1 line
340 KiB
JavaScript
1 line
340 KiB
JavaScript
"use strict";(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["reports-ReportBaseViewController"],{7867:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ReportBaseViewController\": () => (/* binding */ ReportBaseViewController)\n/* harmony export */ });\n/* harmony import */ var _views_BaseViewController__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(121);\n/* harmony import */ var _global_Global__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9490);\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\n\n\n\nclass ReportBaseViewController extends _views_BaseViewController__WEBPACK_IMPORTED_MODULE_0__.BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tview_file: '',\n\n\t\t\tpage_orientation_array: null,\n\t\t\tfont_size_array: null,\n\t\t\tauto_refresh_array: null,\n\t\t\tchart_display_mode_array: null,\n\t\t\tchart_type_array: null,\n\t\t\ttemplates_array: null,\n\t\t\tsetup_fields_array: null,\n\n\t\t\tlog_action_id_array: null,\n\n\t\t\tlog_table_name_id_array: null,\n\n\t\t\ttime_period_array: null,\n\n\t\t\tvisible_report_widgets: null,\n\n\t\t\tvisible_report_values: null,\n\n\t\t\tvisible_report_widgets_order_fix: null,\n\n\t\t\tstatus_id_array: null,\n\n\t\t\tapi_user_report: null,\n\n\t\t\tcurrent_saved_report: null, // Current saved report if any\n\n\t\t\tsaved_report_array: null,\n\n\t\t\tsub_saved_report_view_controller: null,\n\n\t\t\tsub_custom_column_view_controller: null,\n\n\t\t\tneed_refresh_display_columns: false, //When custom column changed. Set this to true.\n\n\t\t\tReportMissedField: null,\n\n\t\t\tinclude_form_setup: false,\n\n\t\t\tshow_empty_message: false,\n\n\t\t\tdo_validate_after_create_ui: false, //Do validate if there is a saved report\n\n\t\t\tform_setup_changed: false\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tpreInit( options ) {\n\t\tthis.preInitReport();\n\t}\n\n\tinit( options ) {\n\t\t//Initialize this.real_this without having to call _super,\n\t\t//this avoids Maximum stack size errors in other functions that call _super. Copied from __super.\n\t\tthis.real_this = this.constructor.__super__;\n\n\t\tthis.permission_id = 'report';\n\n\t\tLocalCacheData.current_open_report_controller = this;\n\n\t\tvar $this = this;\n\n\t\t$this.api_user_report = TTAPI.APIUserReportData;\n\t\t$this.initReport();\n\t\t// this.buildContextMenu(); // #VueContextMenu#EditOnly - Commented out as must happen after initEditViewUI\n\t\tTTPromise.resolve( 'Reports', 'openReport' );\n\t\t$this.postInitReport();\n\t}\n\n\t// Removed because the require callback in init() serves this function and calls postInitReport() at the proper time.\n\t// postInit: function(){\n\t// },\n\n\tpreInitReport( options ) {\n\t}\n\n\tinitReport( options ) {\n\t}\n\n\tpostInitReport( options ) {\n\t}\n\n\trender() {\n\t}\n\n\t// Need always override if report has filter field.\n\tprocessFilterField() {\n\t}\n\n\tgetDefaultReport( data ) {\n\t\tvar item = _.find( data, function( item ) {\n\t\t\treturn item.is_default === true;\n\t\t} );\n\t\tdata && data.length > 0 && !item && ( item = data[0] );\n\n\t\treturn item;\n\t}\n\n\t// overrides BaseViewController.getDefaultContextMenuModel()\n\tgetDefaultContextMenuModel() {\n\n\t\tvar default_context_menu_model = {\n\t\t\t// only put groups that are used in default here, others go in the relevant view controller to avoid confusion on which are obsolete.\n\t\t\tgroups: {\n\t\t\t\teditor: {\n\t\t\t\t\tlabel: $.i18n._( 'Editor' ),\n\t\t\t\t\tid: 'editor'\n\t\t\t\t},\n\t\t\t\tsaved_report: {\n\t\t\t\t\tlabel: $.i18n._( 'Saved Report' ),\n\t\t\t\t\tid: this.viewId + 'SavedReport'\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t'icons': {}\n\t\t};\n\n\t\tdefault_context_menu_model['icons']['view_html'] = {\n\t\t\tlabel: $.i18n._( 'View' ),\n\t\t\tid: 'view_html',\n\t\t\taction_group: 'view',\n\t\t\tgroup: 'editor',\n\t\t\tvue_icon: 'tticon tticon-visibility_black_24dp',\n\t\t\tshow_on_right_click: true,\n\t\t};\n\n\t\tdefault_context_menu_model['icons']['view'] = {\n\t\t\tlabel: $.i18n._( 'PDF' ),\n\t\t\tid: 'view',\n\t\t\taction_group: 'view',\n\t\t\tgroup: 'editor',\n\t\t\tvue_icon: 'tticon tticon-picture_as_pdf_black_24dp',\n\t\t};\n\n\t\tdefault_context_menu_model['icons']['export_excel'] = {\n\t\t\tlabel: $.i18n._( 'Excel' ),\n\t\t\tid: 'export_excel',\n\t\t\taction_group: 'view',\n\t\t\tgroup: 'editor',\n\t\t\tvue_icon: 'tticon tticon-file_upload_black_24dp',\n\t\t\tsort_order: 1800\n\t\t};\n\n\t\tdefault_context_menu_model['icons']['cancel'] = {\n\t\t\tlabel: $.i18n._( 'Cancel' ),\n\t\t\tid: 'cancel',\n\t\t\tgroup: 'editor',\n\t\t\tvue_icon: 'tticon tticon-cancel_black_24dp',\n\t\t\tsort_order: 1990\n\t\t};\n\n\t\tdefault_context_menu_model['icons']['save_existed_report'] = {\n\t\t\tlabel: $.i18n._( 'Save' ),\n\t\t\tid: 'save_existed_report',\n\t\t\taction_group: 'save',\n\t\t\tgroup: 'saved_report',\n\t\t\tvue_icon: 'tticon tticon-save_black_24dp',\n\t\t\tshow_on_right_click: true,\n\t\t};\n\n\t\tdefault_context_menu_model['icons']['save_new_report'] = {\n\t\t\tlabel: $.i18n._( 'Save as New' ),\n\t\t\tid: 'save_new_report',\n\t\t\taction_group: 'save',\n\t\t\tgroup: 'saved_report',\n\t\t\tvue_icon: 'tticon tticon-save_black_24dp',\n\t\t};\n\n\t\treturn default_context_menu_model;\n\t}\n\n\t//this prevents the function of the same name in base class from hiding all of the export to excel buttons on all reports due to their lack of a grid.\n\tsetDefaultMenuExportIcon( context_btn, grid_selected_length, pId ) {\n\t}\n\n\topenEditView() {\n\t\tvar $this = this;\n\t\tthis.initOptions( function() {\n\t\t\t// Always need override\n\t\t\t$this.processFilterField();\n\t\t\tif ( !$this.edit_view ) {\n\t\t\t\t$this.initEditViewUI( $this.viewId, $this.view_file );\n\t\t\t\t$this.buildContextMenu(); // #VueContextMenu#EditOnly - Must happen after initEditViewUI\n\t\t\t\t$this.setEditMenu(); // Since moving buildContextMenu to being after initEditViewUI, none of the report icons were enabled until a tab was switched. So adding this in here refreshes the icons.\n\t\t\t}\n\n\t\t\t$this.do_validate_after_create_ui = true;\n\n\t\t\tTTPromise.wait( 'init', 'init', function() {\n\t\t\t\tif ( LocalCacheData.default_edit_id_for_next_open_edit_view ) {\n\t\t\t\t\t$this.navigation.setValue( LocalCacheData.default_edit_id_for_next_open_edit_view );\n\t\t\t\t\t$this.api_user_report.getUserReportData( { filter_data: { id: LocalCacheData.default_edit_id_for_next_open_edit_view } }, {\n\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\tresult = result.getResult();\n\t\t\t\t\t\t\t$this.current_saved_report = result[0];\n\t\t\t\t\t\t\t$this.current_edit_record = {};\n\t\t\t\t\t\t\t$this.visible_report_values = {};\n\t\t\t\t\t\t\tLocalCacheData.default_edit_id_for_next_open_edit_view = null;\n\t\t\t\t\t\t\t$this.initEditView();\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\t\t\t\t\t$this.api_user_report.getUserReportData( {\n\t\t\t\t\t\tfilter_data: {\n\t\t\t\t\t\t\tscript: $this.script_name,\n\t\t\t\t\t\t\tis_default: true\n\t\t\t\t\t\t}\n\t\t\t\t\t}, {\n\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\tvar data = result.getResult();\n\t\t\t\t\t\t\t$this.current_saved_report = {};\n\t\t\t\t\t\t\tif ( data && data.length > 0 ) {\n\t\t\t\t\t\t\t\t$this.current_saved_report = data[0];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t$this.current_edit_record = {};\n\t\t\t\t\t\t\t$this.visible_report_values = {};\n\t\t\t\t\t\t\t$this.initEditView();\n\t\t\t\t\t\t}\n\t\t\t\t\t} );\n\t\t\t\t}\n\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// #2838 Commenting this out, as it was only needed for ReportView.vue. Basically a revert of 44b853d92b9b45b58aa2c1723537fb408afffe8f\n\t// Currently we are going to go back to the old existing logic of loading each report html, and keeping the contextmenu in the old place, as the Vue template had too many bugs for now, and does not take into account form_setup and custom colummns etc.\n\t// Future work can re-include this when we consolidate the html templates into Vue templates.\n\t// initEditViewUI( view_id, edit_view_file_name ) {\n\t// \tGlobal.setUINotready();\n\t// \tTTPromise.add( 'init', 'init' );\n\t// \tTTPromise.wait();\n\t//\n\t// \tvar $this = this;\n\t// \tif ( this.edit_view ) {\n\t// \t\tthis.edit_view.remove();\n\t// \t}\n\t//\n\t// \t// this.edit_view = $( Global.loadViewSource( view_id, edit_view_file_name, null, true ) );\n\t// \tthis.edit_view = Global.contentContainer().find('.report-view.edit-view');\n\t//\n\t// \t//#2353 - commented out because it breaks subgrid menus in the employee qualifications tab\n\t// \t//calls the context menu click every time that the edit view is clicked.\n\t// \t// this.edit_view.unbind( 'click' ).bind( 'click', function() {\n\t// \t// \t$this.selectContextMenu();\n\t// \t// } );\n\t//\n\t// \tthis.edit_view_tab = $( this.edit_view.find( '.edit-view-tab-bar' ) );\n\t// \tthis.edit_view_tab.css( 'opacity', 0 );\n\t//\n\t// \t//Give edt view tab a id, so we can load it when put right click menu on it\n\t// \tthis.edit_view_tab.attr( 'id', this.ui_id + '_edit_view_tab' );\n\t//\n\t// \tthis.setTabOVisibility( false );\n\t//\n\t// \tthis.edit_view_tab = this.edit_view_tab.tabs( {\n\t// \t\tactivate: function( e, ui ) {\n\t// \t\t\tif ( !$this.edit_view_tab || !$this.edit_view_tab.is( ':visible' ) ) {\n\t// \t\t\t\treturn;\n\t// \t\t\t}\n\t//\n\t// \t\t\t$this.onTabShow( e, ui );\n\t// \t\t\tGlobal.triggerAnalyticsTabs( e, ui );\n\t// \t\t}\n\t// \t} );\n\t//\n\t// \tthis.edit_view_tab.off( 'click' ).on( 'click', function( e ) {\n\t// \t\t$this.onTabIndexChange( e );\n\t// \t} );\n\t//\n\t// \t// Global.contentContainer().append( this.edit_view );\n\t//\n\t// \tthis.initRightClickMenu( RightClickMenuType.EDITVIEW );\n\t//\n\t// \tthis.buildEditViewUI();\n\t//\n\t// \t$this.setEditViewTabHeight();\n\t// \tTTPromise.wait( 'init', 'init', function() {\n\t// \t\t$this.edit_view.css( 'opacity', 1 ); // To prevent a FOUC from empty form to populated.\n\t// \t\t$( '.edit-view-tab-bar' ).css( 'opacity', 1 );\n\t// \t} );\n\t// }\n\n\tsetDefaultConfigData() {\n\n\t\tvar $this = this;\n\t\tthis.api.getOtherConfig( {\n\t\t\tonResult: function( config_result ) {\n\n\t\t\t\tif ( $this.current_saved_report &&\n\t\t\t\t\t$this.current_saved_report.data &&\n\t\t\t\t\t$this.current_saved_report.data.config &&\n\t\t\t\t\t$this.current_saved_report.data.config.other\n\t\t\t\t) {\n\t\t\t\t\t//do nothing\n\t\t\t\t} else {\n\n\t\t\t\t\tconfig_result = config_result.getResult();\n\t\t\t\t\tfor ( var key in config_result ) {\n\t\t\t\t\t\tif ( $this.edit_view_ui_dic.hasOwnProperty( key ) ) {\n\t\t\t\t\t\t\t$this.edit_view_ui_dic[key].setValue( config_result[key] );\n\t\t\t\t\t\t\t$this.current_edit_record[key] = config_result[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t\tthis.api.getChartConfig( {\n\t\t\tonResult: function( config_result ) {\n\n\t\t\t\tif ( $this.current_saved_report &&\n\t\t\t\t\t$this.current_saved_report.data &&\n\t\t\t\t\t$this.current_saved_report.data.config &&\n\t\t\t\t\t$this.current_saved_report.data.config.chart\n\t\t\t\t) {\n\t\t\t\t\t//do nothing\n\t\t\t\t} else {\n\n\t\t\t\t\tconfig_result = config_result.getResult();\n\t\t\t\t\tfor ( var key in config_result ) {\n\t\t\t\t\t\tif ( $this.edit_view_ui_dic.hasOwnProperty( key ) ) {\n\t\t\t\t\t\t\t$this.edit_view_ui_dic[key].setValue( config_result[key] );\n\t\t\t\t\t\t\t$this.current_edit_record[key] = config_result[key];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t}\n\n\tsetTabStatus() {\n\t\t//Handle most cases that one tab and on audit tab\n\t}\n\n\t//Call this from setEditViewData\n\tinitTabData() {\n\t}\n\n\tgetReportData( callBack ) {\n\n\t\tvar $this = this;\n\t\tvar args = {};\n\t\targs.filter_data = { script: this.script_name };\n\t\tthis.api_user_report.getUserReportData( args, {\n\t\t\tonResult: function( result ) {\n\n\t\t\t\tvar res_data = result.getResult();\n\t\t\t\t$this.pager_data = result.getPagerData();\n\n\t\t\t\tcallBack( res_data );\n\t\t\t}\n\t\t} );\n\t}\n\n\tinitOptions( callBack ) {\n\t\tvar options = [\n\t\t\t{ option_name: 'page_orientation' },\n\t\t\t{ option_name: 'font_size' },\n\t\t\t{ option_name: 'auto_refresh' },\n\t\t\t{ option_name: 'chart_display_mode' },\n\t\t\t{ option_name: 'chart_type' },\n\t\t\t{ option_name: 'templates' },\n\t\t\t{ option_name: 'setup_fields' }\n\n\t\t];\n\n\t\tthis.initDropDownOptions( options, function( result ) {\n\t\t\tcallBack( result ); // First to initialize drop down options, and then to initialize edit view UI.\n\t\t} );\n\t}\n\n\t//Call this from setEditViewData\n\tinitEditViewData() {\n\t\tvar $this = this;\n\n\t\t//Set Navigation Awesomebox\n\t\tvar navigation_div = this.edit_view.find( '.navigation-div' );\n\t\tnavigation_div.css( 'display', 'block' );\n\n\t\t//init navigation only when open edit view\n\t\tif ( !this.navigation.getSourceData() ) {\n\t\t\tthis.navigation.setSourceData( this.saved_report_array );\n\t\t\tif ( LocalCacheData.getLoginUserPreference() ) {\n\t\t\t\tthis.navigation.setRowPerPage( LocalCacheData.getLoginUserPreference().items_per_page );\n\t\t\t}\n\t\t\tthis.navigation.setPagerData( this.pager_data );\n\n\t\t\tvar default_args = {};\n\t\t\tdefault_args.filter_data = { script: this.script_name };\n\t\t\tthis.navigation.setDefaultArgs( default_args );\n\t\t}\n\n\t\tthis.navigation.setValue( this.current_saved_report );\n\t\tthis.setUIWidgetFieldsToCurrentEditRecord();\n\t\tthis.setNavigationArrowsEnabled();\n\t\t// Create this function alone because of the column value of view is different from each other, some columns need to be handle specially. and easily to rewrite this function in sub-class.\n\t\tthis.setCurrentEditRecordData();\n\n\t\t//Can't hide navigation box if there aren't any saved reports, without having to make an API call and count how many saved reports there are first, which kind of defeats the purpose.\n\n\t\t//Init *Please save this record before modifying any related data* box\n\t\tthis.edit_view.find( '.save-and-continue-div' ).SaveAndContinueBox( { related_view_controller: this } );\n\t\tthis.edit_view.find( '.save-and-continue-div' ).css( 'display', 'none' );\n\t}\n\n\tonRightOrLeftArrowClickCallBack( next_select_item ) {\n\t\tthis.navigation.setValue( next_select_item );\n\t\tthis.current_saved_report = next_select_item;\n\t\tthis.current_edit_record = {};\n\t\tthis.visible_report_values = {};\n\t\tthis.initEditView();\n\t}\n\n\t//Call this after initEditViewUI, usually after current_edit_record is set\n\tinitEditView() {\n\t\tvar $this = this;\n\t\tvar current_url = window.location.href;\n\t\tif ( current_url.indexOf( '&sm' ) > 0 ) {\n\t\t\tcurrent_url = current_url.substring( 0, current_url.indexOf( '&sm' ) );\n\t\t}\n\t\tif ( $this.current_saved_report && $this.current_saved_report.id ) {\n\n\t\t\tcurrent_url = current_url + '&sm=' + $this.viewId + '&sid=' + $this.current_saved_report.id;\n\n\t\t} else {\n\t\t\tcurrent_url = current_url + '&sm=' + $this.viewId;\n\t\t}\n\n\t\tif ( window.location.href.indexOf( '&tab=' ) > 0 ) {\n\t\t\tvar tab_name = window.location.href;\n\t\t\ttab_name = tab_name.substr( ( window.location.href.indexOf( '&tab=' ) + 5 ) ); //get the selected tab name\n\t\t\ttab_name = tab_name.substr( 0, window.location.href.indexOf( '&' ) ); // incase there are subsequent arguments after the tab argument\n\t\t\tcurrent_url += '&tab=' + tab_name;\n\t\t}\n\n\t\t_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.setURLToBrowser */ .x.setURLToBrowser( current_url );\n\n\t\tsuper.initEditView();\n\t}\n\n\tsetNavigation() {\n\n\t\tvar $this = this;\n\n\t\tthis.navigation.off( 'formItemChange' ).on( 'formItemChange', function( e, target ) {\n\t\t\tvar next_select_item_id = target.getValue();\n\t\t\t$this.edit_view_error_ui_dic = {};\n\t\t\tif ( !next_select_item_id || next_select_item_id === TTUUID.zero_id ) {\n\t\t\t\t$this.current_saved_report = null;\n\t\t\t\t$this.saved_report_array = [];\n\t\t\t\t$this.current_edit_record = {};\n\t\t\t\t$this.visible_report_values = {};\n\n\t\t\t\t$this.do_validate_after_create_ui = true;\n\t\t\t\t$this.initEditView();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( next_select_item_id !== $this.current_edit_record.id ) {\n\t\t\t\t$this.current_saved_report = target.getValue( true );\n\t\t\t\t$this.current_edit_record = {};\n\t\t\t\t$this.visible_report_values = {};\n\n\t\t\t\t$this.initEditView();\n\t\t\t}\n\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.triggerAnalyticsEditViewNavigation */ .x.triggerAnalyticsEditViewNavigation( 'navigation', $this.viewId );\n\t\t} );\n\t}\n\n\tinitSubCustomColumnView( callBack ) {\n\t\tvar $this = this;\n\n\t\t$this.sub_view_mode = true;\n\n\t\tif ( this.sub_custom_column_view_controller ) {\n\t\t\t$this.sub_custom_column_view_controller.edit_only_mode = false;\n\t\t\t$this.sub_custom_column_view_controller.buildContextMenu( true );\n\t\t\t$this.sub_custom_column_view_controller.parent_value = this.script_name;\n\t\t\t$this.sub_custom_column_view_controller.initData(); //Init data in this parent view\n\t\t\treturn;\n\t\t}\n\n\t\t_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadViewSource */ .x.loadViewSource( 'CustomColumn', 'CustomColumnViewController.js', function() {\n\t\t\tvar tab = $this.edit_view_tab.find( '#tab_custom_columns' );\n\n\t\t\tvar firstColumn = tab.find( '.first-column-sub-view' );\n\n\t\t\tTTPromise.add( 'SubCustomColumnView', 'init' );\n\t\t\tTTPromise.wait( 'SubCustomColumnView', 'init', function() {\n\t\t\t\tfirstColumn.css( 'opacity', '1' );\n\t\t\t} );\n\n\t\t\tfirstColumn.css( 'opacity', '0' ); //Hide the grid while its loading/sizing.\n\n\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.trackView */ .x.trackView( 'Sub' + 'ReportSchedule' + 'View' );\n\t\t\tCustomColumnViewController.loadSubView( firstColumn, beforeLoadView, afterLoadView );\n\n\t\t} );\n\n\t\tfunction beforeLoadView() {\n\n\t\t}\n\n\t\tfunction afterLoadView( subViewController ) {\n\t\t\t$this.sub_custom_column_view_controller = subViewController;\n\t\t\t$this.sub_custom_column_view_controller.parent_key = 'script';\n\t\t\t$this.sub_custom_column_view_controller.parent_value = $this.script_name;\n\t\t\t$this.sub_custom_column_view_controller.parent_view_controller = $this;\n\t\t\t$this.sub_custom_column_view_controller.edit_only_mode = false;\n\t\t\t$this.sub_custom_column_view_controller.sub_view_mode = true;\n\n\t\t\t//init complete\n\t\t\tif ( callBack ) {\n\t\t\t\tcallBack(); // Call back decide call init or not\n\t\t\t}\n\t\t\t$this.sub_custom_column_view_controller.initData(); //Init data in this parent view\n\t\t}\n\t}\n\n\tonSavedReportDelete() {\n\t\tthis.refreshNav();\n\t}\n\n\tinitSubSavedReportView( callBack ) {\n\t\tvar $this = this;\n\n\t\t$this.sub_view_mode = true;\n\n\t\tif ( this.sub_saved_report_view_controller ) {\n\t\t\t$this.sub_saved_report_view_controller.edit_only_mode = false;\n\t\t\t$this.sub_saved_report_view_controller.buildContextMenu( true );\n\t\t\t$this.sub_saved_report_view_controller.parent_value = this.script_name;\n\t\t\t$this.sub_saved_report_view_controller.initData(); //Init data in this parent view\n\t\t\treturn;\n\t\t}\n\n\t\t_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadViewSource */ .x.loadViewSource( 'SavedReport', 'SavedReportViewController.js', function() {\n\t\t\tvar tab = $this.edit_view_tab.find( '#tab_saved_reports' );\n\n\t\t\tvar firstColumn = tab.find( '.first-column-sub-view' );\n\n\t\t\tTTPromise.add( 'SubSavedReportView', 'init' );\n\t\t\tTTPromise.wait( 'SubSavedReportView', 'init', function() {\n\t\t\t\tfirstColumn.css( 'opacity', '1' );\n\t\t\t} );\n\n\t\t\tfirstColumn.css( 'opacity', '0' ); //Hide the grid while its loading/sizing.\n\n\t\t\t_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.trackView */ .x.trackView( 'Sub' + 'ReportSchedule' + 'View' );\n\t\t\tSavedReportViewController.loadSubView( firstColumn, beforeLoadView, afterLoadView );\n\n\t\t} );\n\n\t\tfunction beforeLoadView() {\n\n\t\t}\n\n\t\tfunction afterLoadView( subViewController ) {\n\n\t\t\t$this.sub_saved_report_view_controller = subViewController;\n\t\t\t$this.sub_saved_report_view_controller.parent_key = 'script';\n\t\t\t$this.sub_saved_report_view_controller.parent_value = $this.script_name;\n\t\t\t$this.sub_saved_report_view_controller.parent_view_controller = $this;\n\t\t\t$this.sub_saved_report_view_controller.edit_only_mode = false;\n\t\t\t$this.sub_saved_report_view_controller.sub_view_mode = true;\n\n\t\t\t//init complete\n\t\t\tif ( callBack ) {\n\t\t\t\tcallBack(); // Call back decide call init or not\n\t\t\t} else {\n\t\t\t\t$this.sub_saved_report_view_controller.initData(); //Init data in this parent view\n\t\t\t}\n\t\t}\n\t}\n\n\tbuildEditViewUI() {\n\t\tvar $this = this;\n\n\t\tthis.initEditViewTabs(); // Fixes: Report tabs not initializing in reports, as this code was moved around in BaseVC to initEditViewTabs, which never gets called in Reports because setTabModel() is not used in Reports, which calls this. See 766392fed39460764542611f3ab4df1deb518cf1\n\n\t\tvar navigation_div = this.edit_view.find( '.navigation-div' );\n\t\tvar label = navigation_div.find( '.navigation-label' );\n\t\tvar left_click = navigation_div.find( '.left-click' );\n\t\tvar right_click = navigation_div.find( '.right-click' );\n\t\tvar navigation_widget_div = navigation_div.find( '.navigation-widget-div' );\n\t\tthis.initNavigationWidget( navigation_widget_div );\n\t\tleft_click.attr( 'src', _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getRealImagePath */ .x.getRealImagePath( 'images/left_arrow.svg' ) );\n\t\tright_click.attr( 'src', _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getRealImagePath */ .x.getRealImagePath( 'images/right_arrow.svg' ) );\n\t\tlabel.text( this.navigation_label );\n\n\t\tthis.edit_view_close_icon = this.edit_view.find( '.close-icon' );\n\t\tthis.edit_view_close_icon.hide();\n\t\tthis.edit_view_close_icon.click( function() {\n\t\t\t$this.onCloseIconClick();\n\t\t} );\n\n\t\tvar tab_0_label = this.edit_view.find( 'a[ref=tab_report]' );\n\t\tvar tab_1_label = this.edit_view.find( 'a[ref=tab_setup]' );\n\t\tvar tab_2_label = this.edit_view.find( 'a[ref=tab_chart]' );\n\n\t\tif ( this.include_form_setup ) {\n\t\t\t// TODO: #2838 BIG todo here for when we convert back to ReportView.vue, as that does not handle the form setup field yet in the all-in-one template.\n\t\t\tvar tab_3_label = this.edit_view.find( 'a[ref=tab_form_setup]' );\n\t\t\tvar tab_4_label = this.edit_view.find( 'a[ref=tab_custom_columns]' );\n\t\t\tvar tab_5_label = this.edit_view.find( 'a[ref=tab_saved_reports]' );\n\n\t\t\ttab_0_label.text( $.i18n._( 'Report' ) );\n\t\t\ttab_1_label.text( $.i18n._( 'Setup' ) );\n\t\t\ttab_2_label.text( $.i18n._( 'Chart' ) );\n\t\t\ttab_3_label.text( $.i18n._( 'Form Setup' ) );\n\t\t\ttab_4_label.text( $.i18n._( 'Custom Columns' ) );\n\t\t\ttab_5_label.text( $.i18n._( 'Saved Reports' ) );\n\n\t\t\tthis.buildFormSetupUI();\n\t\t} else {\n\t\t\tvar tab_3_label = this.edit_view.find( 'a[ref=tab_custom_columns]' );\n\t\t\tvar tab_4_label = this.edit_view.find( 'a[ref=tab_saved_reports]' );\n\n\t\t\ttab_0_label.text( $.i18n._( 'Report' ) );\n\t\t\ttab_1_label.text( $.i18n._( 'Setup' ) );\n\t\t\ttab_2_label.text( $.i18n._( 'Chart' ) );\n\t\t\ttab_3_label.text( $.i18n._( 'Custom Columns' ) );\n\t\t\ttab_4_label.text( $.i18n._( 'Saved Reports' ) );\n\t\t}\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tapi_class: TTAPI.APIUserReportData,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_user_report_data',\n\t\t\tdefault_args: { filter_data: { script: this.script_name } },\n\t\t\tnavigation_mode: true,\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true, //Required in case there are saved reports but none of them are the default.\n\t\t\talways_search_full_columns: true\n\t\t} );\n\n\t\tthis.setNavigation();\n\n\t\t//Making sure that this.saved_report_array is not empty, otherwise navigation arrows will not be enabled on first opening even if there are other reports.\n\t\tif ( this.saved_report_array == null ) {\n\t\t\tthis.navigation.setSourceData( null );\n\t\t\t$this.getReportData( function( result ) {\n\t\t\t\tif ( result && result.length > 0 ) {\n\t\t\t\t\t$this.saved_report_array = result;\n\t\t\t\t} else {\n\t\t\t\t\t$this.saved_report_array = [];\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t//Tab 0 start\n\n\t\tvar tab_report = this.edit_view_tab.find( '#tab_report' );\n\n\t\tvar tab0_column1 = tab_report.find( '.first-column' );\n\n\t\t// Template\n\t\tvar form_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'template', set_empty: true } );\n\t\tform_item_input.setSourceData( $this.templates_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Template' ), form_item_input, tab0_column1 );\n\n\t\t//Tab 1 start\n\t\tvar tab_setup = this.edit_view_tab.find( '#tab_setup' );\n\t\tvar tab1_column1 = tab_setup.find( '.first-column' );\n\n\t\t//Fields\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tallow_multiple_selection: true,\n\t\t\tkey: 'value',\n\t\t\tlayout_name: 'global_option_column',\n\t\t\tallow_drag_to_order: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'setup_field'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Fields' ), form_item_input, tab1_column1, '' );\n\t\tthis.setup_fields_array.shift();\n\t\tform_item_input.setSourceData( this.setup_fields_array );\n\n\t\t//Page Orientation\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'page_orientation', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.page_orientation_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Page Orientation' ), form_item_input, tab1_column1 );\n\n\t\t//Font Size\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'font_size', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.font_size_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Font Size' ), form_item_input, tab1_column1 );\n\n\t\t//Disable Grand Total\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'disable_grand_total' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Disable Grand Total' ), form_item_input, tab1_column1 );\n\n\t\t//Show Duplicate Values\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'show_duplicate_values' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Show Duplicate Values' ), form_item_input, tab1_column1 );\n\n\t\t//Auto-Refresh\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'auto_refresh', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.auto_refresh_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Auto-Refresh' ), form_item_input, tab1_column1 );\n\n\t\t//Maximum Pages\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'maximum_page_limit', width: 50 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Maximum Pages' ), form_item_input, tab1_column1 );\n\n\t\t//Tab 2 start\n\t\tvar tab_chart = this.edit_view_tab.find( '#tab_chart' );\n\t\tvar tab2_column1 = tab_chart.find( '.first-column' );\n\n\t\t//Enable\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'enable' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Enable' ), form_item_input, tab2_column1, '' );\n\n\t\t//Display\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'display_mode', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.chart_display_mode_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Display' ), form_item_input, tab2_column1 );\n\n\t\t//Type\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tform_item_input.TComboBox( { field: 'type', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.chart_type_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab2_column1 );\n\n\t\t//Chart Sub-Totals\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'include_sub_total' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Chart Sub-Totals' ), form_item_input, tab2_column1 );\n\n\t\t//Consistent Axis Scales\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'axis_scale_static' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Consistent Axis Scales' ), form_item_input, tab2_column1 );\n\n\t\t//Consistent Axis Scales\n\t\tform_item_input = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\t\tform_item_input.TCheckbox( { field: 'combine_columns' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Combine Columns' ), form_item_input, tab2_column1, '' );\n\n\t\tTTPromise.resolve( 'init', 'init' );\n\t}\n\n\tbuildFormSetupUI() {\n\t\t//Need always override\n\t}\n\n\tbuildSelectTemplateData() {\n\t\tvar template = this.current_saved_report.data.template;\n\t\tvar config = this.current_saved_report.data.config;\n\n\t\tvar result = {};\n\n\t\tfor ( var i = 0; i < template.length; i++ ) {\n\t\t\tvar item = template[i];\n\t\t\tif ( item === 'sort' ) {\n\t\t\t\tresult[item] = config[item + '_'];\n\t\t\t} else {\n\t\t\t\tresult[item] = config[item];\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/* jshint ignore:start */\n\tsetCurrentEditRecordData() {\n\n\t\tvar $this = this;\n\t\tif ( LocalCacheData.default_filter_for_next_open_view ) {\n\n\t\t\tthis.do_validate_after_create_ui = false;\n\t\t\tthis.current_edit_record['template'] = LocalCacheData.default_filter_for_next_open_view.template;\n\t\t\t$this.onTemplateChange( this.current_edit_record['template'] );\n\t\t\tLocalCacheData.default_filter_for_next_open_view = null;\n\n\t\t} else {\n\t\t\tif ( this.current_saved_report && this.current_saved_report.data ) {\n\t\t\t\tvar select_template_data = this.buildSelectTemplateData();\n\t\t\t\tthis.setSelectTemplate( select_template_data );\n\n\t\t\t\tthis.current_edit_record['template'] = this.current_saved_report.data.config.template;\n\n\t\t\t\tfor ( var other_key in this.current_saved_report.data.config.other ) {\n\n\t\t\t\t\tif ( !this.current_saved_report.data.config.other.hasOwnProperty( other_key ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.current_edit_record[other_key] = this.current_saved_report.data.config.other[other_key];\n\t\t\t\t}\n\n\t\t\t\tfor ( var chart_key in this.current_saved_report.data.config.chart ) {\n\n\t\t\t\t\tif ( !this.current_saved_report.data.config.chart.hasOwnProperty( chart_key ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.current_edit_record[chart_key] = this.current_saved_report.data.config.chart[chart_key];\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t////If no any saved report, use default setup fields\n\t\t\t\t//var default_setup_fields = this.api.getOptions( 'default_setup_fields', {async: false} );\n\t\t\t\t//$this.current_edit_record.setup_field = default_setup_fields.getResult();\n\t\t\t\t//$this.buildReportUIBaseOnSetupFields();\n\t\t\t\tthis.do_validate_after_create_ui = false;\n\t\t\t\tthis.onTemplateChange( this.templates_array[1].id );\n\t\t\t\tthis.current_edit_record['template'] = this.templates_array[1].id;\n\t\t\t}\n\t\t}\n\n\t\t//Set current edit record data to all widgets\n\t\tfor ( var key in this.current_edit_record ) {\n\n\t\t\tif ( !this.current_edit_record.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.isSet */ .x.isSet( widget ) ) {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'user_id':\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'country': //popular case\n\t\t\t\t\t\tthis.setCountryValue( widget, key );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tif ( this.include_form_setup ) {\n\t\t\tthis.api.getCompanyFormConfig( {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\tvar res_Data = result.getResult();\n\t\t\t\t\tif ( res_Data.length == 1 && res_Data.hasOwnProperty( '0' ) && res_Data[0] === false ) {\n\t\t\t\t\t\t//There seem to be cases where the form setup data is somehow saved as the following, which should be ignored, otherwise when trying to re-save the form setup data it doesn't get uploaded to the server because 0 => false.\n\t\t\t\t\t\t// array(1) {\n\t\t\t\t\t\t// [0]=>\n\t\t\t\t\t\t// bool(false)\n\t\t\t\t\t\t// }\n\t\t\t\t\t\t//\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this.setFormSetupData( res_Data );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\tthis.collectUIDataToCurrentEditRecord();\n\n\t\tthis.setDefaultConfigData();\n\t\tthis.setEditViewDataDone();\n\t}\n\n\t/* jshint ignore:end */\n\n\t//set tab 0 visible after all data set done. This be hide when init edit view data\n\tsetEditViewDataDone() {\n//\t\tLocalCacheData.current_doing_context_action = '';\n\t\tthis.setTabOVisibility( true );\n\n\t\tif ( this.do_validate_after_create_ui ) {\n\t\t\tthis.validate();\n\t\t\tthis.do_validate_after_create_ui = false;\n\t\t}\n\n\t\tthis.initRightClickMenuForViewButton();\n\n\t\t//Set url selected tab.\n\t\tif ( window.location.href.indexOf( '&tab=' ) > 0 ) {\n\t\t\tvar tab_name = window.location.href;\n\t\t\ttab_name = tab_name.substr( ( window.location.href.indexOf( '&tab=' ) + 5 ) ); //get the selected tab name\n\t\t\ttab_name = tab_name.substr( 0, window.location.href.indexOf( '&' ) ); // incase there are subsequent arguments after the tab argument\n\t\t\tvar my_tabs = this.edit_view_tab.find( '.edit-view-tab-bar-label' ).children();\n\n\t\t\tfor ( var n = 0; n < my_tabs; n++ ) {\n\t\t\t\tif ( $( my_tabs[n] ).find( 'a' ).length > 0 && tab_name == $( my_tabs[n] ).find( 'a' ).html().replace( /\\/|\\s+/g, '' ) ) {\n\t\t\t\t\t$( my_tabs[n] ).find( 'a' ).click();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tTTPromise.resolve( 'init', 'init' );\n\t\t$( '.edit-view-tab-bar' ).css( 'opacity', 1 );\n\t}\n\n\t//This is just calling into the base anyway, so commented out for now.\n\t// validateResult( result ) {\n\t// \tsuper.validateResult( result );\n\t// },\n\n\tinitRightClickMenuForViewButton() {\n\t\tvar $this = this;\n\t\tvar selector = '#viewHTMLIcon';\n\t\tif ( $( selector ).length == 0 ) {\n\t\t\treturn;\n\t\t}\n\t\tvar items = this.getViewButtonRightClickItems();\n\n\t\tif ( !items || $.isEmptyObject( items ) ) {\n\t\t\treturn;\n\t\t}\n\t\t$.contextMenu( 'destroy', selector );\n\t\t$.contextMenu( {\n\t\t\tselector: selector,\n\t\t\tcallback: function( key, options ) {\n\t\t\t\t$this.onContextMenuClick( null, key );\n\t\t\t},\n\n\t\t\tonContextMenu: function() {\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\titems: items,\n\t\t\tzIndex: 50\n\t\t} );\n\t}\n\n\tgetViewButtonRightClickItems() {\n\t\tvar $this = this;\n\t\tvar items = {};\n\t\titems['viewHTMLIcon'] = {\n\t\t\tname: $.i18n._( 'View' ), icon: 'viewHTMLIcon', disabled: function() {\n\t\t\t\treturn isDisabled();\n\t\t\t}\n\t\t};\n\t\titems['viewHTMLNewWindow'] = {\n\t\t\tname: $.i18n._( 'View (New Window)' ), icon: 'viewHTMLIcon', disabled: function() {\n\t\t\t\treturn isDisabled();\n\t\t\t}\n\t\t};\n\n\t\tfunction isDisabled() {\n\t\t\tif ( $( '#viewHTMLIcon' ).parent().hasClass( 'disable-image' ) ) {\n\t\t\t\treturn true;\n\t\t\t} else {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn items;\n\t}\n\n//\tonViewRightClick( key ) {\n//\t\t//TODO show view\n//\t\talert('dfdf');\n//\t},\n\n\t// Need always override if report has filter field\n\tonFormItemChangeProcessFilterField() {\n\t}\n\n\t//Shim method to allow override for classes that need their own onFormItemChange for a specific purpose ie payroll export reports\n\t//eg in payroll export, when export_type is changed, we need to execute code but also need the default behaviour of onFormItemChange.\n\tpreFormItemChange( target, doNotDoValidate ) {\n\t\treturn true;\n\t}\n\n\t/* jshint ignore:start */\n\tonFormItemChange( target, doNotDoValidate ) {\n\t\tthis.preFormItemChange( target ); //shim for child class\n\t\tvar $this = this;\n\t\tthis.setIsChanged( target );\n\t\tvar key = target.getField();\n\t\tvar time_period;\n\t\tvar skill_expiry_date;\n\t\tvar membership_renewal_date;\n\t\tvar license_expiry_date;\n\t\tvar education_graduate_date;\n\n\t\tif ( this.visible_report_widgets && ( this.visible_report_widgets[key] || key === 'start_date' || key === 'end_date' || key === 'pay_period_id' || key === 'pay_period_schedule_id' ) ) {\n\t\t\tif ( key === 'sort' ) {\n\t\t\t\tthis.visible_report_values[key] = target.getValue( true );\n\n\t\t\t} else if ( key.indexOf( 'time_period' ) >= 0 ) {\n\n\t\t\t\ttime_period = target.getValue();\n\n\t\t\t\tif ( !this.visible_report_values[key] || this.visible_report_values[key].time_period !== time_period ) {\n\t\t\t\t\tthis.visible_report_values[key] = { time_period: time_period };\n\t\t\t\t\tthis.onTimePeriodChange( target );\n\t\t\t\t}\n\n\t\t\t} else if ( key === 'filter' ) {\n\t\t\t\t//Always needs override\n\t\t\t\tthis.onFormItemChangeProcessFilterField( target, key );\n\n\t\t\t} else if ( key === 'start_date' || key === 'end_date' || key === 'pay_period_id' || key === 'pay_period_schedule_id' ) {\n\t\t\t\ttime_period = this.visible_report_values[target.attr( 'time_period_key' ) ? target.attr( 'time_period_key' ) : 'time_period'];\n\t\t\t\ttime_period[key] = target.getValue();\n\n\t\t\t} else if ( key === 'membership_renewal_date' ) {\n\t\t\t\tmembership_renewal_date = target.getValue();\n\t\t\t\tthis.visible_report_values[key] = { time_period: membership_renewal_date };\n\n\t\t\t\tthis.onMembershipRenewalDateChange( target );\n\t\t\t} else if ( key === 'start_date_1' || key === 'end_date_1' || key === 'pay_period_id_1' || key === 'pay_period_schedule_id_1' ) {\n\t\t\t\tmembership_renewal_date = this.visible_report_values['membership_renewal_date'];\n\t\t\t\tmembership_renewal_date[key.replace( '_1', '' )] = target.getValue();\n\n\t\t\t} else if ( key === 'skill_expiry_date' ) {\n\t\t\t\tskill_expiry_date = target.getValue();\n\t\t\t\tthis.visible_report_values[key] = { time_period: skill_expiry_date };\n\n\t\t\t\tthis.onSkillExpiryDate( target );\n\t\t\t} else if ( key === 'start_date_2' || key === 'end_date_2' || key === 'pay_period_id_2' || key === 'pay_period_schedule_id_2' ) {\n\t\t\t\tskill_expiry_date = this.visible_report_values['skill_expiry_date'];\n\t\t\t\tskill_expiry_date[key.replace( '_2', '' )] = target.getValue();\n\n\t\t\t} else if ( key === 'license_expiry_date' ) {\n\t\t\t\tlicense_expiry_date = target.getValue();\n\t\t\t\tthis.visible_report_values[key] = { time_period: license_expiry_date };\n\n\t\t\t\tthis.onLicenseExpiryDate( target );\n\t\t\t} else if ( key === 'start_date_3' || key === 'end_date_3' || key === 'pay_period_id_3' || key === 'pay_period_schedule_id_3' ) {\n\t\t\t\tlicense_expiry_date = this.visible_report_values['license_expiry_date'];\n\t\t\t\tlicense_expiry_date[key.replace( '_3', '' )] = target.getValue();\n\n\t\t\t} else if ( key === 'education_graduate_date' ) {\n\t\t\t\teducation_graduate_date = target.getValue();\n\t\t\t\tthis.visible_report_values[key] = { time_period: education_graduate_date };\n\n\t\t\t\tthis.onEducationGraduateDate( target );\n\t\t\t} else if ( key === 'start_date_4' || key === 'end_date_4' || key === 'pay_period_id_4' || key === 'pay_period_schedule_id_4' ) {\n\t\t\t\teducation_graduate_date = this.visible_report_values['education_graduate_date'];\n\t\t\t\teducation_graduate_date[key.replace( '_4', '' )] = target.getValue();\n\t\t\t} else {\n\t\t\t\tif ( target.hasClass( 't-checkbox' ) ) {\n\t\t\t\t\tthis.visible_report_values[key] = target.getValue();\n\t\t\t\t} else {\n\t\t\t\t\tvar value = target.getValue();\n\t\t\t\t\tif ( value && ( $.type( value ) !== 'array' || value.length > 0 ) && value != TTUUID.zero_id ) {\n\t\t\t\t\t\tthis.visible_report_values[key] = target.getValue();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdelete this.visible_report_values[key];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.current_edit_record[key] = target.getValue();\n\t\t}\n\n\t\tif ( key === 'template' ) {\n\t\t\t$this.onTemplateChange( this.current_edit_record[key] );\n\t\t\t$this.setEditMenu(); //clean error, set edit menu\n\t\t} else {\n\t\t\tif ( !doNotDoValidate ) {\n\t\t\t\tthis.validate();\n\t\t\t}\n\t\t}\n\n\t\tif ( this.include_form_setup && key === 3 ) {\n\t\t\tthis.form_setup_changed = true;\n\t\t}\n\t}\n\n\t/* jshint ignore:end */\n\n\t//Create first tab widget base on select template\n\tonTemplateChange( templateId ) {\n\t\tvar $this = this;\n\t\tthis.api.getTemplate( templateId, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tvar result_data = result.getResult();\n\t\t\t\t$this.setSelectTemplate( result_data );\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tsetSelectTemplate( result_data ) {\n\t\tvar $this = this;\n\t\tvar result = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildRecordArray */ .x.buildRecordArray( result_data );\n\n\t\tvar len = result.length;\n\t\tif ( $this.current_edit_record ) {\n\t\t\t$this.current_edit_record.setup_field = [];\n\t\t\t$this.visible_report_values = {};\n\n\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\tvar item = result[i];\n\n\t\t\t\tif ( item.value === 'template' ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t$this.visible_report_values[item.value] = item.label; // set value to model\n\t\t\t\t$this.current_edit_record.setup_field.push( item.value );\n\n\t\t\t}\n\n\t\t\t$this.createUI( result );\n\t\t}\n\t}\n\n\tgetFieldLabel( field ) {\n\t\tvar len = this.setup_fields_array.length;\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar setup_field = this.setup_fields_array[i];\n\t\t\tif ( setup_field.value === field ) {\n\t\t\t\treturn setup_field.label;\n\t\t\t}\n\t\t}\n\t}\n\n\t//Create widgets,\n\tcreateUI( uiModel ) {\n\n\t\tthis.cleanUI();\n\t\tvar $this = this;\n\t\tvar len = uiModel.length;\n\t\tvar tab_report = this.edit_view_tab.find( '#tab_report' );\n\t\tvar tab0_column1 = tab_report.find( '.first-column' );\n\t\tthis.edit_view_tabs[0] = [];\n\t\tthis.edit_view_tabs[0].push( tab0_column1 );\n\t\tthis.visible_report_widgets = {}; //report tab widgets\n\t\tthis.edit_view_form_item_dic = {}; //Only keep report tab form item\n\n\t\tthis.visible_report_widgets_order_fix = {};\n\n\t\tvar last_time_visible_values = this.visible_report_values;\n\n\t\tthis.visible_report_values = {};\n\n\t\tvar order_fix = 1001;\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar model = uiModel[i];\n\n\t\t\tvar field = '';\n\t\t\tvar value = '';\n\n\t\t\t//Value, label object\n\t\t\tif ( model.value ) {\n\t\t\t\tfield = model.value;\n\n\t\t\t} else { //Mode is string\n\t\t\t\tfield = model;\n\t\t\t}\n\n\t\t\tvalue = last_time_visible_values[field];\n\t\t\tvar widget = this.getUIWidget( field );\n\n\t\t\t//Dont add field is it's not in setup fields.\n\t\t\tif ( !widget || !this.getFieldLabel( field ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t//Add widget first\n\t\t\tif ( field.indexOf( 'time_period' ) >= 0 ||\n\t\t\t\tfield === 'membership_renewal_date' ||\n\t\t\t\tfield === 'skill_expiry_date' ||\n\t\t\t\tfield == 'license_expiry_date' ||\n\t\t\t\tfield == 'education_graduate_date'\n\t\t\t) {\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( this.getFieldLabel( field ) ), widget, tab0_column1, '', null, true, true );\n\t\t\t\t$this.edit_view_form_item_dic[field].attr( 'id', 'report_' + field + '_div' );\n\n\t\t\t} else {\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( this.getFieldLabel( field ) ), widget, tab0_column1, '', null, true );\n\t\t\t}\n\n\t\t\t//Then set Value\n\t\t\tif ( value ) {\n\n\t\t\t\tif ( field.indexOf( 'time_period' ) >= 0 ) {\n\t\t\t\t\twidget.setValue( value['time_period'] ); //inside time_period field, the key always be tiem_period\n\t\t\t\t\t$this.onTimePeriodChange( widget, value );\n\t\t\t\t} else if ( field === 'membership_renewal_date' ) {\n\t\t\t\t\twidget.setValue( value.time_period );\n\t\t\t\t\t$this.onMembershipRenewalDateChange( widget, value );\n\t\t\t\t} else if ( field === 'skill_expiry_date' ) {\n\t\t\t\t\twidget.setValue( value.time_period );\n\t\t\t\t\t$this.onSkillExpiryDate( widget, value );\n\t\t\t\t} else if ( field === 'license_expiry_date' ) {\n\t\t\t\t\twidget.setValue( value.time_period );\n\t\t\t\t\t$this.onLicenseExpiryDate( widget, value );\n\t\t\t\t} else if ( field === 'education_graduate_date' ) {\n\t\t\t\t\twidget.setValue( value.time_period );\n\t\t\t\t\t$this.onEducationGraduateDate( widget, value );\n\t\t\t\t} else if ( field === 'filter' ) {\n\t\t\t\t\t$this.setFilterValue( widget, value );\n\t\t\t\t} else if ( field === 'sort' ) {\n\t\t\t\t\twidget.setValue( value );\n\t\t\t\t} else {\n\t\t\t\t\twidget.setValue( value );\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// then init source options\n\n\t\t\tthis.initSourceData( field, widget );\n\n\t\t\tdelete this.current_edit_record[field];\n\n\t\t\tif ( widget.hasClass( 't-checkbox' ) ) {\n\t\t\t\tthis.visible_report_values[field] = value;\n\t\t\t} else if ( value ) {\n\t\t\t\tthis.visible_report_values[field] = value;\n\t\t\t}\n\n\t\t\tthis.visible_report_widgets[field] = widget;\n\n\t\t\tthis.visible_report_widgets_order_fix[field] = order_fix;\n\n\t\t\torder_fix = order_fix + 1;\n\n\t\t}\n\n\t\tthis.setEditViewWidgetsMode();\n\t\tthis.need_refresh_display_columns = false;\n\t\tthis.editFieldResize( 0 );\n\t}\n\n\t// onTabIndexChange( e, ui ) {\n\t//\n\t// },\t// onTabIndexChange: function( e, ui ) {\n\t//\n\t// },\n\t/* jshint ignore:start */\n\tonTabShow( e ) {\n\t\tvar $this = this;\n\t\tvar key = $( e.target ).tabs( 'option', 'active' );\n\n\t\tthis.editFieldResize( key );\n\n\t\tif ( !this.current_edit_record ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar last_index = this.getEditViewTabIndex();\n\n\t\tif ( !this.include_form_setup ) {\n\t\t\tif ( ( last_index === 1 || this.need_refresh_display_columns ) && key === 0 ) {\n\t\t\t\tthis.buildReportUIBaseOnSetupFields();\n\t\t\t\tthis.buildContextMenu( true );\n\t\t\t\tthis.setEditMenu();\n\t\t\t} else if ( key === 1 ) {\n\t\t\t\tthis.edit_view_ui_dic.setup_field.setValue( this.current_edit_record.setup_field );\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getProductEdition */ .x.getProductEdition() == 10 ) {\n\t\t\t\t\tthis.edit_view_ui_dic.auto_refresh.parent().parent().css( 'display', 'none' );\n\t\t\t\t}\n\t\t\t\tthis.buildContextMenu( true );\n\t\t\t\tthis.setEditMenu();\n\t\t\t} else if ( key === 2 ) {\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 ) {\n\t\t\t\t\tthis.edit_view_tab.find( '#tab_chart' ).find( '.first-column' ).css( 'display', 'block' );\n\t\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'none' );\n\t\t\t\t} else {\n\t\t\t\t\tthis.edit_view_tab.find( '#tab_chart' ).find( '.first-column' ).css( 'display', 'none' );\n\t\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'block' );\n\t\t\t\t\tthis.edit_view.find( '.permission-message' ).html( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getUpgradeMessage */ .x.getUpgradeMessage() );\n\t\t\t\t}\n\t\t\t} else if ( key === 3 ) {\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 ) {\n\t\t\t\t\tthis.edit_view_tab.find( '#tab_custom_columns' ).find( '.first-column-sub-view' ).css( 'display', 'block' );\n\t\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'none' );\n\t\t\t\t\tthis.initSubCustomColumnView();\n\t\t\t\t} else {\n\t\t\t\t\tthis.edit_view_tab.find( '#tab_custom_columns' ).find( '.first-column-sub-view' ).css( 'display', 'none' );\n\t\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'block' );\n\t\t\t\t\tthis.edit_view.find( '.permission-message' ).html( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getUpgradeMessage */ .x.getUpgradeMessage() );\n\n\t\t\t\t}\n\n\t\t\t} else if ( key === 4 ) {\n\t\t\t\tthis.initSubSavedReportView();\n\t\t\t} else {\n\t\t\t\tthis.buildContextMenu( true );\n\t\t\t\tthis.setEditMenu();\n\t\t\t}\n\t\t} else {\n\t\t\tif ( ( last_index === 1 || this.need_refresh_display_columns ) && key === 0 ) {\n\t\t\t\tthis.buildReportUIBaseOnSetupFields();\n\t\t\t\tthis.buildContextMenu( true );\n\t\t\t\tthis.setEditMenu();\n\t\t\t} else if ( key === 1 ) {\n\t\t\t\tthis.edit_view_ui_dic.setup_field.setValue( this.current_edit_record.setup_field );\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getProductEdition */ .x.getProductEdition() == 10 ) {\n\t\t\t\t\tthis.edit_view_ui_dic.auto_refresh.parent().parent().css( 'display', 'none' );\n\t\t\t\t}\n\t\t\t\tthis.buildContextMenu( true );\n\t\t\t\tthis.setEditMenu();\n\t\t\t} else if ( key === 2 ) {\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 ) {\n\t\t\t\t\tthis.edit_view_tab.find( '#tab_chart' ).find( '.first-column' ).css( 'display', 'block' );\n\t\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'none' );\n\t\t\t\t} else {\n\t\t\t\t\tthis.edit_view_tab.find( '#tab_chart' ).find( '.first-column' ).css( 'display', 'none' );\n\t\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'block' );\n\t\t\t\t\tthis.edit_view.find( '.permission-message' ).html( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getUpgradeMessage */ .x.getUpgradeMessage() );\n\t\t\t\t}\n\t\t\t} else if ( key === 4 ) {\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getProductEdition */ .x.getProductEdition() >= 15 ) {\n\t\t\t\t\tthis.edit_view_tab.find( '#tab_form_setup' ).find( '.first-column-sub-view' ).css( 'display', 'block' );\n\t\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'none' );\n\t\t\t\t\tthis.initSubCustomColumnView();\n\t\t\t\t} else {\n\t\t\t\t\tthis.edit_view_tab.find( '#tab_form_setup' ).find( '.first-column-sub-view' ).css( 'display', 'none' );\n\t\t\t\t\tthis.edit_view.find( '.permission-defined-div' ).css( 'display', 'block' );\n\t\t\t\t\tthis.edit_view.find( '.permission-message' ).html( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getUpgradeMessage */ .x.getUpgradeMessage() );\n\n\t\t\t\t}\n\t\t\t} else if ( key === 5 ) {\n\t\t\t\tthis.initSubSavedReportView();\n\t\t\t} else {\n\t\t\t\tthis.buildContextMenu( true );\n\t\t\t\tthis.setEditMenu();\n\t\t\t}\n\n\t\t\tthis.checkFormSetupSaved( last_index );\n\n\t\t}\n\n\t\tif ( key === 0 ) {\n\t\t\tthis.validate();\n\t\t}\n\t}\n\n\t/**\n\t * Copied to ROEViewController as it doesn't share this base\n\t * FIXME: might need to go into BaseViewController eventually\n\t * @param label\n\t */\n\tcheckFormSetupSaved( last_index, label ) {\n\t\tvar $this = this;\n\n\t\tif ( label == undefined ) {\n\t\t\tlabel = $.i18n._( 'Form Setup' );\n\t\t}\n\n\t\tif ( last_index === 3 && this.form_setup_changed ) {\n\t\t\t$this.form_setup_changed = false;\n\t\t\tTAlertManager.showConfirmAlert( $.i18n._( 'You have modified' ) + ' ' + label + ' ' + $.i18n._( 'data without saving, would you like to save your data now?' ), '', function( flag ) {\n\t\t\t\tif ( flag ) {\n\t\t\t\t\t$this.onSaveSetup( label );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\t}\n\n\t/* jshint ignore:end */\n\tcleanUI() {\n\t\tfor ( var key in this.edit_view_form_item_dic ) {\n\t\t\tif ( !this.edit_view_form_item_dic.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tvar html_item = this.edit_view_form_item_dic[key];\n\n\t\t\t//Check if its a separator with a key of separated_X and skip removing it if it is.\n\t\t\t// FIXME: Would be nice to get a better way to detect a separator widget.\n\t\t\tif ( typeof html_item.getField === 'undefined' && key.indexOf('separated_') != -1 ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\thtml_item.remove();\n\t\t}\n\n\t\t//Error: TypeError: this.edit_view_tab is null in /interface/html5/views/reports/ReportBaseViewController.js?v=8.0.4-20150320-094021 line 1100\n\t\tif ( this.edit_view_tab ) {\n\t\t\tvar tab_report = this.edit_view_tab.find( '#tab_report' );\n\n\t\t\tvar tab0_column1 = tab_report.find( '.first-column' );\n\n\t\t\tvar clear_both_div = tab0_column1.find( '.clear-both-div' );\n\n\t\t\tclear_both_div.remove();\n\t\t}\n\t\t$( '.errortip-box' ).remove();\n\t\t$( '.errortip-box' ).remove();\n\t}\n\n\tremoveEditView() {\n\n\t\tsuper.removeEditView();\n\t\tthis.sub_custom_column_view_controller = null;\n\t\tthis.sub_saved_report_view_controller = null;\n\n\t\t//this is also happening in Ribbonviewcontoller in onSubMenuClick\n\t\tLocalCacheData.current_open_report_controller = null;\n\t}\n\n\t/* jshint ignore:start */\n\n\t//Get Widget base on field\n\tgetUIWidget( field ) {\n\t\tvar widget;\n\n\t\tif ( field.indexOf( 'time_period' ) >= 0 ) {\n\t\t\twidget = this.getSimpleTComboBox( field, false );\n\t\t} else {\n\n\t\t\tswitch ( field ) {\n\t\t\t\tcase 'is_reprint':\n\t\t\t\t\twidget = this.getCheckBox( field );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'columns':\n\t\t\t\tcase 'sub_total':\n\t\t\t\tcase 'group':\n\t\t\t\tcase 'page_break':\n\t\t\t\tcase 'user_review_control_type_id':\n\t\t\t\tcase 'user_review_control_status_id':\n\t\t\t\tcase 'severity_id':\n\t\t\t\tcase 'term_id':\n\t\t\t\tcase 'kpi_type_id':\n\t\t\t\tcase 'kpi_status_id':\n\t\t\t\tcase 'fluency_id':\n\t\t\t\tcase 'qualification_type_id':\n\t\t\t\tcase 'proficiency_id':\n\t\t\t\tcase 'competency_id':\n\t\t\t\tcase 'ownership_id':\n\t\t\t\tcase 'invoice_status_id':\n\t\t\t\tcase 'user_status_id':\n\t\t\t\tcase 'pay_stub_status_id':\n\t\t\t\tcase 'filter':\n\t\t\t\tcase 'pay_period_time_sheet_verify_status_id':\n\t\t\t\tcase 'job_status_id':\n\t\t\t\tcase 'job_item_status_id':\n\t\t\t\tcase 'client_status_id':\n\t\t\t\tcase 'product_type_id':\n\t\t\t\tcase 'custom_filter':\n\t\t\t\tcase 'log_action_id':\n\t\t\t\tcase 'log_table_name_id':\n\t\t\t\tcase 'accrual_type_id':\n\t\t\t\tcase 'accrual_policy_type_id':\n\t\t\t\tcase 'exception_policy_severity_id':\n\t\t\t\tcase 'exception_policy_type_id':\n\t\t\t\tcase 'expense_policy_require_receipt_id':\n\t\t\t\tcase 'expense_policy_type_id':\n\t\t\t\tcase 'user_expense_payment_method_id':\n\t\t\t\tcase 'user_expense_status_id':\n\t\t\t\tcase 'job_applicant_sex_id':\n\t\t\t\tcase 'job_applicant_status_id':\n\t\t\t\tcase 'job_application_status_id':\n\t\t\t\tcase 'job_application_type_id':\n\t\t\t\tcase 'job_vacancy_employment_status_id':\n\t\t\t\tcase 'job_vacancy_level_id':\n\t\t\t\tcase 'job_vacancy_status_id':\n\t\t\t\tcase 'job_vacancy_type_id':\n\t\t\t\tcase 'job_vacancy_wage_type_id':\n\t\t\t\tcase 'pay_stub_run_id':\n\t\t\t\tcase 'pay_stub_type_id':\n\t\t\t\tcase 'remittance_source_account_type_id':\n\t\t\t\tcase 'transaction_type_id':\n\t\t\t\tcase 'transaction_status_id':\n\t\t\t\t\twidget = this.getSimpleTComboBox( field );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'sort':\n\t\t\t\t\twidget = this.getSortComboBox( field );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'license_expiry_date':\n\t\t\t\tcase 'membership_renewal_date':\n\t\t\t\tcase 'skill_expiry_date':\n\t\t\t\tcase 'education_graduate_date':\n\t\t\t\t\twidget = this.getComboBox( field );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'user_group_id':\n\t\t\t\tcase 'qualification_group_id':\n\t\t\t\tcase 'kpi_group_id':\n\t\t\t\tcase 'job_group_id':\n\t\t\t\tcase 'job_item_group_id':\n\t\t\t\tcase 'client_group_id':\n\t\t\t\tcase 'product_group_id':\n\t\t\t\t\twidget = this.getTreeModeAComboBox( field );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'user_tag':\n\t\t\t\tcase 'review_tag':\n\t\t\t\tcase 'job_tag':\n\t\t\t\tcase 'job_item_tag':\n\t\t\t\t\twidget = this.getTag( field );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'include_user_id':\n\t\t\t\tcase 'exclude_user_id':\n\t\t\t\tcase 'client_sales_contact_id':\n\t\t\t\tcase 'created_by_id':\n\t\t\t\tcase 'updated_by_id':\n\t\t\t\tcase 'include_reviewer_user_id':\n\t\t\t\tcase 'exclude_reviewer_user_id':\n\t\t\t\tcase 'job_applicant_interviewer_user_id':\n\t\t\t\tcase 'job_application_interviewer_user_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_user', TTAPI.APIUser );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'user_title_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_user_title', TTAPI.APIUserTitle );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'payroll_remittance_agency_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_payroll_remittance_agency', TTAPI.APIPayrollRemittanceAgency );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'legal_entity_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_legal_entity', TTAPI.APILegalEntity );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'policy_group_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_policy_group', TTAPI.APIPolicyGroup );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'default_branch_id':\n\t\t\t\tcase 'schedule_branch_id':\n\t\t\t\tcase 'punch_branch_id':\n\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_branch', TTAPI.APIBranch );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'default_department_id':\n\t\t\t\tcase 'schedule_department_id':\n\t\t\t\tcase 'punch_department_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_department', TTAPI.APIDepartment );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'default_job_id':\n\t\t\t\tcase 'punch_job_id':\n\t\t\t\tcase 'include_job_id':\n\t\t\t\tcase 'exclude_job_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_job', TTAPI.APIJob );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'default_job_item_id':\n\t\t\t\tcase 'punch_job_item_id':\n\t\t\t\tcase 'include_job_item_id':\n\t\t\t\tcase 'exclude_job_item_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_job_item', TTAPI.APIJobItem );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'absence_policy_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_absences', TTAPI.APIAbsencePolicy );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'currency_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_currency', TTAPI.APICurrency );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'include_no_data_rows':\n\t\t\t\tcase 'exclude_ytd_adjustment':\n\t\t\t\tcase 'show_child_expenses':\n\t\t\t\t\twidget = this.getCheckBox( field );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'accrual_policy_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_accrual', TTAPI.APIAccrualPolicy );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'pay_period_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_Pay_period', TTAPI.APIPayPeriod );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'job_id':\n\t\t\t\t\tif ( ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getProductEdition */ .x.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\twidget = this.getTComboBox( field, 'global_job', TTAPI.APIJob );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'job_item_id':\n\t\t\t\t\tif ( ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getProductEdition */ .x.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\twidget = this.getTComboBox( field, 'global_job_item', TTAPI.APIJobItem );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'default_punch_tag_id':\n\t\t\t\tcase 'punch_tag_id':\n\t\t\t\t\tif ( ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getProductEdition */ .x.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\twidget = this.getTComboBox( field, 'global_punch_tag', TTAPI.APIPunchTag );\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'expense_policy_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_expense_policy', TTAPI.APIExpensePolicy );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'pay_stub_entry_account_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_PayStubAccount', TTAPI.APIPayStubEntryAccount );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'product_id':\n\t\t\t\tcase 'exclude_product_id':\n\t\t\t\tcase 'include_product_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_product', TTAPI.APIProduct );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'job_client_id':\n\t\t\t\tcase 'exclude_client_id':\n\t\t\t\tcase 'include_client_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_client', TTAPI.APIClient );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'company_deduction_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_deduction', TTAPI.APICompanyDeduction );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'qualification_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_qualification', TTAPI.APIQualification );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'kpi_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_kpi', TTAPI.APIKPI );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'job_applicant_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_job_applicant', TTAPI.APIJobApplicant );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'job_vacancy_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_job_vacancy', TTAPI.APIJobVacancy );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'accrual_policy_account_id':\n\t\t\t\t\twidget = this.getTComboBox( field, 'global_accrual_policy_account', TTAPI.APIAccrualPolicyAccount );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( !_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.isSet */ .x.isSet( ReportBaseViewController.ReportMissedField ) ) {\n\t\t\t\t\t\tReportBaseViewController.ReportMissedField = {};\n\t\t\t\t\t}\n\n\t\t\t\t\tReportBaseViewController.ReportMissedField[field] = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\t\t}\n\n\t\treturn widget;\n\t}\n\n\t/* jshint ignore:end */\n\tgetTag( field ) {\n\t\tvar widget = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.TAG_INPUT );\n\n\t\twidget.TTagInput( { field: field } );\n\n\t\treturn widget;\n\t}\n\n\tgetTreeModeAComboBox( field ) {\n\t\tvar widget = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\twidget = widget.AComboBox( {\n\t\t\ttree_mode: true,\n\t\t\tallow_multiple_selection: true,\n\t\t\tlayout_name: 'global_tree_column',\n\t\t\tset_empty: true,\n\t\t\tfield: field\n\t\t} );\n\n\t\treturn widget;\n\t}\n\n\tgetCheckBox( field ) {\n\t\tvar widget = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.CHECKBOX );\n\n\t\twidget = widget.TCheckbox( {\n\t\t\tfield: field\n\t\t} );\n\n\t\treturn widget;\n\t}\n\n\tgetTComboBox( field, layoutName, apiClass ) {\n\n\t\tvar widget = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\twidget = widget.AComboBox( {\n\t\t\tapi_class: apiClass,\n\t\t\tallow_multiple_selection: true,\n\t\t\tlayout_name: layoutName,\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: field\n\t\t} );\n\n\t\treturn widget;\n\t}\n\n\tgetSortComboBox( field ) {\n\t\tvar widget = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\twidget = widget.AComboBox( {\n\t\t\tfield: field,\n\t\t\tallow_drag_to_order: true,\n\t\t\tallow_multiple_selection: true,\n\t\t\tset_empty: true,\n\t\t\tlayout_name: 'global_sort_columns'\n\t\t} );\n\n\t\treturn widget;\n\t}\n\n\tgetSimpleTComboBox( field, allowMultiple ) {\n\n\t\tif ( !_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.isSet */ .x.isSet( allowMultiple ) ) {\n\t\t\tallowMultiple = true;\n\t\t}\n\n\t\tvar widget = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\twidget = widget.AComboBox( {\n\t\t\tfield: field,\n\t\t\tset_empty: true,\n\t\t\tallow_multiple_selection: allowMultiple,\n\t\t\tlayout_name: 'global_option_column',\n\t\t\tkey: 'value'\n\t\t} );\n\n\t\treturn widget;\n\t}\n\n\tgetComboBox( field ) {\n\t\tvar widget = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\twidget = widget.TComboBox( {\n\t\t\tfield: field,\n\t\t\tset_empty: true\n\t\t} );\n\n\t\treturn widget;\n\t}\n\n\t/* jshint ignore:start */\n\tinitSourceData( field, widget ) {\n\n\t\tvar api_instance = null;\n\t\tvar option = '';\n\t\tvar $this = this;\n\n\t\tswitch ( field ) {\n\t\t\tcase 'sort':\n\t\t\t\tapi_instance = this.api;\n\t\t\t\toption = 'columns';\n\n\t\t\t\tapi_instance.getOptions( option, {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tonResult( result );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tbreak;\n\t\t\tcase 'kpi_group_id':\n\t\t\t\tTTAPI.APIKPIGroup.getKPIGroup( '', false, false, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tres = res.getResult();\n\t\t\t\t\t\tres = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildTreeRecord */ .x.buildTreeRecord( res );\n\t\t\t\t\t\twidget.setSourceData( res );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'qualification_group_id':\n\t\t\t\tTTAPI.APIQualificationGroup.getQualificationGroup( '', false, false, {\n\t\t\t\t\tonResult: function( res ) {\n\n\t\t\t\t\t\tres = res.getResult();\n\t\t\t\t\t\tres = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildTreeRecord */ .x.buildTreeRecord( res );\n\t\t\t\t\t\twidget.setSourceData( res );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'product_group_id':\n\t\t\t\tTTAPI.APIProductGroup.getProductGroup( '', false, false, {\n\t\t\t\t\tonResult: function( res ) {\n\n\t\t\t\t\t\tres = res.getResult();\n\t\t\t\t\t\tres = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildTreeRecord */ .x.buildTreeRecord( res );\n\t\t\t\t\t\twidget.setSourceData( res );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'client_group_id':\n\t\t\t\tTTAPI.APIClientGroup.getClientGroup( '', false, false, {\n\t\t\t\t\tonResult: function( res ) {\n\n\t\t\t\t\t\tres = res.getResult();\n\t\t\t\t\t\tres = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildTreeRecord */ .x.buildTreeRecord( res );\n\t\t\t\t\t\twidget.setSourceData( res );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'user_group_id':\n\t\t\t\tTTAPI.APIUserGroup.getUserGroup( '', false, false, {\n\t\t\t\t\tonResult: function( res ) {\n\n\t\t\t\t\t\tres = res.getResult();\n\t\t\t\t\t\tres = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildTreeRecord */ .x.buildTreeRecord( res );\n\t\t\t\t\t\twidget.setSourceData( res );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'policy_group_id':\n\t\t\t\tTTAPI.PolicyGroup.getPolicyGroup( '', false, false, {\n\t\t\t\t\tonResult: function( res ) {\n\n\t\t\t\t\t\tres = res.getResult();\n\t\t\t\t\t\tres = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildTreeRecord */ .x.buildTreeRecord( res );\n\t\t\t\t\t\twidget.setSourceData( res );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'job_group_id':\n\t\t\t\tTTAPI.APIJobGroup.getJobGroup( '', false, false, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tres = res.getResult();\n\t\t\t\t\t\tres = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildTreeRecord */ .x.buildTreeRecord( res );\n\t\t\t\t\t\twidget.setSourceData( res );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'job_item_group_id':\n\t\t\t\tTTAPI.APIJobItemGroup.getJobItemGroup( '', false, false, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tres = res.getResult();\n\t\t\t\t\t\tres = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildTreeRecord */ .x.buildTreeRecord( res );\n\t\t\t\t\t\twidget.setSourceData( res );\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 'job_vacancy_employment_status_id':\n\t\t\t\tapi_instance = TTAPI.APIJobVacancy;\n\t\t\t\toption = 'employment_status';\n\t\t\t\tbreak;\n\t\t\tcase 'job_vacancy_level_id':\n\t\t\t\tapi_instance = TTAPI.APIJobVacancy;\n\t\t\t\toption = 'level';\n\t\t\t\tbreak;\n\t\t\tcase 'job_vacancy_status_id':\n\t\t\t\tapi_instance = TTAPI.APIJobVacancy;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'job_vacancy_type_id':\n\t\t\t\tapi_instance = TTAPI.APIJobVacancy;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'job_vacancy_wage_type_id':\n\t\t\t\tapi_instance = TTAPI.APIJobVacancy;\n\t\t\t\toption = 'wage_type';\n\t\t\t\tbreak;\n\t\t\tcase 'job_application_status_id':\n\t\t\t\tapi_instance = TTAPI.APIJobApplication;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'job_application_type_id':\n\t\t\t\tapi_instance = TTAPI.APIJobApplication;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'job_applicant_sex_id':\n\t\t\t\tapi_instance = TTAPI.APIJobApplicant;\n\t\t\t\toption = 'sex';\n\t\t\t\tbreak;\n\t\t\tcase 'job_applicant_status_id':\n\t\t\t\tapi_instance = TTAPI.APIJobApplicant;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'user_review_control_type_id':\n\t\t\t\tapi_instance = TTAPI.APIUserReviewControl;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'user_review_control_status_id':\n\t\t\t\tapi_instance = TTAPI.APIUserReviewControl;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'severity_id':\n\t\t\t\tapi_instance = TTAPI.APIUserReviewControl;\n\t\t\t\toption = 'severity';\n\t\t\t\tbreak;\n\t\t\tcase 'term_id':\n\t\t\t\tapi_instance = TTAPI.APIUserReviewControl;\n\t\t\t\toption = 'term';\n\t\t\t\tbreak;\n\t\t\tcase 'kpi_status_id':\n\t\t\t\tapi_instance = TTAPI.APIKPI;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'kpi_type_id':\n\t\t\t\tapi_instance = TTAPI.APIKPI;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'proficiency_id':\n\t\t\t\tapi_instance = TTAPI.APIUserSkill;\n\t\t\t\toption = 'proficiency';\n\t\t\t\tbreak;\n\t\t\tcase 'fluency_id':\n\t\t\t\tapi_instance = TTAPI.APIUserLanguage;\n\t\t\t\toption = 'fluency';\n\t\t\t\tbreak;\n\t\t\tcase 'competency_id':\n\t\t\t\tapi_instance = TTAPI.APIUserLanguage;\n\t\t\t\toption = 'competency';\n\t\t\t\tbreak;\n\t\t\tcase 'user_status_id':\n\t\t\t\tapi_instance = TTAPI.APIUser;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'pay_stub_status_id':\n\t\t\t\tapi_instance = TTAPI.APIPayStub;\n\t\t\t\toption = 'filtered_status';\n\t\t\t\tbreak;\n\t\t\tcase 'ownership_id':\n\t\t\t\tapi_instance = TTAPI.APIUserMembership;\n\t\t\t\toption = 'ownership';\n\t\t\t\tbreak;\n\t\t\tcase 'license_expiry_date':\n\t\t\t\tapi_instance = this.api;\n\t\t\t\toption = 'license_expiry_date';\n\t\t\t\tbreak;\n\t\t\tcase 'membership_renewal_date':\n\t\t\t\tapi_instance = this.api;\n\t\t\t\toption = 'membership_renewal_date';\n\t\t\t\tbreak;\n\t\t\tcase 'skill_expiry_date':\n\t\t\t\tapi_instance = this.api;\n\t\t\t\toption = 'skill_expiry_date';\n\t\t\t\tbreak;\n\t\t\tcase 'education_graduate_date':\n\t\t\t\tapi_instance = this.api;\n\t\t\t\toption = 'education_graduate_date';\n\t\t\t\tbreak;\n\t\t\tcase 'group':\n\t\t\tcase 'sub_total':\n\t\t\tcase 'page_break':\n\t\t\t\tapi_instance = this.api;\n\t\t\t\toption = 'static_columns';\n\t\t\t\tbreak;\n\t\t\tcase 'pay_period_time_sheet_verify_status_id':\n\t\t\t\tapi_instance = TTAPI.APIPayPeriodTimeSheetVerify;\n\t\t\t\t//show valid values specific to the report\n\t\t\t\toption = 'filter_report_status';\n\t\t\t\tbreak;\n\t\t\tcase 'job_status_id':\n\t\t\t\tapi_instance = TTAPI.APIJob;\n\t\t\t\toption = 'status';\n\n\t\t\t\tbreak;\n\t\t\tcase 'custom_filter':\n\t\t\t\tapi_instance = this.api;\n\t\t\t\toption = 'report_custom_filters';\n\t\t\t\tbreak;\n\n\t\t\tcase 'log_action_id':\n\n\t\t\t\tapi_instance = TTAPI.APILog;\n\t\t\t\toption = 'action';\n\n\t\t\t\tbreak;\n\t\t\tcase 'log_table_name_id':\n\n\t\t\t\tapi_instance = TTAPI.APILog;\n\t\t\t\toption = 'table_name';\n\n\t\t\t\tbreak;\n\t\t\tcase 'filter':\n\t\t\t\tif ( this.script_name === 'ScheduleSummaryReport' ) {\n\t\t\t\t\tapi_instance = TTAPI.APISchedule;\n\t\t\t\t\toption = 'status';\n\t\t\t\t} else if ( this.script_name === 'InvoiceTransactionSummaryReport' ) {\n\t\t\t\t\tapi_instance = TTAPI.APITransaction;\n\t\t\t\t\toption = 'type';\n\t\t\t\t} else if ( this.script_name === 'PayStubSummaryReport' ) {\n\t\t\t\t\tapi_instance = TTAPI.APIPayStub;\n\t\t\t\t\toption = 'status';\n\t\t\t\t} else if ( this.script_name === 'ActiveShiftReport' ) {\n\t\t\t\t\tapi_instance = TTAPI.APIUser;\n\t\t\t\t\toption = 'status';\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 'accrual_policy_type_id':\n\t\t\t\tapi_instance = TTAPI.APIAccrualPolicy;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'accrual_type_id':\n\t\t\t\tapi_instance = TTAPI.APIAccrual;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'qualification_type_id':\n\t\t\t\tapi_instance = TTAPI.APIQualification;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'exception_policy_type_id':\n\t\t\t\tapi_instance = TTAPI.APIExceptionPolicy;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'exception_policy_severity_id':\n\t\t\t\tapi_instance = TTAPI.APIExceptionPolicy;\n\t\t\t\toption = 'severity';\n\t\t\t\tbreak;\n\t\t\tcase 'expense_policy_require_receipt_id':\n\t\t\t\tapi_instance = TTAPI.APIExpensePolicy;\n\t\t\t\toption = 'require_receipt';\n\t\t\t\tbreak;\n\t\t\tcase 'expense_policy_type_id':\n\t\t\t\tapi_instance = TTAPI.APIExpensePolicy;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'user_expense_payment_method_id':\n\t\t\t\tapi_instance = TTAPI.APIUserExpense;\n\t\t\t\toption = 'payment_method';\n\t\t\t\tbreak;\n\t\t\tcase 'user_expense_status_id':\n\t\t\t\tapi_instance = TTAPI.APIUserExpense;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'job_item_status_id':\n\t\t\t\tapi_instance = TTAPI.APIJobItem;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'client_status_id':\n\t\t\t\tapi_instance = TTAPI.APIClient;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'invoice_status_id':\n\t\t\t\tapi_instance = TTAPI.APIInvoice;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'invoice_transaction_type_id':\n\t\t\t\tapi_instance = TTAPI.APITransaction;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'product_type_id':\n\t\t\t\tapi_instance = TTAPI.APIProduct;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'pay_stub_type_id':\n\t\t\t\tapi_instance = TTAPI.APIPayStub;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'transaction_type_id':\n\t\t\t\tapi_instance = this.api;\n\t\t\t\toption = 'type';\n\t\t\t\tbreak;\n\t\t\tcase 'transaction_status_id':\n\t\t\t\tapi_instance = this.api;\n\t\t\t\toption = 'status';\n\t\t\t\tbreak;\n\t\t\tcase 'pay_stub_run_id':\n\t\t\t\tvar result = {};\n\t\t\t\tfor ( var i = 1; i <= 128; i++ ) {\n\t\t\t\t\tresult[i] = i;\n\t\t\t\t}\n\t\t\t\tresult = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildRecordArray */ .x.buildRecordArray( result );\n\t\t\t\twidget.setSourceData( result );\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\t//Don't deal with awesomebox with api\n\t\t\t\tif ( widget.getAPI && widget.getAPI() ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t//Text Input or other no options widget\n\t\t\t\tif ( !widget.setSourceData ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tfield.replace( '_id', '' );\n\n\t\t\t\tapi_instance = this.api;\n\t\t\t\toption = field;\n\t\t\t\tif ( field.indexOf( 'time_period' ) >= 0 ) {\n\t\t\t\t\toption = 'time_period';\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( api_instance ) {\n\n\t\t\tif ( this.need_refresh_display_columns && ( option === 'columns' || field == 'custom_filter' ) ) {\n\t\t\t\tapi_instance.getOptions( option, {\n\t\t\t\t\tnoCache: true, onResult: function( result ) {\n\n\t\t\t\t\t\tonResult( result );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t} else {\n\t\t\t\tapi_instance.getOptions( option, {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tonResult( result );\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onResult( result ) {\n\n\t\t\tvar res_data = result.getResult();\n\t\t\tres_data = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.buildRecordArray */ .x.buildRecordArray( res_data );\n\t\t\tif ( field === 'sort' ) {\n\t\t\t\tres_data = $this.buildSortSelectorUnSelectColumns( res_data );\n\t\t\t} else if ( field.indexOf( 'time_period' ) >= 0 ) {\n\t\t\t\t$this.time_period_array = res_data;\n\t\t\t}\n\n\t\t\twidget.setSourceData( res_data );\n\n\t\t}\n\t}\n\n\t/* jshint ignore:end */\n\tgetDatePicker( field ) {\n\t\tvar widget = _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( FormItemType.DATE_PICKER );\n\n\t\twidget.TDatePicker( { field: field } );\n\n\t\treturn widget;\n\t}\n\n\tputInputToInsideFormItem( form_item_input, label ) {\n\t\tvar form_item = $( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.loadWidgetByName */ .x.loadWidgetByName( WidgetNamesDic.EDIT_VIEW_SUB_FORM_ITEM ) );\n\t\tvar form_item_label = form_item.find( '.edit-view-form-item-label' );\n\t\tvar form_item_input_div = form_item.find( '.edit-view-form-item-input-div' );\n\t\tform_item.addClass( 'remove-margin' );\n\n\t\tform_item_label.text( $.i18n._( label ) );\n\t\tform_item_input_div.append( form_item_input );\n\n\t\treturn form_item;\n\t}\n\n\tonLicenseExpiryDate( target, defaultValue ) {\n\n\t\tvar $this = this;\n\t\tvar value = target.getValue();\n\n\t\tthis.visible_report_widgets.license_expiry_date = null;\n\t\tthis.visible_report_widgets.start_date_3 = null;\n\t\tthis.visible_report_widgets.end_date_3 = null;\n\t\tthis.visible_report_widgets.pay_period_id_3 = null;\n\t\tthis.visible_report_widgets.pay_period_schedule_id_3 = null;\n\n\t\tif ( value === 'custom_date' ) {\n\t\t\tbuildCustomDateUI();\n\t\t} else if ( value === 'custom_pay_period' ) {\n\t\t\tbuildPayPeriodUI();\n\t\t} else if ( value === 'this_pay_period' || value === 'last_pay_period' || value === 'to_last_pay_period' || value === 'to_this_pay_period' ) {\n\t\t\tbuildPayPeriodScheduleUI();\n\t\t} else {\n\t\t\tbuildDefaultUI();\n\t\t}\n\n\t\tfunction buildPayPeriodScheduleUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_license_expiry_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'license_expiry_date', false, false );\n\t\t\t$this.initSourceData( 'license_expiry_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar pay_period = $this.getTComboBox( 'pay_period_schedule_id_3', 'global_pay_period_schedule', TTAPI.APIPayPeriodSchedule );\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( pay_period, $.i18n._( 'Pay Period Schedule' ) );\n\n\t\t\t$this.visible_report_widgets.license_expiry_date = time_period;\n\t\t\t$this.visible_report_widgets.pay_period_schedule_id_3 = pay_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tpay_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tpay_period.setValue( defaultValue.pay_period_schedule_id );\n\t\t\t}\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 120 );\n\n\t\t\tform_input_div.append( v_box );\n\t\t}\n\n\t\tfunction buildPayPeriodUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_license_expiry_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'license_expiry_date', false, false );\n\t\t\t$this.initSourceData( 'license_expiry_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar pay_period = $this.getTComboBox( 'pay_period_id_3', 'global_Pay_period', TTAPI.APIPayPeriod );\n\n\t\t\tpay_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( pay_period, $.i18n._( 'Pay Period' ) );\n\n\t\t\t$this.visible_report_widgets.license_expiry_date = time_period;\n\t\t\t$this.visible_report_widgets.pay_period_id_3 = pay_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tpay_period.setValue( defaultValue.pay_period_id );\n\t\t\t}\n\n\t\t\tform_input_div.append( v_box );\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 70 );\n\n\t\t}\n\n\t\tfunction buildDefaultUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_license_expiry_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'license_expiry_date', false, false );\n\n\t\t\tform_input_div.append( time_period );\n\n\t\t\ttime_period.setValue( value );\n\n\t\t\t$this.initSourceData( 'license_expiry_date', time_period );\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\t$this.visible_report_widgets.license_expiry_date = time_period;\n\n\t\t}\n\n\t\tfunction buildCustomDateUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_license_expiry_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'license_expiry_date', false, false );\n\t\t\t$this.initSourceData( 'license_expiry_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar start_date = $this.getDatePicker( 'start_date_3' );\n\n\t\t\tvar end_date = $this.getDatePicker( 'end_date_3' );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tstart_date.setValue( defaultValue.start_date );\n\t\t\t\tend_date.setValue( defaultValue.end_date );\n\t\t\t}\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( start_date, $.i18n._( 'Start Date' ) );\n\t\t\tvar form_item3 = $this.putInputToInsideFormItem( end_date, $.i18n._( 'End Date' ) );\n\n\t\t\t$this.visible_report_widgets.license_expiry_date = time_period;\n\t\t\t$this.visible_report_widgets.start_date_3 = start_date;\n\t\t\t$this.visible_report_widgets.end_date_3 = end_date;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tstart_date.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tend_date.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item3 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 70 );\n\n\t\t\tform_input_div.append( v_box );\n\n\t\t}\n\t}\n\n\tonEducationGraduateDate( target, defaultValue ) {\n\n\t\tvar $this = this;\n\t\tvar value = target.getValue();\n\n\t\tthis.visible_report_widgets.education_graduate_date = null;\n\t\tthis.visible_report_widgets.start_date_4 = null;\n\t\tthis.visible_report_widgets.end_date_4 = null;\n\t\tthis.visible_report_widgets.pay_period_id_4 = null;\n\t\tthis.visible_report_widgets.pay_period_schedule_id_4 = null;\n\n\t\tif ( value === 'custom_date' ) {\n\t\t\tbuildCustomDateUI();\n\t\t} else if ( value === 'custom_pay_period' ) {\n\t\t\tbuildPayPeriodUI();\n\t\t} else if ( value === 'this_pay_period' || value === 'last_pay_period' || value === 'to_last_pay_period' || value === 'to_this_pay_period' ) {\n\t\t\tbuildPayPeriodScheduleUI();\n\t\t} else {\n\t\t\tbuildDefaultUI();\n\t\t}\n\n\t\tfunction buildPayPeriodScheduleUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_education_graduate_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'education_graduate_date', false, false );\n\t\t\t$this.initSourceData( 'education_graduate_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar pay_period = $this.getTComboBox( 'pay_period_schedule_id_4', 'global_pay_period_schedule', TTAPI.APIPayPeriodSchedule );\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( pay_period, $.i18n._( 'Pay Period Schedule' ) );\n\n\t\t\t$this.visible_report_widgets.education_graduate_date = time_period;\n\t\t\t$this.visible_report_widgets.pay_period_schedule_id_4 = pay_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tpay_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tpay_period.setValue( defaultValue.pay_period_schedule_id );\n\t\t\t}\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 120 );\n\n\t\t\tform_input_div.append( v_box );\n\t\t}\n\n\t\tfunction buildPayPeriodUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_education_graduate_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'education_graduate_date', false, false );\n\t\t\t$this.initSourceData( 'education_graduate_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar pay_period = $this.getTComboBox( 'pay_period_id_4', 'global_Pay_period', TTAPI.APIPayPeriod );\n\n\t\t\tpay_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( pay_period, $.i18n._( 'Pay Period' ) );\n\n\t\t\t$this.visible_report_widgets.education_graduate_date = time_period;\n\t\t\t$this.visible_report_widgets.pay_period_id_4 = pay_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tpay_period.setValue( defaultValue.pay_period_id );\n\t\t\t}\n\n\t\t\tform_input_div.append( v_box );\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 70 );\n\n\t\t}\n\n\t\tfunction buildDefaultUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_education_graduate_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'education_graduate_date', false, false );\n\n\t\t\tform_input_div.append( time_period );\n\n\t\t\ttime_period.setValue( value );\n\n\t\t\t$this.initSourceData( 'education_graduate_date', time_period );\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\t$this.visible_report_widgets.education_graduate_date = time_period;\n\n\t\t}\n\n\t\tfunction buildCustomDateUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_education_graduate_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'education_graduate_date', false, false );\n\t\t\t$this.initSourceData( 'education_graduate_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar start_date = $this.getDatePicker( 'start_date_4' );\n\n\t\t\tvar end_date = $this.getDatePicker( 'end_date_4' );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tstart_date.setValue( defaultValue.start_date );\n\t\t\t\tend_date.setValue( defaultValue.end_date );\n\t\t\t}\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( start_date, $.i18n._( 'Start Date' ) );\n\t\t\tvar form_item3 = $this.putInputToInsideFormItem( end_date, $.i18n._( 'End Date' ) );\n\n\t\t\t$this.visible_report_widgets.education_graduate_date = time_period;\n\t\t\t$this.visible_report_widgets.start_date_4 = start_date;\n\t\t\t$this.visible_report_widgets.end_date_4 = end_date;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tstart_date.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tend_date.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item3 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 70 );\n\n\t\t\tform_input_div.append( v_box );\n\n\t\t}\n\t}\n\n\tonSkillExpiryDate( target, defaultValue ) {\n\n\t\tvar $this = this;\n\t\tvar value = target.getValue();\n\n\t\tthis.visible_report_widgets.skill_expiry_date = null;\n\t\tthis.visible_report_widgets.start_date_2 = null;\n\t\tthis.visible_report_widgets.end_date_2 = null;\n\t\tthis.visible_report_widgets.pay_period_id_2 = null;\n\t\tthis.visible_report_widgets.pay_period_schedule_id_2 = null;\n\n\t\tif ( value === 'custom_date' ) {\n\t\t\tbuildCustomDateUI();\n\t\t} else if ( value === 'custom_pay_period' ) {\n\t\t\tbuildPayPeriodUI();\n\t\t} else if ( value === 'this_pay_period' || value === 'last_pay_period' || value === 'to_last_pay_period' || value === 'to_this_pay_period' ) {\n\t\t\tbuildPayPeriodScheduleUI();\n\t\t} else {\n\t\t\tbuildDefaultUI();\n\t\t}\n\n\t\tfunction buildPayPeriodScheduleUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_skill_expiry_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'skill_expiry_date', false, false );\n\t\t\t$this.initSourceData( 'skill_expiry_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar pay_period = $this.getTComboBox( 'pay_period_schedule_id_2', 'global_pay_period_schedule', TTAPI.APIPayPeriodSchedule );\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( pay_period, $.i18n._( 'Pay Period Schedule' ) );\n\n\t\t\t$this.visible_report_widgets.skill_expiry_date = time_period;\n\t\t\t$this.visible_report_widgets.pay_period_schedule_id_2 = pay_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tpay_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tpay_period.setValue( defaultValue.pay_period_schedule_id );\n\t\t\t}\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 120 );\n\n\t\t\tform_input_div.append( v_box );\n\t\t}\n\n\t\tfunction buildPayPeriodUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_skill_expiry_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'skill_expiry_date', false, false );\n\t\t\t$this.initSourceData( 'skill_expiry_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar pay_period = $this.getTComboBox( 'pay_period_id_2', 'global_Pay_period', TTAPI.APIPayPeriod );\n\n\t\t\tpay_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( pay_period, $.i18n._( 'Pay Period' ) );\n\n\t\t\t$this.visible_report_widgets.skill_expiry_date = time_period;\n\t\t\t$this.visible_report_widgets.pay_period_id_2 = pay_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tpay_period.setValue( defaultValue.pay_period_id );\n\t\t\t}\n\n\t\t\tform_input_div.append( v_box );\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 70 );\n\n\t\t}\n\n\t\tfunction buildDefaultUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_skill_expiry_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'skill_expiry_date', false, false );\n\n\t\t\tform_input_div.append( time_period );\n\n\t\t\ttime_period.setValue( value );\n\n\t\t\t$this.initSourceData( 'skill_expiry_date', time_period );\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\t$this.visible_report_widgets.skill_expiry_date = time_period;\n\n\t\t}\n\n\t\tfunction buildCustomDateUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_skill_expiry_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'skill_expiry_date', false, false );\n\t\t\t$this.initSourceData( 'skill_expiry_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar start_date = $this.getDatePicker( 'start_date_2' );\n\n\t\t\tvar end_date = $this.getDatePicker( 'end_date_2' );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tstart_date.setValue( defaultValue.start_date );\n\t\t\t\tend_date.setValue( defaultValue.end_date );\n\t\t\t}\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( start_date, $.i18n._( 'Start Date' ) );\n\t\t\tvar form_item3 = $this.putInputToInsideFormItem( end_date, $.i18n._( 'End Date' ) );\n\n\t\t\t$this.visible_report_widgets.skill_expiry_date = time_period;\n\t\t\t$this.visible_report_widgets.start_date_2 = start_date;\n\t\t\t$this.visible_report_widgets.end_date_2 = end_date;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tstart_date.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tend_date.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item3 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 70 );\n\n\t\t\tform_input_div.append( v_box );\n\n\t\t}\n\t}\n\n\tonMembershipRenewalDateChange( target, defaultValue ) {\n\n\t\tvar $this = this;\n\t\tvar value = target.getValue();\n\n\t\tthis.visible_report_widgets.membership_renewal_date = null;\n\t\tthis.visible_report_widgets.start_date_1 = null;\n\t\tthis.visible_report_widgets.end_date_1 = null;\n\t\tthis.visible_report_widgets.pay_period_id_1 = null;\n\t\tthis.visible_report_widgets.pay_period_schedule_id_1 = null;\n\n\t\tif ( value === 'custom_date' ) {\n\t\t\tbuildCustomDateUI();\n\t\t} else if ( value === 'custom_pay_period' ) {\n\t\t\tbuildPayPeriodUI();\n\t\t} else if ( value === 'this_pay_period' || value === 'last_pay_period' || value === 'to_last_pay_period' || value === 'to_this_pay_period' ) {\n\t\t\tbuildPayPeriodScheduleUI();\n\t\t} else {\n\t\t\tbuildDefaultUI();\n\t\t}\n\n\t\tfunction buildPayPeriodScheduleUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_membership_renewal_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'membership_renewal_date', false, false );\n\t\t\t$this.initSourceData( 'membership_renewal_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar pay_period = $this.getTComboBox( 'pay_period_schedule_id_1', 'global_pay_period_schedule', TTAPI.APIPayPeriodSchedule );\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( pay_period, $.i18n._( 'Pay Period Schedule' ) );\n\n\t\t\t$this.visible_report_widgets.membership_renewal_date = time_period;\n\t\t\t$this.visible_report_widgets.pay_period_schedule_id_1 = pay_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tpay_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tpay_period.setValue( defaultValue.pay_period_schedule_id );\n\t\t\t}\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 120 );\n\n\t\t\tform_input_div.append( v_box );\n\t\t}\n\n\t\tfunction buildPayPeriodUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_membership_renewal_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'membership_renewal_date', false, false );\n\t\t\t$this.initSourceData( 'membership_renewal_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar pay_period = $this.getTComboBox( 'pay_period_id_1', 'global_Pay_period', TTAPI.APIPayPeriod );\n\n\t\t\tpay_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( pay_period, $.i18n._( 'Pay Period' ) );\n\n\t\t\t$this.visible_report_widgets.membership_renewal_date = time_period;\n\t\t\t$this.visible_report_widgets.pay_period_id_1 = pay_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tpay_period.setValue( defaultValue.pay_period_id );\n\t\t\t}\n\n\t\t\tform_input_div.append( v_box );\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 70 );\n\n\t\t}\n\n\t\tfunction buildDefaultUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_membership_renewal_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'membership_renewal_date', false, false );\n\n\t\t\tform_input_div.append( time_period );\n\n\t\t\ttime_period.setValue( value );\n\n\t\t\t$this.initSourceData( 'membership_renewal_date', time_period );\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\t$this.visible_report_widgets.membership_renewal_date = time_period;\n\n\t\t}\n\n\t\tfunction buildCustomDateUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_membership_renewal_date_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( 'membership_renewal_date', false, false );\n\t\t\t$this.initSourceData( 'membership_renewal_date', time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar start_date = $this.getDatePicker( 'start_date_1' );\n\n\t\t\tvar end_date = $this.getDatePicker( 'end_date_1' );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tstart_date.setValue( defaultValue.start_date );\n\t\t\t\tend_date.setValue( defaultValue.end_date );\n\t\t\t}\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( start_date, $.i18n._( 'Start Date' ) );\n\t\t\tvar form_item3 = $this.putInputToInsideFormItem( end_date, $.i18n._( 'End Date' ) );\n\n\t\t\t$this.visible_report_widgets.membership_renewal_date = time_period;\n\t\t\t$this.visible_report_widgets.start_date_1 = start_date;\n\t\t\t$this.visible_report_widgets.end_date_1 = end_date;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tstart_date.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tend_date.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item3 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 62 );\n\n\t\t\tform_input_div.append( v_box );\n\n\t\t}\n\t}\n\n\tonTimePeriodChange( target, defaultValue ) {\n\t\tvar $this = this;\n\t\tvar value = target.getValue();\n\t\tvar field = target.getField();\n\t\tthis.visible_report_widgets[field] = null;\n\n\t\tif ( value === 'custom_date' ) {\n\t\t\tbuildCustomDateUI();\n\t\t} else if ( value === 'custom_pay_period' ) {\n\t\t\tbuildPayPeriodUI();\n\t\t} else if ( value === 'this_pay_period' || value === 'last_pay_period' || value === 'to_last_pay_period' || value === 'to_this_pay_period' || value === 'this_year_this_pay_period' || value === 'this_year_last_pay_period' ) {\n\t\t\tbuildPayPeriodScheduleUI();\n\t\t} else {\n\t\t\tbuildDefaultUI();\n\t\t}\n\n\t\tfunction buildPayPeriodScheduleUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_' + field + '_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( field, false, false );\n\t\t\t$this.initSourceData( field, time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar pay_period = $this.getTComboBox( 'pay_period_schedule_id', 'global_pay_period_schedule', TTAPI.APIPayPeriodSchedule );\n\t\t\tpay_period.attr( 'time_period_key', field );\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( pay_period, $.i18n._( 'Pay Period Schedule' ) );\n\n\t\t\t$this.visible_report_widgets[field] = time_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tpay_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tpay_period.setValue( defaultValue.pay_period_schedule_id );\n\t\t\t}\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 120 );\n\n\t\t\tform_input_div.append( v_box );\n\t\t}\n\n\t\tfunction buildPayPeriodUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_' + field + '_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( field, false, false );\n\t\t\t$this.initSourceData( field, time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar pay_period = $this.getTComboBox( 'pay_period_id', 'global_Pay_period', TTAPI.APIPayPeriod );\n\t\t\tpay_period.attr( 'time_period_key', field );\n\t\t\tpay_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( pay_period, $.i18n._( 'Pay Period' ) );\n\n\t\t\t$this.visible_report_widgets[field] = time_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tpay_period.setValue( defaultValue.pay_period_id );\n\t\t\t}\n\n\t\t\tform_input_div.append( v_box );\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 70 );\n\n\t\t}\n\n\t\tfunction buildDefaultUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_' + field + '_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( field, false, false );\n\n\t\t\tform_input_div.append( time_period );\n\n\t\t\ttime_period.setValue( value );\n\n\t\t\t$this.initSourceData( field, time_period );\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\t$this.visible_report_widgets[field] = time_period;\n\n\t\t}\n\n\t\tfunction buildCustomDateUI() {\n\t\t\tvar form_item_div = ( $this.edit_view ).find( '#report_' + field + '_div' );\n\t\t\tvar form_input_div = $( form_item_div.children()[1] );\n\t\t\tform_input_div.empty();\n\n\t\t\tvar v_box = $( '<div class=\\'v-box\\'></div>' );\n\n\t\t\tvar time_period = $this.getSimpleTComboBox( field, false, false );\n\t\t\t$this.initSourceData( field, time_period );\n\t\t\ttime_period.setValue( value );\n\n\t\t\tvar start_date = $this.getDatePicker( 'start_date' );\n\t\t\tvar end_date = $this.getDatePicker( 'end_date' );\n\t\t\tstart_date.attr( 'time_period_key', field );\n\t\t\tend_date.attr( 'time_period_key', field );\n\n\t\t\tif ( defaultValue ) {\n\t\t\t\tstart_date.setValue( defaultValue.start_date );\n\t\t\t\tend_date.setValue( defaultValue.end_date );\n\t\t\t}\n\n\t\t\tvar form_item = $this.putInputToInsideFormItem( time_period, $.i18n._( 'Section' ) );\n\t\t\tvar form_item2 = $this.putInputToInsideFormItem( start_date, $.i18n._( 'Start Date' ) );\n\t\t\tvar form_item3 = $this.putInputToInsideFormItem( end_date, $.i18n._( 'End Date' ) );\n\n\t\t\t$this.visible_report_widgets[field] = time_period;\n\n\t\t\ttime_period.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tstart_date.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tend_date.unbind( 'formItemChange' ).bind( 'formItemChange', function( e, target ) {\n\t\t\t\t$this.onFormItemChange( target );\n\t\t\t} );\n\n\t\t\tv_box.append( form_item );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item2 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\t\t\tv_box.append( form_item3 );\n\t\t\tv_box.append( '<div class=\\'clear-both-div\\'></div>' );\n\n\t\t\t$this.setEditFieldSize( v_box.find( '.edit-view-form-item-sub-label-div > span' ), 62 );\n\n\t\t\tform_input_div.append( v_box );\n\n\t\t}\n\t}\n\n\t//Override this if more than one tab\n\tsetErrorTips( result, dont_switch_tab ) {\n\t\tthis.clearErrorTips();\n\n\t\tvar details = result.getDetails();\n\t\tvar error_list = details[0];\n\n\t\tvar found_in_current_tab = false;\n\n\t\tvar tab_report = this.edit_view_tab.find( '#tab_report' );\n\t\tvar tab_setup = this.edit_view_tab.find( '#tab_setup' );\n\n\t\tfor ( var key in error_list ) {\n\n\t\t\tif ( !error_list.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( !_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.isSet */ .x.isSet( this.edit_view_ui_dic[key] ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif ( key === 'time_period' ||\n\t\t\t\tkey === 'membership_renewal_date' ||\n\t\t\t\tkey === 'skill_expiry_date' ||\n\t\t\t\tkey === 'license_expiry_date' ||\n\t\t\t\tkey === 'education_graduate_date'\n\t\t\t) {\n\t\t\t\tif ( this.visible_report_widgets[key] && this.visible_report_widgets[key].is( ':visible' ) ) {\n\t\t\t\t\tthis.visible_report_widgets[key].setErrorStyle( error_list[key], true );\n\t\t\t\t\tfound_in_current_tab = true;\n\t\t\t\t} else if ( this.visible_report_widgets[key] ) {\n\t\t\t\t\tthis.visible_report_widgets[key].setErrorStyle( error_list[key] );\n\t\t\t\t}\n\t\t\t\tthis.edit_view_error_ui_dic[key] = this.visible_report_widgets[key];\n\t\t\t} else {\n\t\t\t\tif ( this.edit_view_ui_dic[key].is( ':visible' ) ) {\n\n\t\t\t\t\tthis.edit_view_ui_dic[key].setErrorStyle( error_list[key], true );\n\t\t\t\t\tfound_in_current_tab = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.edit_view_ui_dic[key].setErrorStyle( error_list[key] );\n\t\t\t\t}\n\t\t\t\tthis.edit_view_error_ui_dic[key] = this.edit_view_ui_dic[key];\n\t\t\t}\n\n\t\t}\n\n\t\tif ( !found_in_current_tab ) {\n\n\t\t\tthis.showEditViewError( result );\n\n\t\t}\n\t}\n\n\tbuildSortSelectorUnSelectColumns( display_columns ) {\n\t\tvar fina_array = [];\n\t\tvar i = 100;\n\t\t$.each( display_columns, function( index, content ) {\n\t\t\tvar new_content = $.extend( {}, content );\n\t\t\tnew_content.id = i; //Need\n\t\t\tnew_content.sort = 'asc';\n\t\t\tfina_array.push( new_content );\n\t\t\ti = i + 1;\n\t\t} );\n\n\t\treturn fina_array;\n\t}\n\n\tsetEditViewWidgetsMode() {\n\t\tvar did_clean_dic = {};\n\t\tfor ( var key in this.edit_view_ui_dic ) {\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\twidget.css( 'opacity', 1 );\n\t\t\tvar column = widget.parent().parent().parent();\n\t\t\tvar tab_id = column.parent().attr( 'id' );\n\t\t\tif ( !column.hasClass( 'v-box' ) ) {\n\t\t\t\tif ( !did_clean_dic[tab_id] ) {\n\t\t\t\t\tdid_clean_dic[tab_id] = true;\n\t\t\t\t}\n\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.isSet */ .x.isSet( widget.setEnabled ) ) {\n\t\t\t\t\twidget.setEnabled( true );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tbuildReportUIBaseOnSetupFields() {\n\t\tvar setup_field = this.current_edit_record.setup_field;\n\t\tif ( setup_field && setup_field.length > 0 ) {\n\t\t\tthis.createUI( setup_field );\n\t\t}\n\t}\n\n\tgetFormValues() {\n\t\tvar other = {};\n\n\t\tother.page_orientation = this.current_edit_record.page_orientation;\n\t\tother.font_size = this.current_edit_record.font_size;\n\t\tother.auto_refresh = this.current_edit_record.auto_refresh;\n\t\tother.disable_grand_total = this.current_edit_record.disable_grand_total;\n\t\tother.maximum_page_limit = this.current_edit_record.maximum_page_limit;\n\t\tother.show_duplicate_values = this.current_edit_record.show_duplicate_values;\n\n\t\tif ( this.current_saved_report && _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.isSet */ .x.isSet( this.current_saved_report.name ) ) {\n\n\t\t\tother.report_name = this.current_saved_report.name;\n\t\t\tother.report_description = this.current_saved_report.description;\n\t\t}\n\n\t\treturn other;\n\t}\n\n\tgetChartValues() {\n\n\t\tvar chart = {};\n\n\t\tchart.enable = this.current_edit_record.enable;\n\t\tchart.display_mode = this.current_edit_record.display_mode;\n\t\tchart.type = this.current_edit_record.type;\n\t\tchart.include_sub_total = this.current_edit_record.include_sub_total;\n\t\tchart.axis_scale_static = this.current_edit_record.axis_scale_static;\n\t\tchart.combine_columns = this.current_edit_record.combine_columns;\n\n\t\treturn chart;\n\t}\n\n\tconvertSortValues( sort ) {\n\n\t\tvar result = [];\n\t\tfor ( var i = 0; i < sort.length; i++ ) {\n\t\t\tvar item = sort[i];\n\n\t\t\tif ( !_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.isSet */ .x.isSet( item.fullValue ) ) {\n\t\t\t\tresult = sort;\n\t\t\t\tbreak;\n\t\t\t} else {\n\t\t\t\tvar new_item = {};\n\t\t\t\tnew_item[item.value] = item.sort;\n\t\t\t\tresult.push( new_item );\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\taddOrderFix( report ) {\n\n\t\tvar new_report_fields = {};\n\n\t\tfor ( var key in report ) {\n\n\t\t\tif ( !report.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar order_fix = this.visible_report_widgets_order_fix[key];\n\n\t\t\tif ( order_fix > 0 ) {\n\t\t\t\tnew_report_fields['-' + order_fix + '-' + key] = report[key];\n\t\t\t}\n\t\t}\n\n\t\treturn new_report_fields;\n\t}\n\n\t//Make sure this.current_edit_record is updated before validate\n\tvalidate( synchronous ) {\n\t\tvar $this = this;\n\t\tvar other = this.getFormValues();\n\t\tvar chart = this.getChartValues();\n\n\t\t//#2293 - Refresh the report tab UI based on any changes to chart or setup tabs, or changes that hide and show fields will not validate properly.\n\t\tthis.buildReportUIBaseOnSetupFields();\n\n\t\tvar report = this.visible_report_values;\n\t\tif ( report.sort ) {\n\t\t\treport.sort = this.convertSortValues( report.sort );\n\t\t}\n\n\t\treport = this.addOrderFix( report );\n\n\t\tvar config = report;\n\t\tconfig['-' + 1000 + '-' + 'template'] = this.current_edit_record.template;\n\t\tconfig.other = other;\n\t\tconfig.chart = chart;\n\n\t\tif ( this.include_form_setup ) {\n\t\t\tconfig.form = this.getFormSetupData( true );\n\t\t}\n\n\t\tif ( report.sort ) {\n\t\t\treport.sort = this.convertSortValues( report.sort );\n\t\t}\n\n\t\tif ( !synchronous ) {\n\t\t\tthis.api['validateReport']( config, 'pdf', {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t$this.validateResult( result );\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\treturn null;\n\t\t} else {\n\t\t\t//#2293 - synchronous call to validation api allows us to return the value in realtime\n\t\t\tvar result = this.api['validateReport']( config, 'pdf', { async: false } );\n\t\t\tif ( result ) {\n\t\t\t\tthis.validateResult( result );\n\n\t\t\t\treturn result.getResult();\n\t\t\t}\n\t\t}\n\t}\n\n\tonViewExcelClick( message_override ) {\n\n\t\tvar config = this.getPostReportJson();\n\t\tvar post_data = { 0: config, 1: 'csv' };\n\n\t\tif ( this.include_form_setup ) {\n\n\t\t\tif ( this.show_empty_message ) {\n\t\t\t\tvar message = $.i18n._( 'Setup data for this report has not been completed yet. Please click on the Form Setup tab to do so now.' );\n\t\t\t\tif ( message_override ) {\n\t\t\t\t\tmessage = message_override;\n\t\t\t\t}\n\t\t\t\tTAlertManager.showAlert( message );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconfig.form = this.getFormSetupData( true );\n\t\t}\n\n\t\tthis.doFormIFrameCall( post_data );\n\n\t\tvar source = 'Excel'; // Backup value in case the url sm does not exist.\n\t\tif ( LocalCacheData.getAllURLArgs() && LocalCacheData.getAllURLArgs().sm ) {\n\t\t\tsource = LocalCacheData.getAllURLArgs().sm + '@Excel';\n\t\t}\n\t\t$().TFeedback( {\n\t\t\tsource: source,\n\t\t\tforce_source: true,\n\t\t\tdelay: 5000\n\t\t} );\n\t}\n\n\tgetVisibleReportValues() {\n\t\t//#2353 - cut out any zero uuid strings, they are likely --none-- in a multiselect\n\t\tfor ( var i in this.visible_report_values.filter ) {\n\t\t\tif ( this.visible_report_values.filter[i] == TTUUID.zero_id ) {\n\t\t\t\tdelete this.visible_report_values.filter[i];\n\t\t\t}\n\t\t}\n\t\treturn this.visible_report_values;\n\t}\n\n\tgetPostReportJson( noPreFix ) {\n\t\tvar other = this.getFormValues();\n\t\tvar chart = this.getChartValues();\n\t\tvar report = this.getVisibleReportValues();\n\n\t\tif ( report.sort ) {\n\t\t\treport.sort = this.convertSortValues( report.sort );\n\n\t\t\tif ( noPreFix ) { //no pre fix means save to userReport, use sort_ to match flex format\n\t\t\t\treport.sort_ = report.sort;\n\n\t\t\t\tdelete report.sort;\n\t\t\t}\n\n\t\t}\n\n\t\tif ( !noPreFix ) {\n\t\t\treport = this.addOrderFix( report );\n\t\t}\n\n\t\tvar config = report;\n\t\tif ( !noPreFix ) {\n\t\t\tconfig['-' + 1000 + '-' + 'template'] = this.current_edit_record.template;\n\t\t} else {\n\t\t\tconfig['template'] = this.current_edit_record.template;\n\t\t}\n\n\t\tconfig.other = other;\n\t\tconfig.chart = chart;\n\n\t\treturn config;\n\t}\n\n\t//Reports don't share many icons with other views, so override the entire function here.\n\tonContextMenuClick( context_btn, menu_name ) {\n\t\tProgressBar.showOverlay();\n\t\t//this flag is turned off in ProgressBarManager::closeOverlay, or 2s whichever happens first\n\t\tif ( window.clickProcessing == true ) {\n\t\t\treturn;\n\t\t} else {\n\t\t\twindow.clickProcessing = true;\n\t\t\twindow.clickProcessingHandle = window.setTimeout( function() {\n\t\t\t\tif ( window.clickProcessing == true ) {\n\t\t\t\t\twindow.clickProcessing = false;\n\t\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\t\tTTPromise.wait();\n\t\t\t\t}\n\t\t\t}, 1000 );\n\t\t}\n\t\tvar id;\n\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.isSet */ .x.isSet( menu_name ) ) {\n\t\t\tid = menu_name;\n\t\t} else {\n\n\t\t\tif ( context_btn.disabled ) {\n\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tswitch ( id ) {\n\t\t\tcase 'view':\n\t\t\t\tProgressBar.showOverlay();\n\t\t\t\tthis.onViewClick();\n\t\t\t\tbreak;\n\t\t\tcase 'view_html':\n\t\t\t\tProgressBar.showOverlay();\n\t\t\t\tthis.onViewClick( 'html' );\n\t\t\t\tbreak;\n\t\t\tcase 'view_html_new_window':\n\t\t\t\tProgressBar.showOverlay();\n\t\t\t\tthis.onViewClick( 'html', true );\n\t\t\t\tbreak;\n\t\t\tcase 'export_excel':\n\t\t\t\tthis.onViewExcelClick();\n\t\t\t\tbreak;\n\t\t\tcase 'cancel':\n\t\t\t\tthis.onCancelClick();\n\t\t\t\tbreak;\n\t\t\tcase 'save_existed_report': //All report view\n\t\t\t\tthis.onSaveExistedReportClick();\n\t\t\t\tbreak;\n\t\t\tcase 'save_new_report': //All report view\n\t\t\t\tthis.onSaveNewReportClick();\n\t\t\t\tbreak;\n\t\t\tcase 'save_setup': //All report view\n\t\t\t\tthis.onSaveSetup();\n\t\t\t\tbreak;\n\t\t\tcase 'view_form': //All report view\n\t\t\t\tthis.onViewClick( 'pdf_form' );\n\t\t\t\tbreak;\n\t\t\tcase 'e_file': //All report view\n\t\t\t\tthis.onViewClick( 'efile' );\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet_view': //All report view\n\t\t\t\tthis.onViewClick( 'pdf_timesheet' );\n\t\t\t\tbreak;\n\t\t\tcase 'timesheet_view_detail': //All report view\n\t\t\t\tthis.onViewClick( 'pdf_timesheet_detail' );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\tthis.onCustomContextClick( id, context_btn );\n\t\t\t\tbreak;\n\t\t}\n\t\t_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.triggerAnalyticsContextMenuClick */ .x.triggerAnalyticsContextMenuClick( context_btn, menu_name );\n\t}\n\n\tonSaveSetup( label ) {\n\t\tvar $this = this;\n\t\tvar form_setup = this.getFormSetupData();\n\n\t\tif ( label == undefined ) {\n\t\t\tlabel = $.i18n._( 'Form setup' );\n\t\t}\n\n\t\t//Allows saving of all export config data for all export formats at once in PayrollExport\n\t\tif ( this.save_export_setup_data != undefined ) {\n\t\t\tform_setup = this.save_export_setup_data;\n\t\t}\n\n\t\t//do this before the api call for speed to stop #\n\t\t$this.show_empty_message = false;\n\t\t$this.form_setup_changed = false;\n\n\t\tif ( form_setup ) { //Don't save if form_setup is false.\n\t\t\tthis.api.setCompanyFormConfig( form_setup, {\n\t\t\t\tonResult: function( result ) {\n\n\t\t\t\t\tif ( result.isValid() ) {\n\n\t\t\t\t\t\tTAlertManager.showAlert( label + ' ' + $.i18n._( 'has been saved successfully' ) );\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$this.show_empty_message = true;\n\t\t\t\t\t\t$this.form_setup_changed = true;\n\t\t\t\t\t\tTAlertManager.showAlert( label + ' ' + $.i18n._( 'save failed, please try again' ) );\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\tTAlertManager.showAlert( label + ' ' + $.i18n._( 'invalid, please try again' ) );\n\t\t}\n\t}\n\n\tgetFormSetupData() {\n\t\t//Always need override\n\t}\n\n\tonViewClick( key, new_window, message_override ) {\n//\t\tGlobal.loadPage('temp_page.html',function(result){\n//\t\t\tIndexViewController.openizard( 'ReportViewWizard', result);\n//\t\t});\n\t\tif ( !key ) {\n\t\t\tkey = 'pdf';\n\t\t}\n\n\t\t//#2293 - make validation call synchronously to stop the report from being shown if it fails.\n\t\tif ( !this.validate( true ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar config = this.getPostReportJson();\n\t\tvar post_data = { 0: config, 1: key };\n\t\tif ( this.include_form_setup ) {\n\t\t\tif ( this.show_empty_message ) {\n\t\t\t\tvar message = $.i18n._( 'Setup data for this report has not been completed yet. Please click on the Form Setup tab to do so now.' );\n\t\t\t\tif ( message_override ) {\n\t\t\t\t\tmessage = message_override;\n\t\t\t\t}\n\t\t\t\tTAlertManager.showAlert( message );\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconfig.form = this.getFormSetupData( true );\n\t\t}\n\n//\t\tif ( key === 'pdf' ) {\n//\t\t\tthis.doFormIFrameCall( post_data );\n//\t\t}\n\t\tif ( key === 'html' ) {\n\t\t\tvar url = ServiceCaller.getAPIURL( 'Class=' + this.api.className + '&Method=' + 'get' + this.api.key_name + '&v=2' );\n\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getStationID */ .x.getStationID() ) {\n\t\t\t\turl = url + '&StationID=' + _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.getStationID */ .x.getStationID();\n\t\t\t}\n\t\t\tvar message_id = TTUUID.generateUUID();\n\t\t\turl = url + '&MessageID=' + message_id;\n\n\t\t\tvar refresh_request = '<script>';\n\t\t\trefresh_request += 'function getCookie( name ) {';\n\t\t\trefresh_request += '\tvar name = name + \"=\";';\n\t\t\trefresh_request += '\tvar split_cookie = document.cookie.split( \";\" );';\n\t\t\trefresh_request += '\tfor ( var i = 0; i < split_cookie.length; i++ ) {';\n\t\t\trefresh_request += '\t\tvar tmp_cookie = split_cookie[i].trim();';\n\t\t\trefresh_request += '';\n\t\t\trefresh_request += '\t\tif ( tmp_cookie.indexOf( name ) === 0 ) {';\n\t\t\trefresh_request += '\t\t\treturn tmp_cookie.substring( name.length, tmp_cookie.length );';\n\t\t\trefresh_request += '\t\t}';\n\t\t\trefresh_request += '\t}';\n\t\t\trefresh_request += '\treturn \"\"';\n\t\t\trefresh_request += '}';\n\t\t\trefresh_request += '';\n\t\t\trefresh_request += 'var timeout_handler;';\n\t\t\trefresh_request += 'var post_data;';\n\t\t\trefresh_request += 'function startRefreshReport() {';\n\t\t\trefresh_request += '\tif ( typeof( auto_refresh_time ) !== \"undefined\" && auto_refresh_time > 0 ) {';\n\t\t\trefresh_request += '\t\ttimeout_handler = setTimeout( \"refreshReport()\", ( auto_refresh_time * 1000 ) );';\n\t\t\trefresh_request += '\t}';\n\t\t\trefresh_request += '}';\n\t\t\trefresh_request += '';\n\t\t\trefresh_request += 'function refreshReport() {';\n\t\t\trefresh_request += '\ttry {';\n\t\t\trefresh_request += '\t\t$.ajax({';\n\t\t\trefresh_request += '\t\t\tdataType: \"JSON\",';\n\t\t\trefresh_request += '\t\t\tdata: { json: JSON.stringify( post_data ) },';\n\t\t\trefresh_request += ' headers: { \"X-Client-ID\": \"Browser-TimeTrex\", \"X-CSRF-Token\": getCookie( \"CSRF-Token\" ) },';\n\t\t\trefresh_request += '\t\t\ttype: \"POST\",';\n\t\t\trefresh_request += ' url: \"' + url + '\",';\n\t\t\trefresh_request += '\t\t\tsuccess: function(result) {';\n\t\t\trefresh_request += '\t\t\tif(console){ console.log( \"Auto refreshing report: Seconds: \"+ auto_refresh_time +\" Current Time: \"+ Date() ) }';\n\t\t\trefresh_request += '\t\t\tvar newDoc = result.api_retval + $(\"body\").children(\":last\")[0].outerHTML; document.open(\"text/html\"); document.write(newDoc); document.close(); ';\n\t\t\trefresh_request += '\t\t\t}';\n\t\t\trefresh_request += '\t\t})';\n\t\t\trefresh_request += '\t} catch(e) {}';\n\t\t\trefresh_request += '}';\n\t\t\trefresh_request += 'startRefreshReport();';\n\t\t\trefresh_request += '';\n\t\t\trefresh_request += '$( \"body\" ).mousemove( function( e ) {';\n\t\t\trefresh_request += '\twindow.parent.Global.doPingIfNecessary()';\n\t\t\trefresh_request += '} );';\n\t\t\trefresh_request += '<\/script>';\n\n\t\t\tthis.api['get' + this.api.key_name]( config, key, {\n\t\t\t\tonResult: function( res ) {\n\t\t\t\t\tvar result = res.getResult();\n\t\t\t\t\tif ( result ) {\n\t\t\t\t\t\tif ( _global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.isEmpty */ .x.isEmpty( result ) === false ) {\n\t\t\t\t\t\t\tresult = result + refresh_request;\n\t\t\t\t\t\t\tif ( new_window ) {\n\t\t\t\t\t\t\t\tvar w = window.open();\n\t\t\t\t\t\t\t\tw.post_data = post_data;\n\t\t\t\t\t\t\t\tw.document.writeln( result );\n\t\t\t\t\t\t\t\tw.document.close();\n\t\t\t\t\t\t\t} else if ( result ) {\n\t\t\t\t\t\t\t\tvar report_data = { post_data: post_data, result: result };\n\t\t\t\t\t\t\t\tIndexViewController.openWizard( 'ReportViewWizard', report_data );\n\t\t\t\t\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tTAlertManager.showAlert( $.i18n._( 'NO DATA MATCHES CRITERIA', LocalCacheData.getApplicationName() ), $.i18n._( 'NOTICE' ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tTAlertManager.showErrorAlert( res );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} else if ( key === 'pdf_form_publish_employee' ) {\n\t\t\tthis.api['get' + this.api.key_name]( config, key, {\n\t\t\t\tonResult: function( result ) {\n\t\t\t\t\tvar retval = result.getResult();\n\t\t\t\t\tif ( retval ) {\n\t\t\t\t\t\tUserGenericStatusWindowController.open( retval, LocalCacheData.getLoginUser().id, function() {\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tTAlertManager.showAlert( $.i18n._( 'NO DATA MATCHES CRITERIA', LocalCacheData.getApplicationName() ), $.i18n._( 'NOTICE' ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} );\n\t\t} else {\n\t\t\tthis.doFormIFrameCall( post_data );\n\t\t\tProgressBar.closeOverlay();\n\n\t\t\tvar source = 'PDF'; // Backup value in case the url sm does not exist.\n\t\t\tif ( LocalCacheData.getAllURLArgs() && LocalCacheData.getAllURLArgs().sm ) {\n\t\t\t\tsource = LocalCacheData.getAllURLArgs().sm + '@PDF';\n\t\t\t}\n\t\t\t$().TFeedback( {\n\t\t\t\tsource: source,\n\t\t\t\tforce_source: true,\n\t\t\t\tdelay: 5000\n\t\t\t} );\n\t\t}\n\t}\n\n\tprocessTransactions( key ) {\n\t\tvar args = this.getPostReportJson( true );\n\t\tvar post_data = { 0: { filter_data: args }, 1: true, 2: key };\n\t\tvar pay_stub_api = TTAPI.APIPayStub;\n\t\tvar url = ServiceCaller.getAPIURL( 'Class=' + pay_stub_api.className + '&Method=' + 'get' + pay_stub_api.key_name );\n\t\t_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.APIFileDownload */ .x.APIFileDownload( pay_stub_api.className, pay_stub_api.key_name, post_data, url );\n\t}\n\n\tsetEditMenuViewIcon( context_btn, pId ) {\n\t}\n\n\tdoFormIFrameCall( postData ) {\n\n\t\tvar url = ServiceCaller.getAPIURL( 'Class=' + this.api.className + '&Method=' + 'get' + this.api.key_name );\n\n\t\t_global_Global__WEBPACK_IMPORTED_MODULE_1__/* .Global.APIFileDownload */ .x.APIFileDownload( this.api.className, this.api.key_name, postData, url );\n\t}\n\n\tonSaveNewReportClick() {\n\t\tvar $this = this;\n\t\tvar config = this.getPostReportJson( true );\n\t\tvar select_field = this.current_edit_record.setup_field;\n\n\t\tif ( config.template ) {\n\t\t\tselect_field.unshift( 'template' );\n\t\t}\n\n\t\tvar report_data = {};\n\t\treport_data.data = {};\n\t\treport_data.data.config = config;\n\t\treport_data.data.template = select_field;\n\t\treport_data.script = this.script_name;\n\n\t\tif ( !this.sub_saved_report_view_controller ) {\n\t\t\tthis.initSubSavedReportView( function() {\n\t\t\t\t$this.sub_saved_report_view_controller.edit_only_mode = true;\n\t\t\t\t$this.sub_saved_report_view_controller.onAddClick( report_data );\n\t\t\t} );\n\t\t} else {\n\t\t\t$this.sub_saved_report_view_controller.edit_only_mode = true;\n\t\t\t$this.sub_saved_report_view_controller.buildContextMenu( true );\n\t\t\t$this.sub_saved_report_view_controller.onAddClick( report_data );\n\t\t}\n\t}\n\n\tonSaveExistedReportClick() {\n\t\tvar $this = this;\n\t\tvar config = this.getPostReportJson( true );\n\t\tvar select_field = this.current_edit_record.setup_field;\n\n\t\tif ( config.template ) {\n\t\t\tselect_field.unshift( 'template' );\n\t\t}\n\n\t\tvar report_data = this.current_saved_report;\n\n\t\tif ( !report_data ) {\n\t\t\treport_data = {};\n\t\t}\n\n\t\treport_data.data = {};\n\t\treport_data.data.config = config;\n\t\treport_data.data.template = select_field;\n\n\t\tif ( !report_data.script ) {\n\t\t\treport_data.script = this.script_name;\n\t\t}\n\n\t\tif ( !this.sub_saved_report_view_controller ) {\n\t\t\tthis.initSubSavedReportView( function() {\n\t\t\t\t$this.sub_saved_report_view_controller.edit_only_mode = true;\n\t\t\t\t$this.sub_saved_report_view_controller.onAddClick( report_data );\n\t\t\t} );\n\t\t} else {\n\t\t\t$this.sub_saved_report_view_controller.edit_only_mode = true;\n\t\t\t$this.sub_saved_report_view_controller.buildContextMenu( true );\n\t\t\t$this.sub_saved_report_view_controller.onAddClick( report_data );\n\t\t}\n\t}\n\n\tonSaveDoneCallback( result, current_edit_record ) {\n\t\tvar new_id = result.getResult();\n\n\t\tif ( TTUUID.isUUID( new_id ) == false && current_edit_record && current_edit_record.id ) {\n\t\t\tnew_id = current_edit_record.id;\n\t\t}\n\t\tthis.refreshNav( new_id );\n\t}\n\n\trefreshNav( newId ) {\n\n\t\tvar $this = this;\n\n\t\tthis.navigation.setSourceData( null );\n\n\t\t$this.getReportData( function( result ) {\n\t\t\t// Waiting for the TTAPI.API returns data to set the current edit record.\n\n\t\t\tif ( result && result.length > 0 ) {\n\n\t\t\t\tif ( TTUUID.isUUID( newId ) ) {\n\t\t\t\t\tfor ( var i = 0; i < result.length; i++ ) {\n\t\t\t\t\t\tvar item = result[i];\n\n\t\t\t\t\t\tif ( item.id === newId ) {\n\t\t\t\t\t\t\t$this.current_saved_report = result[i];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\t\t\t\t\t$this.current_saved_report = $this.getDefaultReport( result );\n\t\t\t\t}\n\n\t\t\t\t$this.saved_report_array = result;\n\t\t\t} else {\n\t\t\t\t$this.current_saved_report = null;\n\t\t\t\t$this.saved_report_array = [];\n\t\t\t}\n\n\t\t\t$this.current_edit_record = {};\n\t\t\t$this.visible_report_values = {};\n\n\t\t\t$this.initEditView();\n\n\t\t} );\n\t}\n\n\tprocessFormSetupDataAndAddToBatch( response_data, form_data_map ) {\n\t\t//This is used to group form setup data by API so that we can do a single API call instead of one for every field.\n\t\t//The API call retrieves the real form data that is displayed when a dropdown has only one record. Data with more than 1 record or with no API\n\t\t//is set immediately as they do not require data from the server. Otherwise this returns an array of batched record IDs\n\t\t//that will be sent to the server with getBatchedRealFormDataFromAPI().\n\t\tlet batch_get_real_data = {};\n\t\tif ( response_data ) {\n\t\t\tfor ( let i = 0; i < form_data_map.length; i++ ) {\n\t\t\t\tif ( form_data_map[i].data && typeof form_data_map[i].data === 'object' && form_data_map[i].api ) {\n\t\t\t\t\tfor ( let key in form_data_map[i].data ) {\n\t\t\t\t\t\tlet field_name = form_data_map[i].field_key + '_' + key;\n\t\t\t\t\t\tif ( form_data_map[i].api && form_data_map[i].data[key] !== false && form_data_map[i].api && form_data_map[i].data[key].length === 1 ) {\n\t\t\t\t\t\t\tif ( !batch_get_real_data[form_data_map[i].api.className] ) {\n\t\t\t\t\t\t\t\tbatch_get_real_data[form_data_map[i].api.className] = {\n\t\t\t\t\t\t\t\t\tmethod: form_data_map[i].api_method,\n\t\t\t\t\t\t\t\t\trecords: []\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbatch_get_real_data[form_data_map[i].api.className].records.push( {\n\t\t\t\t\t\t\t\tfield: field_name,\n\t\t\t\t\t\t\t\tid: form_data_map[i].data[key][0]\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.edit_view_ui_dic[field_name].setValue( form_data_map[i].data[key] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.current_edit_record[field_name] = form_data_map[i].data[key];\n\t\t\t\t\t}\n\t\t\t\t} else if ( form_data_map[i].data !== undefined ) {\n\t\t\t\t\tthis.edit_view_ui_dic[form_data_map[i].field_key].setValue( form_data_map[i].data );\n\t\t\t\t\tthis.current_edit_record[form_data_map[i].field_key] = form_data_map[i].data;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn batch_get_real_data;\n\t}\n\n\tgetBatchedRealFormDataFromAPI( batch_data ) {\n\t\tif ( Object.keys( batch_data ).length > 0 ) {\n\t\t\tlet $this = this;\n\t\t\tfor ( let api in batch_data ) {\n\t\t\t\tlet data = {};\n\t\t\t\t//Get paystub entry account ids and remove duplicate values\n\t\t\t\tdata.filter_data = {\n\t\t\t\t\tid: _.uniq( batch_data[api].records.map( ( obj ) => {\n\t\t\t\t\t\treturn obj.id;\n\t\t\t\t\t} ) )\n\t\t\t\t};\n\n\t\t\t\tTTAPI[api][batch_data[api].method]( data, {\n\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\tlet result = res.getResult();\n\n\t\t\t\t\t\tif ( result && Array.isArray( result ) ) {\n\t\t\t\t\t\t\t//Loop through batch not api results, as results will not contain duplicate values\n\t\t\t\t\t\t\t//which would result in skipping setting fields that have the duplicate account entry id selected.\n\t\t\t\t\t\t\tfor ( let i = 0; i < batch_data[api].records.length; i++ ) {\n\t\t\t\t\t\t\t\tlet result_data = result.find( data => data.id === batch_data[api].records[i].id );\n\t\t\t\t\t\t\t\t//Issue #3130 - Deleted records that are still set on the field would cause an error. Do not set undefined to the field.\n\t\t\t\t\t\t\t\tif ( result_data !== undefined ) {\n\t\t\t\t\t\t\t\t\tif ( $this.edit_view_ui_dic[batch_data[api].records[i].field].getAllowMultipleSelection() === true ) {\n\t\t\t\t\t\t\t\t\t\t$this.edit_view_ui_dic[batch_data[api].records[i].field].setValue( [result_data] );\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t$this.edit_view_ui_dic[batch_data[api].records[i].field].setValue( result );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t}\n\n\t//#2543 - fixing disconnected menu leading to page_orientation JavaScript exception\n\t//This caused a bug that if you go to Dashboard, then Report -> TimeSheet Report, then click the X at the top right, the ribbon menu would get out of sync and have the last \"Help\" top level menu selected.\n\t// onCloseIconClick: function() {\n\t// \tif ( LocalCacheData.current_open_sub_controller ) {\n\t// \t\tLocalCacheData.current_open_sub_controller.onCancelClick();\n\t// \t} else {\n\t// \t\tvar $this = this;\n\t// \t\tthis.onCancelClick( null, null, function() {\n\t// \t\t\tif ( !this.edit_view ) {\n\t// \t\t\t\t$this.parent_view_controller.buildContextMenu();\n\t// \t\t\t\t$this.parent_view_controller.setDefaultMenu();\n\t// \t\t\t\t//$this.onCancelClick();\n\t// \t\t\t} else {\n\t// \t\t\t\t$this.buildEditMenu();\n\t// \t\t\t}\n\t// \t\t} );\n\t// \t}\n\t// }\n\n}\n\nReportBaseViewController.ReportMissedField = null;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxFQUFFLENBQUM7QUFDSCxFQUFFLENBQUM7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLCtGQUF3QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksK0ZBQXdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLCtGQUF3QjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQSxXQUFXLHVFQUFZO0FBQ3ZCO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlLDZGQUF1Qjs7QUFFdEMsc0JBQXNCLGVBQWU7O0FBRXJDO0FBQ0E7O0FBRUE7QUFDQSxlQUFlLDZGQUF1Qjs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0EsZUFBZSw2RkFBdUI7O0FBRXRDO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7O0FBRUE7O0FBRUEsZUFBZSw2RkFBdUI7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0EsZUFBZSw2RkFBdUI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBOztBQUVBLFFBQVEsdUVBQVk7QUFDcEI7QUFDQTs7QUFFQSxlQUFlLDZGQUF1Qjs7QUFFdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBOztBQUVBO0FBQ0EsZUFBZSw2RkFBdUI7O0FBRXRDO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksMkZBQXNCO0FBQ2xDOztBQUVBO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksMkZBQXNCO0FBQ2xDOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWSwyRkFBc0I7QUFDbEM7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxZQUFZLDJGQUFzQjtBQUNsQzs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksMkZBQXNCO0FBQ2xDOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsWUFBWSwyRkFBc0I7QUFDbEM7O0FBRUE7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksMkZBQXNCO0FBQ2xDOztBQUVBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDJGQUFzQjtBQUNsQzs7QUFFQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFVBQVU7QUFDL0I7QUFDQTtBQUNBLGFBQWEsNkZBQXVCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFD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QUNBLFNBQVMsQ0FBQztBQUNWO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0NBQW9DO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7O0FBRUE7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmZhY2UvaHRtbDUvdmlld3MvcmVwb3J0cy9SZXBvcnRCYXNlVmlld0NvbnRyb2xsZXIuanM/YjQxMyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVmlld0NvbnRyb2xsZXIgfSBmcm9tICdAL3ZpZXdzL0Jhc2VWaWV3Q29udHJvbGxlcic7XG5pbXBvcnQgeyBHbG9iYWwgfSBmcm9tICdAL2dsb2JhbC9HbG9iYWwnO1xuXG5leHBvcnQgY2xhc3MgUmVwb3J0QmFzZVZpZXdDb250cm9sbGVyIGV4dGVuZHMgQmFzZVZpZXdDb250cm9sbGVyIHtcblx0Y29uc3RydWN0b3IoIG9wdGlvbnMgPSB7fSApIHtcblx0XHRfLmRlZmF1bHRzKCBvcHRpb25zLCB7XG5cdFx0XHR2aWV3X2ZpbGU6ICcnLFxuXG5cdFx0XHRwYWdlX29yaWVudGF0aW9uX2FycmF5OiBudWxsLFxuXHRcdFx0Zm9udF9zaXplX2FycmF5OiBudWxsLFxuXHRcdFx0YXV0b19yZWZyZXNoX2FycmF5OiBudWxsLFxuXHRcdFx0Y2hhcnRfZGlzcGxheV9tb2RlX2FycmF5OiBudWxsLFxuXHRcdFx0Y2hhcnRfdHlwZV9hcnJheTogbnVsbCxcblx0XHRcdHRlbXBsYXRlc19hcnJheTogbnVsbCxcblx0XHRcdHNldHVwX2ZpZWxkc19hcnJheTogbnVsbCxcblxuXHRcdFx0bG9nX2FjdGlvbl9pZF9hcnJheTogbnVsbCxcblxuXHRcdFx0bG9nX3RhYmxlX25hbWVfaWRfYXJyYXk6IG51bGwsXG5cblx0XHRcdHRpbWVfcGVyaW9kX2FycmF5OiBudWxsLFxuXG5cdFx0XHR2aXNpYmxlX3JlcG9ydF93aWRnZXRzOiBudWxsLFxuXG5cdFx0XHR2aXNpYmxlX3JlcG9ydF92YWx1ZXM6IG51bGwsXG5cblx0XHRcdHZpc2libGVfcmVwb3J0X3dpZGdldHNfb3JkZXJfZml4OiBudWxsLFxuXG5cdFx0XHRzdGF0dXNfaWRfYXJyYXk6IG51bGwsXG5cblx0XHRcdGFwaV91c2VyX3JlcG9ydDogbnVsbCxcblxuXHRcdFx0Y3VycmVudF9zYXZlZF9yZXBvcnQ6IG51bGwsIC8vIEN1cnJlbnQgc2F2ZWQgcmVwb3J0IGlmIGFueVxuXG5cdFx0XHRzYXZlZF9yZXBvcnRfYXJyYXk6IG51bGwsXG5cblx0XHRcdHN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyOiBudWxsLFxuXG5cdFx0XHRzdWJfY3VzdG9tX2NvbHVtbl92aWV3X2NvbnRyb2xsZXI6IG51bGwsXG5cblx0XHRcdG5lZWRfcmVmcmVzaF9kaXNwbGF5X2NvbHVtbnM6IGZhbHNlLCAvL1doZW4gY3VzdG9tIGNvbHVtbiBjaGFuZ2VkLiBTZXQgdGhpcyB0byB0cnVlLlxuXG5cdFx0XHRSZXBvcnRNaXNzZWRGaWVsZDogbnVsbCxcblxuXHRcdFx0aW5jbHVkZV9mb3JtX3NldHVwOiBmYWxzZSxcblxuXHRcdFx0c2hvd19lbXB0eV9tZXNzYWdlOiBmYWxzZSxcblxuXHRcdFx0ZG9fdmFsaWRhdGVfYWZ0ZXJfY3JlYXRlX3VpOiBmYWxzZSwgLy9EbyB2YWxpZGF0ZSBpZiB0aGVyZSBpcyBhIHNhdmVkIHJlcG9ydFxuXG5cdFx0XHRmb3JtX3NldHVwX2NoYW5nZWQ6IGZhbHNlXG5cdFx0fSApO1xuXG5cdFx0c3VwZXIoIG9wdGlvbnMgKTtcblx0fVxuXG5cdHByZUluaXQoIG9wdGlvbnMgKSB7XG5cdFx0dGhpcy5wcmVJbml0UmVwb3J0KCk7XG5cdH1cblxuXHRpbml0KCBvcHRpb25zICkge1xuXHRcdC8vSW5pdGlhbGl6ZSB0aGlzLnJlYWxfdGhpcyB3aXRob3V0IGhhdmluZyB0byBjYWxsIF9zdXBlcixcblx0XHQvL3RoaXMgYXZvaWRzIE1heGltdW0gc3RhY2sgc2l6ZSBlcnJvcnMgaW4gb3RoZXIgZnVuY3Rpb25zIHRoYXQgY2FsbCBfc3VwZXIuIENvcGllZCBmcm9tIF9fc3VwZXIuXG5cdFx0dGhpcy5yZWFsX3RoaXMgPSB0aGlzLmNvbnN0cnVjdG9yLl9fc3VwZXJfXztcblxuXHRcdHRoaXMucGVybWlzc2lvbl9pZCA9ICdyZXBvcnQnO1xuXG5cdFx0TG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX3JlcG9ydF9jb250cm9sbGVyID0gdGhpcztcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHQkdGhpcy5hcGlfdXNlcl9yZXBvcnQgPSBUVEFQSS5BUElVc2VyUmVwb3J0RGF0YTtcblx0XHQkdGhpcy5pbml0UmVwb3J0KCk7XG5cdFx0Ly8gdGhpcy5idWlsZENvbnRleHRNZW51KCk7IC8vICNWdWVDb250ZXh0TWVudSNFZGl0T25seSAtIENvbW1lbnRlZCBvdXQgYXMgbXVzdCBoYXBwZW4gYWZ0ZXIgaW5pdEVkaXRWaWV3VUlcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ1JlcG9ydHMnLCAnb3BlblJlcG9ydCcgKTtcblx0XHQkdGhpcy5wb3N0SW5pdFJlcG9ydCgpO1xuXHR9XG5cblx0Ly8gUmVtb3ZlZCBiZWNhdXNlIHRoZSByZXF1aXJlIGNhbGxiYWNrIGluIGluaXQoKSBzZXJ2ZXMgdGhpcyBmdW5jdGlvbiBhbmQgY2FsbHMgcG9zdEluaXRSZXBvcnQoKSBhdCB0aGUgcHJvcGVyIHRpbWUuXG5cdC8vIHBvc3RJbml0OiBmdW5jdGlvbigpe1xuXHQvLyB9LFxuXG5cdHByZUluaXRSZXBvcnQoIG9wdGlvbnMgKSB7XG5cdH1cblxuXHRpbml0UmVwb3J0KCBvcHRpb25zICkge1xuXHR9XG5cblx0cG9zdEluaXRSZXBvcnQoIG9wdGlvbnMgKSB7XG5cdH1cblxuXHRyZW5kZXIoKSB7XG5cdH1cblxuXHQvLyBOZWVkIGFsd2F5cyBvdmVycmlkZSBpZiByZXBvcnQgaGFzIGZpbHRlciBmaWVsZC5cblx0cHJvY2Vzc0ZpbHRlckZpZWxkKCkge1xuXHR9XG5cblx0Z2V0RGVmYXVsdFJlcG9ydCggZGF0YSApIHtcblx0XHR2YXIgaXRlbSA9IF8uZmluZCggZGF0YSwgZnVuY3Rpb24oIGl0ZW0gKSB7XG5cdFx0XHRyZXR1cm4gaXRlbS5pc19kZWZhdWx0ID09PSB0cnVlO1xuXHRcdH0gKTtcblx0XHRkYXRhICYmIGRhdGEubGVuZ3RoID4gMCAmJiAhaXRlbSAmJiAoIGl0ZW0gPSBkYXRhWzBdICk7XG5cblx0XHRyZXR1cm4gaXRlbTtcblx0fVxuXG5cdC8vIG92ZXJyaWRlcyBCYXNlVmlld0NvbnRyb2xsZXIuZ2V0RGVmYXVsdENvbnRleHRNZW51TW9kZWwoKVxuXHRnZXREZWZhdWx0Q29udGV4dE1lbnVNb2RlbCgpIHtcblxuXHRcdHZhciBkZWZhdWx0X2NvbnRleHRfbWVudV9tb2RlbCA9IHtcblx0XHRcdC8vIG9ubHkgcHV0IGdyb3VwcyB0aGF0IGFyZSB1c2VkIGluIGRlZmF1bHQgaGVyZSwgb3RoZXJzIGdvIGluIHRoZSByZWxldmFudCB2aWV3IGNvbnRyb2xsZXIgdG8gYXZvaWQgY29uZnVzaW9uIG9uIHdoaWNoIGFyZSBvYnNvbGV0ZS5cblx0XHRcdGdyb3Vwczoge1xuXHRcdFx0XHRlZGl0b3I6IHtcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdFZGl0b3InICksXG5cdFx0XHRcdFx0aWQ6ICdlZGl0b3InXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHNhdmVkX3JlcG9ydDoge1xuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1NhdmVkIFJlcG9ydCcgKSxcblx0XHRcdFx0XHRpZDogdGhpcy52aWV3SWQgKyAnU2F2ZWRSZXBvcnQnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdCdpY29ucyc6IHt9XG5cdFx0fTtcblxuXHRcdGRlZmF1bHRfY29udGV4dF9tZW51X21vZGVsWydpY29ucyddWyd2aWV3X2h0bWwnXSA9IHtcblx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1ZpZXcnICksXG5cdFx0XHRpZDogJ3ZpZXdfaHRtbCcsXG5cdFx0XHRhY3Rpb25fZ3JvdXA6ICd2aWV3Jyxcblx0XHRcdGdyb3VwOiAnZWRpdG9yJyxcblx0XHRcdHZ1ZV9pY29uOiAndHRpY29uIHR0aWNvbi12aXNpYmlsaXR5X2JsYWNrXzI0ZHAnLFxuXHRcdFx0c2hvd19vbl9yaWdodF9jbGljazogdHJ1ZSxcblx0XHR9O1xuXG5cdFx0ZGVmYXVsdF9jb250ZXh0X21lbnVfbW9kZWxbJ2ljb25zJ11bJ3ZpZXcnXSA9IHtcblx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1BERicgKSxcblx0XHRcdGlkOiAndmlldycsXG5cdFx0XHRhY3Rpb25fZ3JvdXA6ICd2aWV3Jyxcblx0XHRcdGdyb3VwOiAnZWRpdG9yJyxcblx0XHRcdHZ1ZV9pY29uOiAndHRpY29uIHR0aWNvbi1waWN0dXJlX2FzX3BkZl9ibGFja18yNGRwJyxcblx0XHR9O1xuXG5cdFx0ZGVmYXVsdF9jb250ZXh0X21lbnVfbW9kZWxbJ2ljb25zJ11bJ2V4cG9ydF9leGNlbCddID0ge1xuXHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRXhjZWwnICksXG5cdFx0XHRpZDogJ2V4cG9ydF9leGNlbCcsXG5cdFx0XHRhY3Rpb25fZ3JvdXA6ICd2aWV3Jyxcblx0XHRcdGdyb3VwOiAnZWRpdG9yJyxcblx0XHRcdHZ1ZV9pY29uOiAndHRpY29uIHR0aWNvbi1maWxlX3VwbG9hZF9ibGFja18yNGRwJyxcblx0XHRcdHNvcnRfb3JkZXI6IDE4MDBcblx0XHR9O1xuXG5cdFx0ZGVmYXVsdF9jb250ZXh0X21lbnVfbW9kZWxbJ2ljb25zJ11bJ2NhbmNlbCddID0ge1xuXHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnQ2FuY2VsJyApLFxuXHRcdFx0aWQ6ICdjYW5jZWwnLFxuXHRcdFx0Z3JvdXA6ICdlZGl0b3InLFxuXHRcdFx0dnVlX2ljb246ICd0dGljb24gdHRpY29uLWNhbmNlbF9ibGFja18yNGRwJyxcblx0XHRcdHNvcnRfb3JkZXI6IDE5OTBcblx0XHR9O1xuXG5cdFx0ZGVmYXVsdF9jb250ZXh0X21lbnVfbW9kZWxbJ2ljb25zJ11bJ3NhdmVfZXhpc3RlZF9yZXBvcnQnXSA9IHtcblx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1NhdmUnICksXG5cdFx0XHRpZDogJ3NhdmVfZXhpc3RlZF9yZXBvcnQnLFxuXHRcdFx0YWN0aW9uX2dyb3VwOiAnc2F2ZScsXG5cdFx0XHRncm91cDogJ3NhdmVkX3JlcG9ydCcsXG5cdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tc2F2ZV9ibGFja18yNGRwJyxcblx0XHRcdHNob3dfb25fcmlnaHRfY2xpY2s6IHRydWUsXG5cdFx0fTtcblxuXHRcdGRlZmF1bHRfY29udGV4dF9tZW51X21vZGVsWydpY29ucyddWydzYXZlX25ld19yZXBvcnQnXSA9IHtcblx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1NhdmUgYXMgTmV3JyApLFxuXHRcdFx0aWQ6ICdzYXZlX25ld19yZXBvcnQnLFxuXHRcdFx0YWN0aW9uX2dyb3VwOiAnc2F2ZScsXG5cdFx0XHRncm91cDogJ3NhdmVkX3JlcG9ydCcsXG5cdFx0XHR2dWVfaWNvbjogJ3R0aWNvbiB0dGljb24tc2F2ZV9ibGFja18yNGRwJyxcblx0XHR9O1xuXG5cdFx0cmV0dXJuIGRlZmF1bHRfY29udGV4dF9tZW51X21vZGVsO1xuXHR9XG5cblx0Ly90aGlzIHByZXZlbnRzIHRoZSBmdW5jdGlvbiBvZiB0aGUgc2FtZSBuYW1lIGluIGJhc2UgY2xhc3MgZnJvbSBoaWRpbmcgYWxsIG9mIHRoZSBleHBvcnQgdG8gZXhjZWwgYnV0dG9ucyBvbiBhbGwgcmVwb3J0cyBkdWUgdG8gdGhlaXIgbGFjayBvZiBhIGdyaWQuXG5cdHNldERlZmF1bHRNZW51RXhwb3J0SWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCBwSWQgKSB7XG5cdH1cblxuXHRvcGVuRWRpdFZpZXcoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLmluaXRPcHRpb25zKCBmdW5jdGlvbigpIHtcblx0XHRcdC8vIEFsd2F5cyBuZWVkIG92ZXJyaWRlXG5cdFx0XHQkdGhpcy5wcm9jZXNzRmlsdGVyRmllbGQoKTtcblx0XHRcdGlmICggISR0aGlzLmVkaXRfdmlldyApIHtcblx0XHRcdFx0JHRoaXMuaW5pdEVkaXRWaWV3VUkoICR0aGlzLnZpZXdJZCwgJHRoaXMudmlld19maWxlICk7XG5cdFx0XHRcdCR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoKTsgLy8gI1Z1ZUNvbnRleHRNZW51I0VkaXRPbmx5IC0gTXVzdCBoYXBwZW4gYWZ0ZXIgaW5pdEVkaXRWaWV3VUlcblx0XHRcdFx0JHRoaXMuc2V0RWRpdE1lbnUoKTsgLy8gU2luY2UgbW92aW5nIGJ1aWxkQ29udGV4dE1lbnUgdG8gYmVpbmcgYWZ0ZXIgaW5pdEVkaXRWaWV3VUksIG5vbmUgb2YgdGhlIHJlcG9ydCBpY29ucyB3ZXJlIGVuYWJsZWQgdW50aWwgYSB0YWIgd2FzIHN3aXRjaGVkLiBTbyBhZGRpbmcgdGhpcyBpbiBoZXJlIHJlZnJlc2hlcyB0aGUgaWNvbnMuXG5cdFx0XHR9XG5cblx0XHRcdCR0aGlzLmRvX3ZhbGlkYXRlX2FmdGVyX2NyZWF0ZV91aSA9IHRydWU7XG5cblx0XHRcdFRUUHJvbWlzZS53YWl0KCAnaW5pdCcsICdpbml0JywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggTG9jYWxDYWNoZURhdGEuZGVmYXVsdF9lZGl0X2lkX2Zvcl9uZXh0X29wZW5fZWRpdF92aWV3ICkge1xuXHRcdFx0XHRcdCR0aGlzLm5hdmlnYXRpb24uc2V0VmFsdWUoIExvY2FsQ2FjaGVEYXRhLmRlZmF1bHRfZWRpdF9pZF9mb3JfbmV4dF9vcGVuX2VkaXRfdmlldyApO1xuXHRcdFx0XHRcdCR0aGlzLmFwaV91c2VyX3JlcG9ydC5nZXRVc2VyUmVwb3J0RGF0YSggeyBmaWx0ZXJfZGF0YTogeyBpZDogTG9jYWxDYWNoZURhdGEuZGVmYXVsdF9lZGl0X2lkX2Zvcl9uZXh0X29wZW5fZWRpdF92aWV3IH0gfSwge1xuXHRcdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdCA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9zYXZlZF9yZXBvcnQgPSByZXN1bHRbMF07XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgPSB7fTtcblx0XHRcdFx0XHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzID0ge307XG5cdFx0XHRcdFx0XHRcdExvY2FsQ2FjaGVEYXRhLmRlZmF1bHRfZWRpdF9pZF9mb3JfbmV4dF9vcGVuX2VkaXRfdmlldyA9IG51bGw7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmluaXRFZGl0VmlldygpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdCR0aGlzLmFwaV91c2VyX3JlcG9ydC5nZXRVc2VyUmVwb3J0RGF0YSgge1xuXHRcdFx0XHRcdFx0ZmlsdGVyX2RhdGE6IHtcblx0XHRcdFx0XHRcdFx0c2NyaXB0OiAkdGhpcy5zY3JpcHRfbmFtZSxcblx0XHRcdFx0XHRcdFx0aXNfZGVmYXVsdDogdHJ1ZVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIHtcblx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9zYXZlZF9yZXBvcnQgPSB7fTtcblx0XHRcdFx0XHRcdFx0aWYgKCBkYXRhICYmIGRhdGEubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydCA9IGRhdGFbMF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCA9IHt9O1xuXHRcdFx0XHRcdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF92YWx1ZXMgPSB7fTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuaW5pdEVkaXRWaWV3KCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyAjMjgzOCBDb21tZW50aW5nIHRoaXMgb3V0LCBhcyBpdCB3YXMgb25seSBuZWVkZWQgZm9yIFJlcG9ydFZpZXcudnVlLiBCYXNpY2FsbHkgYSByZXZlcnQgb2YgNDRiODUzZDkyYjliNDViNThhYTJjMTcyMzUzN2ZiNDA4YWZmZmU4ZlxuXHQvLyBDdXJyZW50bHkgd2UgYXJlIGdvaW5nIHRvIGdvIGJhY2sgdG8gdGhlIG9sZCBleGlzdGluZyBsb2dpYyBvZiBsb2FkaW5nIGVhY2ggcmVwb3J0IGh0bWwsIGFuZCBrZWVwaW5nIHRoZSBjb250ZXh0bWVudSBpbiB0aGUgb2xkIHBsYWNlLCBhcyB0aGUgVnVlIHRlbXBsYXRlIGhhZCB0b28gbWFueSBidWdzIGZvciBub3csIGFuZCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBmb3JtX3NldHVwIGFuZCBjdXN0b20gY29sdW1tbnMgZXRjLlxuXHQvLyBGdXR1cmUgd29yayBjYW4gcmUtaW5jbHVkZSB0aGlzIHdoZW4gd2UgY29uc29saWRhdGUgdGhlIGh0bWwgdGVtcGxhdGVzIGludG8gVnVlIHRlbXBsYXRlcy5cblx0Ly8gaW5pdEVkaXRWaWV3VUkoIHZpZXdfaWQsIGVkaXRfdmlld19maWxlX25hbWUgKSB7XG5cdC8vIFx0R2xvYmFsLnNldFVJTm90cmVhZHkoKTtcblx0Ly8gXHRUVFByb21pc2UuYWRkKCAnaW5pdCcsICdpbml0JyApO1xuXHQvLyBcdFRUUHJvbWlzZS53YWl0KCk7XG5cdC8vXG5cdC8vIFx0dmFyICR0aGlzID0gdGhpcztcblx0Ly8gXHRpZiAoIHRoaXMuZWRpdF92aWV3ICkge1xuXHQvLyBcdFx0dGhpcy5lZGl0X3ZpZXcucmVtb3ZlKCk7XG5cdC8vIFx0fVxuXHQvL1xuXHQvLyBcdC8vIHRoaXMuZWRpdF92aWV3ID0gJCggR2xvYmFsLmxvYWRWaWV3U291cmNlKCB2aWV3X2lkLCBlZGl0X3ZpZXdfZmlsZV9uYW1lLCBudWxsLCB0cnVlICkgKTtcblx0Ly8gXHR0aGlzLmVkaXRfdmlldyA9IEdsb2JhbC5jb250ZW50Q29udGFpbmVyKCkuZmluZCgnLnJlcG9ydC12aWV3LmVkaXQtdmlldycpO1xuXHQvL1xuXHQvLyBcdC8vIzIzNTMgLSBjb21tZW50ZWQgb3V0IGJlY2F1c2UgaXQgYnJlYWtzIHN1YmdyaWQgbWVudXMgaW4gdGhlIGVtcGxveWVlIHF1YWxpZmljYXRpb25zIHRhYlxuXHQvLyBcdC8vY2FsbHMgdGhlIGNvbnRleHQgbWVudSBjbGljayBldmVyeSB0aW1lIHRoYXQgdGhlIGVkaXQgdmlldyBpcyBjbGlja2VkLlxuXHQvLyBcdC8vIHRoaXMuZWRpdF92aWV3LnVuYmluZCggJ2NsaWNrJyApLmJpbmQoICdjbGljaycsIGZ1bmN0aW9uKCkge1xuXHQvLyBcdC8vIFx0JHRoaXMuc2VsZWN0Q29udGV4dE1lbnUoKTtcblx0Ly8gXHQvLyB9ICk7XG5cdC8vXG5cdC8vIFx0dGhpcy5lZGl0X3ZpZXdfdGFiID0gJCggdGhpcy5lZGl0X3ZpZXcuZmluZCggJy5lZGl0LXZpZXctdGFiLWJhcicgKSApO1xuXHQvLyBcdHRoaXMuZWRpdF92aWV3X3RhYi5jc3MoICdvcGFjaXR5JywgMCApO1xuXHQvL1xuXHQvLyBcdC8vR2l2ZSBlZHQgdmlldyB0YWIgYSBpZCwgc28gd2UgY2FuIGxvYWQgaXQgd2hlbiBwdXQgcmlnaHQgY2xpY2sgbWVudSBvbiBpdFxuXHQvLyBcdHRoaXMuZWRpdF92aWV3X3RhYi5hdHRyKCAnaWQnLCB0aGlzLnVpX2lkICsgJ19lZGl0X3ZpZXdfdGFiJyApO1xuXHQvL1xuXHQvLyBcdHRoaXMuc2V0VGFiT1Zpc2liaWxpdHkoIGZhbHNlICk7XG5cdC8vXG5cdC8vIFx0dGhpcy5lZGl0X3ZpZXdfdGFiID0gdGhpcy5lZGl0X3ZpZXdfdGFiLnRhYnMoIHtcblx0Ly8gXHRcdGFjdGl2YXRlOiBmdW5jdGlvbiggZSwgdWkgKSB7XG5cdC8vIFx0XHRcdGlmICggISR0aGlzLmVkaXRfdmlld190YWIgfHwgISR0aGlzLmVkaXRfdmlld190YWIuaXMoICc6dmlzaWJsZScgKSApIHtcblx0Ly8gXHRcdFx0XHRyZXR1cm47XG5cdC8vIFx0XHRcdH1cblx0Ly9cblx0Ly8gXHRcdFx0JHRoaXMub25UYWJTaG93KCBlLCB1aSApO1xuXHQvLyBcdFx0XHRHbG9iYWwudHJpZ2dlckFuYWx5dGljc1RhYnMoIGUsIHVpICk7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fSApO1xuXHQvL1xuXHQvLyBcdHRoaXMuZWRpdF92aWV3X3RhYi5vZmYoICdjbGljaycgKS5vbiggJ2NsaWNrJywgZnVuY3Rpb24oIGUgKSB7XG5cdC8vIFx0XHQkdGhpcy5vblRhYkluZGV4Q2hhbmdlKCBlICk7XG5cdC8vIFx0fSApO1xuXHQvL1xuXHQvLyBcdC8vIEdsb2JhbC5jb250ZW50Q29udGFpbmVyKCkuYXBwZW5kKCB0aGlzLmVkaXRfdmlldyApO1xuXHQvL1xuXHQvLyBcdHRoaXMuaW5pdFJpZ2h0Q2xpY2tNZW51KCBSaWdodENsaWNrTWVudVR5cGUuRURJVFZJRVcgKTtcblx0Ly9cblx0Ly8gXHR0aGlzLmJ1aWxkRWRpdFZpZXdVSSgpO1xuXHQvL1xuXHQvLyBcdCR0aGlzLnNldEVkaXRWaWV3VGFiSGVpZ2h0KCk7XG5cdC8vIFx0VFRQcm9taXNlLndhaXQoICdpbml0JywgJ2luaXQnLCBmdW5jdGlvbigpIHtcblx0Ly8gXHRcdCR0aGlzLmVkaXRfdmlldy5jc3MoICdvcGFjaXR5JywgMSApOyAvLyBUbyBwcmV2ZW50IGEgRk9VQyBmcm9tIGVtcHR5IGZvcm0gdG8gcG9wdWxhdGVkLlxuXHQvLyBcdFx0JCggJy5lZGl0LXZpZXctdGFiLWJhcicgKS5jc3MoICdvcGFjaXR5JywgMSApO1xuXHQvLyBcdH0gKTtcblx0Ly8gfVxuXG5cdHNldERlZmF1bHRDb25maWdEYXRhKCkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLmFwaS5nZXRPdGhlckNvbmZpZygge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCBjb25maWdfcmVzdWx0ICkge1xuXG5cdFx0XHRcdGlmICggJHRoaXMuY3VycmVudF9zYXZlZF9yZXBvcnQgJiZcblx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5kYXRhICYmXG5cdFx0XHRcdFx0JHRoaXMuY3VycmVudF9zYXZlZF9yZXBvcnQuZGF0YS5jb25maWcgJiZcblx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5kYXRhLmNvbmZpZy5vdGhlclxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvL2RvIG5vdGhpbmdcblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbmZpZ19yZXN1bHQgPSBjb25maWdfcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdGZvciAoIHZhciBrZXkgaW4gY29uZmlnX3Jlc3VsdCApIHtcblx0XHRcdFx0XHRcdGlmICggJHRoaXMuZWRpdF92aWV3X3VpX2RpYy5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgKSB7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XS5zZXRWYWx1ZSggY29uZmlnX3Jlc3VsdFtrZXldICk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSA9IGNvbmZpZ19yZXN1bHRba2V5XTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHRcdHRoaXMuYXBpLmdldENoYXJ0Q29uZmlnKCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIGNvbmZpZ19yZXN1bHQgKSB7XG5cblx0XHRcdFx0aWYgKCAkdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydCAmJlxuXHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfc2F2ZWRfcmVwb3J0LmRhdGEgJiZcblx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5kYXRhLmNvbmZpZyAmJlxuXHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfc2F2ZWRfcmVwb3J0LmRhdGEuY29uZmlnLmNoYXJ0XG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdC8vZG8gbm90aGluZ1xuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uZmlnX3Jlc3VsdCA9IGNvbmZpZ19yZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0Zm9yICggdmFyIGtleSBpbiBjb25maWdfcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAkdGhpcy5lZGl0X3ZpZXdfdWlfZGljLmhhc093blByb3BlcnR5KCBrZXkgKSApIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldLnNldFZhbHVlKCBjb25maWdfcmVzdWx0W2tleV0gKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldID0gY29uZmlnX3Jlc3VsdFtrZXldO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0c2V0VGFiU3RhdHVzKCkge1xuXHRcdC8vSGFuZGxlIG1vc3QgY2FzZXMgdGhhdCBvbmUgdGFiIGFuZCBvbiBhdWRpdCB0YWJcblx0fVxuXG5cdC8vQ2FsbCB0aGlzIGZyb20gc2V0RWRpdFZpZXdEYXRhXG5cdGluaXRUYWJEYXRhKCkge1xuXHR9XG5cblx0Z2V0UmVwb3J0RGF0YSggY2FsbEJhY2sgKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBhcmdzID0ge307XG5cdFx0YXJncy5maWx0ZXJfZGF0YSA9IHsgc2NyaXB0OiB0aGlzLnNjcmlwdF9uYW1lIH07XG5cdFx0dGhpcy5hcGlfdXNlcl9yZXBvcnQuZ2V0VXNlclJlcG9ydERhdGEoIGFyZ3MsIHtcblx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXG5cdFx0XHRcdHZhciByZXNfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0JHRoaXMucGFnZXJfZGF0YSA9IHJlc3VsdC5nZXRQYWdlckRhdGEoKTtcblxuXHRcdFx0XHRjYWxsQmFjayggcmVzX2RhdGEgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRpbml0T3B0aW9ucyggY2FsbEJhY2sgKSB7XG5cdFx0dmFyIG9wdGlvbnMgPSBbXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAncGFnZV9vcmllbnRhdGlvbicgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdmb250X3NpemUnIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnYXV0b19yZWZyZXNoJyB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ2NoYXJ0X2Rpc3BsYXlfbW9kZScgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdjaGFydF90eXBlJyB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3RlbXBsYXRlcycgfSxcblx0XHRcdHsgb3B0aW9uX25hbWU6ICdzZXR1cF9maWVsZHMnIH1cblxuXHRcdF07XG5cblx0XHR0aGlzLmluaXREcm9wRG93bk9wdGlvbnMoIG9wdGlvbnMsIGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRjYWxsQmFjayggcmVzdWx0ICk7IC8vIEZpcnN0IHRvIGluaXRpYWxpemUgZHJvcCBkb3duIG9wdGlvbnMsIGFuZCB0aGVuIHRvIGluaXRpYWxpemUgZWRpdCB2aWV3IFVJLlxuXHRcdH0gKTtcblx0fVxuXG5cdC8vQ2FsbCB0aGlzIGZyb20gc2V0RWRpdFZpZXdEYXRhXG5cdGluaXRFZGl0Vmlld0RhdGEoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdC8vU2V0IE5hdmlnYXRpb24gQXdlc29tZWJveFxuXHRcdHZhciBuYXZpZ2F0aW9uX2RpdiA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICcubmF2aWdhdGlvbi1kaXYnICk7XG5cdFx0bmF2aWdhdGlvbl9kaXYuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTtcblxuXHRcdC8vaW5pdCBuYXZpZ2F0aW9uIG9ubHkgd2hlbiBvcGVuIGVkaXQgdmlld1xuXHRcdGlmICggIXRoaXMubmF2aWdhdGlvbi5nZXRTb3VyY2VEYXRhKCkgKSB7XG5cdFx0XHR0aGlzLm5hdmlnYXRpb24uc2V0U291cmNlRGF0YSggdGhpcy5zYXZlZF9yZXBvcnRfYXJyYXkgKTtcblx0XHRcdGlmICggTG9jYWxDYWNoZURhdGEuZ2V0TG9naW5Vc2VyUHJlZmVyZW5jZSgpICkge1xuXHRcdFx0XHR0aGlzLm5hdmlnYXRpb24uc2V0Um93UGVyUGFnZSggTG9jYWxDYWNoZURhdGEuZ2V0TG9naW5Vc2VyUHJlZmVyZW5jZSgpLml0ZW1zX3Blcl9wYWdlICk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLm5hdmlnYXRpb24uc2V0UGFnZXJEYXRhKCB0aGlzLnBhZ2VyX2RhdGEgKTtcblxuXHRcdFx0dmFyIGRlZmF1bHRfYXJncyA9IHt9O1xuXHRcdFx0ZGVmYXVsdF9hcmdzLmZpbHRlcl9kYXRhID0geyBzY3JpcHQ6IHRoaXMuc2NyaXB0X25hbWUgfTtcblx0XHRcdHRoaXMubmF2aWdhdGlvbi5zZXREZWZhdWx0QXJncyggZGVmYXVsdF9hcmdzICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5uYXZpZ2F0aW9uLnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfc2F2ZWRfcmVwb3J0ICk7XG5cdFx0dGhpcy5zZXRVSVdpZGdldEZpZWxkc1RvQ3VycmVudEVkaXRSZWNvcmQoKTtcblx0XHR0aGlzLnNldE5hdmlnYXRpb25BcnJvd3NFbmFibGVkKCk7XG5cdFx0Ly8gQ3JlYXRlIHRoaXMgZnVuY3Rpb24gYWxvbmUgYmVjYXVzZSBvZiB0aGUgY29sdW1uIHZhbHVlIG9mIHZpZXcgaXMgZGlmZmVyZW50IGZyb20gZWFjaCBvdGhlciwgc29tZSBjb2x1bW5zIG5lZWQgdG8gYmUgaGFuZGxlIHNwZWNpYWxseS4gYW5kIGVhc2lseSB0byByZXdyaXRlIHRoaXMgZnVuY3Rpb24gaW4gc3ViLWNsYXNzLlxuXHRcdHRoaXMuc2V0Q3VycmVudEVkaXRSZWNvcmREYXRhKCk7XG5cblx0XHQvL0Nhbid0IGhpZGUgbmF2aWdhdGlvbiBib3ggaWYgdGhlcmUgYXJlbid0IGFueSBzYXZlZCByZXBvcnRzLCB3aXRob3V0IGhhdmluZyB0byBtYWtlIGFuIEFQSSBjYWxsIGFuZCBjb3VudCBob3cgbWFueSBzYXZlZCByZXBvcnRzIHRoZXJlIGFyZSBmaXJzdCwgd2hpY2gga2luZCBvZiBkZWZlYXRzIHRoZSBwdXJwb3NlLlxuXG5cdFx0Ly9Jbml0ICpQbGVhc2Ugc2F2ZSB0aGlzIHJlY29yZCBiZWZvcmUgbW9kaWZ5aW5nIGFueSByZWxhdGVkIGRhdGEqIGJveFxuXHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcuc2F2ZS1hbmQtY29udGludWUtZGl2JyApLlNhdmVBbmRDb250aW51ZUJveCggeyByZWxhdGVkX3ZpZXdfY29udHJvbGxlcjogdGhpcyB9ICk7XG5cdFx0dGhpcy5lZGl0X3ZpZXcuZmluZCggJy5zYXZlLWFuZC1jb250aW51ZS1kaXYnICkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHR9XG5cblx0b25SaWdodE9yTGVmdEFycm93Q2xpY2tDYWxsQmFjayggbmV4dF9zZWxlY3RfaXRlbSApIHtcblx0XHR0aGlzLm5hdmlnYXRpb24uc2V0VmFsdWUoIG5leHRfc2VsZWN0X2l0ZW0gKTtcblx0XHR0aGlzLmN1cnJlbnRfc2F2ZWRfcmVwb3J0ID0gbmV4dF9zZWxlY3RfaXRlbTtcblx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgPSB7fTtcblx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlcyA9IHt9O1xuXHRcdHRoaXMuaW5pdEVkaXRWaWV3KCk7XG5cdH1cblxuXHQvL0NhbGwgdGhpcyBhZnRlciBpbml0RWRpdFZpZXdVSSwgdXN1YWxseSBhZnRlciBjdXJyZW50X2VkaXRfcmVjb3JkIGlzIHNldFxuXHRpbml0RWRpdFZpZXcoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgY3VycmVudF91cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcblx0XHRpZiAoIGN1cnJlbnRfdXJsLmluZGV4T2YoICcmc20nICkgPiAwICkge1xuXHRcdFx0Y3VycmVudF91cmwgPSBjdXJyZW50X3VybC5zdWJzdHJpbmcoIDAsIGN1cnJlbnRfdXJsLmluZGV4T2YoICcmc20nICkgKTtcblx0XHR9XG5cdFx0aWYgKCAkdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydCAmJiAkdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5pZCApIHtcblxuXHRcdFx0Y3VycmVudF91cmwgPSBjdXJyZW50X3VybCArICcmc209JyArICR0aGlzLnZpZXdJZCArICcmc2lkPScgKyAkdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5pZDtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJyZW50X3VybCA9IGN1cnJlbnRfdXJsICsgJyZzbT0nICsgJHRoaXMudmlld0lkO1xuXHRcdH1cblxuXHRcdGlmICggd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZiggJyZ0YWI9JyApID4gMCApIHtcblx0XHRcdHZhciB0YWJfbmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0dGFiX25hbWUgPSB0YWJfbmFtZS5zdWJzdHIoICggd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZiggJyZ0YWI9JyApICsgNSApICk7IC8vZ2V0IHRoZSBzZWxlY3RlZCB0YWIgbmFtZVxuXHRcdFx0dGFiX25hbWUgPSB0YWJfbmFtZS5zdWJzdHIoIDAsIHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoICcmJyApICk7IC8vIGluY2FzZSB0aGVyZSBhcmUgc3Vic2VxdWVudCBhcmd1bWVudHMgYWZ0ZXIgdGhlIHRhYiBhcmd1bWVudFxuXHRcdFx0Y3VycmVudF91cmwgKz0gJyZ0YWI9JyArIHRhYl9uYW1lO1xuXHRcdH1cblxuXHRcdEdsb2JhbC5zZXRVUkxUb0Jyb3dzZXIoIGN1cnJlbnRfdXJsICk7XG5cblx0XHRzdXBlci5pbml0RWRpdFZpZXcoKTtcblx0fVxuXG5cdHNldE5hdmlnYXRpb24oKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dGhpcy5uYXZpZ2F0aW9uLm9mZiggJ2Zvcm1JdGVtQ2hhbmdlJyApLm9uKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0dmFyIG5leHRfc2VsZWN0X2l0ZW1faWQgPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblx0XHRcdCR0aGlzLmVkaXRfdmlld19lcnJvcl91aV9kaWMgPSB7fTtcblx0XHRcdGlmICggIW5leHRfc2VsZWN0X2l0ZW1faWQgfHwgbmV4dF9zZWxlY3RfaXRlbV9pZCA9PT0gVFRVVUlELnplcm9faWQgKSB7XG5cdFx0XHRcdCR0aGlzLmN1cnJlbnRfc2F2ZWRfcmVwb3J0ID0gbnVsbDtcblx0XHRcdFx0JHRoaXMuc2F2ZWRfcmVwb3J0X2FycmF5ID0gW107XG5cdFx0XHRcdCR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgPSB7fTtcblx0XHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzID0ge307XG5cblx0XHRcdFx0JHRoaXMuZG9fdmFsaWRhdGVfYWZ0ZXJfY3JlYXRlX3VpID0gdHJ1ZTtcblx0XHRcdFx0JHRoaXMuaW5pdEVkaXRWaWV3KCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBuZXh0X3NlbGVjdF9pdGVtX2lkICE9PSAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0XHQkdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydCA9IHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApO1xuXHRcdFx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkID0ge307XG5cdFx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlcyA9IHt9O1xuXG5cdFx0XHRcdCR0aGlzLmluaXRFZGl0VmlldygpO1xuXHRcdFx0fVxuXHRcdFx0R2xvYmFsLnRyaWdnZXJBbmFseXRpY3NFZGl0Vmlld05hdmlnYXRpb24oICduYXZpZ2F0aW9uJywgJHRoaXMudmlld0lkICk7XG5cdFx0fSApO1xuXHR9XG5cblx0aW5pdFN1YkN1c3RvbUNvbHVtblZpZXcoIGNhbGxCYWNrICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHQkdGhpcy5zdWJfdmlld19tb2RlID0gdHJ1ZTtcblxuXHRcdGlmICggdGhpcy5zdWJfY3VzdG9tX2NvbHVtbl92aWV3X2NvbnRyb2xsZXIgKSB7XG5cdFx0XHQkdGhpcy5zdWJfY3VzdG9tX2NvbHVtbl92aWV3X2NvbnRyb2xsZXIuZWRpdF9vbmx5X21vZGUgPSBmYWxzZTtcblx0XHRcdCR0aGlzLnN1Yl9jdXN0b21fY29sdW1uX3ZpZXdfY29udHJvbGxlci5idWlsZENvbnRleHRNZW51KCB0cnVlICk7XG5cdFx0XHQkdGhpcy5zdWJfY3VzdG9tX2NvbHVtbl92aWV3X2NvbnRyb2xsZXIucGFyZW50X3ZhbHVlID0gdGhpcy5zY3JpcHRfbmFtZTtcblx0XHRcdCR0aGlzLnN1Yl9jdXN0b21fY29sdW1uX3ZpZXdfY29udHJvbGxlci5pbml0RGF0YSgpOyAvL0luaXQgZGF0YSBpbiB0aGlzIHBhcmVudCB2aWV3XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0R2xvYmFsLmxvYWRWaWV3U291cmNlKCAnQ3VzdG9tQ29sdW1uJywgJ0N1c3RvbUNvbHVtblZpZXdDb250cm9sbGVyLmpzJywgZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdGFiID0gJHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9jdXN0b21fY29sdW1ucycgKTtcblxuXHRcdFx0dmFyIGZpcnN0Q29sdW1uID0gdGFiLmZpbmQoICcuZmlyc3QtY29sdW1uLXN1Yi12aWV3JyApO1xuXG5cdFx0XHRUVFByb21pc2UuYWRkKCAnU3ViQ3VzdG9tQ29sdW1uVmlldycsICdpbml0JyApO1xuXHRcdFx0VFRQcm9taXNlLndhaXQoICdTdWJDdXN0b21Db2x1bW5WaWV3JywgJ2luaXQnLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Zmlyc3RDb2x1bW4uY3NzKCAnb3BhY2l0eScsICcxJyApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRmaXJzdENvbHVtbi5jc3MoICdvcGFjaXR5JywgJzAnICk7IC8vSGlkZSB0aGUgZ3JpZCB3aGlsZSBpdHMgbG9hZGluZy9zaXppbmcuXG5cblx0XHRcdEdsb2JhbC50cmFja1ZpZXcoICdTdWInICsgJ1JlcG9ydFNjaGVkdWxlJyArICdWaWV3JyApO1xuXHRcdFx0Q3VzdG9tQ29sdW1uVmlld0NvbnRyb2xsZXIubG9hZFN1YlZpZXcoIGZpcnN0Q29sdW1uLCBiZWZvcmVMb2FkVmlldywgYWZ0ZXJMb2FkVmlldyApO1xuXG5cdFx0fSApO1xuXG5cdFx0ZnVuY3Rpb24gYmVmb3JlTG9hZFZpZXcoKSB7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBhZnRlckxvYWRWaWV3KCBzdWJWaWV3Q29udHJvbGxlciApIHtcblx0XHRcdCR0aGlzLnN1Yl9jdXN0b21fY29sdW1uX3ZpZXdfY29udHJvbGxlciA9IHN1YlZpZXdDb250cm9sbGVyO1xuXHRcdFx0JHRoaXMuc3ViX2N1c3RvbV9jb2x1bW5fdmlld19jb250cm9sbGVyLnBhcmVudF9rZXkgPSAnc2NyaXB0Jztcblx0XHRcdCR0aGlzLnN1Yl9jdXN0b21fY29sdW1uX3ZpZXdfY29udHJvbGxlci5wYXJlbnRfdmFsdWUgPSAkdGhpcy5zY3JpcHRfbmFtZTtcblx0XHRcdCR0aGlzLnN1Yl9jdXN0b21fY29sdW1uX3ZpZXdfY29udHJvbGxlci5wYXJlbnRfdmlld19jb250cm9sbGVyID0gJHRoaXM7XG5cdFx0XHQkdGhpcy5zdWJfY3VzdG9tX2NvbHVtbl92aWV3X2NvbnRyb2xsZXIuZWRpdF9vbmx5X21vZGUgPSBmYWxzZTtcblx0XHRcdCR0aGlzLnN1Yl9jdXN0b21fY29sdW1uX3ZpZXdfY29udHJvbGxlci5zdWJfdmlld19tb2RlID0gdHJ1ZTtcblxuXHRcdFx0Ly9pbml0IGNvbXBsZXRlXG5cdFx0XHRpZiAoIGNhbGxCYWNrICkge1xuXHRcdFx0XHRjYWxsQmFjaygpOyAvLyBDYWxsIGJhY2sgZGVjaWRlIGNhbGwgaW5pdCBvciBub3Rcblx0XHRcdH1cblx0XHRcdCR0aGlzLnN1Yl9jdXN0b21fY29sdW1uX3ZpZXdfY29udHJvbGxlci5pbml0RGF0YSgpOyAvL0luaXQgZGF0YSBpbiB0aGlzIHBhcmVudCB2aWV3XG5cdFx0fVxuXHR9XG5cblx0b25TYXZlZFJlcG9ydERlbGV0ZSgpIHtcblx0XHR0aGlzLnJlZnJlc2hOYXYoKTtcblx0fVxuXG5cdGluaXRTdWJTYXZlZFJlcG9ydFZpZXcoIGNhbGxCYWNrICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHQkdGhpcy5zdWJfdmlld19tb2RlID0gdHJ1ZTtcblxuXHRcdGlmICggdGhpcy5zdWJfc2F2ZWRfcmVwb3J0X3ZpZXdfY29udHJvbGxlciApIHtcblx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLmVkaXRfb25seV9tb2RlID0gZmFsc2U7XG5cdFx0XHQkdGhpcy5zdWJfc2F2ZWRfcmVwb3J0X3ZpZXdfY29udHJvbGxlci5idWlsZENvbnRleHRNZW51KCB0cnVlICk7XG5cdFx0XHQkdGhpcy5zdWJfc2F2ZWRfcmVwb3J0X3ZpZXdfY29udHJvbGxlci5wYXJlbnRfdmFsdWUgPSB0aGlzLnNjcmlwdF9uYW1lO1xuXHRcdFx0JHRoaXMuc3ViX3NhdmVkX3JlcG9ydF92aWV3X2NvbnRyb2xsZXIuaW5pdERhdGEoKTsgLy9Jbml0IGRhdGEgaW4gdGhpcyBwYXJlbnQgdmlld1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdEdsb2JhbC5sb2FkVmlld1NvdXJjZSggJ1NhdmVkUmVwb3J0JywgJ1NhdmVkUmVwb3J0Vmlld0NvbnRyb2xsZXIuanMnLCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0YWIgPSAkdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3NhdmVkX3JlcG9ydHMnICk7XG5cblx0XHRcdHZhciBmaXJzdENvbHVtbiA9IHRhYi5maW5kKCAnLmZpcnN0LWNvbHVtbi1zdWItdmlldycgKTtcblxuXHRcdFx0VFRQcm9taXNlLmFkZCggJ1N1YlNhdmVkUmVwb3J0VmlldycsICdpbml0JyApO1xuXHRcdFx0VFRQcm9taXNlLndhaXQoICdTdWJTYXZlZFJlcG9ydFZpZXcnLCAnaW5pdCcsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmaXJzdENvbHVtbi5jc3MoICdvcGFjaXR5JywgJzEnICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdGZpcnN0Q29sdW1uLmNzcyggJ29wYWNpdHknLCAnMCcgKTsgLy9IaWRlIHRoZSBncmlkIHdoaWxlIGl0cyBsb2FkaW5nL3NpemluZy5cblxuXHRcdFx0R2xvYmFsLnRyYWNrVmlldyggJ1N1YicgKyAnUmVwb3J0U2NoZWR1bGUnICsgJ1ZpZXcnICk7XG5cdFx0XHRTYXZlZFJlcG9ydFZpZXdDb250cm9sbGVyLmxvYWRTdWJWaWV3KCBmaXJzdENvbHVtbiwgYmVmb3JlTG9hZFZpZXcsIGFmdGVyTG9hZFZpZXcgKTtcblxuXHRcdH0gKTtcblxuXHRcdGZ1bmN0aW9uIGJlZm9yZUxvYWRWaWV3KCkge1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYWZ0ZXJMb2FkVmlldyggc3ViVmlld0NvbnRyb2xsZXIgKSB7XG5cblx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyID0gc3ViVmlld0NvbnRyb2xsZXI7XG5cdFx0XHQkdGhpcy5zdWJfc2F2ZWRfcmVwb3J0X3ZpZXdfY29udHJvbGxlci5wYXJlbnRfa2V5ID0gJ3NjcmlwdCc7XG5cdFx0XHQkdGhpcy5zdWJfc2F2ZWRfcmVwb3J0X3ZpZXdfY29udHJvbGxlci5wYXJlbnRfdmFsdWUgPSAkdGhpcy5zY3JpcHRfbmFtZTtcblx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLnBhcmVudF92aWV3X2NvbnRyb2xsZXIgPSAkdGhpcztcblx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLmVkaXRfb25seV9tb2RlID0gZmFsc2U7XG5cdFx0XHQkdGhpcy5zdWJfc2F2ZWRfcmVwb3J0X3ZpZXdfY29udHJvbGxlci5zdWJfdmlld19tb2RlID0gdHJ1ZTtcblxuXHRcdFx0Ly9pbml0IGNvbXBsZXRlXG5cdFx0XHRpZiAoIGNhbGxCYWNrICkge1xuXHRcdFx0XHRjYWxsQmFjaygpOyAvLyBDYWxsIGJhY2sgZGVjaWRlIGNhbGwgaW5pdCBvciBub3Rcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLmluaXREYXRhKCk7IC8vSW5pdCBkYXRhIGluIHRoaXMgcGFyZW50IHZpZXdcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRidWlsZEVkaXRWaWV3VUkoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHRoaXMuaW5pdEVkaXRWaWV3VGFicygpOyAvLyBGaXhlczogUmVwb3J0IHRhYnMgbm90IGluaXRpYWxpemluZyBpbiByZXBvcnRzLCBhcyB0aGlzIGNvZGUgd2FzIG1vdmVkIGFyb3VuZCBpbiBCYXNlVkMgdG8gaW5pdEVkaXRWaWV3VGFicywgd2hpY2ggbmV2ZXIgZ2V0cyBjYWxsZWQgaW4gUmVwb3J0cyBiZWNhdXNlIHNldFRhYk1vZGVsKCkgaXMgbm90IHVzZWQgaW4gUmVwb3J0cywgd2hpY2ggY2FsbHMgdGhpcy4gU2VlIDc2NjM5MmZlZDM5NDYwNzY0NTQyNjExZjNhYjRkZjFkZWI1MThjZjFcblxuXHRcdHZhciBuYXZpZ2F0aW9uX2RpdiA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICcubmF2aWdhdGlvbi1kaXYnICk7XG5cdFx0dmFyIGxhYmVsID0gbmF2aWdhdGlvbl9kaXYuZmluZCggJy5uYXZpZ2F0aW9uLWxhYmVsJyApO1xuXHRcdHZhciBsZWZ0X2NsaWNrID0gbmF2aWdhdGlvbl9kaXYuZmluZCggJy5sZWZ0LWNsaWNrJyApO1xuXHRcdHZhciByaWdodF9jbGljayA9IG5hdmlnYXRpb25fZGl2LmZpbmQoICcucmlnaHQtY2xpY2snICk7XG5cdFx0dmFyIG5hdmlnYXRpb25fd2lkZ2V0X2RpdiA9IG5hdmlnYXRpb25fZGl2LmZpbmQoICcubmF2aWdhdGlvbi13aWRnZXQtZGl2JyApO1xuXHRcdHRoaXMuaW5pdE5hdmlnYXRpb25XaWRnZXQoIG5hdmlnYXRpb25fd2lkZ2V0X2RpdiApO1xuXHRcdGxlZnRfY2xpY2suYXR0ciggJ3NyYycsIEdsb2JhbC5nZXRSZWFsSW1hZ2VQYXRoKCAnaW1hZ2VzL2xlZnRfYXJyb3cuc3ZnJyApICk7XG5cdFx0cmlnaHRfY2xpY2suYXR0ciggJ3NyYycsIEdsb2JhbC5nZXRSZWFsSW1hZ2VQYXRoKCAnaW1hZ2VzL3JpZ2h0X2Fycm93LnN2ZycgKSApO1xuXHRcdGxhYmVsLnRleHQoIHRoaXMubmF2aWdhdGlvbl9sYWJlbCApO1xuXG5cdFx0dGhpcy5lZGl0X3ZpZXdfY2xvc2VfaWNvbiA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICcuY2xvc2UtaWNvbicgKTtcblx0XHR0aGlzLmVkaXRfdmlld19jbG9zZV9pY29uLmhpZGUoKTtcblx0XHR0aGlzLmVkaXRfdmlld19jbG9zZV9pY29uLmNsaWNrKCBmdW5jdGlvbigpIHtcblx0XHRcdCR0aGlzLm9uQ2xvc2VJY29uQ2xpY2soKTtcblx0XHR9ICk7XG5cblx0XHR2YXIgdGFiXzBfbGFiZWwgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnYVtyZWY9dGFiX3JlcG9ydF0nICk7XG5cdFx0dmFyIHRhYl8xX2xhYmVsID0gdGhpcy5lZGl0X3ZpZXcuZmluZCggJ2FbcmVmPXRhYl9zZXR1cF0nICk7XG5cdFx0dmFyIHRhYl8yX2xhYmVsID0gdGhpcy5lZGl0X3ZpZXcuZmluZCggJ2FbcmVmPXRhYl9jaGFydF0nICk7XG5cblx0XHRpZiAoIHRoaXMuaW5jbHVkZV9mb3JtX3NldHVwICkge1xuXHRcdFx0Ly8gVE9ETzogIzI4MzggQklHIHRvZG8gaGVyZSBmb3Igd2hlbiB3ZSBjb252ZXJ0IGJhY2sgdG8gUmVwb3J0Vmlldy52dWUsIGFzIHRoYXQgZG9lcyBub3QgaGFuZGxlIHRoZSBmb3JtIHNldHVwIGZpZWxkIHlldCBpbiB0aGUgYWxsLWluLW9uZSB0ZW1wbGF0ZS5cblx0XHRcdHZhciB0YWJfM19sYWJlbCA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICdhW3JlZj10YWJfZm9ybV9zZXR1cF0nICk7XG5cdFx0XHR2YXIgdGFiXzRfbGFiZWwgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnYVtyZWY9dGFiX2N1c3RvbV9jb2x1bW5zXScgKTtcblx0XHRcdHZhciB0YWJfNV9sYWJlbCA9IHRoaXMuZWRpdF92aWV3LmZpbmQoICdhW3JlZj10YWJfc2F2ZWRfcmVwb3J0c10nICk7XG5cblx0XHRcdHRhYl8wX2xhYmVsLnRleHQoICQuaTE4bi5fKCAnUmVwb3J0JyApICk7XG5cdFx0XHR0YWJfMV9sYWJlbC50ZXh0KCAkLmkxOG4uXyggJ1NldHVwJyApICk7XG5cdFx0XHR0YWJfMl9sYWJlbC50ZXh0KCAkLmkxOG4uXyggJ0NoYXJ0JyApICk7XG5cdFx0XHR0YWJfM19sYWJlbC50ZXh0KCAkLmkxOG4uXyggJ0Zvcm0gU2V0dXAnICkgKTtcblx0XHRcdHRhYl80X2xhYmVsLnRleHQoICQuaTE4bi5fKCAnQ3VzdG9tIENvbHVtbnMnICkgKTtcblx0XHRcdHRhYl81X2xhYmVsLnRleHQoICQuaTE4bi5fKCAnU2F2ZWQgUmVwb3J0cycgKSApO1xuXG5cdFx0XHR0aGlzLmJ1aWxkRm9ybVNldHVwVUkoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHRhYl8zX2xhYmVsID0gdGhpcy5lZGl0X3ZpZXcuZmluZCggJ2FbcmVmPXRhYl9jdXN0b21fY29sdW1uc10nICk7XG5cdFx0XHR2YXIgdGFiXzRfbGFiZWwgPSB0aGlzLmVkaXRfdmlldy5maW5kKCAnYVtyZWY9dGFiX3NhdmVkX3JlcG9ydHNdJyApO1xuXG5cdFx0XHR0YWJfMF9sYWJlbC50ZXh0KCAkLmkxOG4uXyggJ1JlcG9ydCcgKSApO1xuXHRcdFx0dGFiXzFfbGFiZWwudGV4dCggJC5pMThuLl8oICdTZXR1cCcgKSApO1xuXHRcdFx0dGFiXzJfbGFiZWwudGV4dCggJC5pMThuLl8oICdDaGFydCcgKSApO1xuXHRcdFx0dGFiXzNfbGFiZWwudGV4dCggJC5pMThuLl8oICdDdXN0b20gQ29sdW1ucycgKSApO1xuXHRcdFx0dGFiXzRfbGFiZWwudGV4dCggJC5pMThuLl8oICdTYXZlZCBSZXBvcnRzJyApICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5uYXZpZ2F0aW9uLkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElVc2VyUmVwb3J0RGF0YSxcblx0XHRcdGlkOiB0aGlzLnNjcmlwdF9uYW1lICsgJ19uYXZpZ2F0aW9uJyxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF91c2VyX3JlcG9ydF9kYXRhJyxcblx0XHRcdGRlZmF1bHRfYXJnczogeyBmaWx0ZXJfZGF0YTogeyBzY3JpcHQ6IHRoaXMuc2NyaXB0X25hbWUgfSB9LFxuXHRcdFx0bmF2aWdhdGlvbl9tb2RlOiB0cnVlLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLCAvL1JlcXVpcmVkIGluIGNhc2UgdGhlcmUgYXJlIHNhdmVkIHJlcG9ydHMgYnV0IG5vbmUgb2YgdGhlbSBhcmUgdGhlIGRlZmF1bHQuXG5cdFx0XHRhbHdheXNfc2VhcmNoX2Z1bGxfY29sdW1uczogdHJ1ZVxuXHRcdH0gKTtcblxuXHRcdHRoaXMuc2V0TmF2aWdhdGlvbigpO1xuXG5cdFx0Ly9NYWtpbmcgc3VyZSB0aGF0IHRoaXMuc2F2ZWRfcmVwb3J0X2FycmF5IGlzIG5vdCBlbXB0eSwgb3RoZXJ3aXNlIG5hdmlnYXRpb24gYXJyb3dzIHdpbGwgbm90IGJlIGVuYWJsZWQgb24gZmlyc3Qgb3BlbmluZyBldmVuIGlmIHRoZXJlIGFyZSBvdGhlciByZXBvcnRzLlxuXHRcdGlmICggdGhpcy5zYXZlZF9yZXBvcnRfYXJyYXkgPT0gbnVsbCApIHtcblx0XHRcdHRoaXMubmF2aWdhdGlvbi5zZXRTb3VyY2VEYXRhKCBudWxsICk7XG5cdFx0XHQkdGhpcy5nZXRSZXBvcnREYXRhKCBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRpZiAoIHJlc3VsdCAmJiByZXN1bHQubGVuZ3RoID4gMCApIHtcblx0XHRcdFx0XHQkdGhpcy5zYXZlZF9yZXBvcnRfYXJyYXkgPSByZXN1bHQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JHRoaXMuc2F2ZWRfcmVwb3J0X2FycmF5ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvL1RhYiAwIHN0YXJ0XG5cblx0XHR2YXIgdGFiX3JlcG9ydCA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9yZXBvcnQnICk7XG5cblx0XHR2YXIgdGFiMF9jb2x1bW4xID0gdGFiX3JlcG9ydC5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblxuXHRcdC8vIFRlbXBsYXRlXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3RlbXBsYXRlJywgc2V0X2VtcHR5OiB0cnVlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMudGVtcGxhdGVzX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUZW1wbGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWIwX2NvbHVtbjEgKTtcblxuXHRcdC8vVGFiIDEgc3RhcnRcblx0XHR2YXIgdGFiX3NldHVwID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3NldHVwJyApO1xuXHRcdHZhciB0YWIxX2NvbHVtbjEgPSB0YWJfc2V0dXAuZmluZCggJy5maXJzdC1jb2x1bW4nICk7XG5cblx0XHQvL0ZpZWxkc1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IHRydWUsXG5cdFx0XHRrZXk6ICd2YWx1ZScsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdGFsbG93X2RyYWdfdG9fb3JkZXI6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ3NldHVwX2ZpZWxkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0ZpZWxkcycgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWIxX2NvbHVtbjEsICcnICk7XG5cdFx0dGhpcy5zZXR1cF9maWVsZHNfYXJyYXkuc2hpZnQoKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggdGhpcy5zZXR1cF9maWVsZHNfYXJyYXkgKTtcblxuXHRcdC8vUGFnZSBPcmllbnRhdGlvblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3BhZ2Vfb3JpZW50YXRpb24nLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMucGFnZV9vcmllbnRhdGlvbl9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnUGFnZSBPcmllbnRhdGlvbicgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWIxX2NvbHVtbjEgKTtcblxuXHRcdC8vRm9udCBTaXplXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAnZm9udF9zaXplJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLmZvbnRfc2l6ZV9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRm9udCBTaXplJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjFfY29sdW1uMSApO1xuXG5cdFx0Ly9EaXNhYmxlIEdyYW5kIFRvdGFsXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ2hlY2tib3goIHsgZmllbGQ6ICdkaXNhYmxlX2dyYW5kX3RvdGFsJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEaXNhYmxlIEdyYW5kIFRvdGFsJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjFfY29sdW1uMSApO1xuXG5cdFx0Ly9TaG93IER1cGxpY2F0ZSBWYWx1ZXNcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDaGVja2JveCggeyBmaWVsZDogJ3Nob3dfZHVwbGljYXRlX3ZhbHVlcycgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnU2hvdyBEdXBsaWNhdGUgVmFsdWVzJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjFfY29sdW1uMSApO1xuXG5cdFx0Ly9BdXRvLVJlZnJlc2hcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdhdXRvX3JlZnJlc2gnLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMuYXV0b19yZWZyZXNoX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdBdXRvLVJlZnJlc2gnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiMV9jb2x1bW4xICk7XG5cblx0XHQvL01heGltdW0gUGFnZXNcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ21heGltdW1fcGFnZV9saW1pdCcsIHdpZHRoOiA1MCB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdNYXhpbXVtIFBhZ2VzJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjFfY29sdW1uMSApO1xuXG5cdFx0Ly9UYWIgMiBzdGFydFxuXHRcdHZhciB0YWJfY2hhcnQgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfY2hhcnQnICk7XG5cdFx0dmFyIHRhYjJfY29sdW1uMSA9IHRhYl9jaGFydC5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblxuXHRcdC8vRW5hYmxlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ2hlY2tib3goIHsgZmllbGQ6ICdlbmFibGUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0VuYWJsZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWIyX2NvbHVtbjEsICcnICk7XG5cblx0XHQvL0Rpc3BsYXlcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdkaXNwbGF5X21vZGUnLCBzZXRfZW1wdHk6IGZhbHNlIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMuY2hhcnRfZGlzcGxheV9tb2RlX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEaXNwbGF5JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjJfY29sdW1uMSApO1xuXG5cdFx0Ly9UeXBlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENvbWJvQm94KCB7IGZpZWxkOiAndHlwZScsIHNldF9lbXB0eTogZmFsc2UgfSApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXRTb3VyY2VEYXRhKCAkdGhpcy5jaGFydF90eXBlX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUeXBlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjJfY29sdW1uMSApO1xuXG5cdFx0Ly9DaGFydCBTdWItVG90YWxzXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ2hlY2tib3goIHsgZmllbGQ6ICdpbmNsdWRlX3N1Yl90b3RhbCcgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ2hhcnQgU3ViLVRvdGFscycgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWIyX2NvbHVtbjEgKTtcblxuXHRcdC8vQ29uc2lzdGVudCBBeGlzIFNjYWxlc1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENoZWNrYm94KCB7IGZpZWxkOiAnYXhpc19zY2FsZV9zdGF0aWMnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0NvbnNpc3RlbnQgQXhpcyBTY2FsZXMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiMl9jb2x1bW4xICk7XG5cblx0XHQvL0NvbnNpc3RlbnQgQXhpcyBTY2FsZXNcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDaGVja2JveCggeyBmaWVsZDogJ2NvbWJpbmVfY29sdW1ucycgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ29tYmluZSBDb2x1bW5zJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYjJfY29sdW1uMSwgJycgKTtcblxuXHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAnaW5pdCcsICdpbml0JyApO1xuXHR9XG5cblx0YnVpbGRGb3JtU2V0dXBVSSgpIHtcblx0XHQvL05lZWQgYWx3YXlzIG92ZXJyaWRlXG5cdH1cblxuXHRidWlsZFNlbGVjdFRlbXBsYXRlRGF0YSgpIHtcblx0XHR2YXIgdGVtcGxhdGUgPSB0aGlzLmN1cnJlbnRfc2F2ZWRfcmVwb3J0LmRhdGEudGVtcGxhdGU7XG5cdFx0dmFyIGNvbmZpZyA9IHRoaXMuY3VycmVudF9zYXZlZF9yZXBvcnQuZGF0YS5jb25maWc7XG5cblx0XHR2YXIgcmVzdWx0ID0ge307XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0ZW1wbGF0ZS5sZW5ndGg7IGkrKyApIHtcblx0XHRcdHZhciBpdGVtID0gdGVtcGxhdGVbaV07XG5cdFx0XHRpZiAoIGl0ZW0gPT09ICdzb3J0JyApIHtcblx0XHRcdFx0cmVzdWx0W2l0ZW1dID0gY29uZmlnW2l0ZW0gKyAnXyddO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0W2l0ZW1dID0gY29uZmlnW2l0ZW1dO1xuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0c2V0Q3VycmVudEVkaXRSZWNvcmREYXRhKCkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHRpZiAoIExvY2FsQ2FjaGVEYXRhLmRlZmF1bHRfZmlsdGVyX2Zvcl9uZXh0X29wZW5fdmlldyApIHtcblxuXHRcdFx0dGhpcy5kb192YWxpZGF0ZV9hZnRlcl9jcmVhdGVfdWkgPSBmYWxzZTtcblx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsndGVtcGxhdGUnXSA9IExvY2FsQ2FjaGVEYXRhLmRlZmF1bHRfZmlsdGVyX2Zvcl9uZXh0X29wZW5fdmlldy50ZW1wbGF0ZTtcblx0XHRcdCR0aGlzLm9uVGVtcGxhdGVDaGFuZ2UoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsndGVtcGxhdGUnXSApO1xuXHRcdFx0TG9jYWxDYWNoZURhdGEuZGVmYXVsdF9maWx0ZXJfZm9yX25leHRfb3Blbl92aWV3ID0gbnVsbDtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIHRoaXMuY3VycmVudF9zYXZlZF9yZXBvcnQgJiYgdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5kYXRhICkge1xuXHRcdFx0XHR2YXIgc2VsZWN0X3RlbXBsYXRlX2RhdGEgPSB0aGlzLmJ1aWxkU2VsZWN0VGVtcGxhdGVEYXRhKCk7XG5cdFx0XHRcdHRoaXMuc2V0U2VsZWN0VGVtcGxhdGUoIHNlbGVjdF90ZW1wbGF0ZV9kYXRhICk7XG5cblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWyd0ZW1wbGF0ZSddID0gdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5kYXRhLmNvbmZpZy50ZW1wbGF0ZTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgb3RoZXJfa2V5IGluIHRoaXMuY3VycmVudF9zYXZlZF9yZXBvcnQuZGF0YS5jb25maWcub3RoZXIgKSB7XG5cblx0XHRcdFx0XHRpZiAoICF0aGlzLmN1cnJlbnRfc2F2ZWRfcmVwb3J0LmRhdGEuY29uZmlnLm90aGVyLmhhc093blByb3BlcnR5KCBvdGhlcl9rZXkgKSApIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtvdGhlcl9rZXldID0gdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5kYXRhLmNvbmZpZy5vdGhlcltvdGhlcl9rZXldO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggdmFyIGNoYXJ0X2tleSBpbiB0aGlzLmN1cnJlbnRfc2F2ZWRfcmVwb3J0LmRhdGEuY29uZmlnLmNoYXJ0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5kYXRhLmNvbmZpZy5jaGFydC5oYXNPd25Qcm9wZXJ0eSggY2hhcnRfa2V5ICkgKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbY2hhcnRfa2V5XSA9IHRoaXMuY3VycmVudF9zYXZlZF9yZXBvcnQuZGF0YS5jb25maWcuY2hhcnRbY2hhcnRfa2V5XTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLy8vSWYgbm8gYW55IHNhdmVkIHJlcG9ydCwgdXNlIGRlZmF1bHQgc2V0dXAgZmllbGRzXG5cdFx0XHRcdC8vdmFyIGRlZmF1bHRfc2V0dXBfZmllbGRzID0gdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ2RlZmF1bHRfc2V0dXBfZmllbGRzJywge2FzeW5jOiBmYWxzZX0gKTtcblx0XHRcdFx0Ly8kdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnNldHVwX2ZpZWxkID0gZGVmYXVsdF9zZXR1cF9maWVsZHMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdC8vJHRoaXMuYnVpbGRSZXBvcnRVSUJhc2VPblNldHVwRmllbGRzKCk7XG5cdFx0XHRcdHRoaXMuZG9fdmFsaWRhdGVfYWZ0ZXJfY3JlYXRlX3VpID0gZmFsc2U7XG5cdFx0XHRcdHRoaXMub25UZW1wbGF0ZUNoYW5nZSggdGhpcy50ZW1wbGF0ZXNfYXJyYXlbMV0uaWQgKTtcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWyd0ZW1wbGF0ZSddID0gdGhpcy50ZW1wbGF0ZXNfYXJyYXlbMV0uaWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly9TZXQgY3VycmVudCBlZGl0IHJlY29yZCBkYXRhIHRvIGFsbCB3aWRnZXRzXG5cdFx0Zm9yICggdmFyIGtleSBpbiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cblx0XHRcdGlmICggIXRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgd2lkZ2V0ID0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV07XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggd2lkZ2V0ICkgKSB7XG5cdFx0XHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdFx0XHRjYXNlICd1c2VyX2lkJzpcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvdW50cnknOiAvL3BvcHVsYXIgY2FzZVxuXHRcdFx0XHRcdFx0dGhpcy5zZXRDb3VudHJ5VmFsdWUoIHdpZGdldCwga2V5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pbmNsdWRlX2Zvcm1fc2V0dXAgKSB7XG5cdFx0XHR0aGlzLmFwaS5nZXRDb21wYW55Rm9ybUNvbmZpZygge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHR2YXIgcmVzX0RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0aWYgKCByZXNfRGF0YS5sZW5ndGggPT0gMSAmJiByZXNfRGF0YS5oYXNPd25Qcm9wZXJ0eSggJzAnICkgJiYgcmVzX0RhdGFbMF0gPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0Ly9UaGVyZSBzZWVtIHRvIGJlIGNhc2VzIHdoZXJlIHRoZSBmb3JtIHNldHVwIGRhdGEgaXMgc29tZWhvdyBzYXZlZCBhcyB0aGUgZm9sbG93aW5nLCB3aGljaCBzaG91bGQgYmUgaWdub3JlZCwgb3RoZXJ3aXNlIHdoZW4gdHJ5aW5nIHRvIHJlLXNhdmUgdGhlIGZvcm0gc2V0dXAgZGF0YSBpdCBkb2Vzbid0IGdldCB1cGxvYWRlZCB0byB0aGUgc2VydmVyIGJlY2F1c2UgMCA9PiBmYWxzZS5cblx0XHRcdFx0XHRcdC8vICAgYXJyYXkoMSkge1xuXHRcdFx0XHRcdFx0Ly8gICAgIFswXT0+XG5cdFx0XHRcdFx0XHQvLyAgICAgYm9vbChmYWxzZSlcblx0XHRcdFx0XHRcdC8vICAgfVxuXHRcdFx0XHRcdFx0Ly9cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JHRoaXMuc2V0Rm9ybVNldHVwRGF0YSggcmVzX0RhdGEgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR0aGlzLmNvbGxlY3RVSURhdGFUb0N1cnJlbnRFZGl0UmVjb3JkKCk7XG5cblx0XHR0aGlzLnNldERlZmF1bHRDb25maWdEYXRhKCk7XG5cdFx0dGhpcy5zZXRFZGl0Vmlld0RhdGFEb25lKCk7XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG5cdC8vc2V0IHRhYiAwIHZpc2libGUgYWZ0ZXIgYWxsIGRhdGEgc2V0IGRvbmUuIFRoaXMgYmUgaGlkZSB3aGVuIGluaXQgZWRpdCB2aWV3IGRhdGFcblx0c2V0RWRpdFZpZXdEYXRhRG9uZSgpIHtcbi8vXHRcdExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfZG9pbmdfY29udGV4dF9hY3Rpb24gPSAnJztcblx0XHR0aGlzLnNldFRhYk9WaXNpYmlsaXR5KCB0cnVlICk7XG5cblx0XHRpZiAoIHRoaXMuZG9fdmFsaWRhdGVfYWZ0ZXJfY3JlYXRlX3VpICkge1xuXHRcdFx0dGhpcy52YWxpZGF0ZSgpO1xuXHRcdFx0dGhpcy5kb192YWxpZGF0ZV9hZnRlcl9jcmVhdGVfdWkgPSBmYWxzZTtcblx0XHR9XG5cblx0XHR0aGlzLmluaXRSaWdodENsaWNrTWVudUZvclZpZXdCdXR0b24oKTtcblxuXHRcdC8vU2V0IHVybCBzZWxlY3RlZCB0YWIuXG5cdFx0aWYgKCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCAnJnRhYj0nICkgPiAwICkge1xuXHRcdFx0dmFyIHRhYl9uYW1lID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHR0YWJfbmFtZSA9IHRhYl9uYW1lLnN1YnN0ciggKCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCAnJnRhYj0nICkgKyA1ICkgKTsgLy9nZXQgdGhlIHNlbGVjdGVkIHRhYiBuYW1lXG5cdFx0XHR0YWJfbmFtZSA9IHRhYl9uYW1lLnN1YnN0ciggMCwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZiggJyYnICkgKTsgLy8gaW5jYXNlIHRoZXJlIGFyZSBzdWJzZXF1ZW50IGFyZ3VtZW50cyBhZnRlciB0aGUgdGFiIGFyZ3VtZW50XG5cdFx0XHR2YXIgbXlfdGFicyA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnLmVkaXQtdmlldy10YWItYmFyLWxhYmVsJyApLmNoaWxkcmVuKCk7XG5cblx0XHRcdGZvciAoIHZhciBuID0gMDsgbiA8IG15X3RhYnM7IG4rKyApIHtcblx0XHRcdFx0aWYgKCAkKCBteV90YWJzW25dICkuZmluZCggJ2EnICkubGVuZ3RoID4gMCAmJiB0YWJfbmFtZSA9PSAkKCBteV90YWJzW25dICkuZmluZCggJ2EnICkuaHRtbCgpLnJlcGxhY2UoIC9cXC98XFxzKy9nLCAnJyApICkge1xuXHRcdFx0XHRcdCQoIG15X3RhYnNbbl0gKS5maW5kKCAnYScgKS5jbGljaygpO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdpbml0JywgJ2luaXQnICk7XG5cdFx0JCggJy5lZGl0LXZpZXctdGFiLWJhcicgKS5jc3MoICdvcGFjaXR5JywgMSApO1xuXHR9XG5cblx0Ly9UaGlzIGlzIGp1c3QgY2FsbGluZyBpbnRvIHRoZSBiYXNlIGFueXdheSwgc28gY29tbWVudGVkIG91dCBmb3Igbm93LlxuXHQvLyB2YWxpZGF0ZVJlc3VsdCggcmVzdWx0ICkge1xuXHQvLyBcdHN1cGVyLnZhbGlkYXRlUmVzdWx0KCByZXN1bHQgKTtcblx0Ly8gfSxcblxuXHRpbml0UmlnaHRDbGlja01lbnVGb3JWaWV3QnV0dG9uKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHNlbGVjdG9yID0gJyN2aWV3SFRNTEljb24nO1xuXHRcdGlmICggJCggc2VsZWN0b3IgKS5sZW5ndGggPT0gMCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dmFyIGl0ZW1zID0gdGhpcy5nZXRWaWV3QnV0dG9uUmlnaHRDbGlja0l0ZW1zKCk7XG5cblx0XHRpZiAoICFpdGVtcyB8fCAkLmlzRW1wdHlPYmplY3QoIGl0ZW1zICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdCQuY29udGV4dE1lbnUoICdkZXN0cm95Jywgc2VsZWN0b3IgKTtcblx0XHQkLmNvbnRleHRNZW51KCB7XG5cdFx0XHRzZWxlY3Rvcjogc2VsZWN0b3IsXG5cdFx0XHRjYWxsYmFjazogZnVuY3Rpb24oIGtleSwgb3B0aW9ucyApIHtcblx0XHRcdFx0JHRoaXMub25Db250ZXh0TWVudUNsaWNrKCBudWxsLCBrZXkgKTtcblx0XHRcdH0sXG5cblx0XHRcdG9uQ29udGV4dE1lbnU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9LFxuXHRcdFx0aXRlbXM6IGl0ZW1zLFxuXHRcdFx0ekluZGV4OiA1MFxuXHRcdH0gKTtcblx0fVxuXG5cdGdldFZpZXdCdXR0b25SaWdodENsaWNrSXRlbXMoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgaXRlbXMgPSB7fTtcblx0XHRpdGVtc1sndmlld0hUTUxJY29uJ10gPSB7XG5cdFx0XHRuYW1lOiAkLmkxOG4uXyggJ1ZpZXcnICksIGljb246ICd2aWV3SFRNTEljb24nLCBkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBpc0Rpc2FibGVkKCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRpdGVtc1sndmlld0hUTUxOZXdXaW5kb3cnXSA9IHtcblx0XHRcdG5hbWU6ICQuaTE4bi5fKCAnVmlldyAoTmV3IFdpbmRvdyknICksIGljb246ICd2aWV3SFRNTEljb24nLCBkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBpc0Rpc2FibGVkKCk7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGZ1bmN0aW9uIGlzRGlzYWJsZWQoKSB7XG5cdFx0XHRpZiAoICQoICcjdmlld0hUTUxJY29uJyApLnBhcmVudCgpLmhhc0NsYXNzKCAnZGlzYWJsZS1pbWFnZScgKSApIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGl0ZW1zO1xuXHR9XG5cbi8vXHRvblZpZXdSaWdodENsaWNrKCBrZXkgKSB7XG4vL1x0XHQvL1RPRE8gc2hvdyB2aWV3XG4vL1x0XHRhbGVydCgnZGZkZicpO1xuLy9cdH0sXG5cblx0Ly8gTmVlZCBhbHdheXMgb3ZlcnJpZGUgaWYgcmVwb3J0IGhhcyBmaWx0ZXIgZmllbGRcblx0b25Gb3JtSXRlbUNoYW5nZVByb2Nlc3NGaWx0ZXJGaWVsZCgpIHtcblx0fVxuXG5cdC8vU2hpbSBtZXRob2QgdG8gYWxsb3cgb3ZlcnJpZGUgZm9yIGNsYXNzZXMgdGhhdCBuZWVkIHRoZWlyIG93biBvbkZvcm1JdGVtQ2hhbmdlIGZvciBhIHNwZWNpZmljIHB1cnBvc2UgaWUgcGF5cm9sbCBleHBvcnQgcmVwb3J0c1xuXHQvL2VnIGluIHBheXJvbGwgZXhwb3J0LCB3aGVuIGV4cG9ydF90eXBlIGlzIGNoYW5nZWQsIHdlIG5lZWQgdG8gZXhlY3V0ZSBjb2RlIGJ1dCBhbHNvIG5lZWQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIG9uRm9ybUl0ZW1DaGFuZ2UuXG5cdHByZUZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQsIGRvTm90RG9WYWxpZGF0ZSApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0b25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0LCBkb05vdERvVmFsaWRhdGUgKSB7XG5cdFx0dGhpcy5wcmVGb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7IC8vc2hpbSBmb3IgY2hpbGQgY2xhc3Ncblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMuc2V0SXNDaGFuZ2VkKCB0YXJnZXQgKTtcblx0XHR2YXIga2V5ID0gdGFyZ2V0LmdldEZpZWxkKCk7XG5cdFx0dmFyIHRpbWVfcGVyaW9kO1xuXHRcdHZhciBza2lsbF9leHBpcnlfZGF0ZTtcblx0XHR2YXIgbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGU7XG5cdFx0dmFyIGxpY2Vuc2VfZXhwaXJ5X2RhdGU7XG5cdFx0dmFyIGVkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlO1xuXG5cdFx0aWYgKCB0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMgJiYgKCB0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHNba2V5XSB8fCBrZXkgPT09ICdzdGFydF9kYXRlJyB8fCBrZXkgPT09ICdlbmRfZGF0ZScgfHwga2V5ID09PSAncGF5X3BlcmlvZF9pZCcgfHwga2V5ID09PSAncGF5X3BlcmlvZF9zY2hlZHVsZV9pZCcgKSApIHtcblx0XHRcdGlmICgga2V5ID09PSAnc29ydCcgKSB7XG5cdFx0XHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzW2tleV0gPSB0YXJnZXQuZ2V0VmFsdWUoIHRydWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICgga2V5LmluZGV4T2YoICd0aW1lX3BlcmlvZCcgKSA+PSAwICkge1xuXG5cdFx0XHRcdHRpbWVfcGVyaW9kID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cblx0XHRcdFx0aWYgKCAhdGhpcy52aXNpYmxlX3JlcG9ydF92YWx1ZXNba2V5XSB8fCB0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1trZXldLnRpbWVfcGVyaW9kICE9PSB0aW1lX3BlcmlvZCApIHtcblx0XHRcdFx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1trZXldID0geyB0aW1lX3BlcmlvZDogdGltZV9wZXJpb2QgfTtcblx0XHRcdFx0XHR0aGlzLm9uVGltZVBlcmlvZENoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAnZmlsdGVyJyApIHtcblx0XHRcdFx0Ly9BbHdheXMgbmVlZHMgb3ZlcnJpZGVcblx0XHRcdFx0dGhpcy5vbkZvcm1JdGVtQ2hhbmdlUHJvY2Vzc0ZpbHRlckZpZWxkKCB0YXJnZXQsIGtleSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT09ICdzdGFydF9kYXRlJyB8fCBrZXkgPT09ICdlbmRfZGF0ZScgfHwga2V5ID09PSAncGF5X3BlcmlvZF9pZCcgfHwga2V5ID09PSAncGF5X3BlcmlvZF9zY2hlZHVsZV9pZCcgKSB7XG5cdFx0XHRcdHRpbWVfcGVyaW9kID0gdGhpcy52aXNpYmxlX3JlcG9ydF92YWx1ZXNbdGFyZ2V0LmF0dHIoICd0aW1lX3BlcmlvZF9rZXknICkgPyB0YXJnZXQuYXR0ciggJ3RpbWVfcGVyaW9kX2tleScgKSA6ICd0aW1lX3BlcmlvZCddO1xuXHRcdFx0XHR0aW1lX3BlcmlvZFtrZXldID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ21lbWJlcnNoaXBfcmVuZXdhbF9kYXRlJyApIHtcblx0XHRcdFx0bWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUgPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0dGhpcy52aXNpYmxlX3JlcG9ydF92YWx1ZXNba2V5XSA9IHsgdGltZV9wZXJpb2Q6IG1lbWJlcnNoaXBfcmVuZXdhbF9kYXRlIH07XG5cblx0XHRcdFx0dGhpcy5vbk1lbWJlcnNoaXBSZW5ld2FsRGF0ZUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT09ICdzdGFydF9kYXRlXzEnIHx8IGtleSA9PT0gJ2VuZF9kYXRlXzEnIHx8IGtleSA9PT0gJ3BheV9wZXJpb2RfaWRfMScgfHwga2V5ID09PSAncGF5X3BlcmlvZF9zY2hlZHVsZV9pZF8xJyApIHtcblx0XHRcdFx0bWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUgPSB0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1snbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUnXTtcblx0XHRcdFx0bWVtYmVyc2hpcF9yZW5ld2FsX2RhdGVba2V5LnJlcGxhY2UoICdfMScsICcnICldID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ3NraWxsX2V4cGlyeV9kYXRlJyApIHtcblx0XHRcdFx0c2tpbGxfZXhwaXJ5X2RhdGUgPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblx0XHRcdFx0dGhpcy52aXNpYmxlX3JlcG9ydF92YWx1ZXNba2V5XSA9IHsgdGltZV9wZXJpb2Q6IHNraWxsX2V4cGlyeV9kYXRlIH07XG5cblx0XHRcdFx0dGhpcy5vblNraWxsRXhwaXJ5RGF0ZSggdGFyZ2V0ICk7XG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT09ICdzdGFydF9kYXRlXzInIHx8IGtleSA9PT0gJ2VuZF9kYXRlXzInIHx8IGtleSA9PT0gJ3BheV9wZXJpb2RfaWRfMicgfHwga2V5ID09PSAncGF5X3BlcmlvZF9zY2hlZHVsZV9pZF8yJyApIHtcblx0XHRcdFx0c2tpbGxfZXhwaXJ5X2RhdGUgPSB0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1snc2tpbGxfZXhwaXJ5X2RhdGUnXTtcblx0XHRcdFx0c2tpbGxfZXhwaXJ5X2RhdGVba2V5LnJlcGxhY2UoICdfMicsICcnICldID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ2xpY2Vuc2VfZXhwaXJ5X2RhdGUnICkge1xuXHRcdFx0XHRsaWNlbnNlX2V4cGlyeV9kYXRlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzW2tleV0gPSB7IHRpbWVfcGVyaW9kOiBsaWNlbnNlX2V4cGlyeV9kYXRlIH07XG5cblx0XHRcdFx0dGhpcy5vbkxpY2Vuc2VFeHBpcnlEYXRlKCB0YXJnZXQgKTtcblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ3N0YXJ0X2RhdGVfMycgfHwga2V5ID09PSAnZW5kX2RhdGVfMycgfHwga2V5ID09PSAncGF5X3BlcmlvZF9pZF8zJyB8fCBrZXkgPT09ICdwYXlfcGVyaW9kX3NjaGVkdWxlX2lkXzMnICkge1xuXHRcdFx0XHRsaWNlbnNlX2V4cGlyeV9kYXRlID0gdGhpcy52aXNpYmxlX3JlcG9ydF92YWx1ZXNbJ2xpY2Vuc2VfZXhwaXJ5X2RhdGUnXTtcblx0XHRcdFx0bGljZW5zZV9leHBpcnlfZGF0ZVtrZXkucmVwbGFjZSggJ18zJywgJycgKV0gPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblxuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAnZWR1Y2F0aW9uX2dyYWR1YXRlX2RhdGUnICkge1xuXHRcdFx0XHRlZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZSA9IHRhcmdldC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1trZXldID0geyB0aW1lX3BlcmlvZDogZWR1Y2F0aW9uX2dyYWR1YXRlX2RhdGUgfTtcblxuXHRcdFx0XHR0aGlzLm9uRWR1Y2F0aW9uR3JhZHVhdGVEYXRlKCB0YXJnZXQgKTtcblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ3N0YXJ0X2RhdGVfNCcgfHwga2V5ID09PSAnZW5kX2RhdGVfNCcgfHwga2V5ID09PSAncGF5X3BlcmlvZF9pZF80JyB8fCBrZXkgPT09ICdwYXlfcGVyaW9kX3NjaGVkdWxlX2lkXzQnICkge1xuXHRcdFx0XHRlZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZSA9IHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzWydlZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZSddO1xuXHRcdFx0XHRlZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZVtrZXkucmVwbGFjZSggJ180JywgJycgKV0gPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICggdGFyZ2V0Lmhhc0NsYXNzKCAndC1jaGVja2JveCcgKSApIHtcblx0XHRcdFx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1trZXldID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dmFyIHZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSAmJiAoICQudHlwZSggdmFsdWUgKSAhPT0gJ2FycmF5JyB8fCB2YWx1ZS5sZW5ndGggPiAwICkgJiYgdmFsdWUgIT0gVFRVVUlELnplcm9faWQgKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1trZXldID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1trZXldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSA9IHRhcmdldC5nZXRWYWx1ZSgpO1xuXHRcdH1cblxuXHRcdGlmICgga2V5ID09PSAndGVtcGxhdGUnICkge1xuXHRcdFx0JHRoaXMub25UZW1wbGF0ZUNoYW5nZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gKTtcblx0XHRcdCR0aGlzLnNldEVkaXRNZW51KCk7IC8vY2xlYW4gZXJyb3IsIHNldCBlZGl0IG1lbnVcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCAhZG9Ob3REb1ZhbGlkYXRlICkge1xuXHRcdFx0XHR0aGlzLnZhbGlkYXRlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmluY2x1ZGVfZm9ybV9zZXR1cCAmJiBrZXkgPT09IDMgKSB7XG5cdFx0XHR0aGlzLmZvcm1fc2V0dXBfY2hhbmdlZCA9IHRydWU7XG5cdFx0fVxuXHR9XG5cblx0LyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuXHQvL0NyZWF0ZSBmaXJzdCB0YWIgd2lkZ2V0IGJhc2Ugb24gc2VsZWN0IHRlbXBsYXRlXG5cdG9uVGVtcGxhdGVDaGFuZ2UoIHRlbXBsYXRlSWQgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLmFwaS5nZXRUZW1wbGF0ZSggdGVtcGxhdGVJZCwge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0JHRoaXMuc2V0U2VsZWN0VGVtcGxhdGUoIHJlc3VsdF9kYXRhICk7XG5cblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRzZXRTZWxlY3RUZW1wbGF0ZSggcmVzdWx0X2RhdGEgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgcmVzdWx0ID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdF9kYXRhICk7XG5cblx0XHR2YXIgbGVuID0gcmVzdWx0Lmxlbmd0aDtcblx0XHRpZiAoICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnNldHVwX2ZpZWxkID0gW107XG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF92YWx1ZXMgPSB7fTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdHZhciBpdGVtID0gcmVzdWx0W2ldO1xuXG5cdFx0XHRcdGlmICggaXRlbS52YWx1ZSA9PT0gJ3RlbXBsYXRlJyApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1tpdGVtLnZhbHVlXSA9IGl0ZW0ubGFiZWw7IC8vIHNldCB2YWx1ZSB0byBtb2RlbFxuXHRcdFx0XHQkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnNldHVwX2ZpZWxkLnB1c2goIGl0ZW0udmFsdWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5jcmVhdGVVSSggcmVzdWx0ICk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0RmllbGRMYWJlbCggZmllbGQgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMuc2V0dXBfZmllbGRzX2FycmF5Lmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0dmFyIHNldHVwX2ZpZWxkID0gdGhpcy5zZXR1cF9maWVsZHNfYXJyYXlbaV07XG5cdFx0XHRpZiAoIHNldHVwX2ZpZWxkLnZhbHVlID09PSBmaWVsZCApIHtcblx0XHRcdFx0cmV0dXJuIHNldHVwX2ZpZWxkLmxhYmVsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vQ3JlYXRlIHdpZGdldHMsXG5cdGNyZWF0ZVVJKCB1aU1vZGVsICkge1xuXG5cdFx0dGhpcy5jbGVhblVJKCk7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgbGVuID0gdWlNb2RlbC5sZW5ndGg7XG5cdFx0dmFyIHRhYl9yZXBvcnQgPSB0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfcmVwb3J0JyApO1xuXHRcdHZhciB0YWIwX2NvbHVtbjEgPSB0YWJfcmVwb3J0LmZpbmQoICcuZmlyc3QtY29sdW1uJyApO1xuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0gPSBbXTtcblx0XHR0aGlzLmVkaXRfdmlld190YWJzWzBdLnB1c2goIHRhYjBfY29sdW1uMSApO1xuXHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cyA9IHt9OyAvL3JlcG9ydCB0YWIgd2lkZ2V0c1xuXHRcdHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMgPSB7fTsgLy9Pbmx5IGtlZXAgcmVwb3J0IHRhYiBmb3JtIGl0ZW1cblxuXHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0c19vcmRlcl9maXggPSB7fTtcblxuXHRcdHZhciBsYXN0X3RpbWVfdmlzaWJsZV92YWx1ZXMgPSB0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlcztcblxuXHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzID0ge307XG5cblx0XHR2YXIgb3JkZXJfZml4ID0gMTAwMTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0dmFyIG1vZGVsID0gdWlNb2RlbFtpXTtcblxuXHRcdFx0dmFyIGZpZWxkID0gJyc7XG5cdFx0XHR2YXIgdmFsdWUgPSAnJztcblxuXHRcdFx0Ly9WYWx1ZSwgbGFiZWwgb2JqZWN0XG5cdFx0XHRpZiAoIG1vZGVsLnZhbHVlICkge1xuXHRcdFx0XHRmaWVsZCA9IG1vZGVsLnZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgeyAvL01vZGUgaXMgc3RyaW5nXG5cdFx0XHRcdGZpZWxkID0gbW9kZWw7XG5cdFx0XHR9XG5cblx0XHRcdHZhbHVlID0gbGFzdF90aW1lX3Zpc2libGVfdmFsdWVzW2ZpZWxkXTtcblx0XHRcdHZhciB3aWRnZXQgPSB0aGlzLmdldFVJV2lkZ2V0KCBmaWVsZCApO1xuXG5cdFx0XHQvL0RvbnQgYWRkIGZpZWxkIGlzIGl0J3Mgbm90IGluIHNldHVwIGZpZWxkcy5cblx0XHRcdGlmICggIXdpZGdldCB8fCAhdGhpcy5nZXRGaWVsZExhYmVsKCBmaWVsZCApICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly9BZGQgd2lkZ2V0IGZpcnN0XG5cdFx0XHRpZiAoIGZpZWxkLmluZGV4T2YoICd0aW1lX3BlcmlvZCcgKSA+PSAwIHx8XG5cdFx0XHRcdGZpZWxkID09PSAnbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUnIHx8XG5cdFx0XHRcdGZpZWxkID09PSAnc2tpbGxfZXhwaXJ5X2RhdGUnIHx8XG5cdFx0XHRcdGZpZWxkID09ICdsaWNlbnNlX2V4cGlyeV9kYXRlJyB8fFxuXHRcdFx0XHRmaWVsZCA9PSAnZWR1Y2F0aW9uX2dyYWR1YXRlX2RhdGUnXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oIHRoaXMuZ2V0RmllbGRMYWJlbCggZmllbGQgKSApLCB3aWRnZXQsIHRhYjBfY29sdW1uMSwgJycsIG51bGwsIHRydWUsIHRydWUgKTtcblx0XHRcdFx0JHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWNbZmllbGRdLmF0dHIoICdpZCcsICdyZXBvcnRfJyArIGZpZWxkICsgJ19kaXYnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCB0aGlzLmdldEZpZWxkTGFiZWwoIGZpZWxkICkgKSwgd2lkZ2V0LCB0YWIwX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vVGhlbiBzZXQgVmFsdWVcblx0XHRcdGlmICggdmFsdWUgKSB7XG5cblx0XHRcdFx0aWYgKCBmaWVsZC5pbmRleE9mKCAndGltZV9wZXJpb2QnICkgPj0gMCApIHtcblx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHZhbHVlWyd0aW1lX3BlcmlvZCddICk7IC8vaW5zaWRlIHRpbWVfcGVyaW9kIGZpZWxkLCB0aGUga2V5IGFsd2F5cyBiZSB0aWVtX3BlcmlvZFxuXHRcdFx0XHRcdCR0aGlzLm9uVGltZVBlcmlvZENoYW5nZSggd2lkZ2V0LCB2YWx1ZSApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBmaWVsZCA9PT0gJ21lbWJlcnNoaXBfcmVuZXdhbF9kYXRlJyApIHtcblx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHZhbHVlLnRpbWVfcGVyaW9kICk7XG5cdFx0XHRcdFx0JHRoaXMub25NZW1iZXJzaGlwUmVuZXdhbERhdGVDaGFuZ2UoIHdpZGdldCwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIGlmICggZmllbGQgPT09ICdza2lsbF9leHBpcnlfZGF0ZScgKSB7XG5cdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB2YWx1ZS50aW1lX3BlcmlvZCApO1xuXHRcdFx0XHRcdCR0aGlzLm9uU2tpbGxFeHBpcnlEYXRlKCB3aWRnZXQsIHZhbHVlICk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIGZpZWxkID09PSAnbGljZW5zZV9leHBpcnlfZGF0ZScgKSB7XG5cdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB2YWx1ZS50aW1lX3BlcmlvZCApO1xuXHRcdFx0XHRcdCR0aGlzLm9uTGljZW5zZUV4cGlyeURhdGUoIHdpZGdldCwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIGlmICggZmllbGQgPT09ICdlZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZScgKSB7XG5cdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB2YWx1ZS50aW1lX3BlcmlvZCApO1xuXHRcdFx0XHRcdCR0aGlzLm9uRWR1Y2F0aW9uR3JhZHVhdGVEYXRlKCB3aWRnZXQsIHZhbHVlICk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIGZpZWxkID09PSAnZmlsdGVyJyApIHtcblx0XHRcdFx0XHQkdGhpcy5zZXRGaWx0ZXJWYWx1ZSggd2lkZ2V0LCB2YWx1ZSApO1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBmaWVsZCA9PT0gJ3NvcnQnICkge1xuXHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHZhbHVlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyB0aGVuIGluaXQgc291cmNlIG9wdGlvbnNcblxuXHRcdFx0dGhpcy5pbml0U291cmNlRGF0YSggZmllbGQsIHdpZGdldCApO1xuXG5cdFx0XHRkZWxldGUgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2ZpZWxkXTtcblxuXHRcdFx0aWYgKCB3aWRnZXQuaGFzQ2xhc3MoICd0LWNoZWNrYm94JyApICkge1xuXHRcdFx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1tmaWVsZF0gPSB2YWx1ZTtcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlICkge1xuXHRcdFx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlc1tmaWVsZF0gPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzW2ZpZWxkXSA9IHdpZGdldDtcblxuXHRcdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzX29yZGVyX2ZpeFtmaWVsZF0gPSBvcmRlcl9maXg7XG5cblx0XHRcdG9yZGVyX2ZpeCA9IG9yZGVyX2ZpeCArIDE7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldEVkaXRWaWV3V2lkZ2V0c01vZGUoKTtcblx0XHR0aGlzLm5lZWRfcmVmcmVzaF9kaXNwbGF5X2NvbHVtbnMgPSBmYWxzZTtcblx0XHR0aGlzLmVkaXRGaWVsZFJlc2l6ZSggMCApO1xuXHR9XG5cblx0Ly8gb25UYWJJbmRleENoYW5nZSggZSwgdWkgKSB7XG5cdC8vXG5cdC8vIH0sXHQvLyBvblRhYkluZGV4Q2hhbmdlOiBmdW5jdGlvbiggZSwgdWkgKSB7XG5cdC8vXG5cdC8vIH0sXG5cdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0b25UYWJTaG93KCBlICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGtleSA9ICQoIGUudGFyZ2V0ICkudGFicyggJ29wdGlvbicsICdhY3RpdmUnICk7XG5cblx0XHR0aGlzLmVkaXRGaWVsZFJlc2l6ZSgga2V5ICk7XG5cblx0XHRpZiAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGxhc3RfaW5kZXggPSB0aGlzLmdldEVkaXRWaWV3VGFiSW5kZXgoKTtcblxuXHRcdGlmICggIXRoaXMuaW5jbHVkZV9mb3JtX3NldHVwICkge1xuXHRcdFx0aWYgKCAoIGxhc3RfaW5kZXggPT09IDEgfHwgdGhpcy5uZWVkX3JlZnJlc2hfZGlzcGxheV9jb2x1bW5zICkgJiYga2V5ID09PSAwICkge1xuXHRcdFx0XHR0aGlzLmJ1aWxkUmVwb3J0VUlCYXNlT25TZXR1cEZpZWxkcygpO1xuXHRcdFx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudSgpO1xuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAxICkge1xuXHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMuc2V0dXBfZmllbGQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zZXR1cF9maWVsZCApO1xuXHRcdFx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID09IDEwICkge1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hdXRvX3JlZnJlc2gucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuYnVpbGRDb250ZXh0TWVudSggdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51KCk7XG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT09IDIgKSB7XG5cdFx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSB7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX2NoYXJ0JyApLmZpbmQoICcuZmlyc3QtY29sdW1uJyApLmNzcyggJ2Rpc3BsYXknLCAnYmxvY2snICk7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXcuZmluZCggJy5wZXJtaXNzaW9uLWRlZmluZWQtZGl2JyApLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfY2hhcnQnICkuZmluZCggJy5maXJzdC1jb2x1bW4nICkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcucGVybWlzc2lvbi1kZWZpbmVkLWRpdicgKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcucGVybWlzc2lvbi1tZXNzYWdlJyApLmh0bWwoIEdsb2JhbC5nZXRVcGdyYWRlTWVzc2FnZSgpICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gMyApIHtcblx0XHRcdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfY3VzdG9tX2NvbHVtbnMnICkuZmluZCggJy5maXJzdC1jb2x1bW4tc3ViLXZpZXcnICkuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlldy5maW5kKCAnLnBlcm1pc3Npb24tZGVmaW5lZC1kaXYnICkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdHRoaXMuaW5pdFN1YkN1c3RvbUNvbHVtblZpZXcoKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfY3VzdG9tX2NvbHVtbnMnICkuZmluZCggJy5maXJzdC1jb2x1bW4tc3ViLXZpZXcnICkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcucGVybWlzc2lvbi1kZWZpbmVkLWRpdicgKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcucGVybWlzc2lvbi1tZXNzYWdlJyApLmh0bWwoIEdsb2JhbC5nZXRVcGdyYWRlTWVzc2FnZSgpICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT09IDQgKSB7XG5cdFx0XHRcdHRoaXMuaW5pdFN1YlNhdmVkUmVwb3J0VmlldygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5idWlsZENvbnRleHRNZW51KCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuc2V0RWRpdE1lbnUoKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCAoIGxhc3RfaW5kZXggPT09IDEgfHwgdGhpcy5uZWVkX3JlZnJlc2hfZGlzcGxheV9jb2x1bW5zICkgJiYga2V5ID09PSAwICkge1xuXHRcdFx0XHR0aGlzLmJ1aWxkUmVwb3J0VUlCYXNlT25TZXR1cEZpZWxkcygpO1xuXHRcdFx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudSgpO1xuXHRcdFx0fSBlbHNlIGlmICgga2V5ID09PSAxICkge1xuXHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMuc2V0dXBfZmllbGQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5zZXR1cF9maWVsZCApO1xuXHRcdFx0XHRpZiAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID09IDEwICkge1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy5hdXRvX3JlZnJlc2gucGFyZW50KCkucGFyZW50KCkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuYnVpbGRDb250ZXh0TWVudSggdHJ1ZSApO1xuXHRcdFx0XHR0aGlzLnNldEVkaXRNZW51KCk7XG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT09IDIgKSB7XG5cdFx0XHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMTUgKSB7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX2NoYXJ0JyApLmZpbmQoICcuZmlyc3QtY29sdW1uJyApLmNzcyggJ2Rpc3BsYXknLCAnYmxvY2snICk7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXcuZmluZCggJy5wZXJtaXNzaW9uLWRlZmluZWQtZGl2JyApLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfY2hhcnQnICkuZmluZCggJy5maXJzdC1jb2x1bW4nICkuY3NzKCAnZGlzcGxheScsICdub25lJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcucGVybWlzc2lvbi1kZWZpbmVkLWRpdicgKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcucGVybWlzc2lvbi1tZXNzYWdlJyApLmh0bWwoIEdsb2JhbC5nZXRVcGdyYWRlTWVzc2FnZSgpICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gNCApIHtcblx0XHRcdFx0aWYgKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAxNSApIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld190YWIuZmluZCggJyN0YWJfZm9ybV9zZXR1cCcgKS5maW5kKCAnLmZpcnN0LWNvbHVtbi1zdWItdmlldycgKS5jc3MoICdkaXNwbGF5JywgJ2Jsb2NrJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3LmZpbmQoICcucGVybWlzc2lvbi1kZWZpbmVkLWRpdicgKS5jc3MoICdkaXNwbGF5JywgJ25vbmUnICk7XG5cdFx0XHRcdFx0dGhpcy5pbml0U3ViQ3VzdG9tQ29sdW1uVmlldygpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9mb3JtX3NldHVwJyApLmZpbmQoICcuZmlyc3QtY29sdW1uLXN1Yi12aWV3JyApLmNzcyggJ2Rpc3BsYXknLCAnbm9uZScgKTtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlldy5maW5kKCAnLnBlcm1pc3Npb24tZGVmaW5lZC1kaXYnICkuY3NzKCAnZGlzcGxheScsICdibG9jaycgKTtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlldy5maW5kKCAnLnBlcm1pc3Npb24tbWVzc2FnZScgKS5odG1sKCBHbG9iYWwuZ2V0VXBncmFkZU1lc3NhZ2UoKSApO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gNSApIHtcblx0XHRcdFx0dGhpcy5pbml0U3ViU2F2ZWRSZXBvcnRWaWV3KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHRcdFx0dGhpcy5zZXRFZGl0TWVudSgpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNoZWNrRm9ybVNldHVwU2F2ZWQoIGxhc3RfaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdGlmICgga2V5ID09PSAwICkge1xuXHRcdFx0dGhpcy52YWxpZGF0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb3BpZWQgdG8gUk9FVmlld0NvbnRyb2xsZXIgYXMgaXQgZG9lc24ndCBzaGFyZSB0aGlzIGJhc2Vcblx0ICogRklYTUU6IG1pZ2h0IG5lZWQgdG8gZ28gaW50byBCYXNlVmlld0NvbnRyb2xsZXIgZXZlbnR1YWxseVxuXHQgKiBAcGFyYW0gbGFiZWxcblx0ICovXG5cdGNoZWNrRm9ybVNldHVwU2F2ZWQoIGxhc3RfaW5kZXgsIGxhYmVsICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHRpZiAoIGxhYmVsID09IHVuZGVmaW5lZCApIHtcblx0XHRcdGxhYmVsID0gJC5pMThuLl8oICdGb3JtIFNldHVwJyApO1xuXHRcdH1cblxuXHRcdGlmICggbGFzdF9pbmRleCA9PT0gMyAmJiB0aGlzLmZvcm1fc2V0dXBfY2hhbmdlZCApIHtcblx0XHRcdCR0aGlzLmZvcm1fc2V0dXBfY2hhbmdlZCA9IGZhbHNlO1xuXHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93Q29uZmlybUFsZXJ0KCAkLmkxOG4uXyggJ1lvdSBoYXZlIG1vZGlmaWVkJyApICsgJyAnICsgbGFiZWwgKyAnICcgKyAkLmkxOG4uXyggJ2RhdGEgd2l0aG91dCBzYXZpbmcsIHdvdWxkIHlvdSBsaWtlIHRvIHNhdmUgeW91ciBkYXRhIG5vdz8nICksICcnLCBmdW5jdGlvbiggZmxhZyApIHtcblx0XHRcdFx0aWYgKCBmbGFnICkge1xuXHRcdFx0XHRcdCR0aGlzLm9uU2F2ZVNldHVwKCBsYWJlbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fVxuXHR9XG5cblx0LyoganNoaW50IGlnbm9yZTplbmQgKi9cblx0Y2xlYW5VSSgpIHtcblx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuZWRpdF92aWV3X2Zvcm1faXRlbV9kaWMgKSB7XG5cdFx0XHRpZiAoICF0aGlzLmVkaXRfdmlld19mb3JtX2l0ZW1fZGljLmhhc093blByb3BlcnR5KCBrZXkgKSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cdFx0XHR2YXIgaHRtbF9pdGVtID0gdGhpcy5lZGl0X3ZpZXdfZm9ybV9pdGVtX2RpY1trZXldO1xuXG5cdFx0XHQvL0NoZWNrIGlmIGl0cyBhIHNlcGFyYXRvciB3aXRoIGEga2V5IG9mIHNlcGFyYXRlZF9YIGFuZCBza2lwIHJlbW92aW5nIGl0IGlmIGl0IGlzLlxuXHRcdFx0Ly8gRklYTUU6IFdvdWxkIGJlIG5pY2UgdG8gZ2V0IGEgYmV0dGVyIHdheSB0byBkZXRlY3QgYSBzZXBhcmF0b3Igd2lkZ2V0LlxuXHRcdFx0aWYgKCB0eXBlb2YgaHRtbF9pdGVtLmdldEZpZWxkID09PSAndW5kZWZpbmVkJyAmJiBrZXkuaW5kZXhPZignc2VwYXJhdGVkXycpICE9IC0xICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aHRtbF9pdGVtLnJlbW92ZSgpO1xuXHRcdH1cblxuXHRcdC8vRXJyb3I6IFR5cGVFcnJvcjogdGhpcy5lZGl0X3ZpZXdfdGFiIGlzIG51bGwgaW4gL2ludGVyZmFjZS9odG1sNS92aWV3cy9yZXBvcnRzL1JlcG9ydEJhc2VWaWV3Q29udHJvbGxlci5qcz92PTguMC40LTIwMTUwMzIwLTA5NDAyMSBsaW5lIDExMDBcblx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3RhYiApIHtcblx0XHRcdHZhciB0YWJfcmVwb3J0ID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3JlcG9ydCcgKTtcblxuXHRcdFx0dmFyIHRhYjBfY29sdW1uMSA9IHRhYl9yZXBvcnQuZmluZCggJy5maXJzdC1jb2x1bW4nICk7XG5cblx0XHRcdHZhciBjbGVhcl9ib3RoX2RpdiA9IHRhYjBfY29sdW1uMS5maW5kKCAnLmNsZWFyLWJvdGgtZGl2JyApO1xuXG5cdFx0XHRjbGVhcl9ib3RoX2Rpdi5yZW1vdmUoKTtcblx0XHR9XG5cdFx0JCggJy5lcnJvcnRpcC1ib3gnICkucmVtb3ZlKCk7XG5cdFx0JCggJy5lcnJvcnRpcC1ib3gnICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZW1vdmVFZGl0VmlldygpIHtcblxuXHRcdHN1cGVyLnJlbW92ZUVkaXRWaWV3KCk7XG5cdFx0dGhpcy5zdWJfY3VzdG9tX2NvbHVtbl92aWV3X2NvbnRyb2xsZXIgPSBudWxsO1xuXHRcdHRoaXMuc3ViX3NhdmVkX3JlcG9ydF92aWV3X2NvbnRyb2xsZXIgPSBudWxsO1xuXG5cdFx0Ly90aGlzIGlzIGFsc28gaGFwcGVuaW5nIGluIFJpYmJvbnZpZXdjb250b2xsZXIgaW4gb25TdWJNZW51Q2xpY2tcblx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fcmVwb3J0X2NvbnRyb2xsZXIgPSBudWxsO1xuXHR9XG5cblx0LyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuXG5cdC8vR2V0IFdpZGdldCBiYXNlIG9uIGZpZWxkXG5cdGdldFVJV2lkZ2V0KCBmaWVsZCApIHtcblx0XHR2YXIgd2lkZ2V0O1xuXG5cdFx0aWYgKCBmaWVsZC5pbmRleE9mKCAndGltZV9wZXJpb2QnICkgPj0gMCApIHtcblx0XHRcdHdpZGdldCA9IHRoaXMuZ2V0U2ltcGxlVENvbWJvQm94KCBmaWVsZCwgZmFsc2UgKTtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzd2l0Y2ggKCBmaWVsZCApIHtcblx0XHRcdFx0Y2FzZSAnaXNfcmVwcmludCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRDaGVja0JveCggZmllbGQgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnY29sdW1ucyc6XG5cdFx0XHRcdGNhc2UgJ3N1Yl90b3RhbCc6XG5cdFx0XHRcdGNhc2UgJ2dyb3VwJzpcblx0XHRcdFx0Y2FzZSAncGFnZV9icmVhayc6XG5cdFx0XHRcdGNhc2UgJ3VzZXJfcmV2aWV3X2NvbnRyb2xfdHlwZV9pZCc6XG5cdFx0XHRcdGNhc2UgJ3VzZXJfcmV2aWV3X2NvbnRyb2xfc3RhdHVzX2lkJzpcblx0XHRcdFx0Y2FzZSAnc2V2ZXJpdHlfaWQnOlxuXHRcdFx0XHRjYXNlICd0ZXJtX2lkJzpcblx0XHRcdFx0Y2FzZSAna3BpX3R5cGVfaWQnOlxuXHRcdFx0XHRjYXNlICdrcGlfc3RhdHVzX2lkJzpcblx0XHRcdFx0Y2FzZSAnZmx1ZW5jeV9pZCc6XG5cdFx0XHRcdGNhc2UgJ3F1YWxpZmljYXRpb25fdHlwZV9pZCc6XG5cdFx0XHRcdGNhc2UgJ3Byb2ZpY2llbmN5X2lkJzpcblx0XHRcdFx0Y2FzZSAnY29tcGV0ZW5jeV9pZCc6XG5cdFx0XHRcdGNhc2UgJ293bmVyc2hpcF9pZCc6XG5cdFx0XHRcdGNhc2UgJ2ludm9pY2Vfc3RhdHVzX2lkJzpcblx0XHRcdFx0Y2FzZSAndXNlcl9zdGF0dXNfaWQnOlxuXHRcdFx0XHRjYXNlICdwYXlfc3R1Yl9zdGF0dXNfaWQnOlxuXHRcdFx0XHRjYXNlICdmaWx0ZXInOlxuXHRcdFx0XHRjYXNlICdwYXlfcGVyaW9kX3RpbWVfc2hlZXRfdmVyaWZ5X3N0YXR1c19pZCc6XG5cdFx0XHRcdGNhc2UgJ2pvYl9zdGF0dXNfaWQnOlxuXHRcdFx0XHRjYXNlICdqb2JfaXRlbV9zdGF0dXNfaWQnOlxuXHRcdFx0XHRjYXNlICdjbGllbnRfc3RhdHVzX2lkJzpcblx0XHRcdFx0Y2FzZSAncHJvZHVjdF90eXBlX2lkJzpcblx0XHRcdFx0Y2FzZSAnY3VzdG9tX2ZpbHRlcic6XG5cdFx0XHRcdGNhc2UgJ2xvZ19hY3Rpb25faWQnOlxuXHRcdFx0XHRjYXNlICdsb2dfdGFibGVfbmFtZV9pZCc6XG5cdFx0XHRcdGNhc2UgJ2FjY3J1YWxfdHlwZV9pZCc6XG5cdFx0XHRcdGNhc2UgJ2FjY3J1YWxfcG9saWN5X3R5cGVfaWQnOlxuXHRcdFx0XHRjYXNlICdleGNlcHRpb25fcG9saWN5X3NldmVyaXR5X2lkJzpcblx0XHRcdFx0Y2FzZSAnZXhjZXB0aW9uX3BvbGljeV90eXBlX2lkJzpcblx0XHRcdFx0Y2FzZSAnZXhwZW5zZV9wb2xpY3lfcmVxdWlyZV9yZWNlaXB0X2lkJzpcblx0XHRcdFx0Y2FzZSAnZXhwZW5zZV9wb2xpY3lfdHlwZV9pZCc6XG5cdFx0XHRcdGNhc2UgJ3VzZXJfZXhwZW5zZV9wYXltZW50X21ldGhvZF9pZCc6XG5cdFx0XHRcdGNhc2UgJ3VzZXJfZXhwZW5zZV9zdGF0dXNfaWQnOlxuXHRcdFx0XHRjYXNlICdqb2JfYXBwbGljYW50X3NleF9pZCc6XG5cdFx0XHRcdGNhc2UgJ2pvYl9hcHBsaWNhbnRfc3RhdHVzX2lkJzpcblx0XHRcdFx0Y2FzZSAnam9iX2FwcGxpY2F0aW9uX3N0YXR1c19pZCc6XG5cdFx0XHRcdGNhc2UgJ2pvYl9hcHBsaWNhdGlvbl90eXBlX2lkJzpcblx0XHRcdFx0Y2FzZSAnam9iX3ZhY2FuY3lfZW1wbG95bWVudF9zdGF0dXNfaWQnOlxuXHRcdFx0XHRjYXNlICdqb2JfdmFjYW5jeV9sZXZlbF9pZCc6XG5cdFx0XHRcdGNhc2UgJ2pvYl92YWNhbmN5X3N0YXR1c19pZCc6XG5cdFx0XHRcdGNhc2UgJ2pvYl92YWNhbmN5X3R5cGVfaWQnOlxuXHRcdFx0XHRjYXNlICdqb2JfdmFjYW5jeV93YWdlX3R5cGVfaWQnOlxuXHRcdFx0XHRjYXNlICdwYXlfc3R1Yl9ydW5faWQnOlxuXHRcdFx0XHRjYXNlICdwYXlfc3R1Yl90eXBlX2lkJzpcblx0XHRcdFx0Y2FzZSAncmVtaXR0YW5jZV9zb3VyY2VfYWNjb3VudF90eXBlX2lkJzpcblx0XHRcdFx0Y2FzZSAndHJhbnNhY3Rpb25fdHlwZV9pZCc6XG5cdFx0XHRcdGNhc2UgJ3RyYW5zYWN0aW9uX3N0YXR1c19pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRTaW1wbGVUQ29tYm9Cb3goIGZpZWxkICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3NvcnQnOlxuXHRcdFx0XHRcdHdpZGdldCA9IHRoaXMuZ2V0U29ydENvbWJvQm94KCBmaWVsZCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdsaWNlbnNlX2V4cGlyeV9kYXRlJzpcblx0XHRcdFx0Y2FzZSAnbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUnOlxuXHRcdFx0XHRjYXNlICdza2lsbF9leHBpcnlfZGF0ZSc6XG5cdFx0XHRcdGNhc2UgJ2VkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlJzpcblx0XHRcdFx0XHR3aWRnZXQgPSB0aGlzLmdldENvbWJvQm94KCBmaWVsZCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICd1c2VyX2dyb3VwX2lkJzpcblx0XHRcdFx0Y2FzZSAncXVhbGlmaWNhdGlvbl9ncm91cF9pZCc6XG5cdFx0XHRcdGNhc2UgJ2twaV9ncm91cF9pZCc6XG5cdFx0XHRcdGNhc2UgJ2pvYl9ncm91cF9pZCc6XG5cdFx0XHRcdGNhc2UgJ2pvYl9pdGVtX2dyb3VwX2lkJzpcblx0XHRcdFx0Y2FzZSAnY2xpZW50X2dyb3VwX2lkJzpcblx0XHRcdFx0Y2FzZSAncHJvZHVjdF9ncm91cF9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUcmVlTW9kZUFDb21ib0JveCggZmllbGQgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAndXNlcl90YWcnOlxuXHRcdFx0XHRjYXNlICdyZXZpZXdfdGFnJzpcblx0XHRcdFx0Y2FzZSAnam9iX3RhZyc6XG5cdFx0XHRcdGNhc2UgJ2pvYl9pdGVtX3RhZyc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUYWcoIGZpZWxkICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2luY2x1ZGVfdXNlcl9pZCc6XG5cdFx0XHRcdGNhc2UgJ2V4Y2x1ZGVfdXNlcl9pZCc6XG5cdFx0XHRcdGNhc2UgJ2NsaWVudF9zYWxlc19jb250YWN0X2lkJzpcblx0XHRcdFx0Y2FzZSAnY3JlYXRlZF9ieV9pZCc6XG5cdFx0XHRcdGNhc2UgJ3VwZGF0ZWRfYnlfaWQnOlxuXHRcdFx0XHRjYXNlICdpbmNsdWRlX3Jldmlld2VyX3VzZXJfaWQnOlxuXHRcdFx0XHRjYXNlICdleGNsdWRlX3Jldmlld2VyX3VzZXJfaWQnOlxuXHRcdFx0XHRjYXNlICdqb2JfYXBwbGljYW50X2ludGVydmlld2VyX3VzZXJfaWQnOlxuXHRcdFx0XHRjYXNlICdqb2JfYXBwbGljYXRpb25faW50ZXJ2aWV3ZXJfdXNlcl9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX3VzZXInLCBUVEFQSS5BUElVc2VyICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3VzZXJfdGl0bGVfaWQnOlxuXHRcdFx0XHRcdHdpZGdldCA9IHRoaXMuZ2V0VENvbWJvQm94KCBmaWVsZCwgJ2dsb2JhbF91c2VyX3RpdGxlJywgVFRBUEkuQVBJVXNlclRpdGxlICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3BheXJvbGxfcmVtaXR0YW5jZV9hZ2VuY3lfaWQnOlxuXHRcdFx0XHRcdHdpZGdldCA9IHRoaXMuZ2V0VENvbWJvQm94KCBmaWVsZCwgJ2dsb2JhbF9wYXlyb2xsX3JlbWl0dGFuY2VfYWdlbmN5JywgVFRBUEkuQVBJUGF5cm9sbFJlbWl0dGFuY2VBZ2VuY3kgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnbGVnYWxfZW50aXR5X2lkJzpcblx0XHRcdFx0XHR3aWRnZXQgPSB0aGlzLmdldFRDb21ib0JveCggZmllbGQsICdnbG9iYWxfbGVnYWxfZW50aXR5JywgVFRBUEkuQVBJTGVnYWxFbnRpdHkgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAncG9saWN5X2dyb3VwX2lkJzpcblx0XHRcdFx0XHR3aWRnZXQgPSB0aGlzLmdldFRDb21ib0JveCggZmllbGQsICdnbG9iYWxfcG9saWN5X2dyb3VwJywgVFRBUEkuQVBJUG9saWN5R3JvdXAgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZGVmYXVsdF9icmFuY2hfaWQnOlxuXHRcdFx0XHRjYXNlICdzY2hlZHVsZV9icmFuY2hfaWQnOlxuXHRcdFx0XHRjYXNlICdwdW5jaF9icmFuY2hfaWQnOlxuXG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2JyYW5jaCcsIFRUQVBJLkFQSUJyYW5jaCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkZWZhdWx0X2RlcGFydG1lbnRfaWQnOlxuXHRcdFx0XHRjYXNlICdzY2hlZHVsZV9kZXBhcnRtZW50X2lkJzpcblx0XHRcdFx0Y2FzZSAncHVuY2hfZGVwYXJ0bWVudF9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2RlcGFydG1lbnQnLCBUVEFQSS5BUElEZXBhcnRtZW50ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2RlZmF1bHRfam9iX2lkJzpcblx0XHRcdFx0Y2FzZSAncHVuY2hfam9iX2lkJzpcblx0XHRcdFx0Y2FzZSAnaW5jbHVkZV9qb2JfaWQnOlxuXHRcdFx0XHRjYXNlICdleGNsdWRlX2pvYl9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2pvYicsIFRUQVBJLkFQSUpvYiApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdkZWZhdWx0X2pvYl9pdGVtX2lkJzpcblx0XHRcdFx0Y2FzZSAncHVuY2hfam9iX2l0ZW1faWQnOlxuXHRcdFx0XHRjYXNlICdpbmNsdWRlX2pvYl9pdGVtX2lkJzpcblx0XHRcdFx0Y2FzZSAnZXhjbHVkZV9qb2JfaXRlbV9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2pvYl9pdGVtJywgVFRBUEkuQVBJSm9iSXRlbSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdhYnNlbmNlX3BvbGljeV9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2Fic2VuY2VzJywgVFRBUEkuQVBJQWJzZW5jZVBvbGljeSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdjdXJyZW5jeV9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2N1cnJlbmN5JywgVFRBUEkuQVBJQ3VycmVuY3kgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnaW5jbHVkZV9ub19kYXRhX3Jvd3MnOlxuXHRcdFx0XHRjYXNlICdleGNsdWRlX3l0ZF9hZGp1c3RtZW50Jzpcblx0XHRcdFx0Y2FzZSAnc2hvd19jaGlsZF9leHBlbnNlcyc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRDaGVja0JveCggZmllbGQgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnYWNjcnVhbF9wb2xpY3lfaWQnOlxuXHRcdFx0XHRcdHdpZGdldCA9IHRoaXMuZ2V0VENvbWJvQm94KCBmaWVsZCwgJ2dsb2JhbF9hY2NydWFsJywgVFRBUEkuQVBJQWNjcnVhbFBvbGljeSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdwYXlfcGVyaW9kX2lkJzpcblx0XHRcdFx0XHR3aWRnZXQgPSB0aGlzLmdldFRDb21ib0JveCggZmllbGQsICdnbG9iYWxfUGF5X3BlcmlvZCcsIFRUQVBJLkFQSVBheVBlcmlvZCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdqb2JfaWQnOlxuXHRcdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2pvYicsIFRUQVBJLkFQSUpvYiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnam9iX2l0ZW1faWQnOlxuXHRcdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2pvYl9pdGVtJywgVFRBUEkuQVBJSm9iSXRlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAnZGVmYXVsdF9wdW5jaF90YWdfaWQnOlxuXHRcdFx0XHRjYXNlICdwdW5jaF90YWdfaWQnOlxuXHRcdFx0XHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX3B1bmNoX3RhZycsIFRUQVBJLkFQSVB1bmNoVGFnICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdleHBlbnNlX3BvbGljeV9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2V4cGVuc2VfcG9saWN5JywgVFRBUEkuQVBJRXhwZW5zZVBvbGljeSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdwYXlfc3R1Yl9lbnRyeV9hY2NvdW50X2lkJzpcblx0XHRcdFx0XHR3aWRnZXQgPSB0aGlzLmdldFRDb21ib0JveCggZmllbGQsICdnbG9iYWxfUGF5U3R1YkFjY291bnQnLCBUVEFQSS5BUElQYXlTdHViRW50cnlBY2NvdW50ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ3Byb2R1Y3RfaWQnOlxuXHRcdFx0XHRjYXNlICdleGNsdWRlX3Byb2R1Y3RfaWQnOlxuXHRcdFx0XHRjYXNlICdpbmNsdWRlX3Byb2R1Y3RfaWQnOlxuXHRcdFx0XHRcdHdpZGdldCA9IHRoaXMuZ2V0VENvbWJvQm94KCBmaWVsZCwgJ2dsb2JhbF9wcm9kdWN0JywgVFRBUEkuQVBJUHJvZHVjdCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdqb2JfY2xpZW50X2lkJzpcblx0XHRcdFx0Y2FzZSAnZXhjbHVkZV9jbGllbnRfaWQnOlxuXHRcdFx0XHRjYXNlICdpbmNsdWRlX2NsaWVudF9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2NsaWVudCcsIFRUQVBJLkFQSUNsaWVudCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdjb21wYW55X2RlZHVjdGlvbl9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2RlZHVjdGlvbicsIFRUQVBJLkFQSUNvbXBhbnlEZWR1Y3Rpb24gKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0Y2FzZSAncXVhbGlmaWNhdGlvbl9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX3F1YWxpZmljYXRpb24nLCBUVEFQSS5BUElRdWFsaWZpY2F0aW9uICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdGNhc2UgJ2twaV9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2twaScsIFRUQVBJLkFQSUtQSSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdqb2JfYXBwbGljYW50X2lkJzpcblx0XHRcdFx0XHR3aWRnZXQgPSB0aGlzLmdldFRDb21ib0JveCggZmllbGQsICdnbG9iYWxfam9iX2FwcGxpY2FudCcsIFRUQVBJLkFQSUpvYkFwcGxpY2FudCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdqb2JfdmFjYW5jeV9pZCc6XG5cdFx0XHRcdFx0d2lkZ2V0ID0gdGhpcy5nZXRUQ29tYm9Cb3goIGZpZWxkLCAnZ2xvYmFsX2pvYl92YWNhbmN5JywgVFRBUEkuQVBJSm9iVmFjYW5jeSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRjYXNlICdhY2NydWFsX3BvbGljeV9hY2NvdW50X2lkJzpcblx0XHRcdFx0XHR3aWRnZXQgPSB0aGlzLmdldFRDb21ib0JveCggZmllbGQsICdnbG9iYWxfYWNjcnVhbF9wb2xpY3lfYWNjb3VudCcsIFRUQVBJLkFQSUFjY3J1YWxQb2xpY3lBY2NvdW50ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdGlmICggIUdsb2JhbC5pc1NldCggUmVwb3J0QmFzZVZpZXdDb250cm9sbGVyLlJlcG9ydE1pc3NlZEZpZWxkICkgKSB7XG5cdFx0XHRcdFx0XHRSZXBvcnRCYXNlVmlld0NvbnRyb2xsZXIuUmVwb3J0TWlzc2VkRmllbGQgPSB7fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRSZXBvcnRCYXNlVmlld0NvbnRyb2xsZXIuUmVwb3J0TWlzc2VkRmllbGRbZmllbGRdID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdpZGdldDtcblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cdGdldFRhZyggZmllbGQgKSB7XG5cdFx0dmFyIHdpZGdldCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEFHX0lOUFVUICk7XG5cblx0XHR3aWRnZXQuVFRhZ0lucHV0KCB7IGZpZWxkOiBmaWVsZCB9ICk7XG5cblx0XHRyZXR1cm4gd2lkZ2V0O1xuXHR9XG5cblx0Z2V0VHJlZU1vZGVBQ29tYm9Cb3goIGZpZWxkICkge1xuXHRcdHZhciB3aWRnZXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHR3aWRnZXQgPSB3aWRnZXQuQUNvbWJvQm94KCB7XG5cdFx0XHR0cmVlX21vZGU6IHRydWUsXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IHRydWUsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF90cmVlX2NvbHVtbicsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogZmllbGRcblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gd2lkZ2V0O1xuXHR9XG5cblx0Z2V0Q2hlY2tCb3goIGZpZWxkICkge1xuXHRcdHZhciB3aWRnZXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNIRUNLQk9YICk7XG5cblx0XHR3aWRnZXQgPSB3aWRnZXQuVENoZWNrYm94KCB7XG5cdFx0XHRmaWVsZDogZmllbGRcblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gd2lkZ2V0O1xuXHR9XG5cblx0Z2V0VENvbWJvQm94KCBmaWVsZCwgbGF5b3V0TmFtZSwgYXBpQ2xhc3MgKSB7XG5cblx0XHR2YXIgd2lkZ2V0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0d2lkZ2V0ID0gd2lkZ2V0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBhcGlDbGFzcyxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogdHJ1ZSxcblx0XHRcdGxheW91dF9uYW1lOiBsYXlvdXROYW1lLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0ZmllbGQ6IGZpZWxkXG5cdFx0fSApO1xuXG5cdFx0cmV0dXJuIHdpZGdldDtcblx0fVxuXG5cdGdldFNvcnRDb21ib0JveCggZmllbGQgKSB7XG5cdFx0dmFyIHdpZGdldCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblx0XHR3aWRnZXQgPSB3aWRnZXQuQUNvbWJvQm94KCB7XG5cdFx0XHRmaWVsZDogZmllbGQsXG5cdFx0XHRhbGxvd19kcmFnX3RvX29yZGVyOiB0cnVlLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiB0cnVlLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfc29ydF9jb2x1bW5zJ1xuXHRcdH0gKTtcblxuXHRcdHJldHVybiB3aWRnZXQ7XG5cdH1cblxuXHRnZXRTaW1wbGVUQ29tYm9Cb3goIGZpZWxkLCBhbGxvd011bHRpcGxlICkge1xuXG5cdFx0aWYgKCAhR2xvYmFsLmlzU2V0KCBhbGxvd011bHRpcGxlICkgKSB7XG5cdFx0XHRhbGxvd011bHRpcGxlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHR2YXIgd2lkZ2V0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0d2lkZ2V0ID0gd2lkZ2V0LkFDb21ib0JveCgge1xuXHRcdFx0ZmllbGQ6IGZpZWxkLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBhbGxvd011bHRpcGxlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfb3B0aW9uX2NvbHVtbicsXG5cdFx0XHRrZXk6ICd2YWx1ZSdcblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gd2lkZ2V0O1xuXHR9XG5cblx0Z2V0Q29tYm9Cb3goIGZpZWxkICkge1xuXHRcdHZhciB3aWRnZXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXG5cdFx0d2lkZ2V0ID0gd2lkZ2V0LlRDb21ib0JveCgge1xuXHRcdFx0ZmllbGQ6IGZpZWxkLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlXG5cdFx0fSApO1xuXG5cdFx0cmV0dXJuIHdpZGdldDtcblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0aW5pdFNvdXJjZURhdGEoIGZpZWxkLCB3aWRnZXQgKSB7XG5cblx0XHR2YXIgYXBpX2luc3RhbmNlID0gbnVsbDtcblx0XHR2YXIgb3B0aW9uID0gJyc7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHN3aXRjaCAoIGZpZWxkICkge1xuXHRcdFx0Y2FzZSAnc29ydCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IHRoaXMuYXBpO1xuXHRcdFx0XHRvcHRpb24gPSAnY29sdW1ucyc7XG5cblx0XHRcdFx0YXBpX2luc3RhbmNlLmdldE9wdGlvbnMoIG9wdGlvbiwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0b25SZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAna3BpX2dyb3VwX2lkJzpcblx0XHRcdFx0VFRBUEkuQVBJS1BJR3JvdXAuZ2V0S1BJR3JvdXAoICcnLCBmYWxzZSwgZmFsc2UsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRcdHJlcyA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdHJlcyA9IEdsb2JhbC5idWlsZFRyZWVSZWNvcmQoIHJlcyApO1xuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFNvdXJjZURhdGEoIHJlcyApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdxdWFsaWZpY2F0aW9uX2dyb3VwX2lkJzpcblx0XHRcdFx0VFRBUEkuQVBJUXVhbGlmaWNhdGlvbkdyb3VwLmdldFF1YWxpZmljYXRpb25Hcm91cCggJycsIGZhbHNlLCBmYWxzZSwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXG5cdFx0XHRcdFx0XHRyZXMgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRyZXMgPSBHbG9iYWwuYnVpbGRUcmVlUmVjb3JkKCByZXMgKTtcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRTb3VyY2VEYXRhKCByZXMgKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3Byb2R1Y3RfZ3JvdXBfaWQnOlxuXHRcdFx0XHRUVEFQSS5BUElQcm9kdWN0R3JvdXAuZ2V0UHJvZHVjdEdyb3VwKCAnJywgZmFsc2UsIGZhbHNlLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cblx0XHRcdFx0XHRcdHJlcyA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdHJlcyA9IEdsb2JhbC5idWlsZFRyZWVSZWNvcmQoIHJlcyApO1xuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFNvdXJjZURhdGEoIHJlcyApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnY2xpZW50X2dyb3VwX2lkJzpcblx0XHRcdFx0VFRBUEkuQVBJQ2xpZW50R3JvdXAuZ2V0Q2xpZW50R3JvdXAoICcnLCBmYWxzZSwgZmFsc2UsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblxuXHRcdFx0XHRcdFx0cmVzID0gcmVzLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRcdFx0cmVzID0gR2xvYmFsLmJ1aWxkVHJlZVJlY29yZCggcmVzICk7XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0U291cmNlRGF0YSggcmVzICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd1c2VyX2dyb3VwX2lkJzpcblx0XHRcdFx0VFRBUEkuQVBJVXNlckdyb3VwLmdldFVzZXJHcm91cCggJycsIGZhbHNlLCBmYWxzZSwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXG5cdFx0XHRcdFx0XHRyZXMgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRyZXMgPSBHbG9iYWwuYnVpbGRUcmVlUmVjb3JkKCByZXMgKTtcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRTb3VyY2VEYXRhKCByZXMgKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3BvbGljeV9ncm91cF9pZCc6XG5cdFx0XHRcdFRUQVBJLlBvbGljeUdyb3VwLmdldFBvbGljeUdyb3VwKCAnJywgZmFsc2UsIGZhbHNlLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cblx0XHRcdFx0XHRcdHJlcyA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdHJlcyA9IEdsb2JhbC5idWlsZFRyZWVSZWNvcmQoIHJlcyApO1xuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFNvdXJjZURhdGEoIHJlcyApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX2dyb3VwX2lkJzpcblx0XHRcdFx0VFRBUEkuQVBJSm9iR3JvdXAuZ2V0Sm9iR3JvdXAoICcnLCBmYWxzZSwgZmFsc2UsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRcdHJlcyA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdHJlcyA9IEdsb2JhbC5idWlsZFRyZWVSZWNvcmQoIHJlcyApO1xuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFNvdXJjZURhdGEoIHJlcyApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX2l0ZW1fZ3JvdXBfaWQnOlxuXHRcdFx0XHRUVEFQSS5BUElKb2JJdGVtR3JvdXAuZ2V0Sm9iSXRlbUdyb3VwKCAnJywgZmFsc2UsIGZhbHNlLCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0XHRyZXMgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRyZXMgPSBHbG9iYWwuYnVpbGRUcmVlUmVjb3JkKCByZXMgKTtcblx0XHRcdFx0XHRcdHdpZGdldC5zZXRTb3VyY2VEYXRhKCByZXMgKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2pvYl92YWNhbmN5X2VtcGxveW1lbnRfc3RhdHVzX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJSm9iVmFjYW5jeTtcblx0XHRcdFx0b3B0aW9uID0gJ2VtcGxveW1lbnRfc3RhdHVzJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdqb2JfdmFjYW5jeV9sZXZlbF9pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSUpvYlZhY2FuY3k7XG5cdFx0XHRcdG9wdGlvbiA9ICdsZXZlbCc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX3ZhY2FuY3lfc3RhdHVzX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJSm9iVmFjYW5jeTtcblx0XHRcdFx0b3B0aW9uID0gJ3N0YXR1cyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX3ZhY2FuY3lfdHlwZV9pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSUpvYlZhY2FuY3k7XG5cdFx0XHRcdG9wdGlvbiA9ICd0eXBlJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdqb2JfdmFjYW5jeV93YWdlX3R5cGVfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElKb2JWYWNhbmN5O1xuXHRcdFx0XHRvcHRpb24gPSAnd2FnZV90eXBlJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdqb2JfYXBwbGljYXRpb25fc3RhdHVzX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJSm9iQXBwbGljYXRpb247XG5cdFx0XHRcdG9wdGlvbiA9ICdzdGF0dXMnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2pvYl9hcHBsaWNhdGlvbl90eXBlX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJSm9iQXBwbGljYXRpb247XG5cdFx0XHRcdG9wdGlvbiA9ICd0eXBlJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdqb2JfYXBwbGljYW50X3NleF9pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSUpvYkFwcGxpY2FudDtcblx0XHRcdFx0b3B0aW9uID0gJ3NleCc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX2FwcGxpY2FudF9zdGF0dXNfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElKb2JBcHBsaWNhbnQ7XG5cdFx0XHRcdG9wdGlvbiA9ICdzdGF0dXMnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3VzZXJfcmV2aWV3X2NvbnRyb2xfdHlwZV9pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSVVzZXJSZXZpZXdDb250cm9sO1xuXHRcdFx0XHRvcHRpb24gPSAndHlwZSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndXNlcl9yZXZpZXdfY29udHJvbF9zdGF0dXNfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElVc2VyUmV2aWV3Q29udHJvbDtcblx0XHRcdFx0b3B0aW9uID0gJ3N0YXR1cyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2V2ZXJpdHlfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElVc2VyUmV2aWV3Q29udHJvbDtcblx0XHRcdFx0b3B0aW9uID0gJ3NldmVyaXR5Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd0ZXJtX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJVXNlclJldmlld0NvbnRyb2w7XG5cdFx0XHRcdG9wdGlvbiA9ICd0ZXJtJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdrcGlfc3RhdHVzX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJS1BJO1xuXHRcdFx0XHRvcHRpb24gPSAnc3RhdHVzJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdrcGlfdHlwZV9pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSUtQSTtcblx0XHRcdFx0b3B0aW9uID0gJ3R5cGUnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3Byb2ZpY2llbmN5X2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJVXNlclNraWxsO1xuXHRcdFx0XHRvcHRpb24gPSAncHJvZmljaWVuY3knO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2ZsdWVuY3lfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElVc2VyTGFuZ3VhZ2U7XG5cdFx0XHRcdG9wdGlvbiA9ICdmbHVlbmN5Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjb21wZXRlbmN5X2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJVXNlckxhbmd1YWdlO1xuXHRcdFx0XHRvcHRpb24gPSAnY29tcGV0ZW5jeSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndXNlcl9zdGF0dXNfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElVc2VyO1xuXHRcdFx0XHRvcHRpb24gPSAnc3RhdHVzJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXlfc3R1Yl9zdGF0dXNfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElQYXlTdHViO1xuXHRcdFx0XHRvcHRpb24gPSAnZmlsdGVyZWRfc3RhdHVzJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdvd25lcnNoaXBfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElVc2VyTWVtYmVyc2hpcDtcblx0XHRcdFx0b3B0aW9uID0gJ293bmVyc2hpcCc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbGljZW5zZV9leHBpcnlfZGF0ZSc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IHRoaXMuYXBpO1xuXHRcdFx0XHRvcHRpb24gPSAnbGljZW5zZV9leHBpcnlfZGF0ZSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSB0aGlzLmFwaTtcblx0XHRcdFx0b3B0aW9uID0gJ21lbWJlcnNoaXBfcmVuZXdhbF9kYXRlJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdza2lsbF9leHBpcnlfZGF0ZSc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IHRoaXMuYXBpO1xuXHRcdFx0XHRvcHRpb24gPSAnc2tpbGxfZXhwaXJ5X2RhdGUnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2VkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gdGhpcy5hcGk7XG5cdFx0XHRcdG9wdGlvbiA9ICdlZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZ3JvdXAnOlxuXHRcdFx0Y2FzZSAnc3ViX3RvdGFsJzpcblx0XHRcdGNhc2UgJ3BhZ2VfYnJlYWsnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSB0aGlzLmFwaTtcblx0XHRcdFx0b3B0aW9uID0gJ3N0YXRpY19jb2x1bW5zJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXlfcGVyaW9kX3RpbWVfc2hlZXRfdmVyaWZ5X3N0YXR1c19pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSVBheVBlcmlvZFRpbWVTaGVldFZlcmlmeTtcblx0XHRcdFx0Ly9zaG93IHZhbGlkIHZhbHVlcyBzcGVjaWZpYyB0byB0aGUgcmVwb3J0XG5cdFx0XHRcdG9wdGlvbiA9ICdmaWx0ZXJfcmVwb3J0X3N0YXR1cyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX3N0YXR1c19pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSUpvYjtcblx0XHRcdFx0b3B0aW9uID0gJ3N0YXR1cyc7XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjdXN0b21fZmlsdGVyJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gdGhpcy5hcGk7XG5cdFx0XHRcdG9wdGlvbiA9ICdyZXBvcnRfY3VzdG9tX2ZpbHRlcnMnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnbG9nX2FjdGlvbl9pZCc6XG5cblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJTG9nO1xuXHRcdFx0XHRvcHRpb24gPSAnYWN0aW9uJztcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2xvZ190YWJsZV9uYW1lX2lkJzpcblxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElMb2c7XG5cdFx0XHRcdG9wdGlvbiA9ICd0YWJsZV9uYW1lJztcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2ZpbHRlcic6XG5cdFx0XHRcdGlmICggdGhpcy5zY3JpcHRfbmFtZSA9PT0gJ1NjaGVkdWxlU3VtbWFyeVJlcG9ydCcgKSB7XG5cdFx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJU2NoZWR1bGU7XG5cdFx0XHRcdFx0b3B0aW9uID0gJ3N0YXR1cyc7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuc2NyaXB0X25hbWUgPT09ICdJbnZvaWNlVHJhbnNhY3Rpb25TdW1tYXJ5UmVwb3J0JyApIHtcblx0XHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElUcmFuc2FjdGlvbjtcblx0XHRcdFx0XHRvcHRpb24gPSAndHlwZSc7XG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRoaXMuc2NyaXB0X25hbWUgPT09ICdQYXlTdHViU3VtbWFyeVJlcG9ydCcgKSB7XG5cdFx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJUGF5U3R1Yjtcblx0XHRcdFx0XHRvcHRpb24gPSAnc3RhdHVzJztcblx0XHRcdFx0fSBlbHNlIGlmICggdGhpcy5zY3JpcHRfbmFtZSA9PT0gJ0FjdGl2ZVNoaWZ0UmVwb3J0JyApIHtcblx0XHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElVc2VyO1xuXHRcdFx0XHRcdG9wdGlvbiA9ICdzdGF0dXMnO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhY2NydWFsX3BvbGljeV90eXBlX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJQWNjcnVhbFBvbGljeTtcblx0XHRcdFx0b3B0aW9uID0gJ3R5cGUnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2FjY3J1YWxfdHlwZV9pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSUFjY3J1YWw7XG5cdFx0XHRcdG9wdGlvbiA9ICd0eXBlJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdxdWFsaWZpY2F0aW9uX3R5cGVfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElRdWFsaWZpY2F0aW9uO1xuXHRcdFx0XHRvcHRpb24gPSAndHlwZSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZXhjZXB0aW9uX3BvbGljeV90eXBlX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJRXhjZXB0aW9uUG9saWN5O1xuXHRcdFx0XHRvcHRpb24gPSAndHlwZSc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZXhjZXB0aW9uX3BvbGljeV9zZXZlcml0eV9pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSUV4Y2VwdGlvblBvbGljeTtcblx0XHRcdFx0b3B0aW9uID0gJ3NldmVyaXR5Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdleHBlbnNlX3BvbGljeV9yZXF1aXJlX3JlY2VpcHRfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElFeHBlbnNlUG9saWN5O1xuXHRcdFx0XHRvcHRpb24gPSAncmVxdWlyZV9yZWNlaXB0Jztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdleHBlbnNlX3BvbGljeV90eXBlX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJRXhwZW5zZVBvbGljeTtcblx0XHRcdFx0b3B0aW9uID0gJ3R5cGUnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3VzZXJfZXhwZW5zZV9wYXltZW50X21ldGhvZF9pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSVVzZXJFeHBlbnNlO1xuXHRcdFx0XHRvcHRpb24gPSAncGF5bWVudF9tZXRob2QnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3VzZXJfZXhwZW5zZV9zdGF0dXNfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElVc2VyRXhwZW5zZTtcblx0XHRcdFx0b3B0aW9uID0gJ3N0YXR1cyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnam9iX2l0ZW1fc3RhdHVzX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJSm9iSXRlbTtcblx0XHRcdFx0b3B0aW9uID0gJ3N0YXR1cyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnY2xpZW50X3N0YXR1c19pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSUNsaWVudDtcblx0XHRcdFx0b3B0aW9uID0gJ3N0YXR1cyc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnaW52b2ljZV9zdGF0dXNfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElJbnZvaWNlO1xuXHRcdFx0XHRvcHRpb24gPSAnc3RhdHVzJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdpbnZvaWNlX3RyYW5zYWN0aW9uX3R5cGVfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSBUVEFQSS5BUElUcmFuc2FjdGlvbjtcblx0XHRcdFx0b3B0aW9uID0gJ3R5cGUnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3Byb2R1Y3RfdHlwZV9pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IFRUQVBJLkFQSVByb2R1Y3Q7XG5cdFx0XHRcdG9wdGlvbiA9ICd0eXBlJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXlfc3R1Yl90eXBlX2lkJzpcblx0XHRcdFx0YXBpX2luc3RhbmNlID0gVFRBUEkuQVBJUGF5U3R1Yjtcblx0XHRcdFx0b3B0aW9uID0gJ3R5cGUnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3RyYW5zYWN0aW9uX3R5cGVfaWQnOlxuXHRcdFx0XHRhcGlfaW5zdGFuY2UgPSB0aGlzLmFwaTtcblx0XHRcdFx0b3B0aW9uID0gJ3R5cGUnO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3RyYW5zYWN0aW9uX3N0YXR1c19pZCc6XG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IHRoaXMuYXBpO1xuXHRcdFx0XHRvcHRpb24gPSAnc3RhdHVzJztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdwYXlfc3R1Yl9ydW5faWQnOlxuXHRcdFx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0XHRcdGZvciAoIHZhciBpID0gMTsgaSA8PSAxMjg7IGkrKyApIHtcblx0XHRcdFx0XHRyZXN1bHRbaV0gPSBpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJlc3VsdCA9IEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHQgKTtcblx0XHRcdFx0d2lkZ2V0LnNldFNvdXJjZURhdGEoIHJlc3VsdCApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHQvL0Rvbid0IGRlYWwgd2l0aCBhd2Vzb21lYm94IHdpdGggYXBpXG5cdFx0XHRcdGlmICggd2lkZ2V0LmdldEFQSSAmJiB3aWRnZXQuZ2V0QVBJKCkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly9UZXh0IElucHV0IG9yIG90aGVyIG5vIG9wdGlvbnMgd2lkZ2V0XG5cdFx0XHRcdGlmICggIXdpZGdldC5zZXRTb3VyY2VEYXRhICkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZpZWxkLnJlcGxhY2UoICdfaWQnLCAnJyApO1xuXG5cdFx0XHRcdGFwaV9pbnN0YW5jZSA9IHRoaXMuYXBpO1xuXHRcdFx0XHRvcHRpb24gPSBmaWVsZDtcblx0XHRcdFx0aWYgKCBmaWVsZC5pbmRleE9mKCAndGltZV9wZXJpb2QnICkgPj0gMCApIHtcblx0XHRcdFx0XHRvcHRpb24gPSAndGltZV9wZXJpb2QnO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0aWYgKCBhcGlfaW5zdGFuY2UgKSB7XG5cblx0XHRcdGlmICggdGhpcy5uZWVkX3JlZnJlc2hfZGlzcGxheV9jb2x1bW5zICYmICggb3B0aW9uID09PSAnY29sdW1ucycgfHwgZmllbGQgPT0gJ2N1c3RvbV9maWx0ZXInICkgKSB7XG5cdFx0XHRcdGFwaV9pbnN0YW5jZS5nZXRPcHRpb25zKCBvcHRpb24sIHtcblx0XHRcdFx0XHRub0NhY2hlOiB0cnVlLCBvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0b25SZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YXBpX2luc3RhbmNlLmdldE9wdGlvbnMoIG9wdGlvbiwge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0b25SZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gb25SZXN1bHQoIHJlc3VsdCApIHtcblxuXHRcdFx0dmFyIHJlc19kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0cmVzX2RhdGEgPSBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggcmVzX2RhdGEgKTtcblx0XHRcdGlmICggZmllbGQgPT09ICdzb3J0JyApIHtcblx0XHRcdFx0cmVzX2RhdGEgPSAkdGhpcy5idWlsZFNvcnRTZWxlY3RvclVuU2VsZWN0Q29sdW1ucyggcmVzX2RhdGEgKTtcblx0XHRcdH0gZWxzZSBpZiAoIGZpZWxkLmluZGV4T2YoICd0aW1lX3BlcmlvZCcgKSA+PSAwICkge1xuXHRcdFx0XHQkdGhpcy50aW1lX3BlcmlvZF9hcnJheSA9IHJlc19kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHR3aWRnZXQuc2V0U291cmNlRGF0YSggcmVzX2RhdGEgKTtcblxuXHRcdH1cblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6ZW5kICovXG5cdGdldERhdGVQaWNrZXIoIGZpZWxkICkge1xuXHRcdHZhciB3aWRnZXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSICk7XG5cblx0XHR3aWRnZXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6IGZpZWxkIH0gKTtcblxuXHRcdHJldHVybiB3aWRnZXQ7XG5cdH1cblxuXHRwdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIGZvcm1faXRlbV9pbnB1dCwgbGFiZWwgKSB7XG5cdFx0dmFyIGZvcm1faXRlbSA9ICQoIEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBXaWRnZXROYW1lc0RpYy5FRElUX1ZJRVdfU1VCX0ZPUk1fSVRFTSApICk7XG5cdFx0dmFyIGZvcm1faXRlbV9sYWJlbCA9IGZvcm1faXRlbS5maW5kKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tbGFiZWwnICk7XG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dF9kaXYgPSBmb3JtX2l0ZW0uZmluZCggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWlucHV0LWRpdicgKTtcblx0XHRmb3JtX2l0ZW0uYWRkQ2xhc3MoICdyZW1vdmUtbWFyZ2luJyApO1xuXG5cdFx0Zm9ybV9pdGVtX2xhYmVsLnRleHQoICQuaTE4bi5fKCBsYWJlbCApICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0X2Rpdi5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXG5cdFx0cmV0dXJuIGZvcm1faXRlbTtcblx0fVxuXG5cdG9uTGljZW5zZUV4cGlyeURhdGUoIHRhcmdldCwgZGVmYXVsdFZhbHVlICkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgdmFsdWUgPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblxuXHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5saWNlbnNlX2V4cGlyeV9kYXRlID0gbnVsbDtcblx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMuc3RhcnRfZGF0ZV8zID0gbnVsbDtcblx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMuZW5kX2RhdGVfMyA9IG51bGw7XG5cdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLnBheV9wZXJpb2RfaWRfMyA9IG51bGw7XG5cdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLnBheV9wZXJpb2Rfc2NoZWR1bGVfaWRfMyA9IG51bGw7XG5cblx0XHRpZiAoIHZhbHVlID09PSAnY3VzdG9tX2RhdGUnICkge1xuXHRcdFx0YnVpbGRDdXN0b21EYXRlVUkoKTtcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gJ2N1c3RvbV9wYXlfcGVyaW9kJyApIHtcblx0XHRcdGJ1aWxkUGF5UGVyaW9kVUkoKTtcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gJ3RoaXNfcGF5X3BlcmlvZCcgfHwgdmFsdWUgPT09ICdsYXN0X3BheV9wZXJpb2QnIHx8IHZhbHVlID09PSAndG9fbGFzdF9wYXlfcGVyaW9kJyB8fCB2YWx1ZSA9PT0gJ3RvX3RoaXNfcGF5X3BlcmlvZCcgKSB7XG5cdFx0XHRidWlsZFBheVBlcmlvZFNjaGVkdWxlVUkoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YnVpbGREZWZhdWx0VUkoKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBidWlsZFBheVBlcmlvZFNjaGVkdWxlVUkoKSB7XG5cdFx0XHR2YXIgZm9ybV9pdGVtX2RpdiA9ICggJHRoaXMuZWRpdF92aWV3ICkuZmluZCggJyNyZXBvcnRfbGljZW5zZV9leHBpcnlfZGF0ZV9kaXYnICk7XG5cdFx0XHR2YXIgZm9ybV9pbnB1dF9kaXYgPSAkKCBmb3JtX2l0ZW1fZGl2LmNoaWxkcmVuKClbMV0gKTtcblx0XHRcdGZvcm1faW5wdXRfZGl2LmVtcHR5KCk7XG5cblx0XHRcdHZhciB2X2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ3YtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0dmFyIHRpbWVfcGVyaW9kID0gJHRoaXMuZ2V0U2ltcGxlVENvbWJvQm94KCAnbGljZW5zZV9leHBpcnlfZGF0ZScsIGZhbHNlLCBmYWxzZSApO1xuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoICdsaWNlbnNlX2V4cGlyeV9kYXRlJywgdGltZV9wZXJpb2QgKTtcblx0XHRcdHRpbWVfcGVyaW9kLnNldFZhbHVlKCB2YWx1ZSApO1xuXG5cdFx0XHR2YXIgcGF5X3BlcmlvZCA9ICR0aGlzLmdldFRDb21ib0JveCggJ3BheV9wZXJpb2Rfc2NoZWR1bGVfaWRfMycsICdnbG9iYWxfcGF5X3BlcmlvZF9zY2hlZHVsZScsIFRUQVBJLkFQSVBheVBlcmlvZFNjaGVkdWxlICk7XG5cblx0XHRcdHZhciBmb3JtX2l0ZW0gPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIHRpbWVfcGVyaW9kLCAkLmkxOG4uXyggJ1NlY3Rpb24nICkgKTtcblx0XHRcdHZhciBmb3JtX2l0ZW0yID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBwYXlfcGVyaW9kLCAkLmkxOG4uXyggJ1BheSBQZXJpb2QgU2NoZWR1bGUnICkgKTtcblxuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5saWNlbnNlX2V4cGlyeV9kYXRlID0gdGltZV9wZXJpb2Q7XG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLnBheV9wZXJpb2Rfc2NoZWR1bGVfaWRfMyA9IHBheV9wZXJpb2Q7XG5cblx0XHRcdHRpbWVfcGVyaW9kLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRwYXlfcGVyaW9kLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIGRlZmF1bHRWYWx1ZSApIHtcblx0XHRcdFx0cGF5X3BlcmlvZC5zZXRWYWx1ZSggZGVmYXVsdFZhbHVlLnBheV9wZXJpb2Rfc2NoZWR1bGVfaWQgKTtcblx0XHRcdH1cblxuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0gKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0yICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0JHRoaXMuc2V0RWRpdEZpZWxkU2l6ZSggdl9ib3guZmluZCggJy5lZGl0LXZpZXctZm9ybS1pdGVtLXN1Yi1sYWJlbC1kaXYgPiBzcGFuJyApLCAxMjAgKTtcblxuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuYXBwZW5kKCB2X2JveCApO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGJ1aWxkUGF5UGVyaW9kVUkoKSB7XG5cdFx0XHR2YXIgZm9ybV9pdGVtX2RpdiA9ICggJHRoaXMuZWRpdF92aWV3ICkuZmluZCggJyNyZXBvcnRfbGljZW5zZV9leHBpcnlfZGF0ZV9kaXYnICk7XG5cdFx0XHR2YXIgZm9ybV9pbnB1dF9kaXYgPSAkKCBmb3JtX2l0ZW1fZGl2LmNoaWxkcmVuKClbMV0gKTtcblx0XHRcdGZvcm1faW5wdXRfZGl2LmVtcHR5KCk7XG5cblx0XHRcdHZhciB2X2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ3YtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0dmFyIHRpbWVfcGVyaW9kID0gJHRoaXMuZ2V0U2ltcGxlVENvbWJvQm94KCAnbGljZW5zZV9leHBpcnlfZGF0ZScsIGZhbHNlLCBmYWxzZSApO1xuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoICdsaWNlbnNlX2V4cGlyeV9kYXRlJywgdGltZV9wZXJpb2QgKTtcblx0XHRcdHRpbWVfcGVyaW9kLnNldFZhbHVlKCB2YWx1ZSApO1xuXG5cdFx0XHR2YXIgcGF5X3BlcmlvZCA9ICR0aGlzLmdldFRDb21ib0JveCggJ3BheV9wZXJpb2RfaWRfMycsICdnbG9iYWxfUGF5X3BlcmlvZCcsIFRUQVBJLkFQSVBheVBlcmlvZCApO1xuXG5cdFx0XHRwYXlfcGVyaW9kLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHR2YXIgZm9ybV9pdGVtID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCB0aW1lX3BlcmlvZCwgJC5pMThuLl8oICdTZWN0aW9uJyApICk7XG5cdFx0XHR2YXIgZm9ybV9pdGVtMiA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggcGF5X3BlcmlvZCwgJC5pMThuLl8oICdQYXkgUGVyaW9kJyApICk7XG5cblx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMubGljZW5zZV9leHBpcnlfZGF0ZSA9IHRpbWVfcGVyaW9kO1xuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5wYXlfcGVyaW9kX2lkXzMgPSBwYXlfcGVyaW9kO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0aWYgKCBkZWZhdWx0VmFsdWUgKSB7XG5cdFx0XHRcdHBheV9wZXJpb2Quc2V0VmFsdWUoIGRlZmF1bHRWYWx1ZS5wYXlfcGVyaW9kX2lkICk7XG5cdFx0XHR9XG5cblx0XHRcdGZvcm1faW5wdXRfZGl2LmFwcGVuZCggdl9ib3ggKTtcblxuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0gKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0yICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0JHRoaXMuc2V0RWRpdEZpZWxkU2l6ZSggdl9ib3guZmluZCggJy5lZGl0LXZpZXctZm9ybS1pdGVtLXN1Yi1sYWJlbC1kaXYgPiBzcGFuJyApLCA3MCApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYnVpbGREZWZhdWx0VUkoKSB7XG5cdFx0XHR2YXIgZm9ybV9pdGVtX2RpdiA9ICggJHRoaXMuZWRpdF92aWV3ICkuZmluZCggJyNyZXBvcnRfbGljZW5zZV9leHBpcnlfZGF0ZV9kaXYnICk7XG5cdFx0XHR2YXIgZm9ybV9pbnB1dF9kaXYgPSAkKCBmb3JtX2l0ZW1fZGl2LmNoaWxkcmVuKClbMV0gKTtcblx0XHRcdGZvcm1faW5wdXRfZGl2LmVtcHR5KCk7XG5cblx0XHRcdHZhciB0aW1lX3BlcmlvZCA9ICR0aGlzLmdldFNpbXBsZVRDb21ib0JveCggJ2xpY2Vuc2VfZXhwaXJ5X2RhdGUnLCBmYWxzZSwgZmFsc2UgKTtcblxuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuYXBwZW5kKCB0aW1lX3BlcmlvZCApO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC5zZXRWYWx1ZSggdmFsdWUgKTtcblxuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoICdsaWNlbnNlX2V4cGlyeV9kYXRlJywgdGltZV9wZXJpb2QgKTtcblxuXHRcdFx0dGltZV9wZXJpb2QudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMubGljZW5zZV9leHBpcnlfZGF0ZSA9IHRpbWVfcGVyaW9kO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYnVpbGRDdXN0b21EYXRlVUkoKSB7XG5cdFx0XHR2YXIgZm9ybV9pdGVtX2RpdiA9ICggJHRoaXMuZWRpdF92aWV3ICkuZmluZCggJyNyZXBvcnRfbGljZW5zZV9leHBpcnlfZGF0ZV9kaXYnICk7XG5cdFx0XHR2YXIgZm9ybV9pbnB1dF9kaXYgPSAkKCBmb3JtX2l0ZW1fZGl2LmNoaWxkcmVuKClbMV0gKTtcblx0XHRcdGZvcm1faW5wdXRfZGl2LmVtcHR5KCk7XG5cblx0XHRcdHZhciB2X2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ3YtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0dmFyIHRpbWVfcGVyaW9kID0gJHRoaXMuZ2V0U2ltcGxlVENvbWJvQm94KCAnbGljZW5zZV9leHBpcnlfZGF0ZScsIGZhbHNlLCBmYWxzZSApO1xuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoICdsaWNlbnNlX2V4cGlyeV9kYXRlJywgdGltZV9wZXJpb2QgKTtcblx0XHRcdHRpbWVfcGVyaW9kLnNldFZhbHVlKCB2YWx1ZSApO1xuXG5cdFx0XHR2YXIgc3RhcnRfZGF0ZSA9ICR0aGlzLmdldERhdGVQaWNrZXIoICdzdGFydF9kYXRlXzMnICk7XG5cblx0XHRcdHZhciBlbmRfZGF0ZSA9ICR0aGlzLmdldERhdGVQaWNrZXIoICdlbmRfZGF0ZV8zJyApO1xuXG5cdFx0XHRpZiAoIGRlZmF1bHRWYWx1ZSApIHtcblx0XHRcdFx0c3RhcnRfZGF0ZS5zZXRWYWx1ZSggZGVmYXVsdFZhbHVlLnN0YXJ0X2RhdGUgKTtcblx0XHRcdFx0ZW5kX2RhdGUuc2V0VmFsdWUoIGRlZmF1bHRWYWx1ZS5lbmRfZGF0ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZm9ybV9pdGVtID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCB0aW1lX3BlcmlvZCwgJC5pMThuLl8oICdTZWN0aW9uJyApICk7XG5cdFx0XHR2YXIgZm9ybV9pdGVtMiA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggc3RhcnRfZGF0ZSwgJC5pMThuLl8oICdTdGFydCBEYXRlJyApICk7XG5cdFx0XHR2YXIgZm9ybV9pdGVtMyA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggZW5kX2RhdGUsICQuaTE4bi5fKCAnRW5kIERhdGUnICkgKTtcblxuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5saWNlbnNlX2V4cGlyeV9kYXRlID0gdGltZV9wZXJpb2Q7XG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLnN0YXJ0X2RhdGVfMyA9IHN0YXJ0X2RhdGU7XG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLmVuZF9kYXRlXzMgPSBlbmRfZGF0ZTtcblxuXHRcdFx0dGltZV9wZXJpb2QudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdHN0YXJ0X2RhdGUudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdGVuZF9kYXRlLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbSApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbTIgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0zICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0JHRoaXMuc2V0RWRpdEZpZWxkU2l6ZSggdl9ib3guZmluZCggJy5lZGl0LXZpZXctZm9ybS1pdGVtLXN1Yi1sYWJlbC1kaXYgPiBzcGFuJyApLCA3MCApO1xuXG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5hcHBlbmQoIHZfYm94ICk7XG5cblx0XHR9XG5cdH1cblxuXHRvbkVkdWNhdGlvbkdyYWR1YXRlRGF0ZSggdGFyZ2V0LCBkZWZhdWx0VmFsdWUgKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciB2YWx1ZSA9IHRhcmdldC5nZXRWYWx1ZSgpO1xuXG5cdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLmVkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlID0gbnVsbDtcblx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMuc3RhcnRfZGF0ZV80ID0gbnVsbDtcblx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMuZW5kX2RhdGVfNCA9IG51bGw7XG5cdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLnBheV9wZXJpb2RfaWRfNCA9IG51bGw7XG5cdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLnBheV9wZXJpb2Rfc2NoZWR1bGVfaWRfNCA9IG51bGw7XG5cblx0XHRpZiAoIHZhbHVlID09PSAnY3VzdG9tX2RhdGUnICkge1xuXHRcdFx0YnVpbGRDdXN0b21EYXRlVUkoKTtcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gJ2N1c3RvbV9wYXlfcGVyaW9kJyApIHtcblx0XHRcdGJ1aWxkUGF5UGVyaW9kVUkoKTtcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gJ3RoaXNfcGF5X3BlcmlvZCcgfHwgdmFsdWUgPT09ICdsYXN0X3BheV9wZXJpb2QnIHx8IHZhbHVlID09PSAndG9fbGFzdF9wYXlfcGVyaW9kJyB8fCB2YWx1ZSA9PT0gJ3RvX3RoaXNfcGF5X3BlcmlvZCcgKSB7XG5cdFx0XHRidWlsZFBheVBlcmlvZFNjaGVkdWxlVUkoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YnVpbGREZWZhdWx0VUkoKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBidWlsZFBheVBlcmlvZFNjaGVkdWxlVUkoKSB7XG5cdFx0XHR2YXIgZm9ybV9pdGVtX2RpdiA9ICggJHRoaXMuZWRpdF92aWV3ICkuZmluZCggJyNyZXBvcnRfZWR1Y2F0aW9uX2dyYWR1YXRlX2RhdGVfZGl2JyApO1xuXHRcdFx0dmFyIGZvcm1faW5wdXRfZGl2ID0gJCggZm9ybV9pdGVtX2Rpdi5jaGlsZHJlbigpWzFdICk7XG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5lbXB0eSgpO1xuXG5cdFx0XHR2YXIgdl9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCd2LWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciB0aW1lX3BlcmlvZCA9ICR0aGlzLmdldFNpbXBsZVRDb21ib0JveCggJ2VkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlJywgZmFsc2UsIGZhbHNlICk7XG5cdFx0XHQkdGhpcy5pbml0U291cmNlRGF0YSggJ2VkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlJywgdGltZV9wZXJpb2QgKTtcblx0XHRcdHRpbWVfcGVyaW9kLnNldFZhbHVlKCB2YWx1ZSApO1xuXG5cdFx0XHR2YXIgcGF5X3BlcmlvZCA9ICR0aGlzLmdldFRDb21ib0JveCggJ3BheV9wZXJpb2Rfc2NoZWR1bGVfaWRfNCcsICdnbG9iYWxfcGF5X3BlcmlvZF9zY2hlZHVsZScsIFRUQVBJLkFQSVBheVBlcmlvZFNjaGVkdWxlICk7XG5cblx0XHRcdHZhciBmb3JtX2l0ZW0gPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIHRpbWVfcGVyaW9kLCAkLmkxOG4uXyggJ1NlY3Rpb24nICkgKTtcblx0XHRcdHZhciBmb3JtX2l0ZW0yID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBwYXlfcGVyaW9kLCAkLmkxOG4uXyggJ1BheSBQZXJpb2QgU2NoZWR1bGUnICkgKTtcblxuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5lZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZSA9IHRpbWVfcGVyaW9kO1xuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5wYXlfcGVyaW9kX3NjaGVkdWxlX2lkXzQgPSBwYXlfcGVyaW9kO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0cGF5X3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0aWYgKCBkZWZhdWx0VmFsdWUgKSB7XG5cdFx0XHRcdHBheV9wZXJpb2Quc2V0VmFsdWUoIGRlZmF1bHRWYWx1ZS5wYXlfcGVyaW9kX3NjaGVkdWxlX2lkICk7XG5cdFx0XHR9XG5cblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtMiApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cblx0XHRcdCR0aGlzLnNldEVkaXRGaWVsZFNpemUoIHZfYm94LmZpbmQoICcuZWRpdC12aWV3LWZvcm0taXRlbS1zdWItbGFiZWwtZGl2ID4gc3BhbicgKSwgMTIwICk7XG5cblx0XHRcdGZvcm1faW5wdXRfZGl2LmFwcGVuZCggdl9ib3ggKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBidWlsZFBheVBlcmlvZFVJKCkge1xuXHRcdFx0dmFyIGZvcm1faXRlbV9kaXYgPSAoICR0aGlzLmVkaXRfdmlldyApLmZpbmQoICcjcmVwb3J0X2VkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlX2RpdicgKTtcblx0XHRcdHZhciBmb3JtX2lucHV0X2RpdiA9ICQoIGZvcm1faXRlbV9kaXYuY2hpbGRyZW4oKVsxXSApO1xuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuZW1wdHkoKTtcblxuXHRcdFx0dmFyIHZfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwndi1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHR2YXIgdGltZV9wZXJpb2QgPSAkdGhpcy5nZXRTaW1wbGVUQ29tYm9Cb3goICdlZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZScsIGZhbHNlLCBmYWxzZSApO1xuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoICdlZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZScsIHRpbWVfcGVyaW9kICk7XG5cdFx0XHR0aW1lX3BlcmlvZC5zZXRWYWx1ZSggdmFsdWUgKTtcblxuXHRcdFx0dmFyIHBheV9wZXJpb2QgPSAkdGhpcy5nZXRUQ29tYm9Cb3goICdwYXlfcGVyaW9kX2lkXzQnLCAnZ2xvYmFsX1BheV9wZXJpb2QnLCBUVEFQSS5BUElQYXlQZXJpb2QgKTtcblxuXHRcdFx0cGF5X3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0dmFyIGZvcm1faXRlbSA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggdGltZV9wZXJpb2QsICQuaTE4bi5fKCAnU2VjdGlvbicgKSApO1xuXHRcdFx0dmFyIGZvcm1faXRlbTIgPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIHBheV9wZXJpb2QsICQuaTE4bi5fKCAnUGF5IFBlcmlvZCcgKSApO1xuXG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLmVkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlID0gdGltZV9wZXJpb2Q7XG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLnBheV9wZXJpb2RfaWRfNCA9IHBheV9wZXJpb2Q7XG5cblx0XHRcdHRpbWVfcGVyaW9kLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIGRlZmF1bHRWYWx1ZSApIHtcblx0XHRcdFx0cGF5X3BlcmlvZC5zZXRWYWx1ZSggZGVmYXVsdFZhbHVlLnBheV9wZXJpb2RfaWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuYXBwZW5kKCB2X2JveCApO1xuXG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbSApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbTIgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHQkdGhpcy5zZXRFZGl0RmllbGRTaXplKCB2X2JveC5maW5kKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tc3ViLWxhYmVsLWRpdiA+IHNwYW4nICksIDcwICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBidWlsZERlZmF1bHRVSSgpIHtcblx0XHRcdHZhciBmb3JtX2l0ZW1fZGl2ID0gKCAkdGhpcy5lZGl0X3ZpZXcgKS5maW5kKCAnI3JlcG9ydF9lZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZV9kaXYnICk7XG5cdFx0XHR2YXIgZm9ybV9pbnB1dF9kaXYgPSAkKCBmb3JtX2l0ZW1fZGl2LmNoaWxkcmVuKClbMV0gKTtcblx0XHRcdGZvcm1faW5wdXRfZGl2LmVtcHR5KCk7XG5cblx0XHRcdHZhciB0aW1lX3BlcmlvZCA9ICR0aGlzLmdldFNpbXBsZVRDb21ib0JveCggJ2VkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlJywgZmFsc2UsIGZhbHNlICk7XG5cblx0XHRcdGZvcm1faW5wdXRfZGl2LmFwcGVuZCggdGltZV9wZXJpb2QgKTtcblxuXHRcdFx0dGltZV9wZXJpb2Quc2V0VmFsdWUoIHZhbHVlICk7XG5cblx0XHRcdCR0aGlzLmluaXRTb3VyY2VEYXRhKCAnZWR1Y2F0aW9uX2dyYWR1YXRlX2RhdGUnLCB0aW1lX3BlcmlvZCApO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5lZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZSA9IHRpbWVfcGVyaW9kO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYnVpbGRDdXN0b21EYXRlVUkoKSB7XG5cdFx0XHR2YXIgZm9ybV9pdGVtX2RpdiA9ICggJHRoaXMuZWRpdF92aWV3ICkuZmluZCggJyNyZXBvcnRfZWR1Y2F0aW9uX2dyYWR1YXRlX2RhdGVfZGl2JyApO1xuXHRcdFx0dmFyIGZvcm1faW5wdXRfZGl2ID0gJCggZm9ybV9pdGVtX2Rpdi5jaGlsZHJlbigpWzFdICk7XG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5lbXB0eSgpO1xuXG5cdFx0XHR2YXIgdl9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCd2LWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciB0aW1lX3BlcmlvZCA9ICR0aGlzLmdldFNpbXBsZVRDb21ib0JveCggJ2VkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlJywgZmFsc2UsIGZhbHNlICk7XG5cdFx0XHQkdGhpcy5pbml0U291cmNlRGF0YSggJ2VkdWNhdGlvbl9ncmFkdWF0ZV9kYXRlJywgdGltZV9wZXJpb2QgKTtcblx0XHRcdHRpbWVfcGVyaW9kLnNldFZhbHVlKCB2YWx1ZSApO1xuXG5cdFx0XHR2YXIgc3RhcnRfZGF0ZSA9ICR0aGlzLmdldERhdGVQaWNrZXIoICdzdGFydF9kYXRlXzQnICk7XG5cblx0XHRcdHZhciBlbmRfZGF0ZSA9ICR0aGlzLmdldERhdGVQaWNrZXIoICdlbmRfZGF0ZV80JyApO1xuXG5cdFx0XHRpZiAoIGRlZmF1bHRWYWx1ZSApIHtcblx0XHRcdFx0c3RhcnRfZGF0ZS5zZXRWYWx1ZSggZGVmYXVsdFZhbHVlLnN0YXJ0X2RhdGUgKTtcblx0XHRcdFx0ZW5kX2RhdGUuc2V0VmFsdWUoIGRlZmF1bHRWYWx1ZS5lbmRfZGF0ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZm9ybV9pdGVtID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCB0aW1lX3BlcmlvZCwgJC5pMThuLl8oICdTZWN0aW9uJyApICk7XG5cdFx0XHR2YXIgZm9ybV9pdGVtMiA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggc3RhcnRfZGF0ZSwgJC5pMThuLl8oICdTdGFydCBEYXRlJyApICk7XG5cdFx0XHR2YXIgZm9ybV9pdGVtMyA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggZW5kX2RhdGUsICQuaTE4bi5fKCAnRW5kIERhdGUnICkgKTtcblxuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5lZHVjYXRpb25fZ3JhZHVhdGVfZGF0ZSA9IHRpbWVfcGVyaW9kO1xuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5zdGFydF9kYXRlXzQgPSBzdGFydF9kYXRlO1xuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5lbmRfZGF0ZV80ID0gZW5kX2RhdGU7XG5cblx0XHRcdHRpbWVfcGVyaW9kLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRzdGFydF9kYXRlLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRlbmRfZGF0ZS51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0gKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0yICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtMyApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cblx0XHRcdCR0aGlzLnNldEVkaXRGaWVsZFNpemUoIHZfYm94LmZpbmQoICcuZWRpdC12aWV3LWZvcm0taXRlbS1zdWItbGFiZWwtZGl2ID4gc3BhbicgKSwgNzAgKTtcblxuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuYXBwZW5kKCB2X2JveCApO1xuXG5cdFx0fVxuXHR9XG5cblx0b25Ta2lsbEV4cGlyeURhdGUoIHRhcmdldCwgZGVmYXVsdFZhbHVlICkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgdmFsdWUgPSB0YXJnZXQuZ2V0VmFsdWUoKTtcblxuXHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5za2lsbF9leHBpcnlfZGF0ZSA9IG51bGw7XG5cdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLnN0YXJ0X2RhdGVfMiA9IG51bGw7XG5cdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLmVuZF9kYXRlXzIgPSBudWxsO1xuXHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5wYXlfcGVyaW9kX2lkXzIgPSBudWxsO1xuXHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5wYXlfcGVyaW9kX3NjaGVkdWxlX2lkXzIgPSBudWxsO1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gJ2N1c3RvbV9kYXRlJyApIHtcblx0XHRcdGJ1aWxkQ3VzdG9tRGF0ZVVJKCk7XG5cdFx0fSBlbHNlIGlmICggdmFsdWUgPT09ICdjdXN0b21fcGF5X3BlcmlvZCcgKSB7XG5cdFx0XHRidWlsZFBheVBlcmlvZFVJKCk7XG5cdFx0fSBlbHNlIGlmICggdmFsdWUgPT09ICd0aGlzX3BheV9wZXJpb2QnIHx8IHZhbHVlID09PSAnbGFzdF9wYXlfcGVyaW9kJyB8fCB2YWx1ZSA9PT0gJ3RvX2xhc3RfcGF5X3BlcmlvZCcgfHwgdmFsdWUgPT09ICd0b190aGlzX3BheV9wZXJpb2QnICkge1xuXHRcdFx0YnVpbGRQYXlQZXJpb2RTY2hlZHVsZVVJKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJ1aWxkRGVmYXVsdFVJKCk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYnVpbGRQYXlQZXJpb2RTY2hlZHVsZVVJKCkge1xuXHRcdFx0dmFyIGZvcm1faXRlbV9kaXYgPSAoICR0aGlzLmVkaXRfdmlldyApLmZpbmQoICcjcmVwb3J0X3NraWxsX2V4cGlyeV9kYXRlX2RpdicgKTtcblx0XHRcdHZhciBmb3JtX2lucHV0X2RpdiA9ICQoIGZvcm1faXRlbV9kaXYuY2hpbGRyZW4oKVsxXSApO1xuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuZW1wdHkoKTtcblxuXHRcdFx0dmFyIHZfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwndi1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHR2YXIgdGltZV9wZXJpb2QgPSAkdGhpcy5nZXRTaW1wbGVUQ29tYm9Cb3goICdza2lsbF9leHBpcnlfZGF0ZScsIGZhbHNlLCBmYWxzZSApO1xuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoICdza2lsbF9leHBpcnlfZGF0ZScsIHRpbWVfcGVyaW9kICk7XG5cdFx0XHR0aW1lX3BlcmlvZC5zZXRWYWx1ZSggdmFsdWUgKTtcblxuXHRcdFx0dmFyIHBheV9wZXJpb2QgPSAkdGhpcy5nZXRUQ29tYm9Cb3goICdwYXlfcGVyaW9kX3NjaGVkdWxlX2lkXzInLCAnZ2xvYmFsX3BheV9wZXJpb2Rfc2NoZWR1bGUnLCBUVEFQSS5BUElQYXlQZXJpb2RTY2hlZHVsZSApO1xuXG5cdFx0XHR2YXIgZm9ybV9pdGVtID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCB0aW1lX3BlcmlvZCwgJC5pMThuLl8oICdTZWN0aW9uJyApICk7XG5cdFx0XHR2YXIgZm9ybV9pdGVtMiA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggcGF5X3BlcmlvZCwgJC5pMThuLl8oICdQYXkgUGVyaW9kIFNjaGVkdWxlJyApICk7XG5cblx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMuc2tpbGxfZXhwaXJ5X2RhdGUgPSB0aW1lX3BlcmlvZDtcblx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMucGF5X3BlcmlvZF9zY2hlZHVsZV9pZF8yID0gcGF5X3BlcmlvZDtcblxuXHRcdFx0dGltZV9wZXJpb2QudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdHBheV9wZXJpb2QudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdGlmICggZGVmYXVsdFZhbHVlICkge1xuXHRcdFx0XHRwYXlfcGVyaW9kLnNldFZhbHVlKCBkZWZhdWx0VmFsdWUucGF5X3BlcmlvZF9zY2hlZHVsZV9pZCApO1xuXHRcdFx0fVxuXG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbSApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbTIgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHQkdGhpcy5zZXRFZGl0RmllbGRTaXplKCB2X2JveC5maW5kKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tc3ViLWxhYmVsLWRpdiA+IHNwYW4nICksIDEyMCApO1xuXG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5hcHBlbmQoIHZfYm94ICk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYnVpbGRQYXlQZXJpb2RVSSgpIHtcblx0XHRcdHZhciBmb3JtX2l0ZW1fZGl2ID0gKCAkdGhpcy5lZGl0X3ZpZXcgKS5maW5kKCAnI3JlcG9ydF9za2lsbF9leHBpcnlfZGF0ZV9kaXYnICk7XG5cdFx0XHR2YXIgZm9ybV9pbnB1dF9kaXYgPSAkKCBmb3JtX2l0ZW1fZGl2LmNoaWxkcmVuKClbMV0gKTtcblx0XHRcdGZvcm1faW5wdXRfZGl2LmVtcHR5KCk7XG5cblx0XHRcdHZhciB2X2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ3YtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0dmFyIHRpbWVfcGVyaW9kID0gJHRoaXMuZ2V0U2ltcGxlVENvbWJvQm94KCAnc2tpbGxfZXhwaXJ5X2RhdGUnLCBmYWxzZSwgZmFsc2UgKTtcblx0XHRcdCR0aGlzLmluaXRTb3VyY2VEYXRhKCAnc2tpbGxfZXhwaXJ5X2RhdGUnLCB0aW1lX3BlcmlvZCApO1xuXHRcdFx0dGltZV9wZXJpb2Quc2V0VmFsdWUoIHZhbHVlICk7XG5cblx0XHRcdHZhciBwYXlfcGVyaW9kID0gJHRoaXMuZ2V0VENvbWJvQm94KCAncGF5X3BlcmlvZF9pZF8yJywgJ2dsb2JhbF9QYXlfcGVyaW9kJywgVFRBUEkuQVBJUGF5UGVyaW9kICk7XG5cblx0XHRcdHBheV9wZXJpb2QudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdHZhciBmb3JtX2l0ZW0gPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIHRpbWVfcGVyaW9kLCAkLmkxOG4uXyggJ1NlY3Rpb24nICkgKTtcblx0XHRcdHZhciBmb3JtX2l0ZW0yID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBwYXlfcGVyaW9kLCAkLmkxOG4uXyggJ1BheSBQZXJpb2QnICkgKTtcblxuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5za2lsbF9leHBpcnlfZGF0ZSA9IHRpbWVfcGVyaW9kO1xuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5wYXlfcGVyaW9kX2lkXzIgPSBwYXlfcGVyaW9kO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0aWYgKCBkZWZhdWx0VmFsdWUgKSB7XG5cdFx0XHRcdHBheV9wZXJpb2Quc2V0VmFsdWUoIGRlZmF1bHRWYWx1ZS5wYXlfcGVyaW9kX2lkICk7XG5cdFx0XHR9XG5cblx0XHRcdGZvcm1faW5wdXRfZGl2LmFwcGVuZCggdl9ib3ggKTtcblxuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0gKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0yICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0JHRoaXMuc2V0RWRpdEZpZWxkU2l6ZSggdl9ib3guZmluZCggJy5lZGl0LXZpZXctZm9ybS1pdGVtLXN1Yi1sYWJlbC1kaXYgPiBzcGFuJyApLCA3MCApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYnVpbGREZWZhdWx0VUkoKSB7XG5cdFx0XHR2YXIgZm9ybV9pdGVtX2RpdiA9ICggJHRoaXMuZWRpdF92aWV3ICkuZmluZCggJyNyZXBvcnRfc2tpbGxfZXhwaXJ5X2RhdGVfZGl2JyApO1xuXHRcdFx0dmFyIGZvcm1faW5wdXRfZGl2ID0gJCggZm9ybV9pdGVtX2Rpdi5jaGlsZHJlbigpWzFdICk7XG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5lbXB0eSgpO1xuXG5cdFx0XHR2YXIgdGltZV9wZXJpb2QgPSAkdGhpcy5nZXRTaW1wbGVUQ29tYm9Cb3goICdza2lsbF9leHBpcnlfZGF0ZScsIGZhbHNlLCBmYWxzZSApO1xuXG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5hcHBlbmQoIHRpbWVfcGVyaW9kICk7XG5cblx0XHRcdHRpbWVfcGVyaW9kLnNldFZhbHVlKCB2YWx1ZSApO1xuXG5cdFx0XHQkdGhpcy5pbml0U291cmNlRGF0YSggJ3NraWxsX2V4cGlyeV9kYXRlJywgdGltZV9wZXJpb2QgKTtcblxuXHRcdFx0dGltZV9wZXJpb2QudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMuc2tpbGxfZXhwaXJ5X2RhdGUgPSB0aW1lX3BlcmlvZDtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGJ1aWxkQ3VzdG9tRGF0ZVVJKCkge1xuXHRcdFx0dmFyIGZvcm1faXRlbV9kaXYgPSAoICR0aGlzLmVkaXRfdmlldyApLmZpbmQoICcjcmVwb3J0X3NraWxsX2V4cGlyeV9kYXRlX2RpdicgKTtcblx0XHRcdHZhciBmb3JtX2lucHV0X2RpdiA9ICQoIGZvcm1faXRlbV9kaXYuY2hpbGRyZW4oKVsxXSApO1xuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuZW1wdHkoKTtcblxuXHRcdFx0dmFyIHZfYm94ID0gJCggJzxkaXYgY2xhc3M9XFwndi1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHR2YXIgdGltZV9wZXJpb2QgPSAkdGhpcy5nZXRTaW1wbGVUQ29tYm9Cb3goICdza2lsbF9leHBpcnlfZGF0ZScsIGZhbHNlLCBmYWxzZSApO1xuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoICdza2lsbF9leHBpcnlfZGF0ZScsIHRpbWVfcGVyaW9kICk7XG5cdFx0XHR0aW1lX3BlcmlvZC5zZXRWYWx1ZSggdmFsdWUgKTtcblxuXHRcdFx0dmFyIHN0YXJ0X2RhdGUgPSAkdGhpcy5nZXREYXRlUGlja2VyKCAnc3RhcnRfZGF0ZV8yJyApO1xuXG5cdFx0XHR2YXIgZW5kX2RhdGUgPSAkdGhpcy5nZXREYXRlUGlja2VyKCAnZW5kX2RhdGVfMicgKTtcblxuXHRcdFx0aWYgKCBkZWZhdWx0VmFsdWUgKSB7XG5cdFx0XHRcdHN0YXJ0X2RhdGUuc2V0VmFsdWUoIGRlZmF1bHRWYWx1ZS5zdGFydF9kYXRlICk7XG5cdFx0XHRcdGVuZF9kYXRlLnNldFZhbHVlKCBkZWZhdWx0VmFsdWUuZW5kX2RhdGUgKTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIGZvcm1faXRlbSA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggdGltZV9wZXJpb2QsICQuaTE4bi5fKCAnU2VjdGlvbicgKSApO1xuXHRcdFx0dmFyIGZvcm1faXRlbTIgPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIHN0YXJ0X2RhdGUsICQuaTE4bi5fKCAnU3RhcnQgRGF0ZScgKSApO1xuXHRcdFx0dmFyIGZvcm1faXRlbTMgPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIGVuZF9kYXRlLCAkLmkxOG4uXyggJ0VuZCBEYXRlJyApICk7XG5cblx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMuc2tpbGxfZXhwaXJ5X2RhdGUgPSB0aW1lX3BlcmlvZDtcblx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMuc3RhcnRfZGF0ZV8yID0gc3RhcnRfZGF0ZTtcblx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMuZW5kX2RhdGVfMiA9IGVuZF9kYXRlO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0c3RhcnRfZGF0ZS51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0ZW5kX2RhdGUudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtMiApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbTMgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHQkdGhpcy5zZXRFZGl0RmllbGRTaXplKCB2X2JveC5maW5kKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tc3ViLWxhYmVsLWRpdiA+IHNwYW4nICksIDcwICk7XG5cblx0XHRcdGZvcm1faW5wdXRfZGl2LmFwcGVuZCggdl9ib3ggKTtcblxuXHRcdH1cblx0fVxuXG5cdG9uTWVtYmVyc2hpcFJlbmV3YWxEYXRlQ2hhbmdlKCB0YXJnZXQsIGRlZmF1bHRWYWx1ZSApIHtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cblx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMubWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUgPSBudWxsO1xuXHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5zdGFydF9kYXRlXzEgPSBudWxsO1xuXHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0cy5lbmRfZGF0ZV8xID0gbnVsbDtcblx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMucGF5X3BlcmlvZF9pZF8xID0gbnVsbDtcblx0XHR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMucGF5X3BlcmlvZF9zY2hlZHVsZV9pZF8xID0gbnVsbDtcblxuXHRcdGlmICggdmFsdWUgPT09ICdjdXN0b21fZGF0ZScgKSB7XG5cdFx0XHRidWlsZEN1c3RvbURhdGVVSSgpO1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSAnY3VzdG9tX3BheV9wZXJpb2QnICkge1xuXHRcdFx0YnVpbGRQYXlQZXJpb2RVSSgpO1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSAndGhpc19wYXlfcGVyaW9kJyB8fCB2YWx1ZSA9PT0gJ2xhc3RfcGF5X3BlcmlvZCcgfHwgdmFsdWUgPT09ICd0b19sYXN0X3BheV9wZXJpb2QnIHx8IHZhbHVlID09PSAndG9fdGhpc19wYXlfcGVyaW9kJyApIHtcblx0XHRcdGJ1aWxkUGF5UGVyaW9kU2NoZWR1bGVVSSgpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRidWlsZERlZmF1bHRVSSgpO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGJ1aWxkUGF5UGVyaW9kU2NoZWR1bGVVSSgpIHtcblx0XHRcdHZhciBmb3JtX2l0ZW1fZGl2ID0gKCAkdGhpcy5lZGl0X3ZpZXcgKS5maW5kKCAnI3JlcG9ydF9tZW1iZXJzaGlwX3JlbmV3YWxfZGF0ZV9kaXYnICk7XG5cdFx0XHR2YXIgZm9ybV9pbnB1dF9kaXYgPSAkKCBmb3JtX2l0ZW1fZGl2LmNoaWxkcmVuKClbMV0gKTtcblx0XHRcdGZvcm1faW5wdXRfZGl2LmVtcHR5KCk7XG5cblx0XHRcdHZhciB2X2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ3YtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0dmFyIHRpbWVfcGVyaW9kID0gJHRoaXMuZ2V0U2ltcGxlVENvbWJvQm94KCAnbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUnLCBmYWxzZSwgZmFsc2UgKTtcblx0XHRcdCR0aGlzLmluaXRTb3VyY2VEYXRhKCAnbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUnLCB0aW1lX3BlcmlvZCApO1xuXHRcdFx0dGltZV9wZXJpb2Quc2V0VmFsdWUoIHZhbHVlICk7XG5cblx0XHRcdHZhciBwYXlfcGVyaW9kID0gJHRoaXMuZ2V0VENvbWJvQm94KCAncGF5X3BlcmlvZF9zY2hlZHVsZV9pZF8xJywgJ2dsb2JhbF9wYXlfcGVyaW9kX3NjaGVkdWxlJywgVFRBUEkuQVBJUGF5UGVyaW9kU2NoZWR1bGUgKTtcblxuXHRcdFx0dmFyIGZvcm1faXRlbSA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggdGltZV9wZXJpb2QsICQuaTE4bi5fKCAnU2VjdGlvbicgKSApO1xuXHRcdFx0dmFyIGZvcm1faXRlbTIgPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIHBheV9wZXJpb2QsICQuaTE4bi5fKCAnUGF5IFBlcmlvZCBTY2hlZHVsZScgKSApO1xuXG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLm1lbWJlcnNoaXBfcmVuZXdhbF9kYXRlID0gdGltZV9wZXJpb2Q7XG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLnBheV9wZXJpb2Rfc2NoZWR1bGVfaWRfMSA9IHBheV9wZXJpb2Q7XG5cblx0XHRcdHRpbWVfcGVyaW9kLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRwYXlfcGVyaW9kLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIGRlZmF1bHRWYWx1ZSApIHtcblx0XHRcdFx0cGF5X3BlcmlvZC5zZXRWYWx1ZSggZGVmYXVsdFZhbHVlLnBheV9wZXJpb2Rfc2NoZWR1bGVfaWQgKTtcblx0XHRcdH1cblxuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0gKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0yICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0JHRoaXMuc2V0RWRpdEZpZWxkU2l6ZSggdl9ib3guZmluZCggJy5lZGl0LXZpZXctZm9ybS1pdGVtLXN1Yi1sYWJlbC1kaXYgPiBzcGFuJyApLCAxMjAgKTtcblxuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuYXBwZW5kKCB2X2JveCApO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGJ1aWxkUGF5UGVyaW9kVUkoKSB7XG5cdFx0XHR2YXIgZm9ybV9pdGVtX2RpdiA9ICggJHRoaXMuZWRpdF92aWV3ICkuZmluZCggJyNyZXBvcnRfbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGVfZGl2JyApO1xuXHRcdFx0dmFyIGZvcm1faW5wdXRfZGl2ID0gJCggZm9ybV9pdGVtX2Rpdi5jaGlsZHJlbigpWzFdICk7XG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5lbXB0eSgpO1xuXG5cdFx0XHR2YXIgdl9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCd2LWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciB0aW1lX3BlcmlvZCA9ICR0aGlzLmdldFNpbXBsZVRDb21ib0JveCggJ21lbWJlcnNoaXBfcmVuZXdhbF9kYXRlJywgZmFsc2UsIGZhbHNlICk7XG5cdFx0XHQkdGhpcy5pbml0U291cmNlRGF0YSggJ21lbWJlcnNoaXBfcmVuZXdhbF9kYXRlJywgdGltZV9wZXJpb2QgKTtcblx0XHRcdHRpbWVfcGVyaW9kLnNldFZhbHVlKCB2YWx1ZSApO1xuXG5cdFx0XHR2YXIgcGF5X3BlcmlvZCA9ICR0aGlzLmdldFRDb21ib0JveCggJ3BheV9wZXJpb2RfaWRfMScsICdnbG9iYWxfUGF5X3BlcmlvZCcsIFRUQVBJLkFQSVBheVBlcmlvZCApO1xuXG5cdFx0XHRwYXlfcGVyaW9kLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHR2YXIgZm9ybV9pdGVtID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCB0aW1lX3BlcmlvZCwgJC5pMThuLl8oICdTZWN0aW9uJyApICk7XG5cdFx0XHR2YXIgZm9ybV9pdGVtMiA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggcGF5X3BlcmlvZCwgJC5pMThuLl8oICdQYXkgUGVyaW9kJyApICk7XG5cblx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMubWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUgPSB0aW1lX3BlcmlvZDtcblx0XHRcdCR0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHMucGF5X3BlcmlvZF9pZF8xID0gcGF5X3BlcmlvZDtcblxuXHRcdFx0dGltZV9wZXJpb2QudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdGlmICggZGVmYXVsdFZhbHVlICkge1xuXHRcdFx0XHRwYXlfcGVyaW9kLnNldFZhbHVlKCBkZWZhdWx0VmFsdWUucGF5X3BlcmlvZF9pZCApO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5hcHBlbmQoIHZfYm94ICk7XG5cblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtMiApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cblx0XHRcdCR0aGlzLnNldEVkaXRGaWVsZFNpemUoIHZfYm94LmZpbmQoICcuZWRpdC12aWV3LWZvcm0taXRlbS1zdWItbGFiZWwtZGl2ID4gc3BhbicgKSwgNzAgKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGJ1aWxkRGVmYXVsdFVJKCkge1xuXHRcdFx0dmFyIGZvcm1faXRlbV9kaXYgPSAoICR0aGlzLmVkaXRfdmlldyApLmZpbmQoICcjcmVwb3J0X21lbWJlcnNoaXBfcmVuZXdhbF9kYXRlX2RpdicgKTtcblx0XHRcdHZhciBmb3JtX2lucHV0X2RpdiA9ICQoIGZvcm1faXRlbV9kaXYuY2hpbGRyZW4oKVsxXSApO1xuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuZW1wdHkoKTtcblxuXHRcdFx0dmFyIHRpbWVfcGVyaW9kID0gJHRoaXMuZ2V0U2ltcGxlVENvbWJvQm94KCAnbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUnLCBmYWxzZSwgZmFsc2UgKTtcblxuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuYXBwZW5kKCB0aW1lX3BlcmlvZCApO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC5zZXRWYWx1ZSggdmFsdWUgKTtcblxuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoICdtZW1iZXJzaGlwX3JlbmV3YWxfZGF0ZScsIHRpbWVfcGVyaW9kICk7XG5cblx0XHRcdHRpbWVfcGVyaW9kLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLm1lbWJlcnNoaXBfcmVuZXdhbF9kYXRlID0gdGltZV9wZXJpb2Q7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBidWlsZEN1c3RvbURhdGVVSSgpIHtcblx0XHRcdHZhciBmb3JtX2l0ZW1fZGl2ID0gKCAkdGhpcy5lZGl0X3ZpZXcgKS5maW5kKCAnI3JlcG9ydF9tZW1iZXJzaGlwX3JlbmV3YWxfZGF0ZV9kaXYnICk7XG5cdFx0XHR2YXIgZm9ybV9pbnB1dF9kaXYgPSAkKCBmb3JtX2l0ZW1fZGl2LmNoaWxkcmVuKClbMV0gKTtcblx0XHRcdGZvcm1faW5wdXRfZGl2LmVtcHR5KCk7XG5cblx0XHRcdHZhciB2X2JveCA9ICQoICc8ZGl2IGNsYXNzPVxcJ3YtYm94XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0dmFyIHRpbWVfcGVyaW9kID0gJHRoaXMuZ2V0U2ltcGxlVENvbWJvQm94KCAnbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUnLCBmYWxzZSwgZmFsc2UgKTtcblx0XHRcdCR0aGlzLmluaXRTb3VyY2VEYXRhKCAnbWVtYmVyc2hpcF9yZW5ld2FsX2RhdGUnLCB0aW1lX3BlcmlvZCApO1xuXHRcdFx0dGltZV9wZXJpb2Quc2V0VmFsdWUoIHZhbHVlICk7XG5cblx0XHRcdHZhciBzdGFydF9kYXRlID0gJHRoaXMuZ2V0RGF0ZVBpY2tlciggJ3N0YXJ0X2RhdGVfMScgKTtcblxuXHRcdFx0dmFyIGVuZF9kYXRlID0gJHRoaXMuZ2V0RGF0ZVBpY2tlciggJ2VuZF9kYXRlXzEnICk7XG5cblx0XHRcdGlmICggZGVmYXVsdFZhbHVlICkge1xuXHRcdFx0XHRzdGFydF9kYXRlLnNldFZhbHVlKCBkZWZhdWx0VmFsdWUuc3RhcnRfZGF0ZSApO1xuXHRcdFx0XHRlbmRfZGF0ZS5zZXRWYWx1ZSggZGVmYXVsdFZhbHVlLmVuZF9kYXRlICk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBmb3JtX2l0ZW0gPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIHRpbWVfcGVyaW9kLCAkLmkxOG4uXyggJ1NlY3Rpb24nICkgKTtcblx0XHRcdHZhciBmb3JtX2l0ZW0yID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBzdGFydF9kYXRlLCAkLmkxOG4uXyggJ1N0YXJ0IERhdGUnICkgKTtcblx0XHRcdHZhciBmb3JtX2l0ZW0zID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBlbmRfZGF0ZSwgJC5pMThuLl8oICdFbmQgRGF0ZScgKSApO1xuXG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLm1lbWJlcnNoaXBfcmVuZXdhbF9kYXRlID0gdGltZV9wZXJpb2Q7XG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLnN0YXJ0X2RhdGVfMSA9IHN0YXJ0X2RhdGU7XG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzLmVuZF9kYXRlXzEgPSBlbmRfZGF0ZTtcblxuXHRcdFx0dGltZV9wZXJpb2QudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdHN0YXJ0X2RhdGUudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdGVuZF9kYXRlLnVuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJyApLmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQgKSB7XG5cdFx0XHRcdCR0aGlzLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCApO1xuXHRcdFx0fSApO1xuXG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbSApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbTIgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCBmb3JtX2l0ZW0zICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblxuXHRcdFx0JHRoaXMuc2V0RWRpdEZpZWxkU2l6ZSggdl9ib3guZmluZCggJy5lZGl0LXZpZXctZm9ybS1pdGVtLXN1Yi1sYWJlbC1kaXYgPiBzcGFuJyApLCA2MiApO1xuXG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5hcHBlbmQoIHZfYm94ICk7XG5cblx0XHR9XG5cdH1cblxuXHRvblRpbWVQZXJpb2RDaGFuZ2UoIHRhcmdldCwgZGVmYXVsdFZhbHVlICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIHZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cdFx0dmFyIGZpZWxkID0gdGFyZ2V0LmdldEZpZWxkKCk7XG5cdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzW2ZpZWxkXSA9IG51bGw7XG5cblx0XHRpZiAoIHZhbHVlID09PSAnY3VzdG9tX2RhdGUnICkge1xuXHRcdFx0YnVpbGRDdXN0b21EYXRlVUkoKTtcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gJ2N1c3RvbV9wYXlfcGVyaW9kJyApIHtcblx0XHRcdGJ1aWxkUGF5UGVyaW9kVUkoKTtcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSA9PT0gJ3RoaXNfcGF5X3BlcmlvZCcgfHwgdmFsdWUgPT09ICdsYXN0X3BheV9wZXJpb2QnIHx8IHZhbHVlID09PSAndG9fbGFzdF9wYXlfcGVyaW9kJyB8fCB2YWx1ZSA9PT0gJ3RvX3RoaXNfcGF5X3BlcmlvZCcgfHwgdmFsdWUgPT09ICd0aGlzX3llYXJfdGhpc19wYXlfcGVyaW9kJyB8fCB2YWx1ZSA9PT0gJ3RoaXNfeWVhcl9sYXN0X3BheV9wZXJpb2QnICkge1xuXHRcdFx0YnVpbGRQYXlQZXJpb2RTY2hlZHVsZVVJKCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGJ1aWxkRGVmYXVsdFVJKCk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYnVpbGRQYXlQZXJpb2RTY2hlZHVsZVVJKCkge1xuXHRcdFx0dmFyIGZvcm1faXRlbV9kaXYgPSAoICR0aGlzLmVkaXRfdmlldyApLmZpbmQoICcjcmVwb3J0XycgKyBmaWVsZCArICdfZGl2JyApO1xuXHRcdFx0dmFyIGZvcm1faW5wdXRfZGl2ID0gJCggZm9ybV9pdGVtX2Rpdi5jaGlsZHJlbigpWzFdICk7XG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5lbXB0eSgpO1xuXG5cdFx0XHR2YXIgdl9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCd2LWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciB0aW1lX3BlcmlvZCA9ICR0aGlzLmdldFNpbXBsZVRDb21ib0JveCggZmllbGQsIGZhbHNlLCBmYWxzZSApO1xuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoIGZpZWxkLCB0aW1lX3BlcmlvZCApO1xuXHRcdFx0dGltZV9wZXJpb2Quc2V0VmFsdWUoIHZhbHVlICk7XG5cblx0XHRcdHZhciBwYXlfcGVyaW9kID0gJHRoaXMuZ2V0VENvbWJvQm94KCAncGF5X3BlcmlvZF9zY2hlZHVsZV9pZCcsICdnbG9iYWxfcGF5X3BlcmlvZF9zY2hlZHVsZScsIFRUQVBJLkFQSVBheVBlcmlvZFNjaGVkdWxlICk7XG5cdFx0XHRwYXlfcGVyaW9kLmF0dHIoICd0aW1lX3BlcmlvZF9rZXknLCBmaWVsZCApO1xuXHRcdFx0dmFyIGZvcm1faXRlbSA9ICR0aGlzLnB1dElucHV0VG9JbnNpZGVGb3JtSXRlbSggdGltZV9wZXJpb2QsICQuaTE4bi5fKCAnU2VjdGlvbicgKSApO1xuXHRcdFx0dmFyIGZvcm1faXRlbTIgPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIHBheV9wZXJpb2QsICQuaTE4bi5fKCAnUGF5IFBlcmlvZCBTY2hlZHVsZScgKSApO1xuXG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzW2ZpZWxkXSA9IHRpbWVfcGVyaW9kO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0cGF5X3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0aWYgKCBkZWZhdWx0VmFsdWUgKSB7XG5cdFx0XHRcdHBheV9wZXJpb2Quc2V0VmFsdWUoIGRlZmF1bHRWYWx1ZS5wYXlfcGVyaW9kX3NjaGVkdWxlX2lkICk7XG5cdFx0XHR9XG5cblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtMiApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cblx0XHRcdCR0aGlzLnNldEVkaXRGaWVsZFNpemUoIHZfYm94LmZpbmQoICcuZWRpdC12aWV3LWZvcm0taXRlbS1zdWItbGFiZWwtZGl2ID4gc3BhbicgKSwgMTIwICk7XG5cblx0XHRcdGZvcm1faW5wdXRfZGl2LmFwcGVuZCggdl9ib3ggKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBidWlsZFBheVBlcmlvZFVJKCkge1xuXHRcdFx0dmFyIGZvcm1faXRlbV9kaXYgPSAoICR0aGlzLmVkaXRfdmlldyApLmZpbmQoICcjcmVwb3J0XycgKyBmaWVsZCArICdfZGl2JyApO1xuXHRcdFx0dmFyIGZvcm1faW5wdXRfZGl2ID0gJCggZm9ybV9pdGVtX2Rpdi5jaGlsZHJlbigpWzFdICk7XG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5lbXB0eSgpO1xuXG5cdFx0XHR2YXIgdl9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCd2LWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciB0aW1lX3BlcmlvZCA9ICR0aGlzLmdldFNpbXBsZVRDb21ib0JveCggZmllbGQsIGZhbHNlLCBmYWxzZSApO1xuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoIGZpZWxkLCB0aW1lX3BlcmlvZCApO1xuXHRcdFx0dGltZV9wZXJpb2Quc2V0VmFsdWUoIHZhbHVlICk7XG5cblx0XHRcdHZhciBwYXlfcGVyaW9kID0gJHRoaXMuZ2V0VENvbWJvQm94KCAncGF5X3BlcmlvZF9pZCcsICdnbG9iYWxfUGF5X3BlcmlvZCcsIFRUQVBJLkFQSVBheVBlcmlvZCApO1xuXHRcdFx0cGF5X3BlcmlvZC5hdHRyKCAndGltZV9wZXJpb2Rfa2V5JywgZmllbGQgKTtcblx0XHRcdHBheV9wZXJpb2QudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdHZhciBmb3JtX2l0ZW0gPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIHRpbWVfcGVyaW9kLCAkLmkxOG4uXyggJ1NlY3Rpb24nICkgKTtcblx0XHRcdHZhciBmb3JtX2l0ZW0yID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBwYXlfcGVyaW9kLCAkLmkxOG4uXyggJ1BheSBQZXJpb2QnICkgKTtcblxuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0c1tmaWVsZF0gPSB0aW1lX3BlcmlvZDtcblxuXHRcdFx0dGltZV9wZXJpb2QudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdGlmICggZGVmYXVsdFZhbHVlICkge1xuXHRcdFx0XHRwYXlfcGVyaW9kLnNldFZhbHVlKCBkZWZhdWx0VmFsdWUucGF5X3BlcmlvZF9pZCApO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5hcHBlbmQoIHZfYm94ICk7XG5cblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtMiApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cblx0XHRcdCR0aGlzLnNldEVkaXRGaWVsZFNpemUoIHZfYm94LmZpbmQoICcuZWRpdC12aWV3LWZvcm0taXRlbS1zdWItbGFiZWwtZGl2ID4gc3BhbicgKSwgNzAgKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGJ1aWxkRGVmYXVsdFVJKCkge1xuXHRcdFx0dmFyIGZvcm1faXRlbV9kaXYgPSAoICR0aGlzLmVkaXRfdmlldyApLmZpbmQoICcjcmVwb3J0XycgKyBmaWVsZCArICdfZGl2JyApO1xuXHRcdFx0dmFyIGZvcm1faW5wdXRfZGl2ID0gJCggZm9ybV9pdGVtX2Rpdi5jaGlsZHJlbigpWzFdICk7XG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5lbXB0eSgpO1xuXG5cdFx0XHR2YXIgdGltZV9wZXJpb2QgPSAkdGhpcy5nZXRTaW1wbGVUQ29tYm9Cb3goIGZpZWxkLCBmYWxzZSwgZmFsc2UgKTtcblxuXHRcdFx0Zm9ybV9pbnB1dF9kaXYuYXBwZW5kKCB0aW1lX3BlcmlvZCApO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC5zZXRWYWx1ZSggdmFsdWUgKTtcblxuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoIGZpZWxkLCB0aW1lX3BlcmlvZCApO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0c1tmaWVsZF0gPSB0aW1lX3BlcmlvZDtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGJ1aWxkQ3VzdG9tRGF0ZVVJKCkge1xuXHRcdFx0dmFyIGZvcm1faXRlbV9kaXYgPSAoICR0aGlzLmVkaXRfdmlldyApLmZpbmQoICcjcmVwb3J0XycgKyBmaWVsZCArICdfZGl2JyApO1xuXHRcdFx0dmFyIGZvcm1faW5wdXRfZGl2ID0gJCggZm9ybV9pdGVtX2Rpdi5jaGlsZHJlbigpWzFdICk7XG5cdFx0XHRmb3JtX2lucHV0X2Rpdi5lbXB0eSgpO1xuXG5cdFx0XHR2YXIgdl9ib3ggPSAkKCAnPGRpdiBjbGFzcz1cXCd2LWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciB0aW1lX3BlcmlvZCA9ICR0aGlzLmdldFNpbXBsZVRDb21ib0JveCggZmllbGQsIGZhbHNlLCBmYWxzZSApO1xuXHRcdFx0JHRoaXMuaW5pdFNvdXJjZURhdGEoIGZpZWxkLCB0aW1lX3BlcmlvZCApO1xuXHRcdFx0dGltZV9wZXJpb2Quc2V0VmFsdWUoIHZhbHVlICk7XG5cblx0XHRcdHZhciBzdGFydF9kYXRlID0gJHRoaXMuZ2V0RGF0ZVBpY2tlciggJ3N0YXJ0X2RhdGUnICk7XG5cdFx0XHR2YXIgZW5kX2RhdGUgPSAkdGhpcy5nZXREYXRlUGlja2VyKCAnZW5kX2RhdGUnICk7XG5cdFx0XHRzdGFydF9kYXRlLmF0dHIoICd0aW1lX3BlcmlvZF9rZXknLCBmaWVsZCApO1xuXHRcdFx0ZW5kX2RhdGUuYXR0ciggJ3RpbWVfcGVyaW9kX2tleScsIGZpZWxkICk7XG5cblx0XHRcdGlmICggZGVmYXVsdFZhbHVlICkge1xuXHRcdFx0XHRzdGFydF9kYXRlLnNldFZhbHVlKCBkZWZhdWx0VmFsdWUuc3RhcnRfZGF0ZSApO1xuXHRcdFx0XHRlbmRfZGF0ZS5zZXRWYWx1ZSggZGVmYXVsdFZhbHVlLmVuZF9kYXRlICk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBmb3JtX2l0ZW0gPSAkdGhpcy5wdXRJbnB1dFRvSW5zaWRlRm9ybUl0ZW0oIHRpbWVfcGVyaW9kLCAkLmkxOG4uXyggJ1NlY3Rpb24nICkgKTtcblx0XHRcdHZhciBmb3JtX2l0ZW0yID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBzdGFydF9kYXRlLCAkLmkxOG4uXyggJ1N0YXJ0IERhdGUnICkgKTtcblx0XHRcdHZhciBmb3JtX2l0ZW0zID0gJHRoaXMucHV0SW5wdXRUb0luc2lkZUZvcm1JdGVtKCBlbmRfZGF0ZSwgJC5pMThuLl8oICdFbmQgRGF0ZScgKSApO1xuXG5cdFx0XHQkdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzW2ZpZWxkXSA9IHRpbWVfcGVyaW9kO1xuXG5cdFx0XHR0aW1lX3BlcmlvZC51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0c3RhcnRfZGF0ZS51bmJpbmQoICdmb3JtSXRlbUNoYW5nZScgKS5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHQkdGhpcy5vbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQgKTtcblx0XHRcdH0gKTtcblxuXHRcdFx0ZW5kX2RhdGUudW5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnICkuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCApIHtcblx0XHRcdFx0JHRoaXMub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0XHR9ICk7XG5cblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoICc8ZGl2IGNsYXNzPVxcJ2NsZWFyLWJvdGgtZGl2XFwnPjwvZGl2PicgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggZm9ybV9pdGVtMiApO1xuXHRcdFx0dl9ib3guYXBwZW5kKCAnPGRpdiBjbGFzcz1cXCdjbGVhci1ib3RoLWRpdlxcJz48L2Rpdj4nICk7XG5cdFx0XHR2X2JveC5hcHBlbmQoIGZvcm1faXRlbTMgKTtcblx0XHRcdHZfYm94LmFwcGVuZCggJzxkaXYgY2xhc3M9XFwnY2xlYXItYm90aC1kaXZcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHQkdGhpcy5zZXRFZGl0RmllbGRTaXplKCB2X2JveC5maW5kKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tc3ViLWxhYmVsLWRpdiA+IHNwYW4nICksIDYyICk7XG5cblx0XHRcdGZvcm1faW5wdXRfZGl2LmFwcGVuZCggdl9ib3ggKTtcblxuXHRcdH1cblx0fVxuXG5cdC8vT3ZlcnJpZGUgdGhpcyBpZiBtb3JlIHRoYW4gb25lIHRhYlxuXHRzZXRFcnJvclRpcHMoIHJlc3VsdCwgZG9udF9zd2l0Y2hfdGFiICkge1xuXHRcdHRoaXMuY2xlYXJFcnJvclRpcHMoKTtcblxuXHRcdHZhciBkZXRhaWxzID0gcmVzdWx0LmdldERldGFpbHMoKTtcblx0XHR2YXIgZXJyb3JfbGlzdCA9IGRldGFpbHNbMF07XG5cblx0XHR2YXIgZm91bmRfaW5fY3VycmVudF90YWIgPSBmYWxzZTtcblxuXHRcdHZhciB0YWJfcmVwb3J0ID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3JlcG9ydCcgKTtcblx0XHR2YXIgdGFiX3NldHVwID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX3NldHVwJyApO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBlcnJvcl9saXN0ICkge1xuXG5cdFx0XHRpZiAoICFlcnJvcl9saXN0Lmhhc093blByb3BlcnR5KCBrZXkgKSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggIUdsb2JhbC5pc1NldCggdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV0gKSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICgga2V5ID09PSAndGltZV9wZXJpb2QnIHx8XG5cdFx0XHRcdGtleSA9PT0gJ21lbWJlcnNoaXBfcmVuZXdhbF9kYXRlJyB8fFxuXHRcdFx0XHRrZXkgPT09ICdza2lsbF9leHBpcnlfZGF0ZScgfHxcblx0XHRcdFx0a2V5ID09PSAnbGljZW5zZV9leHBpcnlfZGF0ZScgfHxcblx0XHRcdFx0a2V5ID09PSAnZWR1Y2F0aW9uX2dyYWR1YXRlX2RhdGUnXG5cdFx0XHQpIHtcblx0XHRcdFx0aWYgKCB0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHNba2V5XSAmJiB0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHNba2V5XS5pcyggJzp2aXNpYmxlJyApICkge1xuXHRcdFx0XHRcdHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0c1trZXldLnNldEVycm9yU3R5bGUoIGVycm9yX2xpc3Rba2V5XSwgdHJ1ZSApO1xuXHRcdFx0XHRcdGZvdW5kX2luX2N1cnJlbnRfdGFiID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIGlmICggdGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzW2tleV0gKSB7XG5cdFx0XHRcdFx0dGhpcy52aXNpYmxlX3JlcG9ydF93aWRnZXRzW2tleV0uc2V0RXJyb3JTdHlsZSggZXJyb3JfbGlzdFtrZXldICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfZXJyb3JfdWlfZGljW2tleV0gPSB0aGlzLnZpc2libGVfcmVwb3J0X3dpZGdldHNba2V5XTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmICggdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV0uaXMoICc6dmlzaWJsZScgKSApIHtcblxuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldLnNldEVycm9yU3R5bGUoIGVycm9yX2xpc3Rba2V5XSwgdHJ1ZSApO1xuXHRcdFx0XHRcdGZvdW5kX2luX2N1cnJlbnRfdGFiID0gdHJ1ZTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW2tleV0uc2V0RXJyb3JTdHlsZSggZXJyb3JfbGlzdFtrZXldICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfZXJyb3JfdWlfZGljW2tleV0gPSB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XTtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggIWZvdW5kX2luX2N1cnJlbnRfdGFiICkge1xuXG5cdFx0XHR0aGlzLnNob3dFZGl0Vmlld0Vycm9yKCByZXN1bHQgKTtcblxuXHRcdH1cblx0fVxuXG5cdGJ1aWxkU29ydFNlbGVjdG9yVW5TZWxlY3RDb2x1bW5zKCBkaXNwbGF5X2NvbHVtbnMgKSB7XG5cdFx0dmFyIGZpbmFfYXJyYXkgPSBbXTtcblx0XHR2YXIgaSA9IDEwMDtcblx0XHQkLmVhY2goIGRpc3BsYXlfY29sdW1ucywgZnVuY3Rpb24oIGluZGV4LCBjb250ZW50ICkge1xuXHRcdFx0dmFyIG5ld19jb250ZW50ID0gJC5leHRlbmQoIHt9LCBjb250ZW50ICk7XG5cdFx0XHRuZXdfY29udGVudC5pZCA9IGk7IC8vTmVlZFxuXHRcdFx0bmV3X2NvbnRlbnQuc29ydCA9ICdhc2MnO1xuXHRcdFx0ZmluYV9hcnJheS5wdXNoKCBuZXdfY29udGVudCApO1xuXHRcdFx0aSA9IGkgKyAxO1xuXHRcdH0gKTtcblxuXHRcdHJldHVybiBmaW5hX2FycmF5O1xuXHR9XG5cblx0c2V0RWRpdFZpZXdXaWRnZXRzTW9kZSgpIHtcblx0XHR2YXIgZGlkX2NsZWFuX2RpYyA9IHt9O1xuXHRcdGZvciAoIHZhciBrZXkgaW4gdGhpcy5lZGl0X3ZpZXdfdWlfZGljICkge1xuXHRcdFx0dmFyIHdpZGdldCA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1trZXldO1xuXHRcdFx0d2lkZ2V0LmNzcyggJ29wYWNpdHknLCAxICk7XG5cdFx0XHR2YXIgY29sdW1uID0gd2lkZ2V0LnBhcmVudCgpLnBhcmVudCgpLnBhcmVudCgpO1xuXHRcdFx0dmFyIHRhYl9pZCA9IGNvbHVtbi5wYXJlbnQoKS5hdHRyKCAnaWQnICk7XG5cdFx0XHRpZiAoICFjb2x1bW4uaGFzQ2xhc3MoICd2LWJveCcgKSApIHtcblx0XHRcdFx0aWYgKCAhZGlkX2NsZWFuX2RpY1t0YWJfaWRdICkge1xuXHRcdFx0XHRcdGRpZF9jbGVhbl9kaWNbdGFiX2lkXSA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHdpZGdldC5zZXRFbmFibGVkICkgKSB7XG5cdFx0XHRcdFx0d2lkZ2V0LnNldEVuYWJsZWQoIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGJ1aWxkUmVwb3J0VUlCYXNlT25TZXR1cEZpZWxkcygpIHtcblx0XHR2YXIgc2V0dXBfZmllbGQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc2V0dXBfZmllbGQ7XG5cdFx0aWYgKCBzZXR1cF9maWVsZCAmJiBzZXR1cF9maWVsZC5sZW5ndGggPiAwICkge1xuXHRcdFx0dGhpcy5jcmVhdGVVSSggc2V0dXBfZmllbGQgKTtcblx0XHR9XG5cdH1cblxuXHRnZXRGb3JtVmFsdWVzKCkge1xuXHRcdHZhciBvdGhlciA9IHt9O1xuXG5cdFx0b3RoZXIucGFnZV9vcmllbnRhdGlvbiA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5wYWdlX29yaWVudGF0aW9uO1xuXHRcdG90aGVyLmZvbnRfc2l6ZSA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5mb250X3NpemU7XG5cdFx0b3RoZXIuYXV0b19yZWZyZXNoID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmF1dG9fcmVmcmVzaDtcblx0XHRvdGhlci5kaXNhYmxlX2dyYW5kX3RvdGFsID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmRpc2FibGVfZ3JhbmRfdG90YWw7XG5cdFx0b3RoZXIubWF4aW11bV9wYWdlX2xpbWl0ID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1heGltdW1fcGFnZV9saW1pdDtcblx0XHRvdGhlci5zaG93X2R1cGxpY2F0ZV92YWx1ZXMgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc2hvd19kdXBsaWNhdGVfdmFsdWVzO1xuXG5cdFx0aWYgKCB0aGlzLmN1cnJlbnRfc2F2ZWRfcmVwb3J0ICYmIEdsb2JhbC5pc1NldCggdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5uYW1lICkgKSB7XG5cblx0XHRcdG90aGVyLnJlcG9ydF9uYW1lID0gdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5uYW1lO1xuXHRcdFx0b3RoZXIucmVwb3J0X2Rlc2NyaXB0aW9uID0gdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydC5kZXNjcmlwdGlvbjtcblx0XHR9XG5cblx0XHRyZXR1cm4gb3RoZXI7XG5cdH1cblxuXHRnZXRDaGFydFZhbHVlcygpIHtcblxuXHRcdHZhciBjaGFydCA9IHt9O1xuXG5cdFx0Y2hhcnQuZW5hYmxlID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmVuYWJsZTtcblx0XHRjaGFydC5kaXNwbGF5X21vZGUgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZGlzcGxheV9tb2RlO1xuXHRcdGNoYXJ0LnR5cGUgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZTtcblx0XHRjaGFydC5pbmNsdWRlX3N1Yl90b3RhbCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pbmNsdWRlX3N1Yl90b3RhbDtcblx0XHRjaGFydC5heGlzX3NjYWxlX3N0YXRpYyA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5heGlzX3NjYWxlX3N0YXRpYztcblx0XHRjaGFydC5jb21iaW5lX2NvbHVtbnMgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuY29tYmluZV9jb2x1bW5zO1xuXG5cdFx0cmV0dXJuIGNoYXJ0O1xuXHR9XG5cblx0Y29udmVydFNvcnRWYWx1ZXMoIHNvcnQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gW107XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgc29ydC5sZW5ndGg7IGkrKyApIHtcblx0XHRcdHZhciBpdGVtID0gc29ydFtpXTtcblxuXHRcdFx0aWYgKCAhR2xvYmFsLmlzU2V0KCBpdGVtLmZ1bGxWYWx1ZSApICkge1xuXHRcdFx0XHRyZXN1bHQgPSBzb3J0O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBuZXdfaXRlbSA9IHt9O1xuXHRcdFx0XHRuZXdfaXRlbVtpdGVtLnZhbHVlXSA9IGl0ZW0uc29ydDtcblx0XHRcdFx0cmVzdWx0LnB1c2goIG5ld19pdGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGFkZE9yZGVyRml4KCByZXBvcnQgKSB7XG5cblx0XHR2YXIgbmV3X3JlcG9ydF9maWVsZHMgPSB7fTtcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gcmVwb3J0ICkge1xuXG5cdFx0XHRpZiAoICFyZXBvcnQuaGFzT3duUHJvcGVydHkoIGtleSApICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIG9yZGVyX2ZpeCA9IHRoaXMudmlzaWJsZV9yZXBvcnRfd2lkZ2V0c19vcmRlcl9maXhba2V5XTtcblxuXHRcdFx0aWYgKCBvcmRlcl9maXggPiAwICkge1xuXHRcdFx0XHRuZXdfcmVwb3J0X2ZpZWxkc1snLScgKyBvcmRlcl9maXggKyAnLScgKyBrZXldID0gcmVwb3J0W2tleV07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ld19yZXBvcnRfZmllbGRzO1xuXHR9XG5cblx0Ly9NYWtlIHN1cmUgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkIGlzIHVwZGF0ZWQgYmVmb3JlIHZhbGlkYXRlXG5cdHZhbGlkYXRlKCBzeW5jaHJvbm91cyApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBvdGhlciA9IHRoaXMuZ2V0Rm9ybVZhbHVlcygpO1xuXHRcdHZhciBjaGFydCA9IHRoaXMuZ2V0Q2hhcnRWYWx1ZXMoKTtcblxuXHRcdC8vIzIyOTMgLSBSZWZyZXNoIHRoZSByZXBvcnQgdGFiIFVJIGJhc2VkIG9uIGFueSBjaGFuZ2VzIHRvIGNoYXJ0IG9yIHNldHVwIHRhYnMsIG9yIGNoYW5nZXMgdGhhdCBoaWRlIGFuZCBzaG93IGZpZWxkcyB3aWxsIG5vdCB2YWxpZGF0ZSBwcm9wZXJseS5cblx0XHR0aGlzLmJ1aWxkUmVwb3J0VUlCYXNlT25TZXR1cEZpZWxkcygpO1xuXG5cdFx0dmFyIHJlcG9ydCA9IHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzO1xuXHRcdGlmICggcmVwb3J0LnNvcnQgKSB7XG5cdFx0XHRyZXBvcnQuc29ydCA9IHRoaXMuY29udmVydFNvcnRWYWx1ZXMoIHJlcG9ydC5zb3J0ICk7XG5cdFx0fVxuXG5cdFx0cmVwb3J0ID0gdGhpcy5hZGRPcmRlckZpeCggcmVwb3J0ICk7XG5cblx0XHR2YXIgY29uZmlnID0gcmVwb3J0O1xuXHRcdGNvbmZpZ1snLScgKyAxMDAwICsgJy0nICsgJ3RlbXBsYXRlJ10gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudGVtcGxhdGU7XG5cdFx0Y29uZmlnLm90aGVyID0gb3RoZXI7XG5cdFx0Y29uZmlnLmNoYXJ0ID0gY2hhcnQ7XG5cblx0XHRpZiAoIHRoaXMuaW5jbHVkZV9mb3JtX3NldHVwICkge1xuXHRcdFx0Y29uZmlnLmZvcm0gPSB0aGlzLmdldEZvcm1TZXR1cERhdGEoIHRydWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIHJlcG9ydC5zb3J0ICkge1xuXHRcdFx0cmVwb3J0LnNvcnQgPSB0aGlzLmNvbnZlcnRTb3J0VmFsdWVzKCByZXBvcnQuc29ydCApO1xuXHRcdH1cblxuXHRcdGlmICggIXN5bmNocm9ub3VzICkge1xuXHRcdFx0dGhpcy5hcGlbJ3ZhbGlkYXRlUmVwb3J0J10oIGNvbmZpZywgJ3BkZicsIHtcblx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0JHRoaXMudmFsaWRhdGVSZXN1bHQoIHJlc3VsdCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyMyMjkzIC0gc3luY2hyb25vdXMgY2FsbCB0byB2YWxpZGF0aW9uIGFwaSBhbGxvd3MgdXMgdG8gcmV0dXJuIHRoZSB2YWx1ZSBpbiByZWFsdGltZVxuXHRcdFx0dmFyIHJlc3VsdCA9IHRoaXMuYXBpWyd2YWxpZGF0ZVJlcG9ydCddKCBjb25maWcsICdwZGYnLCB7IGFzeW5jOiBmYWxzZSB9ICk7XG5cdFx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdFx0dGhpcy52YWxpZGF0ZVJlc3VsdCggcmVzdWx0ICk7XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRvblZpZXdFeGNlbENsaWNrKCBtZXNzYWdlX292ZXJyaWRlICkge1xuXG5cdFx0dmFyIGNvbmZpZyA9IHRoaXMuZ2V0UG9zdFJlcG9ydEpzb24oKTtcblx0XHR2YXIgcG9zdF9kYXRhID0geyAwOiBjb25maWcsIDE6ICdjc3YnIH07XG5cblx0XHRpZiAoIHRoaXMuaW5jbHVkZV9mb3JtX3NldHVwICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuc2hvd19lbXB0eV9tZXNzYWdlICkge1xuXHRcdFx0XHR2YXIgbWVzc2FnZSA9ICQuaTE4bi5fKCAnU2V0dXAgZGF0YSBmb3IgdGhpcyByZXBvcnQgaGFzIG5vdCBiZWVuIGNvbXBsZXRlZCB5ZXQuIFBsZWFzZSBjbGljayBvbiB0aGUgRm9ybSBTZXR1cCB0YWIgdG8gZG8gc28gbm93LicgKTtcblx0XHRcdFx0aWYgKCBtZXNzYWdlX292ZXJyaWRlICkge1xuXHRcdFx0XHRcdG1lc3NhZ2UgPSBtZXNzYWdlX292ZXJyaWRlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdFRBbGVydE1hbmFnZXIuc2hvd0FsZXJ0KCBtZXNzYWdlICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29uZmlnLmZvcm0gPSB0aGlzLmdldEZvcm1TZXR1cERhdGEoIHRydWUgKTtcblx0XHR9XG5cblx0XHR0aGlzLmRvRm9ybUlGcmFtZUNhbGwoIHBvc3RfZGF0YSApO1xuXG5cdFx0dmFyIHNvdXJjZSA9ICdFeGNlbCc7IC8vIEJhY2t1cCB2YWx1ZSBpbiBjYXNlIHRoZSB1cmwgc20gZG9lcyBub3QgZXhpc3QuXG5cdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5nZXRBbGxVUkxBcmdzKCkgJiYgTG9jYWxDYWNoZURhdGEuZ2V0QWxsVVJMQXJncygpLnNtICkge1xuXHRcdFx0c291cmNlID0gTG9jYWxDYWNoZURhdGEuZ2V0QWxsVVJMQXJncygpLnNtICsgJ0BFeGNlbCc7XG5cdFx0fVxuXHRcdCQoKS5URmVlZGJhY2soIHtcblx0XHRcdHNvdXJjZTogc291cmNlLFxuXHRcdFx0Zm9yY2Vfc291cmNlOiB0cnVlLFxuXHRcdFx0ZGVsYXk6IDUwMDBcblx0XHR9ICk7XG5cdH1cblxuXHRnZXRWaXNpYmxlUmVwb3J0VmFsdWVzKCkge1xuXHRcdC8vIzIzNTMgLSBjdXQgb3V0IGFueSB6ZXJvIHV1aWQgc3RyaW5ncywgdGhleSBhcmUgbGlrZWx5IC0tbm9uZS0tIGluIGEgbXVsdGlzZWxlY3Rcblx0XHRmb3IgKCB2YXIgaSBpbiB0aGlzLnZpc2libGVfcmVwb3J0X3ZhbHVlcy5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoIHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzLmZpbHRlcltpXSA9PSBUVFVVSUQuemVyb19pZCApIHtcblx0XHRcdFx0ZGVsZXRlIHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzLmZpbHRlcltpXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzO1xuXHR9XG5cblx0Z2V0UG9zdFJlcG9ydEpzb24oIG5vUHJlRml4ICkge1xuXHRcdHZhciBvdGhlciA9IHRoaXMuZ2V0Rm9ybVZhbHVlcygpO1xuXHRcdHZhciBjaGFydCA9IHRoaXMuZ2V0Q2hhcnRWYWx1ZXMoKTtcblx0XHR2YXIgcmVwb3J0ID0gdGhpcy5nZXRWaXNpYmxlUmVwb3J0VmFsdWVzKCk7XG5cblx0XHRpZiAoIHJlcG9ydC5zb3J0ICkge1xuXHRcdFx0cmVwb3J0LnNvcnQgPSB0aGlzLmNvbnZlcnRTb3J0VmFsdWVzKCByZXBvcnQuc29ydCApO1xuXG5cdFx0XHRpZiAoIG5vUHJlRml4ICkgeyAvL25vIHByZSBmaXggbWVhbnMgc2F2ZSB0byB1c2VyUmVwb3J0LCB1c2Ugc29ydF8gdG8gbWF0Y2ggZmxleCBmb3JtYXRcblx0XHRcdFx0cmVwb3J0LnNvcnRfID0gcmVwb3J0LnNvcnQ7XG5cblx0XHRcdFx0ZGVsZXRlIHJlcG9ydC5zb3J0O1xuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCAhbm9QcmVGaXggKSB7XG5cdFx0XHRyZXBvcnQgPSB0aGlzLmFkZE9yZGVyRml4KCByZXBvcnQgKTtcblx0XHR9XG5cblx0XHR2YXIgY29uZmlnID0gcmVwb3J0O1xuXHRcdGlmICggIW5vUHJlRml4ICkge1xuXHRcdFx0Y29uZmlnWyctJyArIDEwMDAgKyAnLScgKyAndGVtcGxhdGUnXSA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50ZW1wbGF0ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uZmlnWyd0ZW1wbGF0ZSddID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnRlbXBsYXRlO1xuXHRcdH1cblxuXHRcdGNvbmZpZy5vdGhlciA9IG90aGVyO1xuXHRcdGNvbmZpZy5jaGFydCA9IGNoYXJ0O1xuXG5cdFx0cmV0dXJuIGNvbmZpZztcblx0fVxuXG5cdC8vUmVwb3J0cyBkb24ndCBzaGFyZSBtYW55IGljb25zIHdpdGggb3RoZXIgdmlld3MsIHNvIG92ZXJyaWRlIHRoZSBlbnRpcmUgZnVuY3Rpb24gaGVyZS5cblx0b25Db250ZXh0TWVudUNsaWNrKCBjb250ZXh0X2J0biwgbWVudV9uYW1lICkge1xuXHRcdFByb2dyZXNzQmFyLnNob3dPdmVybGF5KCk7XG5cdFx0Ly90aGlzIGZsYWcgaXMgdHVybmVkIG9mZiBpbiBQcm9ncmVzc0Jhck1hbmFnZXI6OmNsb3NlT3ZlcmxheSwgb3IgMnMgd2hpY2hldmVyIGhhcHBlbnMgZmlyc3Rcblx0XHRpZiAoIHdpbmRvdy5jbGlja1Byb2Nlc3NpbmcgPT0gdHJ1ZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0d2luZG93LmNsaWNrUHJvY2Vzc2luZyA9IHRydWU7XG5cdFx0XHR3aW5kb3cuY2xpY2tQcm9jZXNzaW5nSGFuZGxlID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHdpbmRvdy5jbGlja1Byb2Nlc3NpbmcgPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHR3aW5kb3cuY2xpY2tQcm9jZXNzaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0UHJvZ3Jlc3NCYXIuY2xvc2VPdmVybGF5KCk7XG5cdFx0XHRcdFx0VFRQcm9taXNlLndhaXQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgMTAwMCApO1xuXHRcdH1cblx0XHR2YXIgaWQ7XG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoIG1lbnVfbmFtZSApICkge1xuXHRcdFx0aWQgPSBtZW51X25hbWU7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBjb250ZXh0X2J0bi5kaXNhYmxlZCApIHtcblx0XHRcdFx0UHJvZ3Jlc3NCYXIuY2xvc2VPdmVybGF5KCk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBpZCApIHtcblx0XHRcdGNhc2UgJ3ZpZXcnOlxuXHRcdFx0XHRQcm9ncmVzc0Jhci5zaG93T3ZlcmxheSgpO1xuXHRcdFx0XHR0aGlzLm9uVmlld0NsaWNrKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndmlld19odG1sJzpcblx0XHRcdFx0UHJvZ3Jlc3NCYXIuc2hvd092ZXJsYXkoKTtcblx0XHRcdFx0dGhpcy5vblZpZXdDbGljayggJ2h0bWwnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndmlld19odG1sX25ld193aW5kb3cnOlxuXHRcdFx0XHRQcm9ncmVzc0Jhci5zaG93T3ZlcmxheSgpO1xuXHRcdFx0XHR0aGlzLm9uVmlld0NsaWNrKCAnaHRtbCcsIHRydWUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdleHBvcnRfZXhjZWwnOlxuXHRcdFx0XHR0aGlzLm9uVmlld0V4Y2VsQ2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdjYW5jZWwnOlxuXHRcdFx0XHR0aGlzLm9uQ2FuY2VsQ2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzYXZlX2V4aXN0ZWRfcmVwb3J0JzogLy9BbGwgcmVwb3J0IHZpZXdcblx0XHRcdFx0dGhpcy5vblNhdmVFeGlzdGVkUmVwb3J0Q2xpY2soKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdzYXZlX25ld19yZXBvcnQnOiAvL0FsbCByZXBvcnQgdmlld1xuXHRcdFx0XHR0aGlzLm9uU2F2ZU5ld1JlcG9ydENsaWNrKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnc2F2ZV9zZXR1cCc6IC8vQWxsIHJlcG9ydCB2aWV3XG5cdFx0XHRcdHRoaXMub25TYXZlU2V0dXAoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICd2aWV3X2Zvcm0nOiAvL0FsbCByZXBvcnQgdmlld1xuXHRcdFx0XHR0aGlzLm9uVmlld0NsaWNrKCAncGRmX2Zvcm0nICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnZV9maWxlJzogLy9BbGwgcmVwb3J0IHZpZXdcblx0XHRcdFx0dGhpcy5vblZpZXdDbGljayggJ2VmaWxlJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3RpbWVzaGVldF92aWV3JzogLy9BbGwgcmVwb3J0IHZpZXdcblx0XHRcdFx0dGhpcy5vblZpZXdDbGljayggJ3BkZl90aW1lc2hlZXQnICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAndGltZXNoZWV0X3ZpZXdfZGV0YWlsJzogLy9BbGwgcmVwb3J0IHZpZXdcblx0XHRcdFx0dGhpcy5vblZpZXdDbGljayggJ3BkZl90aW1lc2hlZXRfZGV0YWlsJyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFByb2dyZXNzQmFyLmNsb3NlT3ZlcmxheSgpO1xuXHRcdFx0XHR0aGlzLm9uQ3VzdG9tQ29udGV4dENsaWNrKCBpZCwgY29udGV4dF9idG4gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHRcdEdsb2JhbC50cmlnZ2VyQW5hbHl0aWNzQ29udGV4dE1lbnVDbGljayggY29udGV4dF9idG4sIG1lbnVfbmFtZSApO1xuXHR9XG5cblx0b25TYXZlU2V0dXAoIGxhYmVsICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGZvcm1fc2V0dXAgPSB0aGlzLmdldEZvcm1TZXR1cERhdGEoKTtcblxuXHRcdGlmICggbGFiZWwgPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0bGFiZWwgPSAkLmkxOG4uXyggJ0Zvcm0gc2V0dXAnICk7XG5cdFx0fVxuXG5cdFx0Ly9BbGxvd3Mgc2F2aW5nIG9mIGFsbCBleHBvcnQgY29uZmlnIGRhdGEgZm9yIGFsbCBleHBvcnQgZm9ybWF0cyBhdCBvbmNlIGluIFBheXJvbGxFeHBvcnRcblx0XHRpZiAoIHRoaXMuc2F2ZV9leHBvcnRfc2V0dXBfZGF0YSAhPSB1bmRlZmluZWQgKSB7XG5cdFx0XHRmb3JtX3NldHVwID0gdGhpcy5zYXZlX2V4cG9ydF9zZXR1cF9kYXRhO1xuXHRcdH1cblxuXHRcdC8vZG8gdGhpcyBiZWZvcmUgdGhlIGFwaSBjYWxsIGZvciBzcGVlZCB0byBzdG9wICNcblx0XHQkdGhpcy5zaG93X2VtcHR5X21lc3NhZ2UgPSBmYWxzZTtcblx0XHQkdGhpcy5mb3JtX3NldHVwX2NoYW5nZWQgPSBmYWxzZTtcblxuXHRcdGlmICggZm9ybV9zZXR1cCApIHsgLy9Eb24ndCBzYXZlIGlmIGZvcm1fc2V0dXAgaXMgZmFsc2UuXG5cdFx0XHR0aGlzLmFwaS5zZXRDb21wYW55Rm9ybUNvbmZpZyggZm9ybV9zZXR1cCwge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdGlmICggcmVzdWx0LmlzVmFsaWQoKSApIHtcblxuXHRcdFx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93QWxlcnQoIGxhYmVsICsgJyAnICsgJC5pMThuLl8oICdoYXMgYmVlbiBzYXZlZCBzdWNjZXNzZnVsbHknICkgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0JHRoaXMuc2hvd19lbXB0eV9tZXNzYWdlID0gdHJ1ZTtcblx0XHRcdFx0XHRcdCR0aGlzLmZvcm1fc2V0dXBfY2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHRUQWxlcnRNYW5hZ2VyLnNob3dBbGVydCggbGFiZWwgKyAnICcgKyAkLmkxOG4uXyggJ3NhdmUgZmFpbGVkLCBwbGVhc2UgdHJ5IGFnYWluJyApICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93QWxlcnQoIGxhYmVsICsgJyAnICsgJC5pMThuLl8oICdpbnZhbGlkLCBwbGVhc2UgdHJ5IGFnYWluJyApICk7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Rm9ybVNldHVwRGF0YSgpIHtcblx0XHQvL0Fsd2F5cyBuZWVkIG92ZXJyaWRlXG5cdH1cblxuXHRvblZpZXdDbGljaygga2V5LCBuZXdfd2luZG93LCBtZXNzYWdlX292ZXJyaWRlICkge1xuLy9cdFx0R2xvYmFsLmxvYWRQYWdlKCd0ZW1wX3BhZ2UuaHRtbCcsZnVuY3Rpb24ocmVzdWx0KXtcbi8vXHRcdFx0SW5kZXhWaWV3Q29udHJvbGxlci5vcGVuaXphcmQoICdSZXBvcnRWaWV3V2l6YXJkJywgcmVzdWx0KTtcbi8vXHRcdH0pO1xuXHRcdGlmICggIWtleSApIHtcblx0XHRcdGtleSA9ICdwZGYnO1xuXHRcdH1cblxuXHRcdC8vIzIyOTMgLSBtYWtlIHZhbGlkYXRpb24gY2FsbCBzeW5jaHJvbm91c2x5IHRvIHN0b3AgdGhlIHJlcG9ydCBmcm9tIGJlaW5nIHNob3duIGlmIGl0IGZhaWxzLlxuXHRcdGlmICggIXRoaXMudmFsaWRhdGUoIHRydWUgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgY29uZmlnID0gdGhpcy5nZXRQb3N0UmVwb3J0SnNvbigpO1xuXHRcdHZhciBwb3N0X2RhdGEgPSB7IDA6IGNvbmZpZywgMToga2V5IH07XG5cdFx0aWYgKCB0aGlzLmluY2x1ZGVfZm9ybV9zZXR1cCApIHtcblx0XHRcdGlmICggdGhpcy5zaG93X2VtcHR5X21lc3NhZ2UgKSB7XG5cdFx0XHRcdHZhciBtZXNzYWdlID0gJC5pMThuLl8oICdTZXR1cCBkYXRhIGZvciB0aGlzIHJlcG9ydCBoYXMgbm90IGJlZW4gY29tcGxldGVkIHlldC4gUGxlYXNlIGNsaWNrIG9uIHRoZSBGb3JtIFNldHVwIHRhYiB0byBkbyBzbyBub3cuJyApO1xuXHRcdFx0XHRpZiAoIG1lc3NhZ2Vfb3ZlcnJpZGUgKSB7XG5cdFx0XHRcdFx0bWVzc2FnZSA9IG1lc3NhZ2Vfb3ZlcnJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93QWxlcnQoIG1lc3NhZ2UgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Y29uZmlnLmZvcm0gPSB0aGlzLmdldEZvcm1TZXR1cERhdGEoIHRydWUgKTtcblx0XHR9XG5cbi8vXHRcdGlmICgga2V5ID09PSAncGRmJyApIHtcbi8vXHRcdFx0dGhpcy5kb0Zvcm1JRnJhbWVDYWxsKCBwb3N0X2RhdGEgKTtcbi8vXHRcdH1cblx0XHRpZiAoIGtleSA9PT0gJ2h0bWwnICkge1xuXHRcdFx0dmFyIHVybCA9IFNlcnZpY2VDYWxsZXIuZ2V0QVBJVVJMKCAnQ2xhc3M9JyArIHRoaXMuYXBpLmNsYXNzTmFtZSArICcmTWV0aG9kPScgKyAnZ2V0JyArIHRoaXMuYXBpLmtleV9uYW1lICsgJyZ2PTInICk7XG5cdFx0XHRpZiAoIEdsb2JhbC5nZXRTdGF0aW9uSUQoKSApIHtcblx0XHRcdFx0dXJsID0gdXJsICsgJyZTdGF0aW9uSUQ9JyArIEdsb2JhbC5nZXRTdGF0aW9uSUQoKTtcblx0XHRcdH1cblx0XHRcdHZhciBtZXNzYWdlX2lkID0gVFRVVUlELmdlbmVyYXRlVVVJRCgpO1xuXHRcdFx0dXJsID0gdXJsICsgJyZNZXNzYWdlSUQ9JyArIG1lc3NhZ2VfaWQ7XG5cblx0XHRcdHZhciByZWZyZXNoX3JlcXVlc3QgPSAnPHNjcmlwdD4nO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICdmdW5jdGlvbiBnZXRDb29raWUoIG5hbWUgKSB7Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHR2YXIgbmFtZSA9IG5hbWUgKyBcIj1cIjsnO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICdcdHZhciBzcGxpdF9jb29raWUgPSBkb2N1bWVudC5jb29raWUuc3BsaXQoIFwiO1wiICk7Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBzcGxpdF9jb29raWUubGVuZ3RoOyBpKysgKSB7Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHRcdHZhciB0bXBfY29va2llID0gc3BsaXRfY29va2llW2ldLnRyaW0oKTsnO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICcnO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICdcdFx0aWYgKCB0bXBfY29va2llLmluZGV4T2YoIG5hbWUgKSA9PT0gMCApIHsnO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICdcdFx0XHRyZXR1cm4gdG1wX2Nvb2tpZS5zdWJzdHJpbmcoIG5hbWUubGVuZ3RoLCB0bXBfY29va2llLmxlbmd0aCApOyc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJ1x0XHR9Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHR9Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHRyZXR1cm4gXCJcIic7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJ30nO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICcnO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICd2YXIgdGltZW91dF9oYW5kbGVyOyc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJ3ZhciBwb3N0X2RhdGE7Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnZnVuY3Rpb24gc3RhcnRSZWZyZXNoUmVwb3J0KCkgeyc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJ1x0aWYgKCB0eXBlb2YoIGF1dG9fcmVmcmVzaF90aW1lICkgIT09IFwidW5kZWZpbmVkXCIgJiYgYXV0b19yZWZyZXNoX3RpbWUgPiAwICkgeyc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJ1x0XHR0aW1lb3V0X2hhbmRsZXIgPSBzZXRUaW1lb3V0KCBcInJlZnJlc2hSZXBvcnQoKVwiLCAoIGF1dG9fcmVmcmVzaF90aW1lICogMTAwMCApICk7Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHR9Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnfSc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJyc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJ2Z1bmN0aW9uIHJlZnJlc2hSZXBvcnQoKSB7Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHR0cnkgeyc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJ1x0XHQkLmFqYXgoeyc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJ1x0XHRcdGRhdGFUeXBlOiBcIkpTT05cIiwnO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICdcdFx0XHRkYXRhOiB7IGpzb246IEpTT04uc3RyaW5naWZ5KCBwb3N0X2RhdGEgKSB9LCc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJyAgICAgICAgICAgIGhlYWRlcnM6IHsgXCJYLUNsaWVudC1JRFwiOiBcIkJyb3dzZXItVGltZVRyZXhcIiwgXCJYLUNTUkYtVG9rZW5cIjogZ2V0Q29va2llKCBcIkNTUkYtVG9rZW5cIiApIH0sJztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHRcdFx0dHlwZTogXCJQT1NUXCIsJztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnICAgICAgICAgICAgdXJsOiBcIicgKyB1cmwgKyAnXCIsJztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHRcdFx0c3VjY2VzczogZnVuY3Rpb24ocmVzdWx0KSB7Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHRcdFx0aWYoY29uc29sZSl7IGNvbnNvbGUubG9nKCBcIkF1dG8gcmVmcmVzaGluZyByZXBvcnQ6IFNlY29uZHM6IFwiKyBhdXRvX3JlZnJlc2hfdGltZSArXCIgQ3VycmVudCBUaW1lOiBcIisgRGF0ZSgpICkgfSc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJ1x0XHRcdHZhciBuZXdEb2MgPSByZXN1bHQuYXBpX3JldHZhbCArICQoXCJib2R5XCIpLmNoaWxkcmVuKFwiOmxhc3RcIilbMF0ub3V0ZXJIVE1MOyBkb2N1bWVudC5vcGVuKFwidGV4dC9odG1sXCIpOyBkb2N1bWVudC53cml0ZShuZXdEb2MpOyBkb2N1bWVudC5jbG9zZSgpOyAnO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICdcdFx0XHR9Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHRcdH0pJztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnXHR9IGNhdGNoKGUpIHt9Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnfSc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJ3N0YXJ0UmVmcmVzaFJlcG9ydCgpOyc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJyc7XG5cdFx0XHRyZWZyZXNoX3JlcXVlc3QgKz0gJyQoIFwiYm9keVwiICkubW91c2Vtb3ZlKCBmdW5jdGlvbiggZSApIHsnO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICdcdHdpbmRvdy5wYXJlbnQuR2xvYmFsLmRvUGluZ0lmTmVjZXNzYXJ5KCknO1xuXHRcdFx0cmVmcmVzaF9yZXF1ZXN0ICs9ICd9ICk7Jztcblx0XHRcdHJlZnJlc2hfcmVxdWVzdCArPSAnPC9zY3JpcHQ+JztcblxuXHRcdFx0dGhpcy5hcGlbJ2dldCcgKyB0aGlzLmFwaS5rZXlfbmFtZV0oIGNvbmZpZywga2V5LCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdHZhciByZXN1bHQgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIEdsb2JhbC5pc0VtcHR5KCByZXN1bHQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdCA9IHJlc3VsdCArIHJlZnJlc2hfcmVxdWVzdDtcblx0XHRcdFx0XHRcdFx0aWYgKCBuZXdfd2luZG93ICkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciB3ID0gd2luZG93Lm9wZW4oKTtcblx0XHRcdFx0XHRcdFx0XHR3LnBvc3RfZGF0YSA9IHBvc3RfZGF0YTtcblx0XHRcdFx0XHRcdFx0XHR3LmRvY3VtZW50LndyaXRlbG4oIHJlc3VsdCApO1xuXHRcdFx0XHRcdFx0XHRcdHcuZG9jdW1lbnQuY2xvc2UoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXBvcnRfZGF0YSA9IHsgcG9zdF9kYXRhOiBwb3N0X2RhdGEsIHJlc3VsdDogcmVzdWx0IH07XG5cdFx0XHRcdFx0XHRcdFx0SW5kZXhWaWV3Q29udHJvbGxlci5vcGVuV2l6YXJkKCAnUmVwb3J0Vmlld1dpemFyZCcsIHJlcG9ydF9kYXRhICk7XG5cdFx0XHRcdFx0XHRcdFx0UHJvZ3Jlc3NCYXIuY2xvc2VPdmVybGF5KCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFRBbGVydE1hbmFnZXIuc2hvd0FsZXJ0KCAkLmkxOG4uXyggJ05PIERBVEEgTUFUQ0hFUyBDUklURVJJQScsIExvY2FsQ2FjaGVEYXRhLmdldEFwcGxpY2F0aW9uTmFtZSgpICksICQuaTE4bi5fKCAnTk9USUNFJyApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFRBbGVydE1hbmFnZXIuc2hvd0Vycm9yQWxlcnQoIHJlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ3BkZl9mb3JtX3B1Ymxpc2hfZW1wbG95ZWUnICkge1xuXHRcdFx0dGhpcy5hcGlbJ2dldCcgKyB0aGlzLmFwaS5rZXlfbmFtZV0oIGNvbmZpZywga2V5LCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdHZhciByZXR2YWwgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0aWYgKCByZXR2YWwgKSB7XG5cdFx0XHRcdFx0XHRVc2VyR2VuZXJpY1N0YXR1c1dpbmRvd0NvbnRyb2xsZXIub3BlbiggcmV0dmFsLCBMb2NhbENhY2hlRGF0YS5nZXRMb2dpblVzZXIoKS5pZCwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRQcm9ncmVzc0Jhci5jbG9zZU92ZXJsYXkoKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93QWxlcnQoICQuaTE4bi5fKCAnTk8gREFUQSBNQVRDSEVTIENSSVRFUklBJywgTG9jYWxDYWNoZURhdGEuZ2V0QXBwbGljYXRpb25OYW1lKCkgKSwgJC5pMThuLl8oICdOT1RJQ0UnICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5kb0Zvcm1JRnJhbWVDYWxsKCBwb3N0X2RhdGEgKTtcblx0XHRcdFByb2dyZXNzQmFyLmNsb3NlT3ZlcmxheSgpO1xuXG5cdFx0XHR2YXIgc291cmNlID0gJ1BERic7IC8vIEJhY2t1cCB2YWx1ZSBpbiBjYXNlIHRoZSB1cmwgc20gZG9lcyBub3QgZXhpc3QuXG5cdFx0XHRpZiAoIExvY2FsQ2FjaGVEYXRhLmdldEFsbFVSTEFyZ3MoKSAmJiBMb2NhbENhY2hlRGF0YS5nZXRBbGxVUkxBcmdzKCkuc20gKSB7XG5cdFx0XHRcdHNvdXJjZSA9IExvY2FsQ2FjaGVEYXRhLmdldEFsbFVSTEFyZ3MoKS5zbSArICdAUERGJztcblx0XHRcdH1cblx0XHRcdCQoKS5URmVlZGJhY2soIHtcblx0XHRcdFx0c291cmNlOiBzb3VyY2UsXG5cdFx0XHRcdGZvcmNlX3NvdXJjZTogdHJ1ZSxcblx0XHRcdFx0ZGVsYXk6IDUwMDBcblx0XHRcdH0gKTtcblx0XHR9XG5cdH1cblxuXHRwcm9jZXNzVHJhbnNhY3Rpb25zKCBrZXkgKSB7XG5cdFx0dmFyIGFyZ3MgPSB0aGlzLmdldFBvc3RSZXBvcnRKc29uKCB0cnVlICk7XG5cdFx0dmFyIHBvc3RfZGF0YSA9IHsgMDogeyBmaWx0ZXJfZGF0YTogYXJncyB9LCAxOiB0cnVlLCAyOiBrZXkgfTtcblx0XHR2YXIgcGF5X3N0dWJfYXBpID0gVFRBUEkuQVBJUGF5U3R1Yjtcblx0XHR2YXIgdXJsID0gU2VydmljZUNhbGxlci5nZXRBUElVUkwoICdDbGFzcz0nICsgcGF5X3N0dWJfYXBpLmNsYXNzTmFtZSArICcmTWV0aG9kPScgKyAnZ2V0JyArIHBheV9zdHViX2FwaS5rZXlfbmFtZSApO1xuXHRcdEdsb2JhbC5BUElGaWxlRG93bmxvYWQoIHBheV9zdHViX2FwaS5jbGFzc05hbWUsIHBheV9zdHViX2FwaS5rZXlfbmFtZSwgcG9zdF9kYXRhLCB1cmwgKTtcblx0fVxuXG5cdHNldEVkaXRNZW51Vmlld0ljb24oIGNvbnRleHRfYnRuLCBwSWQgKSB7XG5cdH1cblxuXHRkb0Zvcm1JRnJhbWVDYWxsKCBwb3N0RGF0YSApIHtcblxuXHRcdHZhciB1cmwgPSBTZXJ2aWNlQ2FsbGVyLmdldEFQSVVSTCggJ0NsYXNzPScgKyB0aGlzLmFwaS5jbGFzc05hbWUgKyAnJk1ldGhvZD0nICsgJ2dldCcgKyB0aGlzLmFwaS5rZXlfbmFtZSApO1xuXG5cdFx0R2xvYmFsLkFQSUZpbGVEb3dubG9hZCggdGhpcy5hcGkuY2xhc3NOYW1lLCB0aGlzLmFwaS5rZXlfbmFtZSwgcG9zdERhdGEsIHVybCApO1xuXHR9XG5cblx0b25TYXZlTmV3UmVwb3J0Q2xpY2soKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgY29uZmlnID0gdGhpcy5nZXRQb3N0UmVwb3J0SnNvbiggdHJ1ZSApO1xuXHRcdHZhciBzZWxlY3RfZmllbGQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuc2V0dXBfZmllbGQ7XG5cblx0XHRpZiAoIGNvbmZpZy50ZW1wbGF0ZSApIHtcblx0XHRcdHNlbGVjdF9maWVsZC51bnNoaWZ0KCAndGVtcGxhdGUnICk7XG5cdFx0fVxuXG5cdFx0dmFyIHJlcG9ydF9kYXRhID0ge307XG5cdFx0cmVwb3J0X2RhdGEuZGF0YSA9IHt9O1xuXHRcdHJlcG9ydF9kYXRhLmRhdGEuY29uZmlnID0gY29uZmlnO1xuXHRcdHJlcG9ydF9kYXRhLmRhdGEudGVtcGxhdGUgPSBzZWxlY3RfZmllbGQ7XG5cdFx0cmVwb3J0X2RhdGEuc2NyaXB0ID0gdGhpcy5zY3JpcHRfbmFtZTtcblxuXHRcdGlmICggIXRoaXMuc3ViX3NhdmVkX3JlcG9ydF92aWV3X2NvbnRyb2xsZXIgKSB7XG5cdFx0XHR0aGlzLmluaXRTdWJTYXZlZFJlcG9ydFZpZXcoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkdGhpcy5zdWJfc2F2ZWRfcmVwb3J0X3ZpZXdfY29udHJvbGxlci5lZGl0X29ubHlfbW9kZSA9IHRydWU7XG5cdFx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLm9uQWRkQ2xpY2soIHJlcG9ydF9kYXRhICk7XG5cdFx0XHR9ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLmVkaXRfb25seV9tb2RlID0gdHJ1ZTtcblx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLm9uQWRkQ2xpY2soIHJlcG9ydF9kYXRhICk7XG5cdFx0fVxuXHR9XG5cblx0b25TYXZlRXhpc3RlZFJlcG9ydENsaWNrKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGNvbmZpZyA9IHRoaXMuZ2V0UG9zdFJlcG9ydEpzb24oIHRydWUgKTtcblx0XHR2YXIgc2VsZWN0X2ZpZWxkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnNldHVwX2ZpZWxkO1xuXG5cdFx0aWYgKCBjb25maWcudGVtcGxhdGUgKSB7XG5cdFx0XHRzZWxlY3RfZmllbGQudW5zaGlmdCggJ3RlbXBsYXRlJyApO1xuXHRcdH1cblxuXHRcdHZhciByZXBvcnRfZGF0YSA9IHRoaXMuY3VycmVudF9zYXZlZF9yZXBvcnQ7XG5cblx0XHRpZiAoICFyZXBvcnRfZGF0YSApIHtcblx0XHRcdHJlcG9ydF9kYXRhID0ge307XG5cdFx0fVxuXG5cdFx0cmVwb3J0X2RhdGEuZGF0YSA9IHt9O1xuXHRcdHJlcG9ydF9kYXRhLmRhdGEuY29uZmlnID0gY29uZmlnO1xuXHRcdHJlcG9ydF9kYXRhLmRhdGEudGVtcGxhdGUgPSBzZWxlY3RfZmllbGQ7XG5cblx0XHRpZiAoICFyZXBvcnRfZGF0YS5zY3JpcHQgKSB7XG5cdFx0XHRyZXBvcnRfZGF0YS5zY3JpcHQgPSB0aGlzLnNjcmlwdF9uYW1lO1xuXHRcdH1cblxuXHRcdGlmICggIXRoaXMuc3ViX3NhdmVkX3JlcG9ydF92aWV3X2NvbnRyb2xsZXIgKSB7XG5cdFx0XHR0aGlzLmluaXRTdWJTYXZlZFJlcG9ydFZpZXcoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkdGhpcy5zdWJfc2F2ZWRfcmVwb3J0X3ZpZXdfY29udHJvbGxlci5lZGl0X29ubHlfbW9kZSA9IHRydWU7XG5cdFx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLm9uQWRkQ2xpY2soIHJlcG9ydF9kYXRhICk7XG5cdFx0XHR9ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLmVkaXRfb25seV9tb2RlID0gdHJ1ZTtcblx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLmJ1aWxkQ29udGV4dE1lbnUoIHRydWUgKTtcblx0XHRcdCR0aGlzLnN1Yl9zYXZlZF9yZXBvcnRfdmlld19jb250cm9sbGVyLm9uQWRkQ2xpY2soIHJlcG9ydF9kYXRhICk7XG5cdFx0fVxuXHR9XG5cblx0b25TYXZlRG9uZUNhbGxiYWNrKCByZXN1bHQsIGN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0dmFyIG5ld19pZCA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblxuXHRcdGlmICggVFRVVUlELmlzVVVJRCggbmV3X2lkICkgPT0gZmFsc2UgJiYgY3VycmVudF9lZGl0X3JlY29yZCAmJiBjdXJyZW50X2VkaXRfcmVjb3JkLmlkICkge1xuXHRcdFx0bmV3X2lkID0gY3VycmVudF9lZGl0X3JlY29yZC5pZDtcblx0XHR9XG5cdFx0dGhpcy5yZWZyZXNoTmF2KCBuZXdfaWQgKTtcblx0fVxuXG5cdHJlZnJlc2hOYXYoIG5ld0lkICkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHRoaXMubmF2aWdhdGlvbi5zZXRTb3VyY2VEYXRhKCBudWxsICk7XG5cblx0XHQkdGhpcy5nZXRSZXBvcnREYXRhKCBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0Ly8gV2FpdGluZyBmb3IgdGhlIFRUQVBJLkFQSSByZXR1cm5zIGRhdGEgdG8gc2V0IHRoZSBjdXJyZW50IGVkaXQgcmVjb3JkLlxuXG5cdFx0XHRpZiAoIHJlc3VsdCAmJiByZXN1bHQubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRpZiAoIFRUVVVJRC5pc1VVSUQoIG5ld0lkICkgKSB7XG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdFx0dmFyIGl0ZW0gPSByZXN1bHRbaV07XG5cblx0XHRcdFx0XHRcdGlmICggaXRlbS5pZCA9PT0gbmV3SWQgKSB7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLmN1cnJlbnRfc2F2ZWRfcmVwb3J0ID0gcmVzdWx0W2ldO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQkdGhpcy5jdXJyZW50X3NhdmVkX3JlcG9ydCA9ICR0aGlzLmdldERlZmF1bHRSZXBvcnQoIHJlc3VsdCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0JHRoaXMuc2F2ZWRfcmVwb3J0X2FycmF5ID0gcmVzdWx0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JHRoaXMuY3VycmVudF9zYXZlZF9yZXBvcnQgPSBudWxsO1xuXHRcdFx0XHQkdGhpcy5zYXZlZF9yZXBvcnRfYXJyYXkgPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0JHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCA9IHt9O1xuXHRcdFx0JHRoaXMudmlzaWJsZV9yZXBvcnRfdmFsdWVzID0ge307XG5cblx0XHRcdCR0aGlzLmluaXRFZGl0VmlldygpO1xuXG5cdFx0fSApO1xuXHR9XG5cblx0cHJvY2Vzc0Zvcm1TZXR1cERhdGFBbmRBZGRUb0JhdGNoKCByZXNwb25zZV9kYXRhLCBmb3JtX2RhdGFfbWFwICkge1xuXHRcdC8vVGhpcyBpcyB1c2VkIHRvIGdyb3VwIGZvcm0gc2V0dXAgZGF0YSBieSBBUEkgc28gdGhhdCB3ZSBjYW4gZG8gYSBzaW5nbGUgQVBJIGNhbGwgaW5zdGVhZCBvZiBvbmUgZm9yIGV2ZXJ5IGZpZWxkLlxuXHRcdC8vVGhlIEFQSSBjYWxsIHJldHJpZXZlcyB0aGUgcmVhbCBmb3JtIGRhdGEgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiBhIGRyb3Bkb3duIGhhcyBvbmx5IG9uZSByZWNvcmQuIERhdGEgd2l0aCBtb3JlIHRoYW4gMSByZWNvcmQgb3Igd2l0aCBubyBBUElcblx0XHQvL2lzIHNldCBpbW1lZGlhdGVseSBhcyB0aGV5IGRvIG5vdCByZXF1aXJlIGRhdGEgZnJvbSB0aGUgc2VydmVyLiBPdGhlcndpc2UgdGhpcyByZXR1cm5zIGFuIGFycmF5IG9mIGJhdGNoZWQgcmVjb3JkIElEc1xuXHRcdC8vdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHNlcnZlciB3aXRoIGdldEJhdGNoZWRSZWFsRm9ybURhdGFGcm9tQVBJKCkuXG5cdFx0bGV0IGJhdGNoX2dldF9yZWFsX2RhdGEgPSB7fTtcblx0XHRpZiAoIHJlc3BvbnNlX2RhdGEgKSB7XG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBmb3JtX2RhdGFfbWFwLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGZvcm1fZGF0YV9tYXBbaV0uZGF0YSAmJiB0eXBlb2YgZm9ybV9kYXRhX21hcFtpXS5kYXRhID09PSAnb2JqZWN0JyAmJiBmb3JtX2RhdGFfbWFwW2ldLmFwaSApIHtcblx0XHRcdFx0XHRmb3IgKCBsZXQga2V5IGluIGZvcm1fZGF0YV9tYXBbaV0uZGF0YSApIHtcblx0XHRcdFx0XHRcdGxldCBmaWVsZF9uYW1lID0gZm9ybV9kYXRhX21hcFtpXS5maWVsZF9rZXkgKyAnXycgKyBrZXk7XG5cdFx0XHRcdFx0XHRpZiAoIGZvcm1fZGF0YV9tYXBbaV0uYXBpICYmIGZvcm1fZGF0YV9tYXBbaV0uZGF0YVtrZXldICE9PSBmYWxzZSAmJiBmb3JtX2RhdGFfbWFwW2ldLmFwaSAmJiBmb3JtX2RhdGFfbWFwW2ldLmRhdGFba2V5XS5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggIWJhdGNoX2dldF9yZWFsX2RhdGFbZm9ybV9kYXRhX21hcFtpXS5hcGkuY2xhc3NOYW1lXSApIHtcblx0XHRcdFx0XHRcdFx0XHRiYXRjaF9nZXRfcmVhbF9kYXRhW2Zvcm1fZGF0YV9tYXBbaV0uYXBpLmNsYXNzTmFtZV0gPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6IGZvcm1fZGF0YV9tYXBbaV0uYXBpX21ldGhvZCxcblx0XHRcdFx0XHRcdFx0XHRcdHJlY29yZHM6IFtdXG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRiYXRjaF9nZXRfcmVhbF9kYXRhW2Zvcm1fZGF0YV9tYXBbaV0uYXBpLmNsYXNzTmFtZV0ucmVjb3Jkcy5wdXNoKCB7XG5cdFx0XHRcdFx0XHRcdFx0ZmllbGQ6IGZpZWxkX25hbWUsXG5cdFx0XHRcdFx0XHRcdFx0aWQ6IGZvcm1fZGF0YV9tYXBbaV0uZGF0YVtrZXldWzBdXG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1tmaWVsZF9uYW1lXS5zZXRWYWx1ZSggZm9ybV9kYXRhX21hcFtpXS5kYXRhW2tleV0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtmaWVsZF9uYW1lXSA9IGZvcm1fZGF0YV9tYXBbaV0uZGF0YVtrZXldO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmICggZm9ybV9kYXRhX21hcFtpXS5kYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljW2Zvcm1fZGF0YV9tYXBbaV0uZmllbGRfa2V5XS5zZXRWYWx1ZSggZm9ybV9kYXRhX21hcFtpXS5kYXRhICk7XG5cdFx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2Zvcm1fZGF0YV9tYXBbaV0uZmllbGRfa2V5XSA9IGZvcm1fZGF0YV9tYXBbaV0uZGF0YTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gYmF0Y2hfZ2V0X3JlYWxfZGF0YTtcblx0fVxuXG5cdGdldEJhdGNoZWRSZWFsRm9ybURhdGFGcm9tQVBJKCBiYXRjaF9kYXRhICkge1xuXHRcdGlmICggT2JqZWN0LmtleXMoIGJhdGNoX2RhdGEgKS5sZW5ndGggPiAwICkge1xuXHRcdFx0bGV0ICR0aGlzID0gdGhpcztcblx0XHRcdGZvciAoIGxldCBhcGkgaW4gYmF0Y2hfZGF0YSApIHtcblx0XHRcdFx0bGV0IGRhdGEgPSB7fTtcblx0XHRcdFx0Ly9HZXQgcGF5c3R1YiBlbnRyeSBhY2NvdW50IGlkcyBhbmQgcmVtb3ZlIGR1cGxpY2F0ZSB2YWx1ZXNcblx0XHRcdFx0ZGF0YS5maWx0ZXJfZGF0YSA9IHtcblx0XHRcdFx0XHRpZDogXy51bmlxKCBiYXRjaF9kYXRhW2FwaV0ucmVjb3Jkcy5tYXAoICggb2JqICkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG9iai5pZDtcblx0XHRcdFx0XHR9ICkgKVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdFRUQVBJW2FwaV1bYmF0Y2hfZGF0YVthcGldLm1ldGhvZF0oIGRhdGEsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblx0XHRcdFx0XHRcdGxldCByZXN1bHQgPSByZXMuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0XHRcdGlmICggcmVzdWx0ICYmIEFycmF5LmlzQXJyYXkoIHJlc3VsdCApICkge1xuXHRcdFx0XHRcdFx0XHQvL0xvb3AgdGhyb3VnaCBiYXRjaCBub3QgYXBpIHJlc3VsdHMsIGFzIHJlc3VsdHMgd2lsbCBub3QgY29udGFpbiBkdXBsaWNhdGUgdmFsdWVzXG5cdFx0XHRcdFx0XHRcdC8vd2hpY2ggd291bGQgcmVzdWx0IGluIHNraXBwaW5nIHNldHRpbmcgZmllbGRzIHRoYXQgaGF2ZSB0aGUgZHVwbGljYXRlIGFjY291bnQgZW50cnkgaWQgc2VsZWN0ZWQuXG5cdFx0XHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGJhdGNoX2RhdGFbYXBpXS5yZWNvcmRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRcdFx0XHRcdGxldCByZXN1bHRfZGF0YSA9IHJlc3VsdC5maW5kKCBkYXRhID0+IGRhdGEuaWQgPT09IGJhdGNoX2RhdGFbYXBpXS5yZWNvcmRzW2ldLmlkICk7XG5cdFx0XHRcdFx0XHRcdFx0Ly9Jc3N1ZSAjMzEzMCAtIERlbGV0ZWQgcmVjb3JkcyB0aGF0IGFyZSBzdGlsbCBzZXQgb24gdGhlIGZpZWxkIHdvdWxkIGNhdXNlIGFuIGVycm9yLiBEbyBub3Qgc2V0IHVuZGVmaW5lZCB0byB0aGUgZmllbGQuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXN1bHRfZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCAkdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2JhdGNoX2RhdGFbYXBpXS5yZWNvcmRzW2ldLmZpZWxkXS5nZXRBbGxvd011bHRpcGxlU2VsZWN0aW9uKCkgPT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmVkaXRfdmlld191aV9kaWNbYmF0Y2hfZGF0YVthcGldLnJlY29yZHNbaV0uZmllbGRdLnNldFZhbHVlKCBbcmVzdWx0X2RhdGFdICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQkdGhpcy5lZGl0X3ZpZXdfdWlfZGljW2JhdGNoX2RhdGFbYXBpXS5yZWNvcmRzW2ldLmZpZWxkXS5zZXRWYWx1ZSggcmVzdWx0ICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8jMjU0MyAtIGZpeGluZyBkaXNjb25uZWN0ZWQgbWVudSBsZWFkaW5nIHRvIHBhZ2Vfb3JpZW50YXRpb24gSmF2YVNjcmlwdCBleGNlcHRpb25cblx0Ly9UaGlzIGNhdXNlZCBhIGJ1ZyB0aGF0IGlmIHlvdSBnbyB0byBEYXNoYm9hcmQsIHRoZW4gUmVwb3J0IC0+IFRpbWVTaGVldCBSZXBvcnQsIHRoZW4gY2xpY2sgdGhlIFggYXQgdGhlIHRvcCByaWdodCwgdGhlIHJpYmJvbiBtZW51IHdvdWxkIGdldCBvdXQgb2Ygc3luYyBhbmQgaGF2ZSB0aGUgbGFzdCBcIkhlbHBcIiB0b3AgbGV2ZWwgbWVudSBzZWxlY3RlZC5cblx0Ly8gb25DbG9zZUljb25DbGljazogZnVuY3Rpb24oKSB7XG5cdC8vIFx0aWYgKCBMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fc3ViX2NvbnRyb2xsZXIgKSB7XG5cdC8vIFx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fc3ViX2NvbnRyb2xsZXIub25DYW5jZWxDbGljaygpO1xuXHQvLyBcdH0gZWxzZSB7XG5cdC8vIFx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHQvLyBcdFx0dGhpcy5vbkNhbmNlbENsaWNrKCBudWxsLCBudWxsLCBmdW5jdGlvbigpIHtcblx0Ly8gXHRcdFx0aWYgKCAhdGhpcy5lZGl0X3ZpZXcgKSB7XG5cdC8vIFx0XHRcdFx0JHRoaXMucGFyZW50X3ZpZXdfY29udHJvbGxlci5idWlsZENvbnRleHRNZW51KCk7XG5cdC8vIFx0XHRcdFx0JHRoaXMucGFyZW50X3ZpZXdfY29udHJvbGxlci5zZXREZWZhdWx0TWVudSgpO1xuXHQvLyBcdFx0XHRcdC8vJHRoaXMub25DYW5jZWxDbGljaygpO1xuXHQvLyBcdFx0XHR9IGVsc2Uge1xuXHQvLyBcdFx0XHRcdCR0aGlzLmJ1aWxkRWRpdE1lbnUoKTtcblx0Ly8gXHRcdFx0fVxuXHQvLyBcdFx0fSApO1xuXHQvLyBcdH1cblx0Ly8gfVxuXG59XG5cblJlcG9ydEJhc2VWaWV3Q29udHJvbGxlci5SZXBvcnRNaXNzZWRGaWVsZCA9IG51bGw7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7867\n")}}]);
|