Public Class MyParser
    'Enum EParam
    '    Text = 0  '//문자형태의자료
    '    Digit = 1 '//숫자형태의 자료
    '    Func = 2 '//함수형태의 자료
    'End Enum
    'Structure SParam
    '    Dim Type As EParam
    '    Dim Value As String
    'End Structure
    'Structure SCommand
    '    Dim Name As String
    '    Dim ParamList As ArrayList
    '    Dim Unknown As Boolean    '//알려진 함수인지?
    'End Structure
    Dim SrcText As String
    Dim CommandList As ArrayList   '//여기엔 Scommand 가 들어있다.
    Dim ErrMsg As System.Text.StringBuilder
    Public Log As System.Text.StringBuilder

    Public Sub New(ByVal vSrcTest As String)
        'My.Computer.FileSystem.WriteAllText("c:\command.txT", "srctext=" & vSrcTest & vbCrLf, True)

        SrcText = vSrcTest
        Check_error(SrcText)
        If Me.isError Then
            MsgBox(ErrMsg.ToString, MsgBoxStyle.Critical, "오류")
        End If
        Me.Log = New System.Text.StringBuilder("Start MYParser LOg >>" & vbCrLf)
    End Sub
    Public Shadows ReadOnly Property toString() As String
        Get
            If Me.isError = False Then
                Dim Value As Object = ParseCommand(SrcText, True)
                Return Value.ToString
            End If
            Return ""
        End Get
    End Property
    Public Shadows ReadOnly Property GetData() As Object
        Get
            If Me.isError = False Then
                Dim Value As Object = ParseCommand(SrcText, True)
                Return Value
            End If
            Return Nothing
        End Get
    End Property
    ReadOnly Property isError() As Boolean
        Get
            If Me.ErrMsg.ToString <> "" Then
                Return True
            Else
                Return False
            End If
        End Get
    End Property
    Private Sub Check_error(ByVal vSrcText As String)
        ' Return '//임시로 해제

        Dim Lcnt As Short = 0
        Dim Rcnt As Short = 0
        ErrMsg = New System.Text.StringBuilder

        Return '
        For Each EXP As String In vSrcText.Split(";") '//각명령을 ;로 구분되어잇기떄문에 구분됫것들이 각자의 명령이다.
            EXP = EXP.Trim
            Lcnt = MyString.GetInCountChar(EXP, "(")   '//파라미터 시작갯수
            Rcnt = MyString.GetInCountChar(EXP, ")")  '//파라미터 종료갯수
            If Lcnt <> Rcnt Then   '//오류검사
                ErrMsg.AppendLine(EXP & "파라미터 시작기호 ( 와 종료기호 ) 가 일치하지 않습니다")
            End If
            Lcnt = MyString.GetInCountChar(EXP, Chr(34))   '//파라미터 시작갯수
            Rcnt = MyString.GetInCountChar(EXP, Chr(34))  '//파라미터 종료갯수
            If Lcnt <> Rcnt Then   '//오류검사
                ErrMsg.AppendLine(EXP & "문자열묶음기호(" & Chr(34) & ")가 일치하지 않습니다")
            End If
        Next
    End Sub

    Private Function ParseCommand(ByVal vSrcText As String, ByVal isfirst As Boolean, Optional ByVal NEwValue As Object = "") As Object
        '//각명령어를 쪼갠다. 
        '//중첩명령어의 경우에도 쪼갠다.


        'Dim Cmd As String '//명령어
        'Dim Param As String   '//명렁파라미터
        'Dim target As String   '//타겏값
        'Dim Str As String
        'Dim Line As String

        If isfirst Then Me.CommandList = New ArrayList '//처음에만 이것을 초기화한다.

        '//left(format(now,"yyyyMMddHHmmss"),1)
        '//먼저 ( 의 수와 ) 의 수가 맞는지 확인한다.

        'Dim NewValue As Object = ""


        Me.Log.AppendLine("Command Expression : " & vSrcText)
        For Each EXP As String In vSrcText.Split(";") '//각명령을 ;로 구분되어잇기떄문에 구분됫것들이 각자의 명령이다.
            Me.Log.AppendLine("New Line Value is : " & NewValue.ToString)

            EXP = EXP.Trim
            Dim CmdFind As Boolean = False    '//명령어를다 찾앗는가?
            Dim ParamFind As Boolean = False
            Dim NewParam As New System.Text.StringBuilder
            Dim Isfunction As Boolean = False
            Dim IsFunctionEnd As Boolean = False
            Dim InnerFuncCnt As Short = 0
            Dim NewCmd As New System.Text.StringBuilder
            Dim ParamList As New ArrayList
            Dim IsTextInner As Boolean = False

            If EXP <> "" Then  '//명령어가 존재햇을때

                'My.Computer.FileSystem.WriteAllText("c:\command.txT", "expressiong=" & EXP, True)

                If EXP.Substring(0, 1) = Chr(34) Then    '//첫데이터가 " 로시작한다면 이건 그냥 문자열값을의미한다.
                    NewValue = EXP    '//해당문자자체가 값이된다.
                Else
                    '//파라미터란 ()사이의 명령어이며, 콤마(,)로 분리된다
                    '//단 "" 사이의 콤마는 인정하지않는다.

                    For Each C As Char In EXP.ToCharArray
                        If CmdFind = False Then
                            If C = "(" Then
                                CmdFind = True
                            Else
                                NewCmd.Append(C)
                            End If
                        Else   '//명령어를 찾은상태이므로 파라미터를 추가한다. 파람은 , 로 분리되어잇다.
                            Select Case C
                                Case ","
                                    If IsTextInner Then
                                        NewParam.Append(C)
                                    Else
                                        If Isfunction = False Then '//펑션부분이 아니여야한다.                                        
                                            If IsFunctionEnd Then
                                                ParamList.Add(NewParam.ToString)  '//파라미터를 찾았으므로 파람리스트에 추가한다.
                                                '//파라미터중에 # 가 앞에 붙으면 함수로 인정한다.
                                            Else   '//이번것은 펑션이 아니므로 파람리스트에 추가한다.
                                                ParamList.Add(NewParam.ToString)  '//파라미터를 찾았으므로 파람리스트에 추가한다.
                                            End If
                                            NewParam = New System.Text.StringBuilder   '//파라미터부분 초기화
                                            IsFunctionEnd = False
                                            '//이파라미터의 종결을 으미한다.  '//left(format(now,"yyyyMMddHHmmss"),1)
                                        Else
                                            NewParam.Append(C)
                                        End If
                                    End If
                                Case "("
                                    If IsTextInner Then
                                        NewParam.Append(C)
                                    Else
                                        If Isfunction Then   '//함수잇는데 함수가 또잇네?
                                            InnerFuncCnt += 1
                                            NewParam.Append(C)
                                        Else
                                            Isfunction = True '//이파라미터가 또 함수를 가지고있다 ㅠ_ㅠ;
                                            NewParam.Append(C)
                                        End If
                                    End If
                                Case ")"
                                    If IsTextInner Then
                                        NewParam.Append(C)
                                    Else
                                        If Isfunction Then
                                            If InnerFuncCnt > 0 Then '/.내부펑션이 게속잇엇다
                                                InnerFuncCnt -= 1
                                                NewParam.Append(C)
                                            Else
                                                Isfunction = False '//이파라미터가 또 함수를 가지고있다 ㅠ_ㅠ;
                                                IsFunctionEnd = True
                                                NewParam.Append(C)
                                            End If
                                        Else   '//펑션상태가 아닌데 )를만나면 명령어의 종료를 의미한다. 현재 파람을 확인하고 추가한다.
                                            If NewParam.ToString <> "" Then ParamList.Add(NewParam.ToString) '//파라미터를 찾았으므로 파람리스트에 추가한다.
                                            NewParam = New System.Text.StringBuilder   '//파라미터부분 초기화
                                            IsFunctionEnd = False

                                            'MsgBox("명령어실행 : " & NewCmd.ToString)
                                            '//각 파라미터들의 값을 가져온다
                                            Me.Log.AppendLine("New COmmand : " & NewCmd.ToString & " paramCount=" & ParamList.Count)
                                            Select Case NewCmd.ToString.ToUpper
                                                Case "ISEQULE"  '//둘이 같은지 반환해준다.
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("ISEQULE 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As Object = RunParam(ParamList(0).ToString, NEwValue)
                                                        Dim Param2 As Object = RunParam(ParamList(1).ToString, NewValue)
                                                        ' MsgBox(ParamList(1).ToString & "/" & NewValue)
                                                        Me.Log.AppendLine("ISEQULE " & Param1 & vbTab & Param2)
                                                        If Param1 <> Param2 Then
                                                            Me.Log.AppendLine("ISEQULE RETURN FALSE")
                                                            Return False
                                                        Else
                                                            Me.Log.AppendLine("ISEQULE RETURN TRUE")
                                                            Return True
                                                        End If
                                                        'MsgBox(Param1, MsgBoxStyle.Information, "확인")
                                                    End If
                                                Case "IF"
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("IF 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As Object = RunParam(ParamList(0).ToString, NewValue)
                                                        Dim Param2 As Object = RunParam(ParamList(1).ToString, NewValue)
                                                        If Param1 <> Param2 Then
                                                            Me.Log.AppendLine("If FALSE Case Exit Loop Return Nullstring")
                                                            Return "" '//해당구문전체를 모두 FALSE한다.
                                                        Else
                                                            Me.Log.AppendLine("If True Case IN(" & Param1 & "  " & Param2 & ")")
                                                        End If

                                                        'MsgBox(Param1, MsgBoxStyle.Information, "확인")
                                                    End If
                                                Case "IFNOT"
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("IFNOT 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As Object = RunParam(ParamList(0).ToString, NEwValue)
                                                        Dim Param2 As Object = RunParam(ParamList(1).ToString, NEwValue)
                                                        If Param1 = Param2 Then
                                                            Me.Log.AppendLine("If FALSE Case Exit Loop Return Nullstring")
                                                            Return "" '//해당구문전체를 모두 FALSE한다.
                                                        Else
                                                            Me.Log.AppendLine("If True Case IN(" & Param1 & "  " & Param2 & ")")
                                                        End If

                                                        'MsgBox(Param1, MsgBoxStyle.Information, "확인")
                                                    End If
                                                Case "MSGBOX", "MSG"
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("MSGBOX 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NEwValue)
                                                        MsgBox(Param1, MsgBoxStyle.Information, "확인")
                                                    End If
                                                Case "ISNUM"
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("ISNUM 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NEwValue)
                                                        NEwValue = IsNumeric(Param1)
                                                        'NEwValue = Param1.ToString.Replace(Param2, Param3)
                                                        'MsgBox("p1=" & Param1 & " p2=" & Param2, MsgBoxStyle.Information, NewValue)
                                                    End If
                                                Case "NVL"
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("ISEMPTY 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NEwValue)
                                                        Dim Param2 As Object = RunParam(ParamList(1).ToString, NEwValue)
                                                        If Param1.Trim = "" Then    '//비어있으면 두번째꺼를 쓰고
                                                            NEwValue = Param2
                                                        Else    '//안비어있으면 원래값을 쓴다.
                                                            NEwValue = Param1
                                                        End If

                                                    End If
                                                Case "INDEXOF"
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("INDEXOF 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NEwValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NEwValue)
                                                        NEwValue = Param1.IndexOf(Param2) + 1
                                                     
                                                    End If
                                                Case "LINDEXOF"
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("LINDEXOF 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NEwValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NEwValue)
                                                        NEwValue = Param1.LastIndexOf(Param2) + 1
                                                    End If
                                                Case "REPLACE"
                                                    If ParamList.Count <> 3 Then
                                                        MsgBox("REPLACE 함수에 3개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NEwValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NEwValue)
                                                        Dim Param3 As String = RunParam(ParamList(2).ToString, NEwValue)
                                                        NEwValue = Param1.ToString.Replace(Param2, Param3)
                                                        'MsgBox("p1=" & Param1 & " p2=" & Param2, MsgBoxStyle.Information, NewValue)
                                                    End If
                                                Case "REMOVECHAR"
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("REMOVESPACE 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As Object = RunParam(ParamList(0).ToString, NewValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NewValue)
                                                        NewValue = Param1.Trim(Param2.ToCharArray).ToString.Trim
                                                        'MsgBox("p1=" & Param1 & " p2=" & Param2, MsgBoxStyle.Information, NewValue)
                                                    End If
                                                Case "REMOVESCHAR" '//특수기호삭제한다.
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("REMOVESCHAR 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        Dim NewString As New Text.StringBuilder
                                                        For Each Cc As Char In Param1.ToCharArray
                                                            Select Case Asc(Cc)
                                                                Case 65 To 90, 48 To 57, 97 To 122, Is < 0, 32
                                                                    NewString.Append(Cc)
                                                            End Select
                                                        Next
                                                        NewValue = NewString.ToString
                                                    End If
                                                Case "REMOVESPACE"
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("REMOVESPACE 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        NewValue = Param1.Replace(Space(1), vbNullString)
                                                    End If
                                                Case "TOUPPER"
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("TOUPPER 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        NewValue = Param1.ToUpper
                                                    End If
                                                Case "TOLOWER"
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("TOLOWER 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        NewValue = Param1.ToLower
                                                    End If
                                                Case "LENB"
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("LENB 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        NewValue = System.Text.Encoding.Default.GetByteCount(Param1)
                                                    End If
                                                Case "LEN"
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("LEN 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        NewValue = Param1.Length
                                                    End If
                                                Case "RIGHTADD"
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("RIGHTADD 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NewValue)
                                                        NewValue = Param1 & Param2
                                                    End If
                                                Case "ADDNUM"
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("ADDNUM 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As Integer = RunParam(ParamList(0).ToString, NewValue)
                                                        Dim Param2 As Integer = RunParam(ParamList(1).ToString, NewValue)
                                                        NewValue = Param1 + Param2
                                                    End If
                                                Case "LEFTADD"
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("LEFTADD 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NewValue)
                                                        NewValue = Param2 & Param1
                                                    End If
                                                Case "TODATE"
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("TODATE 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        NewValue = (CDate(Param1))
                                                    End If
                                                Case "TOSTRING"
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("TOSTRING 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        NewValue = (CStr(Param1))
                                                    End If
                                                Case "TOINT"
                                                    If ParamList.Count <> 1 Then
                                                        MsgBox("TOINT 함수에 1개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As Integer = RunParam(ParamList(0).ToString, NewValue)
                                                        NewValue = Param1
                                                    End If
                                                Case "NOW"
                                                    NEwValue = Now

                                                Case "SUBSTRING"  '//2개의 파라미터를 사용한다.
                                                    If ParamList.Count < 2 Then
                                                        MsgBox("SUBSTRING 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NEwValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NEwValue)
                                                        Dim param3 As String = ""
                                                        If ParamList.Count = 3 Then
                                                            param3 = RunParam(ParamList(2).ToString, NEwValue)
                                                        End If
                                                        If Param1.Trim = "" OrElse IsNumeric(Param2) = False OrElse CInt(Param2) < 0 Then
                                                            NEwValue = ""
                                                        Else
                                                            If param3 <> "" Then
                                                                NEwValue = Param1.Substring(Param2, param3)
                                                            Else
                                                                NEwValue = Param1.Substring(Param2)
                                                            End If
                                                        End If
                                                        
                                                    End If

                                                Case "LEFT"  '//2개의 파라미터를 사용한다.
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("LEFT 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NewValue)
                                                        NewValue = Left(Param1, Param2)
                                                    End If
                                                Case "RIGHT"  '//2개의 파라미터를 사용한다.
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("RIGHT 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NewValue)
                                                        NewValue = Right(Param1, Param2)
                                                    End If
                                                Case "MID"  '//2개의 파라미터를 사용한다.
                                                    If ParamList.Count <> 3 Then
                                                        MsgBox("MID 함수에 3개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As String = RunParam(ParamList(0).ToString, NewValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NewValue)
                                                        Dim Param3 As String = RunParam(ParamList(2).ToString, NEwValue)
                                                        If Param2 = "-1" OrElse Param3 < 1 Then
                                                            MsgBox("MID 함수의 시작위치값은 0이상이여야합니다" & vbCrLf & _
                                                                   "MID 함수의 추출길이는 1이상이여야합니다", MsgBoxStyle.Information, "확인")
                                                            NEwValue = ""
                                                        Else
                                                            NEwValue = Mid(Param1, Param2, Param3)
                                                        End If

                                                    End If
                                                Case "FORMAT"
                                                    If ParamList.Count <> 2 Then
                                                        MsgBox("FORMAT 함수에 2개의 파라미터가 없습니다")
                                                    Else
                                                        Dim Param1 As Object = RunParam(ParamList(0).ToString, NewValue)
                                                        Dim Param2 As String = RunParam(ParamList(1).ToString, NewValue)

                                                        ' MsgBox(Param1 & "/" & Param2)
                                                        NewValue = Format(Param1, Param2)
                                                    End If
                                                Case Else
                                                    NewValue = RunUnknown(NewCmd.ToString, NewValue, ParamList)
                                            End Select
                                        End If
                                    End If
                                Case Else
                                    If C = Chr(34) Then '//" 옴표가왓다면
                                        IsTextInner = Not IsTextInner
                                        NewParam.Append(C)
                                    ElseIf IsFunctionEnd Then  '//함수종결문인데 , 가 아닌다른게 왓다면 오류다
                                        MsgBox("내부한수 종결문다음에 , 가 와야하는데 " & C & "가 왔습니다")
                                    Else
                                        NewParam.Append(C)
                                    End If
                            End Select
                        End If
                    Next
                End If
                'MsgBox("명령어 : " & NewCmd.ToString)
                'For Each S As String In ParamList
                '    MsgBox("파람 : " & S)
                'Next
            End If
        Next
        Me.Log.AppendLine("ParseCOmmand Return : " & NewValue.ToString)
        Return NewValue
    End Function

    Public Function RunParam(ByVal vParam As String, ByVal SrcValue As Object) As Object
        'My.Computer.FileSystem.WriteAllText("c:\log.txT", "runparam  param=" & vParam, True)
        vParam = vParam.Trim
        If vParam = "" Then Return ""
        If vParam.Substring(0, 1) = Chr(34) Then   '//파라미터자체가 "" 로시작한다면
            Return vParam.Trim(Chr(34))
        End If

        If vParam.ToUpper = "TRUE" Then Return True
        If vParam.ToUpper = "FALSE" Then Return False

        '//시작값이 숫자라면 이건 숫자값이다.
        If IsNumeric(vParam.Substring(0, 1)) = True Then Return vParam

        '//시작값이 # 라면 원본 데이터이다.
        If vParam = "#" Then Return SrcValue

        '//시작값이 숫자도 일반 문자도 공백도 아니라면 영문단어이다.
        '// (  가 있다면 함수이므로 함수를 실행한다.
        Select Case vParam.ToUpper
            Case "NOW" '//date 타입을 반환한다.
                Return Now
            Case Else
                If vParam.IndexOf("(") <> -1 Then '//일반 실행가능용 명령어이다.
                    Return Me.ParseCommand(vParam, False, SrcValue)
                Else
                    Return RunUnknown(vParam, SrcValue) '//비지원 목록으로 반환한다.
                End If
        End Select
        Return ""
    End Function

    Public Overridable Function RunUnknown(ByVal Cmd As String, ByVal Srcvalue As Object, Optional ByVal Paramlist As ArrayList = Nothing) As Object
        MsgBox("RunUnknown 함수를 재정의 하세요")
        Return ""
    End Function


End Class
