#include-once Const $HELP_MESSAGE = "Server Mode: Opens a socket and waits for a client connection." & @CRLF & _ "-- SERVER MODE USAGE --" & @CRLF & _ " * Select an adaptor" & @CRLF & _ " * Select a port" & @CRLF & _ " * Start the server and wait for traffic" & @CRLF & _ "Data sent from a client will display in the 'Inbound Data' field" & @CRLF & _ "Once a connection is established, data in the 'Outbound Data' box can be sent as a reply" & @CRLF & @CRLF & _ "Client Mode: Connects to an open socket." & @CRLF & _ " -- CLIENT MODE USAGE --" & @CRLF & _ " * Select a destination - either an IP address or a host name" & @CRLF & _ " * Select a destination port" & @CRLF & _ "Once a connection is established, anything in the 'Outbound Data' box can be sent to the remote server." & @CRLF & _ "The reply (if any) from the server will be displayed in the 'Inbound Data' field." Global $listening = FALSE Global $connection = -1 Global $socket = -1 Global $port = -1 ; Window constants Const $MINIMUM_WIDTH = 800 Const $MINIMUM_HEIGHT = 400 Const $INITIAL_WIDTH = $MINIMUM_WIDTH Const $INITIAL_HEIGHT = $MINIMUM_HEIGHT Const $TITLE = "Traffic Analyzer 2.0" Const $WINDOW_STYLE = BitOr( $WS_POPUP, $WS_MAXIMIZEBOX, $WS_CAPTION, $WS_SYSMENU, $WS_MINIMIZEBOX, $WS_THICKFRAME ) Const $TRUE_CENTER = Int( $MINIMUM_WIDTH / 2 ) Const $LP_CENTER = Int( $TRUE_CENTER / 2 ) ; Left Pane center Const $RP_CENTER = Int( $TRUE_CENTER / 2 ) + $TRUE_CENTER ; Right Pane center Const $ROW_HEIGHT = 30 Const $FIELD_WIDTH = 160 Const $LABEL_WIDTH = 45 Const $BUTTON_WIDTH = 45 Const $RADIO_WIDTH = 55 Const $CELL_HEIGHT = 20 Const $MARGIN = 10 Const $WIDGET_ROW3 = $MINIMUM_HEIGHT - $MARGIN - $CELL_HEIGHT Const $WIDGET_ROW2 = $WIDGET_ROW3 - $ROW_HEIGHT Const $WIDGET_ROW1 = $WIDGET_ROW2 - $ROW_HEIGHT ; Register a window resize manager GUIRegisterMsg( $WM_GETMINMAXINFO, "ResizeHandler" ) ; The window Dim $window = GUICreate( $title, $INITIAL_WIDTH, $INITIAL_HEIGHT, -1, -1, $WINDOW_STYLE ) Dim $x, $left, $right, $center, $numDD, $ddOverall, $numBtns, $btnOverall, $radioStart ; LEFT PANE - OUTBOUND STUFF $left = 0 $right = $TRUE_CENTER $center = $LP_CENTER - 60 $numDD = 2 $ddOverall = ( $numDD * $FIELD_WIDTH ) + ( ( $numDD -1 ) * $MARGIN ) $numBtns = 5 $btnOverall = ( $numBtns * $BUTTON_WIDTH ) + ( ( $numBtns - 1 ) * $MARGIN ) If $ddOverall > $btnOverall Then $radioStart = $center + Int( $ddOverall / 2 ) + 30 Else $radioStart = $center + Int( $btnOverall / 2 ) + 30 EndIf ; Outbound Edit Field Dim $obLABEL = GUICtrlCreateLabel( "OUTBOUND DATA", 0, Int($MARGIN / 2), $right - $left, $CELL_HEIGHT, $SS_CENTER ) $x = $center - Int( $ddOverall / 2 ) Dim $obEditFIELD = GUICtrlCreateEdit( "", $MARGIN, 2 * $MARGIN, ($right - $left) - ( 2 * $MARGIN ), $WIDGET_ROW1 - $ROW_HEIGHT ) Const $obEditHANDLE = ControlGetHandle($TITLE, "", $obEditFIELD) GUICtrlSetFont ( $obEditFIELD, 8.5, 400, 0, "Courier New" ) ; Outbound widget row 1 $x = $MARGIN Dim $obTargetLABEL = GUICtrlCreateLabel( "Target:", $x, $WIDGET_ROW1, $LABEL_WIDTH, $CELL_HEIGHT, $SS_RIGHT ) $x += $MARGIN + $LABEL_WIDTH Dim $obTargetFIELD = GUICtrlCreateInput( "", $x, $WIDGET_ROW1 - 2, $FIELD_WIDTH + 10, $CELL_HEIGHT ) $x += $FIELD_WIDTH + 10 Dim $obPortLABEL = GUICtrlCreateLabel( "Port:", $x, $WIDGET_ROW1, $LABEL_WIDTH, $CELL_HEIGHT, $SS_RIGHT) $x += $MARGIN + $LABEL_WIDTH Dim $obPortFIELD = GUICtrlCreateInput( "", $x, $WIDGET_ROW1 - 2, Int($FIELD_WIDTH / 4), $CELL_HEIGHT, $ES_NUMBER ) GUICtrlSetState( $obTargetFIELD, $GUI_DISABLE ) GUICtrlSetState( $obPortFIELD, $GUI_DISABLE ) ; Outbound widget row 2 $x = $MARGIN ;~ $x = ( 2 * $MARGIN ) + $LABEL_WIDTH Dim $obConDisconBTN = GUICtrlCreateButton( "Con", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) GUICtrlSetState( $obConDisconBTN, $GUI_DISABLE ) $x += $BUTTON_WIDTH + $MARGIN Dim $obSendBTN = GUICtrlCreateButton( "Send", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) GUICtrlSetState( $obSendBTN, $GUI_DISABLE ) $x += $BUTTON_WIDTH + $MARGIN Dim $obClearBTN = GUICtrlCreateButton( "Clear", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $obSaveBTN = GUICtrlCreateButton( "Save", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $obCopyBTN = GUICtrlCreateButton( "Copy", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $obCrlfBTN = GUICtrlCreateButton( "->CRLF", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) ; Outbound widget row 3 $x = $MARGIN ;~ $x = ( 2 * $MARGIN ) + $LABEL_WIDTH Dim $obTextBTN = GUICtrlCreateButton( "->Text", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $obBase64BTN = GUICtrlCreateButton( "->B64", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $obHexBTN = GUICtrlCreateButton( "->Hex", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $obLoadBTN = GUICtrlCreateButton( "Load", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $obPasteBTN = GUICtrlCreateButton( "Paste", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $obSizeBTN = GUICtrlCreateButton( "Size", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) ; Widget characteristics and data GUICtrlSetResizing( $obEditFIELD, $GUI_DOCKLEFT + $GUI_DOCKHCENTER + $GUI_DOCKTOP + $GUI_DOCKBOTTOM ) GUICtrlSetResizing( $obLABEL, $GUI_DOCKSIZE + $GUI_DOCKTOP + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obConDisconBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obSendBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obClearBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obSaveBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obLoadBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obCopyBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obPasteBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obTextBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obBase64BTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obHexBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obCrlfBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obSizeBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obTargetFIELD, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obPortFIELD, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obTargetLABEL, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) GUICtrlSetResizing( $obPortLABEL, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKLEFT ) ; Widget tips GUICtrlSetTip( $obConDisconBTN, "Establish a connection to the target address" ) GUICtrlSetTip( $obSendBTN, "Send data to the target address" ) GUICtrlSetTip( $obClearBTN, "Clear the contents of the send field" ) GUICtrlSetTip( $obSaveBTN, "Save the contents of the send field" ) GUICtrlSetTip( $obLoadBTN, "Load a response from a file into the outbound field" ) GUICtrlSetTip( $obTextBTN, "Convert the selected content to text (Base64 versus Hex is inferred)" ) GUICtrlSetTip( $obBase64BTN, "Convert the selected content to Base64 (content is assumed to be text type)" ) GUICtrlSetTip( $obHexBTN, "Convert the selected content to Hex (content is assumed to be text type)" ) GUICtrlSetTip( $obCrlfBTN, "Convert the selected content to CRLF line endings" ) GUICtrlSetTip( $obSizeBTN, "Get the size of the selected content" ) GUICtrlSetTip( $obCopyBTN, "Copy the selected text to the clipboard") GUICtrlSetTip( $obPasteBTN, "Paste text into the field at the current insertion point" ) ; Event Handlers GuiCtrlSetOnEvent( $obConDisconBTN, "ConHandler" ) GuiCtrlSetOnEvent( $obSendBTN, "SendHandler" ) GUICtrlSetOnEvent( $obClearBTN, "ClearHandler" ) GuiCtrlSetOnEvent( $obSaveBTN, "SaveHandler" ) GUICtrlSetOnEvent( $obLoadBTN, "LoadHandler" ) GUICtrlSetOnEvent( $obTextBTN, "CvtTextHandler" ) GUICtrlSetOnEvent( $obBase64BTN, "CvtBase64Handler" ) GUICtrlSetOnEvent( $obHexBTN, "CvtHexHandler" ) GUICtrlSetOnEvent( $obCrlfBTN, "CvtCrLfHandler" ) GUICtrlSetOnEvent( $obSizeBTN, "SizeHandler" ) GUICtrlSetOnEvent( $obCopyBTN, "CopyHandler" ) GUICtrlSetOnEvent( $obPasteBTN, "PasteHandler" ) ; Middle ; Mode selector $x = $TRUE_CENTER - Int($RADIO_WIDTH / 2) - 10 Dim $modeType = GUICtrlCreateGroup( "Mode", $x - 10, $WIDGET_ROW1, $RADIO_WIDTH + 20, ( 2 * $ROW_HEIGHT ) + $CELL_HEIGHT ) Dim $modeServerRADIO = GUICtrlCreateRadio( "Server", $x, $WIDGET_ROW2 - $MARGIN, $RADIO_WIDTH ) GuiCtrlSetState( -1, $GUI_CHECKED ) Dim $modeClientRADIO = GUICtrlCreateRadio( "Client", $x, $WIDGET_ROW3 - $MARGIN, $RADIO_WIDTH ) GUICtrlCreateGroup( "",-99,-99,1,1 ) ; Server/client mode characteristics GUICtrlSetResizing( $modeType, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKHCENTER ) GUICtrlSetResizing( $modeServerRADIO, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKHCENTER ) GUICtrlSetResizing( $modeClientRADIO, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKHCENTER ) ; Server/client mode tips GUICtrlSetTip( $modeServerRADIO, "Opens a port and waits for data to arrive before enabling communications" ) GUICtrlSetTip( $modeClientRADIO, "Connects to the target machine and sends the data" ) GuiCtrlSetOnEvent( $modeServerRADIO, "EnableServer" ) GuiCtrlSetOnEvent( $modeClientRADIO, "EnableClient" ) ; RIGHT PANE - INBOUND STUFF ; Starting points for x and y coordinates $left = $TRUE_CENTER $right = $MINIMUM_WIDTH $center = $RP_CENTER - 40 $numDD = 2 $ddOverall = ( $numDD * $FIELD_WIDTH ) + ( ( $numDD -1 ) * $MARGIN ) $numBtns = 4 $btnOverall = ( $numBtns * $BUTTON_WIDTH ) + ( ( $numBtns - 1 ) * $MARGIN ) If $ddOverall > $btnOverall Then $radioStart = $center + Int( $ddOverall / 2 ) + 30 Else $radioStart = $center + Int( $btnOverall / 2 ) + 30 EndIf ; Inbound Results Field Dim $inLABEL = GUICtrlCreateLabel( "INBOUND DATA", $TRUE_CENTER, Int( $MARGIN / 2 ), $right - $left, $CELL_HEIGHT, $SS_CENTER ) $x = $center - Int( $ddOverall / 2 ) Dim $ibResultsFIELD = GUICtrlCreateEdit( "", $left + $MARGIN, 2 * $MARGIN, ($right - $left) - ( 3 * $MARGIN ), $WIDGET_ROW1 - $ROW_HEIGHT ) Const $ibResultHANDLE = ControlGetHandle($TITLE, "", $ibResultsFIELD) GUICtrlSetFont ( $ibResultsFIELD, 8.5, 400, 0, "Courier New" ) ; Inbound widget row 1 $x = $TRUE_CENTER + Int($RADIO_WIDTH / 2) + 10 Dim $ibIpLABEL = GUICtrlCreateLabel( "Adaptor:", $x, $WIDGET_ROW1, $LABEL_WIDTH, $CELL_HEIGHT, $SS_RIGHT ) $x += $MARGIN + $LABEL_WIDTH Dim $ibIpCOMBO = GUICtrlCreateCombo( @IPAddress1, $x, $WIDGET_ROW1 - 2, $FIELD_WIDTH, 200 ) $x += $MARGIN + $FIELD_WIDTH Dim $ibPortLABEL = GUICtrlCreateLabel( "Port:", $x, $WIDGET_ROW1, $LABEL_WIDTH, $CELL_HEIGHT, $SS_RIGHT ) $x += $MARGIN + $LABEL_WIDTH Dim $ibPortFIELD = GUICtrlCreateInput( "", $x, $WIDGET_ROW1 - 2, Int($FIELD_WIDTH / 4), $CELL_HEIGHT, $ES_NUMBER ) ; Inbound widget row 2 $x = $TRUE_CENTER + Int($RADIO_WIDTH / 2) + 10 + $MARGIN + $LABEL_WIDTH Dim $ibStartStopBTN = GUICtrlCreateButton( "Start", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) GUICtrlSetState( $ibStartStopBTN, $GUI_DISABLE ) $x += $BUTTON_WIDTH + $MARGIN Dim $ibClearBTN = GUICtrlCreateButton( "Clear", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $ibSaveBTN = GUICtrlCreateButton( "Save", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $ibCopyBTN = GUICtrlCreateButton( "Copy", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $ibCrlfBTN = GUICtrlCreateButton( "->CRLF", $x, $WIDGET_ROW2, $BUTTON_WIDTH, $CELL_HEIGHT ) ; Inbound widget row 3 $x = $TRUE_CENTER + Int($RADIO_WIDTH / 2) + 10 + $MARGIN + $LABEL_WIDTH Dim $ibTextBTN = GUICtrlCreateButton( "->Text", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $ibBase64BTN = GUICtrlCreateButton( "->B64", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $ibHexBTN = GUICtrlCreateButton( "->Hex", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $ibPasteBTN = GUICtrlCreateButton( "Paste", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN Dim $ibMoveBTN = GUICtrlCreateButton( "<-Move", $x, $WIDGET_ROW3, $BUTTON_WIDTH, $CELL_HEIGHT ) $x += $BUTTON_WIDTH + $MARGIN ; Widget characteristics and data GUICtrlSetData( $ibIpCOMBO, GetAdaptors() ) GUICtrlSetResizing( $inLABEL, $GUI_DOCKSIZE + $GUI_DOCKTOP + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibResultsFIELD, $GUI_DOCKRIGHT + $GUI_DOCKHCENTER + $GUI_DOCKTOP + $GUI_DOCKBOTTOM ) GUICtrlSetResizing( $ibStartStopBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibClearBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibSaveBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibCopyBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibTextBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibBase64BTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibHexBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibPasteBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibMoveBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibCrlfBTN, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibIpCOMBO, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibPortFIELD, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibIpLABEL, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) GUICtrlSetResizing( $ibPortLABEL, $GUI_DOCKSIZE + $GUI_DOCKBOTTOM + $GUI_DOCKRIGHT ) ; Widget tips GUICtrlSetTip( $ibStartStopBTN, "Starts the program listening on the IP Address and Port supplied" ) GUICtrlSetTip( $ibClearBTN, "Clear the contents of the results field" ) GUICtrlSetTip( $ibSaveBTN, "Save the contents of the results field" ) GUICtrlSetTip( $ibTextBTN, "Convert the selected content to text (Base64 versus Hex is inferred)" ) GUICtrlSetTip( $ibBase64BTN, "Convert the selected content to Base64 (content is assumed to be text type)" ) GUICtrlSetTip( $ibHexBTN, "Convert the selected content to Hex (content is assumed to be text type)" ) GUICtrlSetTip( $ibCrlfBTN, "Convert the selected content to CRLF line endings" ) GUICtrlSetTip( $ibCopyBTN, "Copy the selected text to the clipboard") GUICtrlSetTip( $ibPasteBTN, "Paste text into the field at the current insertion point" ) GUICtrlSetTip( $ibMoveBTN, "Moves text in the Inbound editor to the Outbound editor" ) ; Event Handlers GuiCtrlSetOnEvent( $ibStartStopBTN, "IbStartHandler" ) GUICtrlSetOnEvent( $ibClearBTN, "ClearHandler" ) GuiCtrlSetOnEvent( $ibSaveBTN, "SaveHandler" ) GUICtrlSetOnEvent( $ibTextBTN, "CvtTextHandler" ) GUICtrlSetOnEvent( $ibBase64BTN, "CvtBase64Handler" ) GUICtrlSetOnEvent( $ibHexBTN, "CvtHexHandler" ) GUICtrlSetOnEvent( $ibCrlfBTN, "CvtCrLfHandler") GUICtrlSetOnEvent( $ibCopyBTN, "CopyHandler" ) GUICtrlSetOnEvent( $ibPasteBTN, "PasteHandler" ) GUICtrlSetOnEvent( $ibMoveBTN, "MoveHandler" ) Global $FOCUS = 0 Global $OLD_FOCUS = 0 ; Start the window GUISetState() GUISetOnEvent( $GUI_EVENT_CLOSE, "ExitHandler" ) WinMove( $TITLE, "", default, default, $MINIMUM_WIDTH, $MINIMUM_HEIGHT ) GUICtrlSetState( $modeServerRADIO, $GUI_FOCUS ) HotKeySet( "{F1}", "HelpHandler" ) Global Const $BASE64_CHARS = _ "ABCDEFGHIJKLMNOPQRSTUVWXYZ" & _ "abcdefghijklmnopqrstuvwxyz" & _ "0123456789+/" Global Const $BASE64_CHAR_ARRAY = StringSplit($BASE64_CHARS, "", 2) Global Const $BASE64_PADDING[3] = ["", "=", "=="]