`;\n\t\t}\n\n\t\tinside_editor_div.append( this.editor );\n\t}\n\n\n\tinsideEditorSetValue( val ) {\n\t\tvar len = val.length;\n\n\t\tthis.removeAllRows();\n\t\tfor ( var i = 0; i < val.length; i++ ) {\n\t\t\tif ( Global.isSet( val[i] ) ) {\n\t\t\t\tvar row = val[i];\n\t\t\t\tif ( Global.isSet( this.parent_id ) ) {\n\t\t\t\t\trow['id'] = '';\n\t\t\t\t}\n\t\t\t\tthis.addRow( row );\n\t\t\t}\n\n\t\t}\n\t}\n\n\tinsideEditorAddRow( data, index ) {\n\t\tlet is_existing_row = false;\n\n\t\tif ( !data ) {\n\t\t\tdata = {};\n\t\t} else {\n\t\t\tis_existing_row = true;\n\t\t}\n\n\t\tvar row_id = data.id ? data.id : TTUUID.generateUUID();\n\n\t\tvar row = this.getRowRender(); //Get Row render\n\t\tvar render = this.getRender(); //get render, should be a table\n\t\tvar widgets = {}; //Save each row's widgets\n\n\t\t//Build row widgets\n\n\t\tvar form_item_input;\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'value' } );\n\t\tform_item_input.setValue( data.value ? data.value : '' );\n\t\tform_item_input.attr( 'item_id', row_id );\n\t\tform_item_input.bind( 'formItemChange', function( e, target, doNotValidate ) {\n\t\t\tthis.parent_controller.onFormItemChange( target, doNotValidate );\n\t\t\tthis.parent_controller.updateCustomFieldDropdowns();\n\t\t}.bind( this ) );\n\n\t\tif ( is_existing_row && this.parent_controller.is_add == false) {\n\t\t\tform_item_input.setEnabled( false );\n\t\t}\n\n\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\trow.children().eq( 0 ).append( form_item_input );\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'label' } );\n\t\tform_item_input.setValue( data.label ? data.label : '' );\n\t\tform_item_input.bind( 'formItemChange', function( e, target, doNotValidate ) {\n\t\t\tthis.parent_controller.onFormItemChange( target, doNotValidate );\n\t\t\tthis.parent_controller.updateCustomFieldDropdowns();\n\t\t}.bind( this ) );\n\n\t\twidgets[form_item_input.getField()] = form_item_input;\n\t\trow.children().eq( 1 ).append( form_item_input );\n\n\t\tif ( typeof index != 'undefined' ) {\n\t\t\trow.insertAfter( $( render ).find( 'tr' ).eq( index ) );\n\t\t\tthis.rows_widgets_array.splice( ( index ), 0, widgets );\n\n\t\t} else {\n\t\t\t$( render ).append( row );\n\t\t\tthis.rows_widgets_array.push( widgets );\n\t\t}\n\n\t\tif ( this.parent_controller.is_viewing ) {\n\t\t\trow.find( '.control-icon' ).hide();\n\t\t}\n\n\t\tthis.addIconsEvent( row ); //Bind event to add and minus icon\n\t\tthis.removeLastRowLine();\n\t}\n\n\tinsideEditorRemoveRow( row ) {\n\t\tvar index = row[0].rowIndex - 1;\n\t\trow.remove();\n\t\tthis.rows_widgets_array.splice( index, 1 );\n\t\tthis.removeLastRowLine();\n\n\t\tthis.parent_controller.updateCustomFieldDropdowns();\n\t\tthis.parent_controller.createMetaData( this.parent_controller.current_edit_record.type_id );\n\t}\n\n\tinsideEditorGetValue( current_edit_item_id ) {\n\t\tvar len = this.rows_widgets_array.length;\n\n\t\tvar result = [];\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar row = this.rows_widgets_array[i];\n\n\t\t\tvar data = {\n\t\t\t\tvalue: row.value.getValue(),\n\t\t\t\tlabel: row.label.getValue(),\n\t\t\t\tid: row.value.getValue()\n\t\t\t};\n\n\t\t\tresult.push( data );\n\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tsetEditViewDataDone() {\n\t\tsuper.setEditViewDataDone();\n\t\tthis.onTypeChange( true );\n\t\tthis.initInsideEditorData( true );\n\t}\n\n\tinitInsideEditorData( reset_rows ) {\n\t\tvar $this = this;\n\t\tvar args = {};\n\t\targs.filter_data = {};\n\n\t\tif ( reset_rows ) {\n\t\t\t//On initial open make sure to reset rows, else if user is using navigation arrows the select items from the old record will be shown\n\t\t\tthis.editor.removeAllRows();\n\t\t}\n\n\t\tif ( this.mass_edit || ( !this.current_edit_record.meta_data.validation.multi_select_items || !this.current_edit_record.meta_data.validation.multi_select_items.length > 0 ) || !this.current_edit_record ) {\n\t\t\t$this.editor.removeAllRows();\n\t\t\t$this.editor.addRow();\n\t\t\t$this.original_custom_field_select_items = [];\n\t\t} else {\n\t\t\t$this.original_custom_field_select_items = [];\n\t\t\tfor ( var i = 0; i < $this.current_edit_record.meta_data.validation.multi_select_items.length; i++ ) {\n\t\t\t\tvar item = $this.current_edit_record.meta_data.validation.multi_select_items[i];\n\t\t\t\tif ( item.id !== TTUUID.zero_id && item.id !== TTUUID.not_exist_id ) {\n\t\t\t\t\t$this.editor.addRow( item );\n\t\t\t\t\t$this.original_custom_field_select_items.push( item );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsaveInsideEditorData( callBack ) {\n\t\tthis.createMetaData();\n\n\t\tif ( callBack ) {\n\t\t\tcallBack();\n\t\t}\n\t}\n\n\tonFormItemChange( target, doNotValidate ) {\n\n\t\tthis.setIsChanged( target );\n\t\tthis.setMassEditingFieldsWhenFormChange( target );\n\t\tvar key = target.getField();\n\t\tvar c_value = target.getValue();\n\t\tthis.current_edit_record[key] = c_value;\n\n\t\tswitch ( key ) {\n\t\t\tcase 'type_id':\n\t\t\t\tthis.onTypeChange( false );\n\t\t\t\tbreak;\n\t\t\tcase 'parent_table':\n\t\t\t\tthis.onParentTableChange();\n\t\t\t\tbreak;\n\t\t\tcase 'value':\n\t\t\t\tthis.onSelectValueChange( target[0], c_value );\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.createMetaData( this.current_edit_record.type_id );\n\n\t\tif ( !doNotValidate ) {\n\t\t\tthis.validate();\n\t\t}\n\t}\n\n\tonTypeChange( set_default ) {\n\t\tthis.hideValidationFields();\n\n\t\tif ( this.current_edit_record.type_id == 1010 ) {\n\t\t\tthis.detachElement( 'enable_search' );\n\t\t} else {\n\t\t\tthis.attachElement( 'enable_search' );\n\t\t}\n\n\t\tif ( this.current_edit_record.type_id == 100 || this.current_edit_record.type_id == 110 ) {\n\t\t\tthis.attachElement( 'validate_min_length' );\n\t\t\tthis.attachElement( 'validate_max_length' );\n\t\t} else if ( this.current_edit_record.type_id == 400 || this.current_edit_record.type_id == 410 || this.current_edit_record.type_id == 420 ) {\n\t\t\tthis.attachElement( 'validate_min_amount' );\n\t\t\tthis.attachElement( 'validate_max_amount' );\n\t\t\tif ( this.current_edit_record.type_id == 410 ) {\n\t\t\t\tthis.attachElement( 'validate_decimal_places' );\n\t\t\t}\n\t\t} else if ( this.current_edit_record.type_id == 1000 || this.current_edit_record.type_id == 1010 ) {\n\t\t\tthis.attachElement( 'validate_min_date' );\n\t\t\tthis.attachElement( 'validate_max_date' );\n\t\t} else if ( this.current_edit_record.type_id == 1100 ) {\n\t\t\tthis.attachElement( 'validate_min_time' );\n\t\t\tthis.attachElement( 'validate_max_time' );\n\t\t} else if ( this.current_edit_record.type_id == 1200 ) {\n\t\t\tthis.attachElement( 'validate_min_datetime' );\n\t\t\tthis.attachElement( 'validate_max_datetime' );\n\t\t} else if ( this.current_edit_record.type_id == 1300 ) {\n\t\t\tthis.attachElement( 'validate_min_time_unit' );\n\t\t\tthis.attachElement( 'validate_max_time_unit' );\n\t\t} else if ( this.current_edit_record.type_id == 2100 ) {\n\t\t\t$( '#tab_custom_field_content_div #dropdown-editor').show();\n\t\t} else if ( this.current_edit_record.type_id == 2110 ) {\n\t\t\t$( '#tab_custom_field_content_div #dropdown-editor').show()\n\t\t\tthis.attachElement( 'validate_multi_select_min_amount' );\n\t\t\tthis.attachElement( 'validate_multi_select_max_amount' );\n\t\t}\n\n\t\tthis.changeDefaultValueFormItemType( this.current_edit_record.type_id, set_default );\n\t\tthis.editFieldResize();\n\t}\n\n\tonParentTableChange() {\n\t\tthis.setPunchFieldTypes();\n\t}\n\n\tonSelectValueChange(element, value) {\n\t\telement.id = value;\n\t}\n\n\tchangeDefaultValueFormItemType( new_type_id, set_default ) {\n\t\tlet target_column = this.edit_view_tab.find( '#tab_custom_field .second-column' );\n\n\t\tlet form_array = this.getCustomFieldFormInputByType( new_type_id, 'default_value', this.current_edit_record.meta_data );\n\t\tlet form_item_input = form_array[0];\n\t\tlet widget_container = form_array[1];\n\n\t\tform_item_input.attr( 'id', 'custom-field-default-value-new' );\n\t\tthis.edit_view_ui_dic['default_value'] = form_item_input;\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Default Value' ), form_item_input, target_column, '', widget_container );\n\t\tform_item_input.css( 'opacity', 1 );\n\n\t\tlet old_input = document.querySelector( '#custom-field-default-value' );\n\t\tlet new_input = document.querySelector( '#custom-field-default-value-new' );\n\n\t\t//Swap the old default value input with the new one, then delete the old one.\n\t\tlet temp_node = document.createElement( \"div\" );\n\t\told_input.parentNode.insertBefore( temp_node, old_input );\n\t\tnew_input.parentNode.insertBefore( old_input, new_input );\n\t\ttemp_node.parentNode.insertBefore( new_input, temp_node );\n\t\ttemp_node.parentNode.removeChild( temp_node );\n\t\told_input.parentNode.parentNode.remove();\n\n\t\t//Set ID of the new default value input to the old one.\n\t\tnew_input.id = 'custom-field-default-value';\n\n\t\tif ( set_default ) {\n\t\t\tform_item_input.setValue( this.current_edit_record.default_value );\n\t\t} else {\n\t\t\tthis.current_edit_record.default_value = '';\n\t\t}\n\t}\n\n\thideValidationFields() {\n\t\tthis.detachElement( 'validate_min_length' );\n\t\tthis.detachElement( 'validate_max_length' );\n\t\tthis.detachElement( 'validate_min_amount' );\n\t\tthis.detachElement( 'validate_max_amount' );\n\t\tthis.detachElement( 'validate_decimal_places' );\n\t\tthis.detachElement( 'validate_min_date' );\n\t\tthis.detachElement( 'validate_max_date' );\n\t\tthis.detachElement( 'validate_min_time_unit' );\n\t\tthis.detachElement( 'validate_max_time_unit' );\n\t\tthis.detachElement( 'validate_min_time' );\n\t\tthis.detachElement( 'validate_max_time' );\n\t\tthis.detachElement( 'validate_min_datetime' );\n\t\tthis.detachElement( 'validate_max_datetime' );\n\t\tthis.detachElement( 'validate_multi_select_min_amount' );\n\t\tthis.detachElement( 'validate_multi_select_max_amount' );\n\n\t\t$( '#tab_custom_field_content_div #dropdown-editor').hide()\n\t}\n\n\tcreateMetaData( type_id ) {\n\n\t\ttype_id = parseInt( type_id ); //Switch is strict on type, so we need to parseInt()\n\n\t\tswitch ( type_id ) {\n\t\t\tcase 100: //Text\n\t\t\tcase 110: //Textarea\n\t\t\t\tthis.current_edit_record.meta_data.validation = {\n\t\t\t\t\t'validate_min_length': this.current_edit_record.validate_min_length,\n\t\t\t\t\t'validate_max_length': this.current_edit_record.validate_max_length,\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 400: //Integer\n\t\t\tcase 420: //Currency\n\t\t\t\tthis.current_edit_record.meta_data.validation = {\n\t\t\t\t\t'validate_min_amount': this.current_edit_record.validate_min_amount,\n\t\t\t\t\t'validate_max_amount': this.current_edit_record.validate_max_amount,\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 410: //Decimal\n\t\t\t\tthis.current_edit_record.meta_data.validation = {\n\t\t\t\t\t'validate_min_amount': this.current_edit_record.validate_min_amount,\n\t\t\t\t\t'validate_max_amount': this.current_edit_record.validate_max_amount,\n\t\t\t\t\t'validate_decimal_places': this.current_edit_record.validate_decimal_places,\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 1000: //Date\n\t\t\tcase 1010: //Date range\n\t\t\t\tthis.current_edit_record.meta_data.validation = {\n\t\t\t\t\t'validate_min_date': this.current_edit_record.validate_min_date,\n\t\t\t\t\t'validate_max_date': this.current_edit_record.validate_max_date,\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 1100: //Time\n\t\t\t\tthis.current_edit_record.meta_data.validation = {\n\t\t\t\t\t'validate_min_time': this.current_edit_record.validate_min_time,\n\t\t\t\t\t'validate_max_time': this.current_edit_record.validate_max_time,\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 1200: //Datetike\n\t\t\t\tthis.current_edit_record.meta_data.validation = {\n\t\t\t\t\t'validate_min_datetime': this.current_edit_record.validate_min_datetime,\n\t\t\t\t\t'validate_max_datetime': this.current_edit_record.validate_max_datetime,\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 1300: //Time Unit\n\t\t\t\tthis.current_edit_record.meta_data.validation = {\n\t\t\t\t\t'validate_min_time_unit': this.current_edit_record.validate_min_time_unit,\n\t\t\t\t\t'validate_max_time_unit': this.current_edit_record.validate_max_time_unit,\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 2100: //Single-select\n\t\t\t\tthis.current_edit_record.meta_data.validation = {\n\t\t\t\t\t'multi_select_items': this.editor.getValue(),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tcase 2110: //Multi-select\n\t\t\t\tthis.current_edit_record.meta_data.validation = {\n\t\t\t\t\t'validate_multi_select_min_amount': this.current_edit_record.validate_multi_select_min_amount,\n\t\t\t\t\t'validate_multi_select_max_amount': this.current_edit_record.validate_multi_select_max_amount,\n\t\t\t\t\t'multi_select_items': this.editor.getValue().filter( ( item ) => item.value !== '' || item.label !== '' ),\n\t\t\t\t};\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.current_edit_record.meta_data.validation = {}; //Clear all validation fields\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tupdateCustomFieldDropdowns() {\n\t\tif ( this.current_edit_record.type_id == 2100 || this.current_edit_record.type_id == 2110 ) {\n\t\t\tlet source_data = this.editor.getValue();\n\t\t\tlet default_data = this.current_edit_record.default_value;\n\t\t\tthis.edit_view_ui_dic['default_value'].setSourceData( source_data );\n\t\t\tif ( Array.isArray( source_data ) && source_data.some( item => item.id == default_data ) ) {\n\t\t\t\tthis.edit_view_ui_dic['default_value'].setValue( this.current_edit_record.default_value );\n\t\t\t} else {\n\t\t\t\t//If more than one item is selected, unselect the removed item only. Otherwise set dropdown to null for no item selected.\n\t\t\t\tif ( Array.isArray( default_data ) && default_data.length > 1 ) {\n\t\t\t\t\tthis.edit_view_ui_dic['default_value'].setValue( default_data.filter( default_item => source_data.some( source_item => source_item.id == default_item ) ) );\n\t\t\t\t} else {\n\t\t\t\t\tthis.edit_view_ui_dic['default_value'].setValue( null );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsetCurrentEditRecordData() {\n\t\tthis.parseMetaDataToCurrentEditRecord();\n\t\tsuper.setCurrentEditRecordData();\n\n\t\tif ( this.is_add == false ) {\n\t\t\tthis.edit_view_ui_dic['type_id'].setEnabled( false );\n\t\t\tthis.edit_view_ui_dic['parent_table'].setEnabled( false );\n\t\t}\n\n\t\tthis.setPunchFieldTypes();\n\t}\n\n\tsetPunchFieldTypes() {\n\n\t\tvar punch_allowed_types_api_params = { 'parent_table': this.current_edit_record.parent_table };\n\t\tvar punch_allowed_types = this.api.getOptions( 'type_id', punch_allowed_types_api_params, { async: false } ).getResult();\n\n\t\tthis.edit_view_ui_dic.type_id.setSourceData( punch_allowed_types );\n\n\t\tif ( punch_allowed_types[this.current_edit_record.type_id] ) {\n\t\t\t//Changing source data visually changes the selected item, so we need to set it back to the current value.\n\t\t\tthis.edit_view_ui_dic.type_id.setValue( this.current_edit_record.type_id );\n\t\t} else {\n\t\t\t//Selected type is not allowed for this parent table. Set to first allowed type.\n\t\t\tthis.edit_view_ui_dic.type_id.setValue( Object.keys( punch_allowed_types )[0] );\n\t\t\tthis.current_edit_record.type_id = Object.keys( punch_allowed_types )[0];\n\t\t}\n\t}\n\n\tparseMetaDataToCurrentEditRecord() {\n\t\tfor ( var rule in this.current_edit_record.meta_data.validation ) {\n\t\t\tthis.current_edit_record[rule] = this.current_edit_record.meta_data.validation[rule];\n\t\t}\n\t}\n\n\tbuildSearchFields() {\n\n\t\tsuper.buildSearchFields();\n\t\tthis.search_fields = [\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Name' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'name',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.TEXT_INPUT\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Status' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'status_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Field Type' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'type_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Object Type' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'parent_table',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\t\t];\n\t}\n\n\tsetDefaultMenuAddIcon( context_btn, grid_selected_length, pId ) {\n\t\t//Community edition cannot add custom fields.\n\t\tif ( Global.getProductEdition() == 10 ) {\n\t\t\tContextMenuManager.hideMenuItem( this.determineContextMenuMountAttributes().id, context_btn.id, false )\n\t\t} else {\n\t\t\tsuper.setDefaultMenuAddIcon( context_btn, grid_selected_length, pId );\n\t\t}\n\t}\n\n\tgetCustomFieldTabHtml() {\n\t\treturn `
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\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}\n\n\tcopyAsNewResetIds( data ) {\n\t\tif ( this.edit_view_ui_dic['type_id'] && this.edit_view_ui_dic['parent_table'] ) {\n\t\t\t//If copying as new while on a record instead of list view, these may already be disabled.\n\t\t\t//Copy as new does not build a new edit view and instead resets the current_edit_record.id.\n\t\t\tthis.edit_view_ui_dic['type_id'].setEnabled( true );\n\t\t\tthis.edit_view_ui_dic['parent_table'].setEnabled( true );\n\t\t}\n\t\treturn super.copyAsNewResetIds( data );\n\t}\n\n\tonSaveDone( result ) {\n\t\t//Clearing cache to prevent issues with report display columns showing outdated cached results.\n\t\tGlobal.clearCache( 'getOptions_columns' );\n\t\tGlobal.clearCache( 'getOptions_debit_credit_variables' ); //PayStubEntryAccount variable selector\n\t\tGlobal.clearCache( 'getOptions_formula_columns' ); //Custom columns variable selector\n\t\tsuper.onSaveDone( result );\n\t}\n\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVELHFEQUFxRDtBQUNyRDtBQUNBOztBQUVBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL2NvbXBhbnkvY3VzdG9tX2ZpZWxkL0N1c3RvbUZpZWxkVmlld0NvbnRyb2xsZXIuanM/MDRmNSJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQ3VzdG9tRmllbGRWaWV3Q29udHJvbGxlciBleHRlbmRzIEJhc2VWaWV3Q29udHJvbGxlciB7XG5cdGNvbnN0cnVjdG9yKCBvcHRpb25zID0ge30gKSB7XG5cdFx0Xy5kZWZhdWx0cyggb3B0aW9ucywge1xuXHRcdFx0ZWw6ICcjY3VzdG9tX2ZpZWxkX3ZpZXdfY29udGFpbmVyJyxcblx0XHRcdHR5cGVfYXJyYXk6IG51bGwsXG5cdFx0XHRwYXJlbnRfdGFibGVfYXJyYXk6IG51bGwsXG5cdFx0XHRzdGF0dXNfYXJyYXk6IG51bGwsXG5cblx0XHRcdG9yaWdpbmFsX2N1c3RvbV9maWVsZF9zZWxlY3RfaXRlbXM6IFtdLFxuXHRcdFx0YXV0aGVudGljYXRpb25fYXBpOiBudWxsLFxuXHRcdH0gKTtcblxuXHRcdHN1cGVyKCBvcHRpb25zICk7XG5cdH1cblxuXHRpbml0KCBvcHRpb25zICkge1xuXHRcdC8vdGhpcy5fc3VwZXIoJ2luaXRpYWxpemUnLCBvcHRpb25zICk7XG5cdFx0dGhpcy5lZGl0X3ZpZXdfdHBsID0gJ0N1c3RvbUZpZWxkRWRpdFZpZXcuaHRtbCc7XG5cdFx0dGhpcy5wZXJtaXNzaW9uX2lkID0gJ2N1c3RvbV9maWVsZCc7XG5cdFx0dGhpcy52aWV3SWQgPSAnQ3VzdG9tRmllbGQnO1xuXHRcdHRoaXMuc2NyaXB0X25hbWUgPSAnQ3VzdG9tRmllbGRWaWV3Jztcblx0XHR0aGlzLnRhYmxlX25hbWVfa2V5ID0gJ2N1c3RvbV9maWVsZF9jb250cm9sJztcblx0XHR0aGlzLmNvbnRleHRfbWVudV9uYW1lID0gJC5pMThuLl8oICdDdXN0b20gRmllbGQnICk7XG5cdFx0dGhpcy5uYXZpZ2F0aW9uX2xhYmVsID0gJC5pMThuLl8oICdDdXN0b20gRmllbGQnICk7XG5cdFx0dGhpcy5hcGkgPSBUVEFQSS5BUElDdXN0b21GaWVsZDtcblx0XHR0aGlzLmF1dGhlbnRpY2F0aW9uX2FwaSA9IFRUQVBJLkFQSUF1dGhlbnRpY2F0aW9uO1xuXG5cdFx0dGhpcy5yZW5kZXIoKTtcblx0XHR0aGlzLmJ1aWxkQ29udGV4dE1lbnUoKTtcblxuXHRcdHRoaXMuaW5pdERhdGEoKTtcblx0fVxuXG5cdGdldEN1c3RvbUNvbnRleHRNZW51TW9kZWwoKSB7XG5cdFx0dmFyIGNvbnRleHRfbWVudV9tb2RlbCA9IHtcblx0XHRcdGV4Y2x1ZGU6IFsnY29weScsICdtYXNzX2VkaXQnXSxcblx0XHRcdGluY2x1ZGU6IFtdXG5cdFx0fTtcblxuXHRcdHJldHVybiBjb250ZXh0X21lbnVfbW9kZWw7XG5cdH1cblxuXHRpbml0T3B0aW9ucyggY2FsbEJhY2sgKSB7XG5cdFx0dmFyIG9wdGlvbnMgPSBbXG5cdFx0XHQvLyB7IG9wdGlvbl9uYW1lOiAndHlwZV9pZCcsIGZpZWxkX25hbWU6ICd0eXBlX2lkJywgYXBpOiB0aGlzLmFwaSB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3R5cGUnLCBhcGk6IHRoaXMuYXBpIH0sXG5cdFx0XHR7IG9wdGlvbl9uYW1lOiAnc3RhdHVzJywgYXBpOiB0aGlzLmFwaSB9LFxuXHRcdFx0eyBvcHRpb25fbmFtZTogJ3BhcmVudF90YWJsZScsIGZpZWxkX25hbWU6ICdwYXJlbnRfdGFibGUnLCBhcGk6IHRoaXMuYXBpIH1cblx0XHRdO1xuXG5cdFx0dGhpcy5pbml0RHJvcERvd25PcHRpb25zKCBvcHRpb25zICk7XG5cdH1cblxuXHRzZWFyY2hEb25lKCByZXN1bHQgKSB7XG5cblx0XHRzdXBlci5zZWFyY2hEb25lKCk7XG5cdFx0dGhpcy5yZWZyZXNoQ3VzdG9tRmllbGRDYWNoZSgpO1xuXHR9XG5cblx0cmVmcmVzaEN1c3RvbUZpZWxkQ2FjaGUoKSB7XG5cdFx0dGhpcy5hdXRoZW50aWNhdGlvbl9hcGkuZ2V0Q3VzdG9tRmllbGREYXRhKCB7fSwge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXNwb25zZSApIHtcblx0XHRcdFx0bGV0IHJlc3VsdCA9IHJlc3BvbnNlLmdldFJlc3VsdCgpO1xuXHRcdFx0XHRMb2NhbENhY2hlRGF0YS5zZXRDdXN0b21GaWVsZERhdGEoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0YnVpbGRFZGl0Vmlld1VJKCkge1xuXG5cdFx0c3VwZXIuYnVpbGRFZGl0Vmlld1VJKCk7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXG5cdFx0dmFyIHRhYl9tb2RlbCA9IHtcblx0XHRcdCd0YWJfY3VzdG9tX2ZpZWxkJzoge1xuXHRcdFx0XHQnbGFiZWwnOiAkLmkxOG4uXyggJ0N1c3RvbSBGaWVsZCcgKSxcblx0XHRcdFx0J2lzX211bHRpX2NvbHVtbic6IHRydWUsXG5cdFx0XHRcdCdodG1sX3RlbXBsYXRlJzogdGhpcy5nZXRDdXN0b21GaWVsZFRhYkh0bWwoKVxuXHRcdFx0fSxcblx0XHRcdCd0YWJfYXVkaXQnOiB0cnVlLFxuXHRcdH07XG5cdFx0dGhpcy5zZXRUYWJNb2RlbCggdGFiX21vZGVsICk7XG5cblx0XHR0aGlzLm5hdmlnYXRpb24uQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUN1c3RvbUZpZWxkLFxuXHRcdFx0aWQ6IHRoaXMuc2NyaXB0X25hbWUgKyAnX25hdmlnYXRpb24nLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2N1c3RvbV9maWVsZCcsXG5cdFx0XHRuYXZpZ2F0aW9uX21vZGU6IHRydWUsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWVcblx0XHR9ICk7XG5cblx0XHR0aGlzLnNldE5hdmlnYXRpb24oKTtcblxuXHRcdC8vVGFiIDAgc3RhcnRcblxuXHRcdHZhciB0YWJfY3VzdG9tX2ZpZWxkID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX2N1c3RvbV9maWVsZCcgKTtcblxuXHRcdHZhciB0YWJfY3VzdG9tX2ZpZWxkX2NvbHVtbjEgPSB0YWJfY3VzdG9tX2ZpZWxkLmZpbmQoICcuZmlyc3QtY29sdW1uJyApO1xuXHRcdHZhciB0YWJfY3VzdG9tX2ZpZWxkX2NvbHVtbjIgPSB0YWJfY3VzdG9tX2ZpZWxkLmZpbmQoICcuc2Vjb25kLWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0gPSBbXTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0ucHVzaCggdGFiX2N1c3RvbV9maWVsZF9jb2x1bW4xICk7XG5cblx0XHQvL1N0YXR1c1xuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdzdGF0dXNfaWQnIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMuc3RhdHVzX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdTdGF0dXMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2N1c3RvbV9maWVsZF9jb2x1bW4xLCAnJyApO1xuXG5cdFx0Ly9OYW1lXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICduYW1lJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdOYW1lJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9jdXN0b21fZmllbGRfY29sdW1uMSwgJycgKTtcblxuXHRcdC8vIFBhcmVudCBUYWJsZVxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ29tYm9Cb3goIHsgZmllbGQ6ICdwYXJlbnRfdGFibGUnIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMucGFyZW50X3RhYmxlX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdPYmplY3QgVHlwZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfY3VzdG9tX2ZpZWxkX2NvbHVtbjEsICcnICk7XG5cblx0XHQvLyBUeXBlXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3R5cGVfaWQnIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0U291cmNlRGF0YSggJHRoaXMudHlwZV9hcnJheSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRmllbGQgVHlwZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfY3VzdG9tX2ZpZWxkX2NvbHVtbjEsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvL0Rpc3BsYXkgT3JkZXJcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2Rpc3BsYXlfb3JkZXInIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0Rpc3BsYXkgT3JkZXInICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2N1c3RvbV9maWVsZF9jb2x1bW4xLCAnJyApO1xuXG5cdFx0Ly9FbmFibGUgU2VhcmNoXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UQ2hlY2tib3goIHsgZmllbGQ6ICdlbmFibGVfc2VhcmNoJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFbmFibGUgU2VhcmNoJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9jdXN0b21fZmllbGRfY29sdW1uMSwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vU2Vjb25kIENvbHVtblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuU0VQQVJBVEVEX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5TZXBhcmF0ZWRCb3goIHsgbGFiZWw6ICQuaTE4bi5fKCAnVmFsaWRhdGlvbiBSdWxlcycgKSB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggbnVsbCwgZm9ybV9pdGVtX2lucHV0LCB0YWJfY3VzdG9tX2ZpZWxkX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0Ly9EZWZhdWx0IFZhbHVlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdkZWZhdWx0X3ZhbHVlJyB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LmF0dHIoICdpZCcsICdjdXN0b20tZmllbGQtZGVmYXVsdC12YWx1ZScgKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0RlZmF1bHQgVmFsdWUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2N1c3RvbV9maWVsZF9jb2x1bW4yLCAnJyApO1xuXG5cdFx0Ly9JcyByZXF1aXJlZFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ0hFQ0tCT1ggKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVENoZWNrYm94KCB7IGZpZWxkOiAnaXNfcmVxdWlyZWQnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ1JlcXVpcmVkJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9jdXN0b21fZmllbGRfY29sdW1uMiwgJycgKTtcblxuXHRcdC8vTWluIExlbmd0aFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAndmFsaWRhdGVfbWluX2xlbmd0aCcgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTWluaW11bSBMZW5ndGgnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2N1c3RvbV9maWVsZF9jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly9NYXggTGVuZ3RoXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICd2YWxpZGF0ZV9tYXhfbGVuZ3RoJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdNYXhpbXVtIExlbmd0aCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfY3VzdG9tX2ZpZWxkX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvL1ByZWNpc2lvbiAoRGVjaW1hbCBQbGFjZXMpXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICd2YWxpZGF0ZV9kZWNpbWFsX3BsYWNlcycgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGVjaW1hbCBQbGFjZXMnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2N1c3RvbV9maWVsZF9jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly9NaW4gQW1vdW50XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICd2YWxpZGF0ZV9taW5fYW1vdW50JyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdNaW5pbXVtIEFtb3VudCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfY3VzdG9tX2ZpZWxkX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvL01heCBBbW91bnRcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3ZhbGlkYXRlX21heF9hbW91bnQnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ01heGltdW0gQW1vdW50JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9jdXN0b21fZmllbGRfY29sdW1uMiwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vTWluIFRpbWUgVW5pdFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAndmFsaWRhdGVfbWluX3RpbWVfdW5pdCcsIG1vZGU6ICd0aW1lX3VuaXQnLCBuZWVkX3BhcnNlcl9zZWM6IHRydWUgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTWluaW11bSBBbW91bnQnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2N1c3RvbV9maWVsZF9jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly9NYXggVGltZSBVbml0XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICd2YWxpZGF0ZV9tYXhfdGltZV91bml0JywgbW9kZTogJ3RpbWVfdW5pdCcsIG5lZWRfcGFyc2VyX3NlYzogdHJ1ZSB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdNYXhpbXVtIEFtb3VudCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfY3VzdG9tX2ZpZWxkX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvL01pbiBEYXRlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5URGF0ZVBpY2tlciggeyBmaWVsZDogJ3ZhbGlkYXRlX21pbl9kYXRlJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdNaW5pbXVtIERhdGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2N1c3RvbV9maWVsZF9jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly9NYXggRGF0ZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuREFURV9QSUNLRVIgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICd2YWxpZGF0ZV9tYXhfZGF0ZScgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTWF4aW11bSBEYXRlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9jdXN0b21fZmllbGRfY29sdW1uMiwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vTWluIHRpbWVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRJTUVfUElDS0VSICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUaW1lUGlja2VyKCB7IGZpZWxkOiAndmFsaWRhdGVfbWluX3RpbWUnLCB2YWxpZGF0aW9uX2ZpZWxkOiAndGltZV9zdGFtcCcgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTWluaW11bSB0aW1lJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9jdXN0b21fZmllbGRfY29sdW1uMiwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vTWF4IHRpbWVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRJTUVfUElDS0VSICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUaW1lUGlja2VyKCB7IGZpZWxkOiAndmFsaWRhdGVfbWF4X3RpbWUnLCB2YWxpZGF0aW9uX2ZpZWxkOiAndGltZV9zdGFtcCcgfSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnTWF4aW11bSB0aW1lJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9jdXN0b21fZmllbGRfY29sdW1uMiwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vIE11bHRpLXNlbGVjdCBNaW5pbXVtIEFtb3VudFxuXHRcdHZhciBmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ3ZhbGlkYXRlX211bHRpX3NlbGVjdF9taW5fYW1vdW50JyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdNdWx0aS1zZWxlY3QgTWluaW11bSBTZWxlY3RlZCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfY3VzdG9tX2ZpZWxkX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvL011bHRpLXNlbGVjdCBNYXhpbXVtIEFtb3VudFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAndmFsaWRhdGVfbXVsdGlfc2VsZWN0X21heF9hbW91bnQnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ011bHRpLXNlbGVjdCBNYXhpbXVtIFNlbGVjdGVkJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9jdXN0b21fZmllbGRfY29sdW1uMiwgJycsIG51bGwsIHRydWUgKTtcblxuXHRcdC8vTWluIERhdGV0aW1lXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5URGF0ZVBpY2tlciggeyBmaWVsZDogJ3ZhbGlkYXRlX21pbl9kYXRldGltZScsIG1vZGU6ICdkYXRlX3RpbWUnIH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ01pbmltdW0gRGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfY3VzdG9tX2ZpZWxkX2NvbHVtbjIsICcnLCBudWxsLCB0cnVlICk7XG5cblx0XHQvL01heCBEYXRldGltZVxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuREFURV9QSUNLRVIgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICd2YWxpZGF0ZV9tYXhfZGF0ZXRpbWUnLCBtb2RlOiAnZGF0ZV90aW1lJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdNYXhpbXVtIERhdGUnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2N1c3RvbV9maWVsZF9jb2x1bW4yLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Ly9cblx0XHQvL0luc2lkZSBlZGl0b3IgZm9yIGRyb3Bkb3duc1xuXHRcdC8vXG5cdFx0dmFyIGluc2lkZV9lZGl0b3JfZGl2ID0gdGFiX2N1c3RvbV9maWVsZC5maW5kKCAnLmluc2lkZS1lZGl0b3ItZGl2JyApO1xuXHRcdHZhciBhcmdzID0ge1xuXHRcdFx0dmFsdWU6ICQuaTE4bi5fKCAnSXRlbSBWYWx1ZScgKSxcblx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0l0ZW0gRGlzcGxheSBMYWJlbCcgKVxuXHRcdH07XG5cblx0XHR0aGlzLmVkaXRvciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuSU5TSURFX0VESVRPUiApO1xuXG5cdFx0dGhpcy5lZGl0b3IuSW5zaWRlRWRpdG9yKCB7XG5cdFx0XHRhZGRSb3c6IHRoaXMuaW5zaWRlRWRpdG9yQWRkUm93LFxuXHRcdFx0cmVtb3ZlUm93OiB0aGlzLmluc2lkZUVkaXRvclJlbW92ZVJvdyxcblx0XHRcdGdldFZhbHVlOiB0aGlzLmluc2lkZUVkaXRvckdldFZhbHVlLFxuXHRcdFx0c2V0VmFsdWU6IHRoaXMuaW5zaWRlRWRpdG9yU2V0VmFsdWUsXG5cdFx0XHRyZW5kZXI6IGdldFJlbmRlcigpLFxuXHRcdFx0cmVuZGVyX2FyZ3M6IGFyZ3MsXG5cdFx0XHRyZW5kZXJfaW5saW5lX2h0bWw6IHRydWUsXG5cdFx0XHRyb3dfcmVuZGVyOiBnZXRSb3dSZW5kZXIoKSxcblx0XHRcdHBhcmVudF9jb250cm9sbGVyOiB0aGlzXG5cdFx0fSApO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0UmVuZGVyKCkge1xuXHRcdFx0cmV0dXJuIGBcblx0XHRcdDx0YWJsZSBjbGFzcz1cImluc2lkZS1lZGl0b3ItcmVuZGVyXCI+XG5cdFx0XHRcdDx0ciBjbGFzcz1cInRpdGxlXCI+XG5cdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDIwMHB4XCI+PCU9IHZhbHVlICU+PC90ZD5cblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogMjAwcHhcIj48JT0gbGFiZWwgJT48L3RkPlxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiAyNXB4XCI+PC90ZD5cblx0XHRcdFx0XHQ8dGQgc3R5bGU9XCJ3aWR0aDogMjVweFwiPjwvdGQ+XG5cdFx0XHRcdDwvdHI+XG5cdFx0XHQ8L3RhYmxlPmA7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0Um93UmVuZGVyKCkge1xuXHRcdFx0cmV0dXJuIGBcblx0XHRcdDx0ciBjbGFzcz1cImluc2lkZS1lZGl0b3Itcm93IGRhdGEtcm93XCI+XG5cdFx0XHRcdDx0ZCBjbGFzcz1cInZhbHVlIGNlbGxcIj48L3RkPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJsYWJlbCBjZWxsXCI+PC90ZD5cblx0XHRcdFx0PHRkIGNsYXNzPVwiY2VsbCBjb250cm9sLWljb25cIj5cblx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwicGx1cy1pY29uXCIgb25jbGljaz1cIlwiPjwvYnV0dG9uPlxuXHRcdFx0XHQ8L3RkPlxuXHRcdFx0XHQ8dGQgY2xhc3M9XCJjZWxsIGNvbnRyb2wtaWNvblwiPlxuXHRcdFx0XHRcdDxidXR0b24gY2xhc3M9XCJtaW51cy1pY29uIFwiIG9uY2xpY2s9XCJcIj48L2J1dHRvbj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdDwvdHI+YDtcblx0XHR9XG5cblx0XHRpbnNpZGVfZWRpdG9yX2Rpdi5hcHBlbmQoIHRoaXMuZWRpdG9yICk7XG5cdH1cblxuXG5cdGluc2lkZUVkaXRvclNldFZhbHVlKCB2YWwgKSB7XG5cdFx0dmFyIGxlbiA9IHZhbC5sZW5ndGg7XG5cblx0XHR0aGlzLnJlbW92ZUFsbFJvd3MoKTtcblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggdmFsW2ldICkgKSB7XG5cdFx0XHRcdHZhciByb3cgPSB2YWxbaV07XG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB0aGlzLnBhcmVudF9pZCApICkge1xuXHRcdFx0XHRcdHJvd1snaWQnXSA9ICcnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuYWRkUm93KCByb3cgKTtcblx0XHRcdH1cblxuXHRcdH1cblx0fVxuXG5cdGluc2lkZUVkaXRvckFkZFJvdyggZGF0YSwgaW5kZXggKSB7XG5cdFx0bGV0IGlzX2V4aXN0aW5nX3JvdyA9IGZhbHNlO1xuXG5cdFx0aWYgKCAhZGF0YSApIHtcblx0XHRcdGRhdGEgPSB7fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aXNfZXhpc3Rpbmdfcm93ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHR2YXIgcm93X2lkID0gZGF0YS5pZCA/IGRhdGEuaWQgOiBUVFVVSUQuZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHR2YXIgcm93ID0gdGhpcy5nZXRSb3dSZW5kZXIoKTsgLy9HZXQgUm93IHJlbmRlclxuXHRcdHZhciByZW5kZXIgPSB0aGlzLmdldFJlbmRlcigpOyAvL2dldCByZW5kZXIsIHNob3VsZCBiZSBhIHRhYmxlXG5cdFx0dmFyIHdpZGdldHMgPSB7fTsgLy9TYXZlIGVhY2ggcm93J3Mgd2lkZ2V0c1xuXG5cdFx0Ly9CdWlsZCByb3cgd2lkZ2V0c1xuXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dDtcblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAndmFsdWUnIH0gKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoIGRhdGEudmFsdWUgPyBkYXRhLnZhbHVlIDogJycgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuYXR0ciggJ2l0ZW1faWQnLCByb3dfaWQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuYmluZCggJ2Zvcm1JdGVtQ2hhbmdlJywgZnVuY3Rpb24oIGUsIHRhcmdldCwgZG9Ob3RWYWxpZGF0ZSApIHtcblx0XHRcdHRoaXMucGFyZW50X2NvbnRyb2xsZXIub25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0LCBkb05vdFZhbGlkYXRlICk7XG5cdFx0XHR0aGlzLnBhcmVudF9jb250cm9sbGVyLnVwZGF0ZUN1c3RvbUZpZWxkRHJvcGRvd25zKCk7XG5cdFx0fS5iaW5kKCB0aGlzICkgKTtcblxuXHRcdGlmICggaXNfZXhpc3Rpbmdfcm93ICYmIHRoaXMucGFyZW50X2NvbnRyb2xsZXIuaXNfYWRkID09IGZhbHNlKSB7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0RW5hYmxlZCggZmFsc2UgKTtcblx0XHR9XG5cblx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMCApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKTtcblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRleHRJbnB1dCggeyBmaWVsZDogJ2xhYmVsJyB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBkYXRhLmxhYmVsID8gZGF0YS5sYWJlbCA6ICcnICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LmJpbmQoICdmb3JtSXRlbUNoYW5nZScsIGZ1bmN0aW9uKCBlLCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0XHR0aGlzLnBhcmVudF9jb250cm9sbGVyLm9uRm9ybUl0ZW1DaGFuZ2UoIHRhcmdldCwgZG9Ob3RWYWxpZGF0ZSApO1xuXHRcdFx0dGhpcy5wYXJlbnRfY29udHJvbGxlci51cGRhdGVDdXN0b21GaWVsZERyb3Bkb3ducygpO1xuXHRcdH0uYmluZCggdGhpcyApICk7XG5cblx0XHR3aWRnZXRzW2Zvcm1faXRlbV9pbnB1dC5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9pbnB1dDtcblx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMSApLmFwcGVuZCggZm9ybV9pdGVtX2lucHV0ICk7XG5cblx0XHRpZiAoIHR5cGVvZiBpbmRleCAhPSAndW5kZWZpbmVkJyApIHtcblx0XHRcdHJvdy5pbnNlcnRBZnRlciggJCggcmVuZGVyICkuZmluZCggJ3RyJyApLmVxKCBpbmRleCApICk7XG5cdFx0XHR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5zcGxpY2UoICggaW5kZXggKSwgMCwgd2lkZ2V0cyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdCQoIHJlbmRlciApLmFwcGVuZCggcm93ICk7XG5cdFx0XHR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5wdXNoKCB3aWRnZXRzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnBhcmVudF9jb250cm9sbGVyLmlzX3ZpZXdpbmcgKSB7XG5cdFx0XHRyb3cuZmluZCggJy5jb250cm9sLWljb24nICkuaGlkZSgpO1xuXHRcdH1cblxuXHRcdHRoaXMuYWRkSWNvbnNFdmVudCggcm93ICk7IC8vQmluZCBldmVudCB0byBhZGQgYW5kIG1pbnVzIGljb25cblx0XHR0aGlzLnJlbW92ZUxhc3RSb3dMaW5lKCk7XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JSZW1vdmVSb3coIHJvdyApIHtcblx0XHR2YXIgaW5kZXggPSByb3dbMF0ucm93SW5kZXggLSAxO1xuXHRcdHJvdy5yZW1vdmUoKTtcblx0XHR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0dGhpcy5yZW1vdmVMYXN0Um93TGluZSgpO1xuXG5cdFx0dGhpcy5wYXJlbnRfY29udHJvbGxlci51cGRhdGVDdXN0b21GaWVsZERyb3Bkb3ducygpO1xuXHRcdHRoaXMucGFyZW50X2NvbnRyb2xsZXIuY3JlYXRlTWV0YURhdGEoIHRoaXMucGFyZW50X2NvbnRyb2xsZXIuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkICk7XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JHZXRWYWx1ZSggY3VycmVudF9lZGl0X2l0ZW1faWQgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMucm93c193aWRnZXRzX2FycmF5Lmxlbmd0aDtcblxuXHRcdHZhciByZXN1bHQgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0dmFyIHJvdyA9IHRoaXMucm93c193aWRnZXRzX2FycmF5W2ldO1xuXG5cdFx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdFx0dmFsdWU6IHJvdy52YWx1ZS5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRsYWJlbDogcm93LmxhYmVsLmdldFZhbHVlKCksXG5cdFx0XHRcdGlkOiByb3cudmFsdWUuZ2V0VmFsdWUoKVxuXHRcdFx0fTtcblxuXHRcdFx0cmVzdWx0LnB1c2goIGRhdGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRzZXRFZGl0Vmlld0RhdGFEb25lKCkge1xuXHRcdHN1cGVyLnNldEVkaXRWaWV3RGF0YURvbmUoKTtcblx0XHR0aGlzLm9uVHlwZUNoYW5nZSggdHJ1ZSApO1xuXHRcdHRoaXMuaW5pdEluc2lkZUVkaXRvckRhdGEoIHRydWUgKTtcblx0fVxuXG5cdGluaXRJbnNpZGVFZGl0b3JEYXRhKCByZXNldF9yb3dzICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHRhcmdzLmZpbHRlcl9kYXRhID0ge307XG5cblx0XHRpZiAoIHJlc2V0X3Jvd3MgKSB7XG5cdFx0XHQvL09uIGluaXRpYWwgb3BlbiBtYWtlIHN1cmUgdG8gcmVzZXQgcm93cywgZWxzZSBpZiB1c2VyIGlzIHVzaW5nIG5hdmlnYXRpb24gYXJyb3dzIHRoZSBzZWxlY3QgaXRlbXMgZnJvbSB0aGUgb2xkIHJlY29yZCB3aWxsIGJlIHNob3duXG5cdFx0XHR0aGlzLmVkaXRvci5yZW1vdmVBbGxSb3dzKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm1hc3NfZWRpdCB8fCAoICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQubWV0YV9kYXRhLnZhbGlkYXRpb24ubXVsdGlfc2VsZWN0X2l0ZW1zIHx8ICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQubWV0YV9kYXRhLnZhbGlkYXRpb24ubXVsdGlfc2VsZWN0X2l0ZW1zLmxlbmd0aCA+IDAgKSB8fCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkICkge1xuXHRcdFx0JHRoaXMuZWRpdG9yLnJlbW92ZUFsbFJvd3MoKTtcblx0XHRcdCR0aGlzLmVkaXRvci5hZGRSb3coKTtcblx0XHRcdCR0aGlzLm9yaWdpbmFsX2N1c3RvbV9maWVsZF9zZWxlY3RfaXRlbXMgPSBbXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JHRoaXMub3JpZ2luYWxfY3VzdG9tX2ZpZWxkX3NlbGVjdF9pdGVtcyA9IFtdO1xuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5tZXRhX2RhdGEudmFsaWRhdGlvbi5tdWx0aV9zZWxlY3RfaXRlbXMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhciBpdGVtID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5tZXRhX2RhdGEudmFsaWRhdGlvbi5tdWx0aV9zZWxlY3RfaXRlbXNbaV07XG5cdFx0XHRcdGlmICggaXRlbS5pZCAhPT0gVFRVVUlELnplcm9faWQgJiYgaXRlbS5pZCAhPT0gVFRVVUlELm5vdF9leGlzdF9pZCApIHtcblx0XHRcdFx0XHQkdGhpcy5lZGl0b3IuYWRkUm93KCBpdGVtICk7XG5cdFx0XHRcdFx0JHRoaXMub3JpZ2luYWxfY3VzdG9tX2ZpZWxkX3NlbGVjdF9pdGVtcy5wdXNoKCBpdGVtICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRzYXZlSW5zaWRlRWRpdG9yRGF0YSggY2FsbEJhY2sgKSB7XG5cdFx0dGhpcy5jcmVhdGVNZXRhRGF0YSgpO1xuXG5cdFx0aWYgKCBjYWxsQmFjayApIHtcblx0XHRcdGNhbGxCYWNrKCk7XG5cdFx0fVxuXHR9XG5cblx0b25Gb3JtSXRlbUNoYW5nZSggdGFyZ2V0LCBkb05vdFZhbGlkYXRlICkge1xuXG5cdFx0dGhpcy5zZXRJc0NoYW5nZWQoIHRhcmdldCApO1xuXHRcdHRoaXMuc2V0TWFzc0VkaXRpbmdGaWVsZHNXaGVuRm9ybUNoYW5nZSggdGFyZ2V0ICk7XG5cdFx0dmFyIGtleSA9IHRhcmdldC5nZXRGaWVsZCgpO1xuXHRcdHZhciBjX3ZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW2tleV0gPSBjX3ZhbHVlO1xuXG5cdFx0c3dpdGNoICgga2V5ICkge1xuXHRcdFx0Y2FzZSAndHlwZV9pZCc6XG5cdFx0XHRcdHRoaXMub25UeXBlQ2hhbmdlKCBmYWxzZSApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3BhcmVudF90YWJsZSc6XG5cdFx0XHRcdHRoaXMub25QYXJlbnRUYWJsZUNoYW5nZSgpO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ3ZhbHVlJzpcblx0XHRcdFx0dGhpcy5vblNlbGVjdFZhbHVlQ2hhbmdlKCB0YXJnZXRbMF0sIGNfdmFsdWUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0dGhpcy5jcmVhdGVNZXRhRGF0YSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgKTtcblxuXHRcdGlmICggIWRvTm90VmFsaWRhdGUgKSB7XG5cdFx0XHR0aGlzLnZhbGlkYXRlKCk7XG5cdFx0fVxuXHR9XG5cblx0b25UeXBlQ2hhbmdlKCBzZXRfZGVmYXVsdCApIHtcblx0XHR0aGlzLmhpZGVWYWxpZGF0aW9uRmllbGRzKCk7XG5cblx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkID09IDEwMTAgKSB7XG5cdFx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICdlbmFibGVfc2VhcmNoJyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICdlbmFibGVfc2VhcmNoJyApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgPT0gMTAwIHx8IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkID09IDExMCApIHtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ3ZhbGlkYXRlX21pbl9sZW5ndGgnICk7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICd2YWxpZGF0ZV9tYXhfbGVuZ3RoJyApO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkID09IDQwMCB8fCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PSA0MTAgfHwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgPT0gNDIwICkge1xuXHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCAndmFsaWRhdGVfbWluX2Ftb3VudCcgKTtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ3ZhbGlkYXRlX21heF9hbW91bnQnICk7XG5cdFx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkID09IDQxMCApIHtcblx0XHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCAndmFsaWRhdGVfZGVjaW1hbF9wbGFjZXMnICk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgPT0gMTAwMCB8fCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PSAxMDEwICkge1xuXHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCAndmFsaWRhdGVfbWluX2RhdGUnICk7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICd2YWxpZGF0ZV9tYXhfZGF0ZScgKTtcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PSAxMTAwICkge1xuXHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCAndmFsaWRhdGVfbWluX3RpbWUnICk7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICd2YWxpZGF0ZV9tYXhfdGltZScgKTtcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PSAxMjAwICkge1xuXHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCAndmFsaWRhdGVfbWluX2RhdGV0aW1lJyApO1xuXHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCAndmFsaWRhdGVfbWF4X2RhdGV0aW1lJyApO1xuXHRcdH0gZWxzZSBpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC50eXBlX2lkID09IDEzMDAgKSB7XG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICd2YWxpZGF0ZV9taW5fdGltZV91bml0JyApO1xuXHRcdFx0dGhpcy5hdHRhY2hFbGVtZW50KCAndmFsaWRhdGVfbWF4X3RpbWVfdW5pdCcgKTtcblx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PSAyMTAwICkge1xuXHRcdFx0JCggJyN0YWJfY3VzdG9tX2ZpZWxkX2NvbnRlbnRfZGl2ICNkcm9wZG93bi1lZGl0b3InKS5zaG93KCk7XG5cdFx0fSBlbHNlIGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgPT0gMjExMCApIHtcblx0XHRcdCQoICcjdGFiX2N1c3RvbV9maWVsZF9jb250ZW50X2RpdiAjZHJvcGRvd24tZWRpdG9yJykuc2hvdygpXG5cdFx0XHR0aGlzLmF0dGFjaEVsZW1lbnQoICd2YWxpZGF0ZV9tdWx0aV9zZWxlY3RfbWluX2Ftb3VudCcgKTtcblx0XHRcdHRoaXMuYXR0YWNoRWxlbWVudCggJ3ZhbGlkYXRlX211bHRpX3NlbGVjdF9tYXhfYW1vdW50JyApO1xuXHRcdH1cblxuXHRcdHRoaXMuY2hhbmdlRGVmYXVsdFZhbHVlRm9ybUl0ZW1UeXBlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCwgc2V0X2RlZmF1bHQgKTtcblx0XHR0aGlzLmVkaXRGaWVsZFJlc2l6ZSgpO1xuXHR9XG5cblx0b25QYXJlbnRUYWJsZUNoYW5nZSgpIHtcblx0XHR0aGlzLnNldFB1bmNoRmllbGRUeXBlcygpO1xuXHR9XG5cblx0b25TZWxlY3RWYWx1ZUNoYW5nZShlbGVtZW50LCB2YWx1ZSkge1xuXHRcdGVsZW1lbnQuaWQgPSB2YWx1ZTtcblx0fVxuXG5cdGNoYW5nZURlZmF1bHRWYWx1ZUZvcm1JdGVtVHlwZSggbmV3X3R5cGVfaWQsIHNldF9kZWZhdWx0ICkge1xuXHRcdGxldCB0YXJnZXRfY29sdW1uID0gdGhpcy5lZGl0X3ZpZXdfdGFiLmZpbmQoICcjdGFiX2N1c3RvbV9maWVsZCAuc2Vjb25kLWNvbHVtbicgKTtcblxuXHRcdGxldCBmb3JtX2FycmF5ID0gdGhpcy5nZXRDdXN0b21GaWVsZEZvcm1JbnB1dEJ5VHlwZSggbmV3X3R5cGVfaWQsICdkZWZhdWx0X3ZhbHVlJywgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1ldGFfZGF0YSApO1xuXHRcdGxldCBmb3JtX2l0ZW1faW5wdXQgPSBmb3JtX2FycmF5WzBdO1xuXHRcdGxldCB3aWRnZXRfY29udGFpbmVyID0gZm9ybV9hcnJheVsxXTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5hdHRyKCAnaWQnLCAnY3VzdG9tLWZpZWxkLWRlZmF1bHQtdmFsdWUtbmV3JyApO1xuXHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snZGVmYXVsdF92YWx1ZSddID0gZm9ybV9pdGVtX2lucHV0O1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnRGVmYXVsdCBWYWx1ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YXJnZXRfY29sdW1uLCAnJywgd2lkZ2V0X2NvbnRhaW5lciApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5jc3MoICdvcGFjaXR5JywgMSApO1xuXG5cdFx0bGV0IG9sZF9pbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcjY3VzdG9tLWZpZWxkLWRlZmF1bHQtdmFsdWUnICk7XG5cdFx0bGV0IG5ld19pbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcjY3VzdG9tLWZpZWxkLWRlZmF1bHQtdmFsdWUtbmV3JyApO1xuXG5cdFx0Ly9Td2FwIHRoZSBvbGQgZGVmYXVsdCB2YWx1ZSBpbnB1dCB3aXRoIHRoZSBuZXcgb25lLCB0aGVuIGRlbGV0ZSB0aGUgb2xkIG9uZS5cblx0XHRsZXQgdGVtcF9ub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXHRcdG9sZF9pbnB1dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggdGVtcF9ub2RlLCBvbGRfaW5wdXQgKTtcblx0XHRuZXdfaW5wdXQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIG9sZF9pbnB1dCwgbmV3X2lucHV0ICk7XG5cdFx0dGVtcF9ub2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBuZXdfaW5wdXQsIHRlbXBfbm9kZSApO1xuXHRcdHRlbXBfbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0ZW1wX25vZGUgKTtcblx0XHRvbGRfaW5wdXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnJlbW92ZSgpO1xuXG5cdFx0Ly9TZXQgSUQgb2YgdGhlIG5ldyBkZWZhdWx0IHZhbHVlIGlucHV0IHRvIHRoZSBvbGQgb25lLlxuXHRcdG5ld19pbnB1dC5pZCA9ICdjdXN0b20tZmllbGQtZGVmYXVsdC12YWx1ZSc7XG5cblx0XHRpZiAoIHNldF9kZWZhdWx0ICkge1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZGVmYXVsdF92YWx1ZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZGVmYXVsdF92YWx1ZSA9ICcnO1xuXHRcdH1cblx0fVxuXG5cdGhpZGVWYWxpZGF0aW9uRmllbGRzKCkge1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3ZhbGlkYXRlX21pbl9sZW5ndGgnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAndmFsaWRhdGVfbWF4X2xlbmd0aCcgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICd2YWxpZGF0ZV9taW5fYW1vdW50JyApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3ZhbGlkYXRlX21heF9hbW91bnQnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAndmFsaWRhdGVfZGVjaW1hbF9wbGFjZXMnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAndmFsaWRhdGVfbWluX2RhdGUnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAndmFsaWRhdGVfbWF4X2RhdGUnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAndmFsaWRhdGVfbWluX3RpbWVfdW5pdCcgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICd2YWxpZGF0ZV9tYXhfdGltZV91bml0JyApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3ZhbGlkYXRlX21pbl90aW1lJyApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3ZhbGlkYXRlX21heF90aW1lJyApO1xuXHRcdHRoaXMuZGV0YWNoRWxlbWVudCggJ3ZhbGlkYXRlX21pbl9kYXRldGltZScgKTtcblx0XHR0aGlzLmRldGFjaEVsZW1lbnQoICd2YWxpZGF0ZV9tYXhfZGF0ZXRpbWUnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAndmFsaWRhdGVfbXVsdGlfc2VsZWN0X21pbl9hbW91bnQnICk7XG5cdFx0dGhpcy5kZXRhY2hFbGVtZW50KCAndmFsaWRhdGVfbXVsdGlfc2VsZWN0X21heF9hbW91bnQnICk7XG5cblx0XHQkKCAnI3RhYl9jdXN0b21fZmllbGRfY29udGVudF9kaXYgI2Ryb3Bkb3duLWVkaXRvcicpLmhpZGUoKVxuXHR9XG5cblx0Y3JlYXRlTWV0YURhdGEoIHR5cGVfaWQgKSB7XG5cblx0XHR0eXBlX2lkID0gcGFyc2VJbnQoIHR5cGVfaWQgKTsgLy9Td2l0Y2ggaXMgc3RyaWN0IG9uIHR5cGUsIHNvIHdlIG5lZWQgdG8gcGFyc2VJbnQoKVxuXG5cdFx0c3dpdGNoICggdHlwZV9pZCApIHtcblx0XHRcdGNhc2UgMTAwOiAvL1RleHRcblx0XHRcdGNhc2UgMTEwOiAvL1RleHRhcmVhXG5cdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5tZXRhX2RhdGEudmFsaWRhdGlvbiA9IHtcblx0XHRcdFx0XHQndmFsaWRhdGVfbWluX2xlbmd0aCc6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC52YWxpZGF0ZV9taW5fbGVuZ3RoLFxuXHRcdFx0XHRcdCd2YWxpZGF0ZV9tYXhfbGVuZ3RoJzogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnZhbGlkYXRlX21heF9sZW5ndGgsXG5cdFx0XHRcdH07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSA0MDA6IC8vSW50ZWdlclxuXHRcdFx0Y2FzZSA0MjA6IC8vQ3VycmVuY3lcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1ldGFfZGF0YS52YWxpZGF0aW9uID0ge1xuXHRcdFx0XHRcdCd2YWxpZGF0ZV9taW5fYW1vdW50JzogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnZhbGlkYXRlX21pbl9hbW91bnQsXG5cdFx0XHRcdFx0J3ZhbGlkYXRlX21heF9hbW91bnQnOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudmFsaWRhdGVfbWF4X2Ftb3VudCxcblx0XHRcdFx0fTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDQxMDogLy9EZWNpbWFsXG5cdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5tZXRhX2RhdGEudmFsaWRhdGlvbiA9IHtcblx0XHRcdFx0XHQndmFsaWRhdGVfbWluX2Ftb3VudCc6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC52YWxpZGF0ZV9taW5fYW1vdW50LFxuXHRcdFx0XHRcdCd2YWxpZGF0ZV9tYXhfYW1vdW50JzogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnZhbGlkYXRlX21heF9hbW91bnQsXG5cdFx0XHRcdFx0J3ZhbGlkYXRlX2RlY2ltYWxfcGxhY2VzJzogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnZhbGlkYXRlX2RlY2ltYWxfcGxhY2VzLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMTAwMDogLy9EYXRlXG5cdFx0XHRjYXNlIDEwMTA6IC8vRGF0ZSByYW5nZVxuXHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQubWV0YV9kYXRhLnZhbGlkYXRpb24gPSB7XG5cdFx0XHRcdFx0J3ZhbGlkYXRlX21pbl9kYXRlJzogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnZhbGlkYXRlX21pbl9kYXRlLFxuXHRcdFx0XHRcdCd2YWxpZGF0ZV9tYXhfZGF0ZSc6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC52YWxpZGF0ZV9tYXhfZGF0ZSxcblx0XHRcdFx0fTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDExMDA6IC8vVGltZVxuXHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQubWV0YV9kYXRhLnZhbGlkYXRpb24gPSB7XG5cdFx0XHRcdFx0J3ZhbGlkYXRlX21pbl90aW1lJzogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnZhbGlkYXRlX21pbl90aW1lLFxuXHRcdFx0XHRcdCd2YWxpZGF0ZV9tYXhfdGltZSc6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC52YWxpZGF0ZV9tYXhfdGltZSxcblx0XHRcdFx0fTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDEyMDA6IC8vRGF0ZXRpa2Vcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1ldGFfZGF0YS52YWxpZGF0aW9uID0ge1xuXHRcdFx0XHRcdCd2YWxpZGF0ZV9taW5fZGF0ZXRpbWUnOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudmFsaWRhdGVfbWluX2RhdGV0aW1lLFxuXHRcdFx0XHRcdCd2YWxpZGF0ZV9tYXhfZGF0ZXRpbWUnOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudmFsaWRhdGVfbWF4X2RhdGV0aW1lLFxuXHRcdFx0XHR9O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMTMwMDogLy9UaW1lIFVuaXRcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1ldGFfZGF0YS52YWxpZGF0aW9uID0ge1xuXHRcdFx0XHRcdCd2YWxpZGF0ZV9taW5fdGltZV91bml0JzogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnZhbGlkYXRlX21pbl90aW1lX3VuaXQsXG5cdFx0XHRcdFx0J3ZhbGlkYXRlX21heF90aW1lX3VuaXQnOiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudmFsaWRhdGVfbWF4X3RpbWVfdW5pdCxcblx0XHRcdFx0fTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDIxMDA6IC8vU2luZ2xlLXNlbGVjdFxuXHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQubWV0YV9kYXRhLnZhbGlkYXRpb24gPSB7XG5cdFx0XHRcdFx0J211bHRpX3NlbGVjdF9pdGVtcyc6IHRoaXMuZWRpdG9yLmdldFZhbHVlKCksXG5cdFx0XHRcdH07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAyMTEwOiAvL011bHRpLXNlbGVjdFxuXHRcdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQubWV0YV9kYXRhLnZhbGlkYXRpb24gPSB7XG5cdFx0XHRcdFx0J3ZhbGlkYXRlX211bHRpX3NlbGVjdF9taW5fYW1vdW50JzogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnZhbGlkYXRlX211bHRpX3NlbGVjdF9taW5fYW1vdW50LFxuXHRcdFx0XHRcdCd2YWxpZGF0ZV9tdWx0aV9zZWxlY3RfbWF4X2Ftb3VudCc6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC52YWxpZGF0ZV9tdWx0aV9zZWxlY3RfbWF4X2Ftb3VudCxcblx0XHRcdFx0XHQnbXVsdGlfc2VsZWN0X2l0ZW1zJzogdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKS5maWx0ZXIoICggaXRlbSApID0+IGl0ZW0udmFsdWUgIT09ICcnIHx8IGl0ZW0ubGFiZWwgIT09ICcnICksXG5cdFx0XHRcdH07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1ldGFfZGF0YS52YWxpZGF0aW9uID0ge307IC8vQ2xlYXIgYWxsIHZhbGlkYXRpb24gZmllbGRzXG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdHVwZGF0ZUN1c3RvbUZpZWxkRHJvcGRvd25zKCkge1xuXHRcdGlmICggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgPT0gMjEwMCB8fCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9PSAyMTEwICkge1xuXHRcdFx0bGV0IHNvdXJjZV9kYXRhID0gdGhpcy5lZGl0b3IuZ2V0VmFsdWUoKTtcblx0XHRcdGxldCBkZWZhdWx0X2RhdGEgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuZGVmYXVsdF92YWx1ZTtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snZGVmYXVsdF92YWx1ZSddLnNldFNvdXJjZURhdGEoIHNvdXJjZV9kYXRhICk7XG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNvdXJjZV9kYXRhICkgJiYgc291cmNlX2RhdGEuc29tZSggaXRlbSA9PiBpdGVtLmlkID09IGRlZmF1bHRfZGF0YSApICkge1xuXHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2RlZmF1bHRfdmFsdWUnXS5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmRlZmF1bHRfdmFsdWUgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdC8vSWYgbW9yZSB0aGFuIG9uZSBpdGVtIGlzIHNlbGVjdGVkLCB1bnNlbGVjdCB0aGUgcmVtb3ZlZCBpdGVtIG9ubHkuIE90aGVyd2lzZSBzZXQgZHJvcGRvd24gdG8gbnVsbCBmb3Igbm8gaXRlbSBzZWxlY3RlZC5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBkZWZhdWx0X2RhdGEgKSAmJiBkZWZhdWx0X2RhdGEubGVuZ3RoID4gMSApIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2RlZmF1bHRfdmFsdWUnXS5zZXRWYWx1ZSggZGVmYXVsdF9kYXRhLmZpbHRlciggZGVmYXVsdF9pdGVtID0+IHNvdXJjZV9kYXRhLnNvbWUoIHNvdXJjZV9pdGVtID0+IHNvdXJjZV9pdGVtLmlkID09IGRlZmF1bHRfaXRlbSApICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2RlZmF1bHRfdmFsdWUnXS5zZXRWYWx1ZSggbnVsbCApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0c2V0Q3VycmVudEVkaXRSZWNvcmREYXRhKCkge1xuXHRcdHRoaXMucGFyc2VNZXRhRGF0YVRvQ3VycmVudEVkaXRSZWNvcmQoKTtcblx0XHRzdXBlci5zZXRDdXJyZW50RWRpdFJlY29yZERhdGEoKTtcblxuXHRcdGlmICggdGhpcy5pc19hZGQgPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ3R5cGVfaWQnXS5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydwYXJlbnRfdGFibGUnXS5zZXRFbmFibGVkKCBmYWxzZSApO1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0UHVuY2hGaWVsZFR5cGVzKCk7XG5cdH1cblxuXHRzZXRQdW5jaEZpZWxkVHlwZXMoKSB7XG5cblx0XHR2YXIgcHVuY2hfYWxsb3dlZF90eXBlc19hcGlfcGFyYW1zID0geyAncGFyZW50X3RhYmxlJzogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnBhcmVudF90YWJsZSB9O1xuXHRcdHZhciBwdW5jaF9hbGxvd2VkX3R5cGVzID0gdGhpcy5hcGkuZ2V0T3B0aW9ucyggJ3R5cGVfaWQnLCBwdW5jaF9hbGxvd2VkX3R5cGVzX2FwaV9wYXJhbXMsIHsgYXN5bmM6IGZhbHNlIH0gKS5nZXRSZXN1bHQoKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy50eXBlX2lkLnNldFNvdXJjZURhdGEoIHB1bmNoX2FsbG93ZWRfdHlwZXMgKTtcblxuXHRcdGlmICggcHVuY2hfYWxsb3dlZF90eXBlc1t0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZF0gKSB7XG5cdFx0XHQvL0NoYW5naW5nIHNvdXJjZSBkYXRhIHZpc3VhbGx5IGNoYW5nZXMgdGhlIHNlbGVjdGVkIGl0ZW0sIHNvIHdlIG5lZWQgdG8gc2V0IGl0IGJhY2sgdG8gdGhlIGN1cnJlbnQgdmFsdWUuXG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWMudHlwZV9pZC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLnR5cGVfaWQgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly9TZWxlY3RlZCB0eXBlIGlzIG5vdCBhbGxvd2VkIGZvciB0aGlzIHBhcmVudCB0YWJsZS4gU2V0IHRvIGZpcnN0IGFsbG93ZWQgdHlwZS5cblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpYy50eXBlX2lkLnNldFZhbHVlKCBPYmplY3Qua2V5cyggcHVuY2hfYWxsb3dlZF90eXBlcyApWzBdICk7XG5cdFx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQudHlwZV9pZCA9IE9iamVjdC5rZXlzKCBwdW5jaF9hbGxvd2VkX3R5cGVzIClbMF07XG5cdFx0fVxuXHR9XG5cblx0cGFyc2VNZXRhRGF0YVRvQ3VycmVudEVkaXRSZWNvcmQoKSB7XG5cdFx0Zm9yICggdmFyIHJ1bGUgaW4gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1ldGFfZGF0YS52YWxpZGF0aW9uICkge1xuXHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkW3J1bGVdID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLm1ldGFfZGF0YS52YWxpZGF0aW9uW3J1bGVdO1xuXHRcdH1cblx0fVxuXG5cdGJ1aWxkU2VhcmNoRmllbGRzKCkge1xuXG5cdFx0c3VwZXIuYnVpbGRTZWFyY2hGaWVsZHMoKTtcblx0XHR0aGlzLnNlYXJjaF9maWVsZHMgPSBbXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnTmFtZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAxLFxuXHRcdFx0XHRmaWVsZDogJ25hbWUnLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUXG5cdFx0XHR9ICksXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnU3RhdHVzJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDEsXG5cdFx0XHRcdGZpZWxkOiAnc3RhdHVzX2lkJyxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX29wdGlvbl9jb2x1bW4nLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRmllbGQgVHlwZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ3R5cGVfaWQnLFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfb3B0aW9uX2NvbHVtbicsXG5cdFx0XHRcdGZvcm1faXRlbV90eXBlOiBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1hcblx0XHRcdH0gKSxcblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdPYmplY3QgVHlwZScgKSxcblx0XHRcdFx0aW5fY29sdW1uOiAyLFxuXHRcdFx0XHRmaWVsZDogJ3BhcmVudF90YWJsZScsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9vcHRpb25fY29sdW1uJyxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXHRcdF07XG5cdH1cblxuXHRzZXREZWZhdWx0TWVudUFkZEljb24oIGNvbnRleHRfYnRuLCBncmlkX3NlbGVjdGVkX2xlbmd0aCwgcElkICkge1xuXHRcdC8vQ29tbXVuaXR5IGVkaXRpb24gY2Fubm90IGFkZCBjdXN0b20gZmllbGRzLlxuXHRcdGlmICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPT0gMTAgKSB7XG5cdFx0XHRDb250ZXh0TWVudU1hbmFnZXIuaGlkZU1lbnVJdGVtKCB0aGlzLmRldGVybWluZUNvbnRleHRNZW51TW91bnRBdHRyaWJ1dGVzKCkuaWQsIGNvbnRleHRfYnRuLmlkLCBmYWxzZSApXG5cdFx0fSBlbHNlIHtcblx0XHRcdHN1cGVyLnNldERlZmF1bHRNZW51QWRkSWNvbiggY29udGV4dF9idG4sIGdyaWRfc2VsZWN0ZWRfbGVuZ3RoLCBwSWQgKTtcblx0XHR9XG5cdH1cblxuXHRnZXRDdXN0b21GaWVsZFRhYkh0bWwoKSB7XG5cdFx0cmV0dXJuIGA8ZGl2IGlkPVwidGFiX2N1c3RvbV9maWVsZFwiIGNsYXNzPVwiZWRpdC12aWV3LXRhYi1vdXRzaWRlXCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImVkaXQtdmlldy10YWJcIiBpZD1cInRhYl9jdXN0b21fZmllbGRfY29udGVudF9kaXZcIj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJmaXJzdC1jb2x1bW5cIj48L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJzZWNvbmQtY29sdW1uXCI+PC9kaXY+XG5cdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaW5zaWRlLWVkaXRvci1kaXYgZnVsbC13aWR0aC1jb2x1bW5cIiBpZD1cImRyb3Bkb3duLWVkaXRvclwiPlxuXHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDwvZGl2PmA7XG5cdH1cblxuXHRjb3B5QXNOZXdSZXNldElkcyggZGF0YSApIHtcblx0XHRpZiAoIHRoaXMuZWRpdF92aWV3X3VpX2RpY1sndHlwZV9pZCddICYmIHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncGFyZW50X3RhYmxlJ10gKSB7XG5cdFx0XHQvL0lmIGNvcHlpbmcgYXMgbmV3IHdoaWxlIG9uIGEgcmVjb3JkIGluc3RlYWQgb2YgbGlzdCB2aWV3LCB0aGVzZSBtYXkgYWxyZWFkeSBiZSBkaXNhYmxlZC5cblx0XHRcdC8vQ29weSBhcyBuZXcgZG9lcyBub3QgYnVpbGQgYSBuZXcgZWRpdCB2aWV3IGFuZCBpbnN0ZWFkIHJlc2V0cyB0aGUgY3VycmVudF9lZGl0X3JlY29yZC5pZC5cblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1sndHlwZV9pZCddLnNldEVuYWJsZWQoIHRydWUgKTtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1sncGFyZW50X3RhYmxlJ10uc2V0RW5hYmxlZCggdHJ1ZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gc3VwZXIuY29weUFzTmV3UmVzZXRJZHMoIGRhdGEgKTtcblx0fVxuXG5cdG9uU2F2ZURvbmUoIHJlc3VsdCApIHtcblx0XHQvL0NsZWFyaW5nIGNhY2hlIHRvIHByZXZlbnQgaXNzdWVzIHdpdGggcmVwb3J0IGRpc3BsYXkgY29sdW1ucyBzaG93aW5nIG91dGRhdGVkIGNhY2hlZCByZXN1bHRzLlxuXHRcdEdsb2JhbC5jbGVhckNhY2hlKCAnZ2V0T3B0aW9uc19jb2x1bW5zJyApO1xuXHRcdEdsb2JhbC5jbGVhckNhY2hlKCAnZ2V0T3B0aW9uc19kZWJpdF9jcmVkaXRfdmFyaWFibGVzJyApOyAvL1BheVN0dWJFbnRyeUFjY291bnQgdmFyaWFibGUgc2VsZWN0b3Jcblx0XHRHbG9iYWwuY2xlYXJDYWNoZSggJ2dldE9wdGlvbnNfZm9ybXVsYV9jb2x1bW5zJyApOyAvL0N1c3RvbSBjb2x1bW5zIHZhcmlhYmxlIHNlbGVjdG9yXG5cdFx0c3VwZXIub25TYXZlRG9uZSggcmVzdWx0ICk7XG5cdH1cblxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///7945\n")}}]);