From 74aff06f0ecfbbe02b9822c3c4f470f2f8f22ca8 Mon Sep 17 00:00:00 2001 From: UCan927 Date: Wed, 17 Jun 2020 17:14:22 +0800 Subject: [PATCH 01/13] Added .NET Core support --- Directory.Build.props | 25 ++ Directory.Build.targets | 19 ++ .../Chat/Client/Client.NET.Core.csproj | 9 + .../Chat/Server/Server.NET.Core.csproj | 8 + .../EchoServer/EchoServer.NET.Core.csproj | 8 + .../SerialShell/SerialShell.NET.Core.csproj | 8 + .../TimeServer/TimeServer.NET.Core.csproj | 8 + Mina.Example/Haiku/Haiku.NET.Core.csproj | 8 + .../MulticastUDP/MulticastUDP.NET.Core.csproj | 8 + Mina.Example/NetCat/NetCat.NET.Core.csproj | 8 + .../Reverser/Reverser.NET.Core.csproj | 8 + Mina.Example/SumUp/SumUp.NET.Core.csproj | 9 + Mina.Example/Tennis/Tennis.NET.Core.csproj | 8 + Mina.Example/Udp/Udp.NET.Core.csproj | 9 + Mina.NET.Core.sln | 247 ++++++++++++++++++ Mina.NET/Mina.NET.Core.csproj | 45 ++++ Mina.Test/Mina.NET.Core.Test.csproj | 14 + 17 files changed, 449 insertions(+) create mode 100644 Directory.Build.props create mode 100644 Directory.Build.targets create mode 100644 Mina.Example/Chat/Client/Client.NET.Core.csproj create mode 100644 Mina.Example/Chat/Server/Server.NET.Core.csproj create mode 100644 Mina.Example/EchoServer/EchoServer.NET.Core.csproj create mode 100644 Mina.Example/GettingStarted/SerialShell/SerialShell.NET.Core.csproj create mode 100644 Mina.Example/GettingStarted/TimeServer/TimeServer.NET.Core.csproj create mode 100644 Mina.Example/Haiku/Haiku.NET.Core.csproj create mode 100644 Mina.Example/MulticastUDP/MulticastUDP.NET.Core.csproj create mode 100644 Mina.Example/NetCat/NetCat.NET.Core.csproj create mode 100644 Mina.Example/Reverser/Reverser.NET.Core.csproj create mode 100644 Mina.Example/SumUp/SumUp.NET.Core.csproj create mode 100644 Mina.Example/Tennis/Tennis.NET.Core.csproj create mode 100644 Mina.Example/Udp/Udp.NET.Core.csproj create mode 100644 Mina.NET.Core.sln create mode 100644 Mina.NET/Mina.NET.Core.csproj create mode 100644 Mina.Test/Mina.NET.Core.Test.csproj diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..d2de7d1 --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,25 @@ + + + $(SolutionDir) + $(SolutionDir)Bin + $(SolutionDir)Source Code + $(SolutionDir)Resource\Icon + $(SolutionDir)Resource + + $(SolutionDir)Resource\3rdLib + $(SolutionDir)Bin\Publish\$(MSBuildProjectName) + $(SolutionDir)Resource\Build Support\CSProj Import + $(SolutionDir)Bin\$(Configuration)\Modules + $(SolutionDir)Bin\$(Configuration)\Libs + $(SolutionDir)Bin\$(Configuration)\$(MSBuildProjectName) + "$(SolutionDir)Resource\Build Support\Tools\Packing Tool\Packing Tool.exe" + $(SolutionDir)Bin\$(Configuration)\Libs\$(MSBuildProjectName) + $(SolutionDir)Bin\$(Configuration)\Modules\$(MSBuildProjectName) + + + $(BinDir)\#Build#\$(MSBuildProjectName) + false + AnyCPU;x64;x86 + NETCore + + \ No newline at end of file diff --git a/Directory.Build.targets b/Directory.Build.targets new file mode 100644 index 0000000..346eeb2 --- /dev/null +++ b/Directory.Build.targets @@ -0,0 +1,19 @@ + + + $(ExeOutputDir) + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Mina.Example/Chat/Client/Client.NET.Core.csproj b/Mina.Example/Chat/Client/Client.NET.Core.csproj new file mode 100644 index 0000000..5c1d9bb --- /dev/null +++ b/Mina.Example/Chat/Client/Client.NET.Core.csproj @@ -0,0 +1,9 @@ + + + + WinExe + netcoreapp3.1 + true + + + diff --git a/Mina.Example/Chat/Server/Server.NET.Core.csproj b/Mina.Example/Chat/Server/Server.NET.Core.csproj new file mode 100644 index 0000000..9acff6d --- /dev/null +++ b/Mina.Example/Chat/Server/Server.NET.Core.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/Mina.Example/EchoServer/EchoServer.NET.Core.csproj b/Mina.Example/EchoServer/EchoServer.NET.Core.csproj new file mode 100644 index 0000000..9acff6d --- /dev/null +++ b/Mina.Example/EchoServer/EchoServer.NET.Core.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/Mina.Example/GettingStarted/SerialShell/SerialShell.NET.Core.csproj b/Mina.Example/GettingStarted/SerialShell/SerialShell.NET.Core.csproj new file mode 100644 index 0000000..9acff6d --- /dev/null +++ b/Mina.Example/GettingStarted/SerialShell/SerialShell.NET.Core.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/Mina.Example/GettingStarted/TimeServer/TimeServer.NET.Core.csproj b/Mina.Example/GettingStarted/TimeServer/TimeServer.NET.Core.csproj new file mode 100644 index 0000000..9acff6d --- /dev/null +++ b/Mina.Example/GettingStarted/TimeServer/TimeServer.NET.Core.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/Mina.Example/Haiku/Haiku.NET.Core.csproj b/Mina.Example/Haiku/Haiku.NET.Core.csproj new file mode 100644 index 0000000..9acff6d --- /dev/null +++ b/Mina.Example/Haiku/Haiku.NET.Core.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/Mina.Example/MulticastUDP/MulticastUDP.NET.Core.csproj b/Mina.Example/MulticastUDP/MulticastUDP.NET.Core.csproj new file mode 100644 index 0000000..9acff6d --- /dev/null +++ b/Mina.Example/MulticastUDP/MulticastUDP.NET.Core.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/Mina.Example/NetCat/NetCat.NET.Core.csproj b/Mina.Example/NetCat/NetCat.NET.Core.csproj new file mode 100644 index 0000000..9acff6d --- /dev/null +++ b/Mina.Example/NetCat/NetCat.NET.Core.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/Mina.Example/Reverser/Reverser.NET.Core.csproj b/Mina.Example/Reverser/Reverser.NET.Core.csproj new file mode 100644 index 0000000..9acff6d --- /dev/null +++ b/Mina.Example/Reverser/Reverser.NET.Core.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/Mina.Example/SumUp/SumUp.NET.Core.csproj b/Mina.Example/SumUp/SumUp.NET.Core.csproj new file mode 100644 index 0000000..610b09c --- /dev/null +++ b/Mina.Example/SumUp/SumUp.NET.Core.csproj @@ -0,0 +1,9 @@ + + + + Exe + netcoreapp3.1 + Mina.Example.SumUp.Client + + + diff --git a/Mina.Example/Tennis/Tennis.NET.Core.csproj b/Mina.Example/Tennis/Tennis.NET.Core.csproj new file mode 100644 index 0000000..9acff6d --- /dev/null +++ b/Mina.Example/Tennis/Tennis.NET.Core.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/Mina.Example/Udp/Udp.NET.Core.csproj b/Mina.Example/Udp/Udp.NET.Core.csproj new file mode 100644 index 0000000..a1b915b --- /dev/null +++ b/Mina.Example/Udp/Udp.NET.Core.csproj @@ -0,0 +1,9 @@ + + + + Exe + netcoreapp3.1 + Mina.Example.Udp.MemoryMonitor + + + diff --git a/Mina.NET.Core.sln b/Mina.NET.Core.sln new file mode 100644 index 0000000..5289870 --- /dev/null +++ b/Mina.NET.Core.sln @@ -0,0 +1,247 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30204.135 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mina.NET.Core", "Mina.NET\Mina.NET.Core.csproj", "{64BD2695-9905-47FC-8893-0CC96AEDF90D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Example", "Example", "{46FA3607-7BFD-443E-90C2-D6C58CE23CCB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Udp.NET.Core", "Mina.Example\Udp\Udp.NET.Core.csproj", "{4F8A9113-42ED-471F-AB2B-EA8E993EFD76}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tennis.NET.Core", "Mina.Example\Tennis\Tennis.NET.Core.csproj", "{7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SumUp.NET.Core", "Mina.Example\SumUp\SumUp.NET.Core.csproj", "{48D9133C-FEAE-4385-8897-BBA5A2D11FB2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Reverser.NET.Core", "Mina.Example\Reverser\Reverser.NET.Core.csproj", "{55B1A41F-45E5-49AA-8142-DD9027C2AEDB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetCat.NET.Core", "Mina.Example\NetCat\NetCat.NET.Core.csproj", "{FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MulticastUDP.NET.Core", "Mina.Example\MulticastUDP\MulticastUDP.NET.Core.csproj", "{4E4653C6-8D5A-48A4-86D7-661C949BD9BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Haiku.NET.Core", "Mina.Example\Haiku\Haiku.NET.Core.csproj", "{2A5394D2-0929-49CE-9185-791CA641C5D7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EchoServer.NET.Core", "Mina.Example\EchoServer\EchoServer.NET.Core.csproj", "{722BC1A0-35C3-4067-AAC9-5581413AF65D}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GettingStarted", "GettingStarted", "{FAA9AA9A-6AE9-4E1B-B6DB-B9B37EC1A95C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TimeServer.NET.Core", "Mina.Example\GettingStarted\TimeServer\TimeServer.NET.Core.csproj", "{DFB709E1-BC33-406E-A86B-C1533C19B13E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SerialShell.NET.Core", "Mina.Example\GettingStarted\SerialShell\SerialShell.NET.Core.csproj", "{10805663-6284-476A-878F-AD0F97A6CF5E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Chat", "Chat", "{15877AEC-FE61-4D75-B0BB-7CE930A843C7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server.NET.Core", "Mina.Example\Chat\Server\Server.NET.Core.csproj", "{3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Client.NET.Core", "Mina.Example\Chat\Client\Client.NET.Core.csproj", "{42092100-5856-4533-A7E4-0685B1F91A73}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mina.NET.Core.Test", "Mina.Test\Mina.NET.Core.Test.csproj", "{F94CCE31-DAF9-4299-B514-1B34DACCB8A6}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{94549169-33A2-439D-8BEC-C62E0B3CED8D}" + ProjectSection(SolutionItems) = preProject + Directory.Build.props = Directory.Build.props + Directory.Build.targets = Directory.Build.targets + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Debug|x64.ActiveCfg = Debug|x64 + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Debug|x64.Build.0 = Debug|x64 + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Debug|x86.ActiveCfg = Debug|x86 + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Debug|x86.Build.0 = Debug|x86 + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Release|Any CPU.Build.0 = Release|Any CPU + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Release|x64.ActiveCfg = Release|x64 + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Release|x64.Build.0 = Release|x64 + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Release|x86.ActiveCfg = Release|x86 + {64BD2695-9905-47FC-8893-0CC96AEDF90D}.Release|x86.Build.0 = Release|x86 + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Debug|x64.ActiveCfg = Debug|x64 + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Debug|x64.Build.0 = Debug|x64 + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Debug|x86.ActiveCfg = Debug|x86 + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Debug|x86.Build.0 = Debug|x86 + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Release|Any CPU.Build.0 = Release|Any CPU + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Release|x64.ActiveCfg = Release|x64 + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Release|x64.Build.0 = Release|x64 + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Release|x86.ActiveCfg = Release|x86 + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76}.Release|x86.Build.0 = Release|x86 + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Debug|x64.ActiveCfg = Debug|x64 + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Debug|x64.Build.0 = Debug|x64 + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Debug|x86.ActiveCfg = Debug|x86 + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Debug|x86.Build.0 = Debug|x86 + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Release|Any CPU.Build.0 = Release|Any CPU + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Release|x64.ActiveCfg = Release|x64 + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Release|x64.Build.0 = Release|x64 + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Release|x86.ActiveCfg = Release|x86 + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A}.Release|x86.Build.0 = Release|x86 + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Debug|x64.ActiveCfg = Debug|x64 + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Debug|x64.Build.0 = Debug|x64 + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Debug|x86.ActiveCfg = Debug|x86 + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Debug|x86.Build.0 = Debug|x86 + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Release|Any CPU.Build.0 = Release|Any CPU + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Release|x64.ActiveCfg = Release|x64 + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Release|x64.Build.0 = Release|x64 + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Release|x86.ActiveCfg = Release|x86 + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2}.Release|x86.Build.0 = Release|x86 + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Debug|x64.ActiveCfg = Debug|x64 + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Debug|x64.Build.0 = Debug|x64 + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Debug|x86.ActiveCfg = Debug|x86 + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Debug|x86.Build.0 = Debug|x86 + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Release|Any CPU.Build.0 = Release|Any CPU + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Release|x64.ActiveCfg = Release|x64 + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Release|x64.Build.0 = Release|x64 + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Release|x86.ActiveCfg = Release|x86 + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB}.Release|x86.Build.0 = Release|x86 + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Debug|x64.ActiveCfg = Debug|x64 + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Debug|x64.Build.0 = Debug|x64 + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Debug|x86.ActiveCfg = Debug|x86 + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Debug|x86.Build.0 = Debug|x86 + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Release|Any CPU.Build.0 = Release|Any CPU + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Release|x64.ActiveCfg = Release|x64 + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Release|x64.Build.0 = Release|x64 + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Release|x86.ActiveCfg = Release|x86 + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5}.Release|x86.Build.0 = Release|x86 + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Debug|x64.ActiveCfg = Debug|x64 + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Debug|x64.Build.0 = Debug|x64 + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Debug|x86.ActiveCfg = Debug|x86 + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Debug|x86.Build.0 = Debug|x86 + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Release|Any CPU.Build.0 = Release|Any CPU + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Release|x64.ActiveCfg = Release|x64 + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Release|x64.Build.0 = Release|x64 + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Release|x86.ActiveCfg = Release|x86 + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC}.Release|x86.Build.0 = Release|x86 + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Debug|x64.ActiveCfg = Debug|x64 + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Debug|x64.Build.0 = Debug|x64 + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Debug|x86.ActiveCfg = Debug|x86 + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Debug|x86.Build.0 = Debug|x86 + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Release|Any CPU.Build.0 = Release|Any CPU + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Release|x64.ActiveCfg = Release|x64 + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Release|x64.Build.0 = Release|x64 + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Release|x86.ActiveCfg = Release|x86 + {2A5394D2-0929-49CE-9185-791CA641C5D7}.Release|x86.Build.0 = Release|x86 + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Debug|x64.ActiveCfg = Debug|x64 + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Debug|x64.Build.0 = Debug|x64 + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Debug|x86.ActiveCfg = Debug|x86 + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Debug|x86.Build.0 = Debug|x86 + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Release|Any CPU.Build.0 = Release|Any CPU + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Release|x64.ActiveCfg = Release|x64 + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Release|x64.Build.0 = Release|x64 + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Release|x86.ActiveCfg = Release|x86 + {722BC1A0-35C3-4067-AAC9-5581413AF65D}.Release|x86.Build.0 = Release|x86 + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Debug|x64.ActiveCfg = Debug|x64 + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Debug|x64.Build.0 = Debug|x64 + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Debug|x86.ActiveCfg = Debug|x86 + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Debug|x86.Build.0 = Debug|x86 + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Release|Any CPU.Build.0 = Release|Any CPU + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Release|x64.ActiveCfg = Release|x64 + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Release|x64.Build.0 = Release|x64 + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Release|x86.ActiveCfg = Release|x86 + {DFB709E1-BC33-406E-A86B-C1533C19B13E}.Release|x86.Build.0 = Release|x86 + {10805663-6284-476A-878F-AD0F97A6CF5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {10805663-6284-476A-878F-AD0F97A6CF5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {10805663-6284-476A-878F-AD0F97A6CF5E}.Debug|x64.ActiveCfg = Debug|x64 + {10805663-6284-476A-878F-AD0F97A6CF5E}.Debug|x64.Build.0 = Debug|x64 + {10805663-6284-476A-878F-AD0F97A6CF5E}.Debug|x86.ActiveCfg = Debug|x86 + {10805663-6284-476A-878F-AD0F97A6CF5E}.Debug|x86.Build.0 = Debug|x86 + {10805663-6284-476A-878F-AD0F97A6CF5E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {10805663-6284-476A-878F-AD0F97A6CF5E}.Release|Any CPU.Build.0 = Release|Any CPU + {10805663-6284-476A-878F-AD0F97A6CF5E}.Release|x64.ActiveCfg = Release|x64 + {10805663-6284-476A-878F-AD0F97A6CF5E}.Release|x64.Build.0 = Release|x64 + {10805663-6284-476A-878F-AD0F97A6CF5E}.Release|x86.ActiveCfg = Release|x86 + {10805663-6284-476A-878F-AD0F97A6CF5E}.Release|x86.Build.0 = Release|x86 + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Debug|x64.ActiveCfg = Debug|x64 + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Debug|x64.Build.0 = Debug|x64 + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Debug|x86.ActiveCfg = Debug|x86 + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Debug|x86.Build.0 = Debug|x86 + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Release|Any CPU.Build.0 = Release|Any CPU + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Release|x64.ActiveCfg = Release|x64 + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Release|x64.Build.0 = Release|x64 + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Release|x86.ActiveCfg = Release|x86 + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5}.Release|x86.Build.0 = Release|x86 + {42092100-5856-4533-A7E4-0685B1F91A73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42092100-5856-4533-A7E4-0685B1F91A73}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42092100-5856-4533-A7E4-0685B1F91A73}.Debug|x64.ActiveCfg = Debug|x64 + {42092100-5856-4533-A7E4-0685B1F91A73}.Debug|x64.Build.0 = Debug|x64 + {42092100-5856-4533-A7E4-0685B1F91A73}.Debug|x86.ActiveCfg = Debug|x86 + {42092100-5856-4533-A7E4-0685B1F91A73}.Debug|x86.Build.0 = Debug|x86 + {42092100-5856-4533-A7E4-0685B1F91A73}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42092100-5856-4533-A7E4-0685B1F91A73}.Release|Any CPU.Build.0 = Release|Any CPU + {42092100-5856-4533-A7E4-0685B1F91A73}.Release|x64.ActiveCfg = Release|x64 + {42092100-5856-4533-A7E4-0685B1F91A73}.Release|x64.Build.0 = Release|x64 + {42092100-5856-4533-A7E4-0685B1F91A73}.Release|x86.ActiveCfg = Release|x86 + {42092100-5856-4533-A7E4-0685B1F91A73}.Release|x86.Build.0 = Release|x86 + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Debug|x64.ActiveCfg = Debug|x64 + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Debug|x64.Build.0 = Debug|x64 + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Debug|x86.ActiveCfg = Debug|x86 + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Debug|x86.Build.0 = Debug|x86 + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Release|Any CPU.Build.0 = Release|Any CPU + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Release|x64.ActiveCfg = Release|x64 + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Release|x64.Build.0 = Release|x64 + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Release|x86.ActiveCfg = Release|x86 + {F94CCE31-DAF9-4299-B514-1B34DACCB8A6}.Release|x86.Build.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {4F8A9113-42ED-471F-AB2B-EA8E993EFD76} = {46FA3607-7BFD-443E-90C2-D6C58CE23CCB} + {7D9B5914-5D53-437B-B73D-01EA6AFBAB0A} = {46FA3607-7BFD-443E-90C2-D6C58CE23CCB} + {48D9133C-FEAE-4385-8897-BBA5A2D11FB2} = {46FA3607-7BFD-443E-90C2-D6C58CE23CCB} + {55B1A41F-45E5-49AA-8142-DD9027C2AEDB} = {46FA3607-7BFD-443E-90C2-D6C58CE23CCB} + {FE9A6BF3-99B9-4176-B241-7B4B5BD569F5} = {46FA3607-7BFD-443E-90C2-D6C58CE23CCB} + {4E4653C6-8D5A-48A4-86D7-661C949BD9BC} = {46FA3607-7BFD-443E-90C2-D6C58CE23CCB} + {2A5394D2-0929-49CE-9185-791CA641C5D7} = {46FA3607-7BFD-443E-90C2-D6C58CE23CCB} + {722BC1A0-35C3-4067-AAC9-5581413AF65D} = {46FA3607-7BFD-443E-90C2-D6C58CE23CCB} + {FAA9AA9A-6AE9-4E1B-B6DB-B9B37EC1A95C} = {46FA3607-7BFD-443E-90C2-D6C58CE23CCB} + {DFB709E1-BC33-406E-A86B-C1533C19B13E} = {FAA9AA9A-6AE9-4E1B-B6DB-B9B37EC1A95C} + {10805663-6284-476A-878F-AD0F97A6CF5E} = {FAA9AA9A-6AE9-4E1B-B6DB-B9B37EC1A95C} + {15877AEC-FE61-4D75-B0BB-7CE930A843C7} = {46FA3607-7BFD-443E-90C2-D6C58CE23CCB} + {3C09D40E-8AE7-4A89-A8AB-FEADDA0859E5} = {15877AEC-FE61-4D75-B0BB-7CE930A843C7} + {42092100-5856-4533-A7E4-0685B1F91A73} = {15877AEC-FE61-4D75-B0BB-7CE930A843C7} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {28D9CFB5-D963-4C55-8990-8DD345A0E8F8} + EndGlobalSection +EndGlobal diff --git a/Mina.NET/Mina.NET.Core.csproj b/Mina.NET/Mina.NET.Core.csproj new file mode 100644 index 0000000..01871cc --- /dev/null +++ b/Mina.NET/Mina.NET.Core.csproj @@ -0,0 +1,45 @@ + + + + netstandard2.1 + 2.0.12 + Longshine + Async socket library for high performance and high scalability network applications. + Copyright © Longshine 2013-2020 + 2070ccbf-2ee3-476e-9715-54e97a5e26c7 + $(LibraryOutputDir) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mina.Test/Mina.NET.Core.Test.csproj b/Mina.Test/Mina.NET.Core.Test.csproj new file mode 100644 index 0000000..e1ae45f --- /dev/null +++ b/Mina.Test/Mina.NET.Core.Test.csproj @@ -0,0 +1,14 @@ + + + + netcoreapp3.1 + false + + + + + + + + + From 717c80e6fc07330480f8f75fc9bdc8f1772fdef8 Mon Sep 17 00:00:00 2001 From: UCan927 Date: Thu, 18 Jun 2020 21:27:39 +0800 Subject: [PATCH 02/13] Handle .NET Core SDK compatibility issues; --- Mina.NET/Core/Service/AbstractIoAcceptor.cs | 2 ++ Mina.NET/Filter/Ssl/SslFilter.cs | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/Mina.NET/Core/Service/AbstractIoAcceptor.cs b/Mina.NET/Core/Service/AbstractIoAcceptor.cs index ab5621b..303eb86 100644 --- a/Mina.NET/Core/Service/AbstractIoAcceptor.cs +++ b/Mina.NET/Core/Service/AbstractIoAcceptor.cs @@ -18,7 +18,9 @@ public abstract class AbstractIoAcceptor : AbstractIoService, IoAcceptor /// /// The lock for binding. /// +#if !NETCore [CLSCompliant(false)] +#endif protected Object _bindLock; /// diff --git a/Mina.NET/Filter/Ssl/SslFilter.cs b/Mina.NET/Filter/Ssl/SslFilter.cs index e904210..fdacafa 100644 --- a/Mina.NET/Filter/Ssl/SslFilter.cs +++ b/Mina.NET/Filter/Ssl/SslFilter.cs @@ -26,7 +26,11 @@ public class SslFilter : IoFilterAdapter private static readonly AttributeKey SSL_HANDLER = new AttributeKey(typeof(SslFilter), "handler"); X509Certificate _serverCertificate = null; +#if !NETCore SslProtocols _sslProtocol = SslProtocols.Default; +#else + SslProtocols _sslProtocol = SslProtocols.None; +#endif /// /// Creates a new SSL filter using the specified PKCS7 signed file. From aa6660f5682a179d14cedcc2e8427a23383bd3d1 Mon Sep 17 00:00:00 2001 From: UCan927 Date: Fri, 19 Jun 2020 19:27:47 +0800 Subject: [PATCH 03/13] Use new syntax to eliminate compilation messages; --- Mina.NET/Core/Service/AbstractIoAcceptor.cs | 2 +- Mina.NET/Filter/Ssl/SslFilter.cs | 17 +++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Mina.NET/Core/Service/AbstractIoAcceptor.cs b/Mina.NET/Core/Service/AbstractIoAcceptor.cs index 303eb86..c28b1ff 100644 --- a/Mina.NET/Core/Service/AbstractIoAcceptor.cs +++ b/Mina.NET/Core/Service/AbstractIoAcceptor.cs @@ -27,7 +27,7 @@ public abstract class AbstractIoAcceptor : AbstractIoService, IoAcceptor /// protected AbstractIoAcceptor(IoSessionConfig sessionConfig) : base(sessionConfig) - { + { _bindLock = ((ICollection)_boundEndPoints).SyncRoot; } diff --git a/Mina.NET/Filter/Ssl/SslFilter.cs b/Mina.NET/Filter/Ssl/SslFilter.cs index fdacafa..538c221 100644 --- a/Mina.NET/Filter/Ssl/SslFilter.cs +++ b/Mina.NET/Filter/Ssl/SslFilter.cs @@ -25,7 +25,7 @@ public class SslFilter : IoFilterAdapter private static readonly AttributeKey NEXT_FILTER = new AttributeKey(typeof(SslFilter), "nextFilter"); private static readonly AttributeKey SSL_HANDLER = new AttributeKey(typeof(SslFilter), "handler"); - X509Certificate _serverCertificate = null; + private readonly X509Certificate _serverCertificate = null; #if !NETCore SslProtocols _sslProtocol = SslProtocols.Default; #else @@ -178,8 +178,7 @@ public override void MessageReceived(INextFilter nextFilter, IoSession session, /// public override void MessageSent(INextFilter nextFilter, IoSession session, IWriteRequest writeRequest) { - EncryptedWriteRequest encryptedWriteRequest = writeRequest as EncryptedWriteRequest; - if (encryptedWriteRequest == null) + if (!(writeRequest is EncryptedWriteRequest encryptedWriteRequest)) { // ignore extra buffers used for handshaking } @@ -217,17 +216,17 @@ public override void FilterClose(INextFilter nextFilter, IoSession session) IWriteFuture future = null; try { - future = InitiateClosure(handler, nextFilter, session); + future = InitiateClosure(handler, session); future.Complete += (s, e) => base.FilterClose(nextFilter, session); } finally - { + { if (future == null) base.FilterClose(nextFilter, session); } } - private IWriteFuture InitiateClosure(SslHandler handler, INextFilter nextFilter, IoSession session) + private IWriteFuture InitiateClosure(SslHandler handler, IoSession session) { IWriteFuture future = DefaultWriteFuture.NewWrittenFuture(session); handler.Destroy(); @@ -481,8 +480,7 @@ public void MessageReceived(INextFilter nextFilter, IoBuffer buf) public void Destroy() { _sslStream.Close(); - IoFilterEvent scheduledWrite; - while (_preHandshakeEventQueue.TryDequeue(out scheduledWrite)) + while (_preHandshakeEventQueue.TryDequeue(out _)) { } } @@ -490,8 +488,7 @@ private void FlushPreHandshakeEvents() { lock (this) { - IoFilterEvent scheduledWrite; - while (_preHandshakeEventQueue.TryDequeue(out scheduledWrite)) + while (_preHandshakeEventQueue.TryDequeue(out IoFilterEvent scheduledWrite)) { _sslFilter.FilterWrite(scheduledWrite.NextFilter, scheduledWrite.Session, (IWriteRequest)scheduledWrite.Parameter); } From 29560e8d5bf5e16cea8d97ed6b4ff29718597683 Mon Sep 17 00:00:00 2001 From: UCan927 Date: Mon, 19 Apr 2021 23:39:40 +0800 Subject: [PATCH 04/13] Fix the problem that UDP does not work in mono --- Mina.NET/Transport/Socket/AsyncDatagramSession.NET40.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mina.NET/Transport/Socket/AsyncDatagramSession.NET40.cs b/Mina.NET/Transport/Socket/AsyncDatagramSession.NET40.cs index e3e8a6c..c997f49 100644 --- a/Mina.NET/Transport/Socket/AsyncDatagramSession.NET40.cs +++ b/Mina.NET/Transport/Socket/AsyncDatagramSession.NET40.cs @@ -18,8 +18,8 @@ partial class AsyncDatagramSession : SocketSession public AsyncDatagramSession(IoService service, IoProcessor processor, System.Net.Sockets.Socket socket, EndPoint remoteEP, SocketAsyncEventArgsBuffer readBuffer, SocketAsyncEventArgsBuffer writeBuffer, Boolean reuseBuffer) - : base(service, processor, new DatagramSessionConfigImpl(socket), socket, socket.LocalEndPoint, socket.RemoteEndPoint, reuseBuffer) - { + : base(service, processor, new DatagramSessionConfigImpl(socket), socket, socket.LocalEndPoint, socket.RemoteEndPoint ?? remoteEP, reuseBuffer) + { _readBuffer = readBuffer; _readBuffer.SocketAsyncEventArgs.UserToken = this; _writeBuffer = writeBuffer; @@ -110,7 +110,7 @@ protected override void BeginReceive() try { if (_readBuffer.SocketAsyncEventArgs.RemoteEndPoint == null) - _readBuffer.SocketAsyncEventArgs.RemoteEndPoint = Socket.RemoteEndPoint; + _readBuffer.SocketAsyncEventArgs.RemoteEndPoint = Socket.RemoteEndPoint ?? this.RemoteEndPoint; willRaiseEvent = Socket.ReceiveFromAsync(_readBuffer.SocketAsyncEventArgs); } From b4905e7ae996f1b60246c95fa60bb724fc874d94 Mon Sep 17 00:00:00 2001 From: UCan927 Date: Wed, 19 Jan 2022 15:50:17 +0800 Subject: [PATCH 05/13] Format carriage return line feed; --- .../Socket/AsyncDatagramConnector.cs | 176 +++++++++--------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/Mina.NET/Transport/Socket/AsyncDatagramConnector.cs b/Mina.NET/Transport/Socket/AsyncDatagramConnector.cs index 3750cfc..e8ed0f2 100644 --- a/Mina.NET/Transport/Socket/AsyncDatagramConnector.cs +++ b/Mina.NET/Transport/Socket/AsyncDatagramConnector.cs @@ -1,93 +1,93 @@ -using System; -using System.Net.Sockets; -using Mina.Core.Service; - -namespace Mina.Transport.Socket -{ - /// - /// for datagram transport (UDP/IP). - /// - public class AsyncDatagramConnector : AbstractSocketConnector, IDatagramConnector - { - /// - /// Instantiates. - /// - public AsyncDatagramConnector() - : base(new DefaultDatagramSessionConfig()) - { } - - /// - public new IDatagramSessionConfig SessionConfig - { - get { return (IDatagramSessionConfig)base.SessionConfig; } - } - - /// - public override ITransportMetadata TransportMetadata - { - get { return AsyncDatagramSession.Metadata; } - } - - /// - protected override System.Net.Sockets.Socket NewSocket(AddressFamily addressFamily) - { - return new System.Net.Sockets.Socket(addressFamily, SocketType.Dgram, ProtocolType.Udp); - } - - /// - protected override void BeginConnect(ConnectorContext connector) - { - /* - * No idea why get a SocketError.InvalidArgument in ConnectAsync. - * Call BeginConnect instead. - */ - connector.Socket.BeginConnect(connector.RemoteEP, ConnectCallback, connector); - } - - private void ConnectCallback(IAsyncResult ar) - { - ConnectorContext connector = (ConnectorContext)ar.AsyncState; - try - { - connector.Socket.EndConnect(ar); - } - catch (Exception ex) - { - EndConnect(ex, connector); - return; - } - - SocketAsyncEventArgs readBuffer = new SocketAsyncEventArgs(); - readBuffer.SetBuffer(new Byte[SessionConfig.ReadBufferSize], 0, SessionConfig.ReadBufferSize); - readBuffer.Completed += new EventHandler(SocketAsyncEventArgs_Completed); - - SocketAsyncEventArgs writeBuffer = new SocketAsyncEventArgs(); - writeBuffer.SetBuffer(new Byte[SessionConfig.ReadBufferSize], 0, SessionConfig.ReadBufferSize); - writeBuffer.Completed += new EventHandler(SocketAsyncEventArgs_Completed); - +using System; +using System.Net.Sockets; +using Mina.Core.Service; + +namespace Mina.Transport.Socket +{ + /// + /// for datagram transport (UDP/IP). + /// + public class AsyncDatagramConnector : AbstractSocketConnector, IDatagramConnector + { + /// + /// Instantiates. + /// + public AsyncDatagramConnector() + : base(new DefaultDatagramSessionConfig()) + { } + + /// + public new IDatagramSessionConfig SessionConfig + { + get { return (IDatagramSessionConfig)base.SessionConfig; } + } + + /// + public override ITransportMetadata TransportMetadata + { + get { return AsyncDatagramSession.Metadata; } + } + + /// + protected override System.Net.Sockets.Socket NewSocket(AddressFamily addressFamily) + { + return new System.Net.Sockets.Socket(addressFamily, SocketType.Dgram, ProtocolType.Udp); + } + + /// + protected override void BeginConnect(ConnectorContext connector) + { + /* + * No idea why get a SocketError.InvalidArgument in ConnectAsync. + * Call BeginConnect instead. + */ + connector.Socket.BeginConnect(connector.RemoteEP, ConnectCallback, connector); + } + + private void ConnectCallback(IAsyncResult ar) + { + ConnectorContext connector = (ConnectorContext)ar.AsyncState; + try + { + connector.Socket.EndConnect(ar); + } + catch (Exception ex) + { + EndConnect(ex, connector); + return; + } + + SocketAsyncEventArgs readBuffer = new SocketAsyncEventArgs(); + readBuffer.SetBuffer(new Byte[SessionConfig.ReadBufferSize], 0, SessionConfig.ReadBufferSize); + readBuffer.Completed += new EventHandler(SocketAsyncEventArgs_Completed); + + SocketAsyncEventArgs writeBuffer = new SocketAsyncEventArgs(); + writeBuffer.SetBuffer(new Byte[SessionConfig.ReadBufferSize], 0, SessionConfig.ReadBufferSize); + writeBuffer.Completed += new EventHandler(SocketAsyncEventArgs_Completed); + try { EndConnect(new AsyncDatagramSession(this, Processor, connector.Socket, connector.RemoteEP, new SocketAsyncEventArgsBuffer(readBuffer), new SocketAsyncEventArgsBuffer(writeBuffer), ReuseBuffer), connector); - } - catch (Exception ex) - { - Util.ExceptionMonitor.Instance.ExceptionCaught(ex); - } - } - - void SocketAsyncEventArgs_Completed(object sender, SocketAsyncEventArgs e) - { - switch (e.LastOperation) - { - case SocketAsyncOperation.ReceiveFrom: - ((AsyncDatagramSession)e.UserToken).ProcessReceive(e); - break; - case SocketAsyncOperation.SendTo: - ((AsyncDatagramSession)e.UserToken).ProcessSend(e); - break; - } - } - } -} + } + catch (Exception ex) + { + Util.ExceptionMonitor.Instance.ExceptionCaught(ex); + } + } + + void SocketAsyncEventArgs_Completed(object sender, SocketAsyncEventArgs e) + { + switch (e.LastOperation) + { + case SocketAsyncOperation.ReceiveFrom: + ((AsyncDatagramSession)e.UserToken).ProcessReceive(e); + break; + case SocketAsyncOperation.SendTo: + ((AsyncDatagramSession)e.UserToken).ProcessSend(e); + break; + } + } + } +} From 58b2e28d260566f97970946cd78bbafe0fbd432d Mon Sep 17 00:00:00 2001 From: UCan927 Date: Wed, 19 Jan 2022 15:51:03 +0800 Subject: [PATCH 06/13] Adjust framework compatibility; --- Mina.NET/Mina.NET.Core.csproj | 4 ++-- Mina.NET/Transport/Socket/AsyncDatagramSession.NET40.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Mina.NET/Mina.NET.Core.csproj b/Mina.NET/Mina.NET.Core.csproj index 01871cc..d797ca7 100644 --- a/Mina.NET/Mina.NET.Core.csproj +++ b/Mina.NET/Mina.NET.Core.csproj @@ -1,7 +1,7 @@ - netstandard2.1 + netstandard2.0 2.0.12 Longshine Async socket library for high performance and high scalability network applications. @@ -39,7 +39,7 @@ - + diff --git a/Mina.NET/Transport/Socket/AsyncDatagramSession.NET40.cs b/Mina.NET/Transport/Socket/AsyncDatagramSession.NET40.cs index c997f49..7bd7725 100644 --- a/Mina.NET/Transport/Socket/AsyncDatagramSession.NET40.cs +++ b/Mina.NET/Transport/Socket/AsyncDatagramSession.NET40.cs @@ -19,7 +19,7 @@ public AsyncDatagramSession(IoService service, IoProcessor proces System.Net.Sockets.Socket socket, EndPoint remoteEP, SocketAsyncEventArgsBuffer readBuffer, SocketAsyncEventArgsBuffer writeBuffer, Boolean reuseBuffer) : base(service, processor, new DatagramSessionConfigImpl(socket), socket, socket.LocalEndPoint, socket.RemoteEndPoint ?? remoteEP, reuseBuffer) - { + { _readBuffer = readBuffer; _readBuffer.SocketAsyncEventArgs.UserToken = this; _writeBuffer = writeBuffer; From 0f44b4f9224de0822a002911cb143bdfc15066f2 Mon Sep 17 00:00:00 2001 From: UCan927 Date: Fri, 21 Jan 2022 12:41:58 +0800 Subject: [PATCH 07/13] Framework upgrade to net5.0; --- Directory.Build.props | 4 ++ Directory.Build.targets | 6 +- .../Chat/Client/Client.NET.Core.csproj | 4 +- Mina.Example/Chat/Client/FormChat.Designer.cs | 70 +++++++++++-------- .../Chat/Server/Server.NET.Core.csproj | 8 ++- .../EchoServer/EchoServer.NET.Core.csproj | 2 +- .../SerialShell/SerialShell.NET.Core.csproj | 2 +- .../TimeServer/TimeServer.NET.Core.csproj | 2 +- Mina.Example/Haiku/Haiku.NET.Core.csproj | 2 +- .../MulticastUDP/MulticastUDP.NET.Core.csproj | 2 +- Mina.Example/NetCat/NetCat.NET.Core.csproj | 2 +- .../Reverser/Reverser.NET.Core.csproj | 2 +- Mina.Example/SumUp/SumUp.NET.Core.csproj | 2 +- Mina.Example/Tennis/Tennis.NET.Core.csproj | 2 +- Mina.Example/Udp/Udp.NET.Core.csproj | 2 +- Mina.Test/Mina.NET.Core.Test.csproj | 2 +- 16 files changed, 68 insertions(+), 46 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index d2de7d1..3a48313 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,3 +1,4 @@ + $(SolutionDir) @@ -22,4 +23,7 @@ AnyCPU;x64;x86 NETCore + + $(ExeOutputDir) + \ No newline at end of file diff --git a/Directory.Build.targets b/Directory.Build.targets index 346eeb2..af8dfad 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,7 +1,5 @@ + - - $(ExeOutputDir) - @@ -10,7 +8,7 @@ - + diff --git a/Mina.Example/Chat/Client/Client.NET.Core.csproj b/Mina.Example/Chat/Client/Client.NET.Core.csproj index 5c1d9bb..69f5229 100644 --- a/Mina.Example/Chat/Client/Client.NET.Core.csproj +++ b/Mina.Example/Chat/Client/Client.NET.Core.csproj @@ -1,8 +1,8 @@ - + WinExe - netcoreapp3.1 + net5.0-windows true diff --git a/Mina.Example/Chat/Client/FormChat.Designer.cs b/Mina.Example/Chat/Client/FormChat.Designer.cs index 2297586..f3be4c1 100644 --- a/Mina.Example/Chat/Client/FormChat.Designer.cs +++ b/Mina.Example/Chat/Client/FormChat.Designer.cs @@ -64,20 +64,22 @@ private void InitializeComponent() this.tableLayoutPanel1.Controls.Add(this.panel1, 5, 1); this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(4); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; this.tableLayoutPanel1.RowCount = 3; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 42F)); this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F)); - this.tableLayoutPanel1.Size = new System.Drawing.Size(464, 282); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 42F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(541, 400); this.tableLayoutPanel1.TabIndex = 0; // // buttonSend // this.buttonSend.Dock = System.Windows.Forms.DockStyle.Fill; - this.buttonSend.Location = new System.Drawing.Point(391, 255); + this.buttonSend.Location = new System.Drawing.Point(456, 362); + this.buttonSend.Margin = new System.Windows.Forms.Padding(4); this.buttonSend.Name = "buttonSend"; - this.buttonSend.Size = new System.Drawing.Size(70, 24); + this.buttonSend.Size = new System.Drawing.Size(81, 34); this.buttonSend.TabIndex = 7; this.buttonSend.Text = "Send"; this.buttonSend.UseVisualStyleBackColor = true; @@ -89,9 +91,10 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(3, 0); + this.label1.Location = new System.Drawing.Point(4, 0); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(68, 30); + this.label1.Size = new System.Drawing.Size(78, 42); this.label1.TabIndex = 0; this.label1.Text = "Name:"; this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -100,9 +103,10 @@ private void InitializeComponent() // this.tableLayoutPanel1.SetColumnSpan(this.textBoxUser, 2); this.textBoxUser.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxUser.Location = new System.Drawing.Point(77, 3); + this.textBoxUser.Location = new System.Drawing.Point(90, 4); + this.textBoxUser.Margin = new System.Windows.Forms.Padding(4); this.textBoxUser.Name = "textBoxUser"; - this.textBoxUser.Size = new System.Drawing.Size(151, 21); + this.textBoxUser.Size = new System.Drawing.Size(175, 23); this.textBoxUser.TabIndex = 1; // // label2 @@ -111,9 +115,10 @@ private void InitializeComponent() | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(234, 0); + this.label2.Location = new System.Drawing.Point(273, 0); + this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(68, 30); + this.label2.Size = new System.Drawing.Size(78, 42); this.label2.TabIndex = 2; this.label2.Text = "Server:"; this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; @@ -122,9 +127,10 @@ private void InitializeComponent() // this.tableLayoutPanel1.SetColumnSpan(this.textBoxServer, 2); this.textBoxServer.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxServer.Location = new System.Drawing.Point(308, 3); + this.textBoxServer.Location = new System.Drawing.Point(359, 4); + this.textBoxServer.Margin = new System.Windows.Forms.Padding(4); this.textBoxServer.Name = "textBoxServer"; - this.textBoxServer.Size = new System.Drawing.Size(153, 21); + this.textBoxServer.Size = new System.Drawing.Size(178, 23); this.textBoxServer.TabIndex = 3; this.textBoxServer.Text = "127.0.0.1:1234"; // @@ -132,19 +138,21 @@ private void InitializeComponent() // this.tableLayoutPanel1.SetColumnSpan(this.textBoxChat, 5); this.textBoxChat.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxChat.Location = new System.Drawing.Point(3, 33); + this.textBoxChat.Location = new System.Drawing.Point(4, 46); + this.textBoxChat.Margin = new System.Windows.Forms.Padding(4); this.textBoxChat.Multiline = true; this.textBoxChat.Name = "textBoxChat"; - this.textBoxChat.Size = new System.Drawing.Size(382, 216); + this.textBoxChat.Size = new System.Drawing.Size(444, 308); this.textBoxChat.TabIndex = 4; // // textBoxInput // this.tableLayoutPanel1.SetColumnSpan(this.textBoxInput, 5); this.textBoxInput.Dock = System.Windows.Forms.DockStyle.Fill; - this.textBoxInput.Location = new System.Drawing.Point(3, 255); + this.textBoxInput.Location = new System.Drawing.Point(4, 362); + this.textBoxInput.Margin = new System.Windows.Forms.Padding(4); this.textBoxInput.Name = "textBoxInput"; - this.textBoxInput.Size = new System.Drawing.Size(382, 21); + this.textBoxInput.Size = new System.Drawing.Size(444, 23); this.textBoxInput.TabIndex = 5; // // panel1 @@ -154,17 +162,19 @@ private void InitializeComponent() this.panel1.Controls.Add(this.buttonConnect); this.panel1.Controls.Add(this.checkBoxSSL); this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.panel1.Location = new System.Drawing.Point(391, 33); + this.panel1.Location = new System.Drawing.Point(456, 46); + this.panel1.Margin = new System.Windows.Forms.Padding(4); this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(70, 216); + this.panel1.Size = new System.Drawing.Size(81, 308); this.panel1.TabIndex = 6; // // buttonQuit // this.buttonQuit.Dock = System.Windows.Forms.DockStyle.Top; - this.buttonQuit.Location = new System.Drawing.Point(0, 62); + this.buttonQuit.Location = new System.Drawing.Point(0, 87); + this.buttonQuit.Margin = new System.Windows.Forms.Padding(4); this.buttonQuit.Name = "buttonQuit"; - this.buttonQuit.Size = new System.Drawing.Size(70, 23); + this.buttonQuit.Size = new System.Drawing.Size(81, 33); this.buttonQuit.TabIndex = 7; this.buttonQuit.Text = "Quit"; this.buttonQuit.UseVisualStyleBackColor = true; @@ -173,9 +183,10 @@ private void InitializeComponent() // buttonDisconnect // this.buttonDisconnect.Dock = System.Windows.Forms.DockStyle.Top; - this.buttonDisconnect.Location = new System.Drawing.Point(0, 39); + this.buttonDisconnect.Location = new System.Drawing.Point(0, 54); + this.buttonDisconnect.Margin = new System.Windows.Forms.Padding(4); this.buttonDisconnect.Name = "buttonDisconnect"; - this.buttonDisconnect.Size = new System.Drawing.Size(70, 23); + this.buttonDisconnect.Size = new System.Drawing.Size(81, 33); this.buttonDisconnect.TabIndex = 6; this.buttonDisconnect.Text = "Close"; this.buttonDisconnect.UseVisualStyleBackColor = true; @@ -184,9 +195,10 @@ private void InitializeComponent() // buttonConnect // this.buttonConnect.Dock = System.Windows.Forms.DockStyle.Top; - this.buttonConnect.Location = new System.Drawing.Point(0, 16); + this.buttonConnect.Location = new System.Drawing.Point(0, 21); + this.buttonConnect.Margin = new System.Windows.Forms.Padding(4); this.buttonConnect.Name = "buttonConnect"; - this.buttonConnect.Size = new System.Drawing.Size(70, 23); + this.buttonConnect.Size = new System.Drawing.Size(81, 33); this.buttonConnect.TabIndex = 4; this.buttonConnect.Text = "Connect"; this.buttonConnect.UseVisualStyleBackColor = true; @@ -197,18 +209,20 @@ private void InitializeComponent() this.checkBoxSSL.AutoSize = true; this.checkBoxSSL.Dock = System.Windows.Forms.DockStyle.Top; this.checkBoxSSL.Location = new System.Drawing.Point(0, 0); + this.checkBoxSSL.Margin = new System.Windows.Forms.Padding(4); this.checkBoxSSL.Name = "checkBoxSSL"; - this.checkBoxSSL.Size = new System.Drawing.Size(70, 16); + this.checkBoxSSL.Size = new System.Drawing.Size(81, 21); this.checkBoxSSL.TabIndex = 3; this.checkBoxSSL.Text = "SSL"; this.checkBoxSSL.UseVisualStyleBackColor = true; // // FormChat // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(464, 282); + this.ClientSize = new System.Drawing.Size(541, 400); this.Controls.Add(this.tableLayoutPanel1); + this.Margin = new System.Windows.Forms.Padding(4); this.Name = "FormChat"; this.Text = "Chat"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormChat_FormClosing); diff --git a/Mina.Example/Chat/Server/Server.NET.Core.csproj b/Mina.Example/Chat/Server/Server.NET.Core.csproj index 9acff6d..98fa6bb 100644 --- a/Mina.Example/Chat/Server/Server.NET.Core.csproj +++ b/Mina.Example/Chat/Server/Server.NET.Core.csproj @@ -2,7 +2,13 @@ Exe - netcoreapp3.1 + net5.0 + + + PreserveNewest + + + diff --git a/Mina.Example/EchoServer/EchoServer.NET.Core.csproj b/Mina.Example/EchoServer/EchoServer.NET.Core.csproj index 9acff6d..59804b0 100644 --- a/Mina.Example/EchoServer/EchoServer.NET.Core.csproj +++ b/Mina.Example/EchoServer/EchoServer.NET.Core.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 diff --git a/Mina.Example/GettingStarted/SerialShell/SerialShell.NET.Core.csproj b/Mina.Example/GettingStarted/SerialShell/SerialShell.NET.Core.csproj index 9acff6d..59804b0 100644 --- a/Mina.Example/GettingStarted/SerialShell/SerialShell.NET.Core.csproj +++ b/Mina.Example/GettingStarted/SerialShell/SerialShell.NET.Core.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 diff --git a/Mina.Example/GettingStarted/TimeServer/TimeServer.NET.Core.csproj b/Mina.Example/GettingStarted/TimeServer/TimeServer.NET.Core.csproj index 9acff6d..59804b0 100644 --- a/Mina.Example/GettingStarted/TimeServer/TimeServer.NET.Core.csproj +++ b/Mina.Example/GettingStarted/TimeServer/TimeServer.NET.Core.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 diff --git a/Mina.Example/Haiku/Haiku.NET.Core.csproj b/Mina.Example/Haiku/Haiku.NET.Core.csproj index 9acff6d..59804b0 100644 --- a/Mina.Example/Haiku/Haiku.NET.Core.csproj +++ b/Mina.Example/Haiku/Haiku.NET.Core.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 diff --git a/Mina.Example/MulticastUDP/MulticastUDP.NET.Core.csproj b/Mina.Example/MulticastUDP/MulticastUDP.NET.Core.csproj index 9acff6d..59804b0 100644 --- a/Mina.Example/MulticastUDP/MulticastUDP.NET.Core.csproj +++ b/Mina.Example/MulticastUDP/MulticastUDP.NET.Core.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 diff --git a/Mina.Example/NetCat/NetCat.NET.Core.csproj b/Mina.Example/NetCat/NetCat.NET.Core.csproj index 9acff6d..59804b0 100644 --- a/Mina.Example/NetCat/NetCat.NET.Core.csproj +++ b/Mina.Example/NetCat/NetCat.NET.Core.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 diff --git a/Mina.Example/Reverser/Reverser.NET.Core.csproj b/Mina.Example/Reverser/Reverser.NET.Core.csproj index 9acff6d..59804b0 100644 --- a/Mina.Example/Reverser/Reverser.NET.Core.csproj +++ b/Mina.Example/Reverser/Reverser.NET.Core.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 diff --git a/Mina.Example/SumUp/SumUp.NET.Core.csproj b/Mina.Example/SumUp/SumUp.NET.Core.csproj index 610b09c..2a46cdb 100644 --- a/Mina.Example/SumUp/SumUp.NET.Core.csproj +++ b/Mina.Example/SumUp/SumUp.NET.Core.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 Mina.Example.SumUp.Client diff --git a/Mina.Example/Tennis/Tennis.NET.Core.csproj b/Mina.Example/Tennis/Tennis.NET.Core.csproj index 9acff6d..59804b0 100644 --- a/Mina.Example/Tennis/Tennis.NET.Core.csproj +++ b/Mina.Example/Tennis/Tennis.NET.Core.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 diff --git a/Mina.Example/Udp/Udp.NET.Core.csproj b/Mina.Example/Udp/Udp.NET.Core.csproj index a1b915b..cbd9450 100644 --- a/Mina.Example/Udp/Udp.NET.Core.csproj +++ b/Mina.Example/Udp/Udp.NET.Core.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net5.0 Mina.Example.Udp.MemoryMonitor diff --git a/Mina.Test/Mina.NET.Core.Test.csproj b/Mina.Test/Mina.NET.Core.Test.csproj index e1ae45f..bcaefa1 100644 --- a/Mina.Test/Mina.NET.Core.Test.csproj +++ b/Mina.Test/Mina.NET.Core.Test.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net5.0 false From 65f387ec70f216d9b2e0a0345ce11c8131927a7e Mon Sep 17 00:00:00 2001 From: UCan927 Date: Fri, 21 Jan 2022 21:43:23 +0800 Subject: [PATCH 08/13] Update copyright information; update version number; --- Mina.NET/Mina.NET.Core.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mina.NET/Mina.NET.Core.csproj b/Mina.NET/Mina.NET.Core.csproj index d797ca7..c37ee3d 100644 --- a/Mina.NET/Mina.NET.Core.csproj +++ b/Mina.NET/Mina.NET.Core.csproj @@ -2,11 +2,11 @@ netstandard2.0 - 2.0.12 + 2.0.13 Longshine Async socket library for high performance and high scalability network applications. - Copyright © Longshine 2013-2020 - 2070ccbf-2ee3-476e-9715-54e97a5e26c7 + Copyright © Longshine 2013-2022 + 27d6430a-d2b6-4eb7-8026-6b106301d91f $(LibraryOutputDir) From b13fd25d28d485f961977a45414d6665c6abb508 Mon Sep 17 00:00:00 2001 From: UCan927 Date: Sat, 22 Jan 2022 01:15:38 +0800 Subject: [PATCH 09/13] Update "nuget" packaging instructions; update version number; --- Icon | Bin 0 -> 199977 bytes Icon.png | Bin 0 -> 22980 bytes Mina.NET.Core.sln | 1 + Mina.NET/Mina.NET.Core.csproj | 24 ++++++++++++++++++- ReleaseNotes.csproj.import | 42 ++++++++++++++++++++++++++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 Icon create mode 100644 Icon.png create mode 100644 ReleaseNotes.csproj.import diff --git a/Icon b/Icon new file mode 100644 index 0000000000000000000000000000000000000000..791cc83ef91a9b590aaf115e6725cb22018e3ab1 GIT binary patch literal 199977 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ⅇItV*T<5WUmnR&sq z`-f&#ou-fsnH%|GK{w2^rY$J-@>qh5+f$kq5^&8dbrt49DjO|u#V3C<&+7d2x$Sf%0{OCyk zLQ1^+!?RldxK74abIiZMOs9&8cLv9jV@@B;H`7d8$nkoaTqMT~yAy)*%%i5mKk`!d zXa$8N$8?m1=bEXeE$mE>l#m-!dono3JZ#zmQ*X&kB{$}FY~V>V*|a$eJ7hj{nM`Sj zf3}%K*PR@dxlV3Of06$QGm&2%?Yv6~xiR6vH@3}?%aG6YIV44|Y+WZqc#&Tnh_#ZW+DTuBTQC03y zl2gqnQw^^g%Z*7mY(|>u!M3s7nAjBafT;#w8Ox0cOg5do+&Y#U zC<#1j2Aj6%dv1~STqeWM0@BPNQ%&p~%Z=fsfMb-{0@6EWiQqCB!B1y0+XC`jvXGD) zBgBuJ0Sx515m|1?jgcB;nEs|3Q70wj#t89D(=^p6c2=yrWQ6z$bHB;4kP`3DT{1#D zixOMF8EXOLE*YVnZSG^#u8hbkNotJHK56cyy_HfzYK+j%G545iDlsNjW(+?I%$1UW zvtyYt@~czkZ>AbZ%!rj4BlvmducjJD*pQVOBl!7J;-4=iWX1^mY4aC)`?lxo@PgP?9W72a*yB2Q%vo82bo zDdUG3E=}$*m7sFdk>{z%J9N*q9hZ(EF~+GLdw^~_Sl;e*goRg(UTZPc3&hvk2V2TA zhfFn0HrgUb%^p)ts$pZS?Npa(OX1|% z9qo>WUoyKZ#GPvEe9lBJGIn;F^q{dW5)^op$)6wth?dCL9+sMf%ShbkIT_t?jw5Q+h zbh*rDuGZYEYwqmn?dcmKG3ItgWOxd@0Hp(_J*c2-ki?jK&K}b{@L(=Jb$;e8KkMtt zZZpLtt&SY8Hr1fJkC2qB?EPO(=x{36W#jxra9CD7#!JYc`M2~7MMdW>TsT))P||`b zTNyiI+G46njJX*daA4R}51^;1=Yu=Vr|_yh`X%o3n}O}7dIEQ}QgYW+5|uugCrwT( z0q0sOED(8($SCOB4joAvO&Av!?FOi*ecu&R!m(hS!eLj1o4{dL;FF%p2jjn`Fwmim-b~UuN+|CMl$ag2{ zn~p^3`TJH{jMLg|7`hD`S-aL@uz$q4ZrQl+ahY&*D|Gq`g^taY5m;;54xA^bP${W4 zZDu;|8m^IXs=0E`;SFe{NC!sNnf4Rq54pBM8M0_J(0#XpyG(nnXDGSe^a=_|zTCu{ zYD*xDZ3b0YNij|}Tkejz5eKWq6IY^U1TagZ?{>&}zQX~7Qk!ZhHAX`zfF1uv(>o;N zb`Q!6FAS#ENaM2*V<<#U^#s>ssP%M}dYn_GY(3!t^im+<5$Z^^MT*NElvC0!rTZZQ z=q8avw$XDz_k>CWk%bnOjC)Y&&*^g7W3z6`Oh||bY&O-iFudvt7CLGid53CO7806Vk(5tD%~!#osOnHSFQSV zf)LVALd=C4bCh+5<0ZL4#%YVrCNoUQ>~q>;F87cSljsabOH+u-PzNsx4M#Z{4-(;- zKy6Ar?jy)6X8&kyt4qQY&sgOAiEHP&7pE;LuL^FhKHTqAqZ&zwsf%=m2QWDg%7*V? zYp_L;Qz1M=1ghOZT~=2$n@`mc{8)IWb$|dXA?arA7_<^%oVMe|jqE!QUOd1WnMOA_ z5}eMkKxjT>KifUn-<3B&HNBz;K|Dn#C^giRkl;Kzf(R&E%o*A68p*YYhSXU3Fiv~i z=_-z=RBMkxG^(9^nCp>FYD$-dLUp9SyZn$)^^QQy{C<_FBjs|pX(z(HyV>-j`sZWh z!iu6AbHr2%tZW#k?P#f_jrE>}DyhFUc-dLRO6-f{tt$=1?8XFnprlsbn*LNhlZ*%w>geefwyC!!e5} z*8q9Whqr@2gnUH0JYblr*h4dq+<{fqL3j|Ffp^Df7W5IUbuW=VmCGmW?je^kW7Q|g4a+U=ymk?7_L=8-FM=G^6bCQ>a25@eG&mGjis zeY)2vd4P`5_UdM#T^uzcYb3Ne#ospEoh7q)ToI#I8x|zNW?8*LyZ12M0LzsJn8_E2 zMo@=i?hEk!TAF?2NVu6Tezx0%81|9Ao{ze@Rd|2i{$$Tc7F~5N^ z7javbqze{E1S$`CFo-Im{B5`D-E`^5fj+1B)NJ=JJcMcE;mBQgStXiAxB`X4BjouBTAT4_okvDOw!S_3G}SMJi3bU?BJ z$-61*RnoVEi|#<^VwOgqmh+;{j+(aQ z>vA4%My<)RiHC{g38#9P0alW<=&}*E0?r|qe23&ft41OQF93yAzuZ|mJ=8n5U zi=s?3fXEQH$JKX+juW5SeXwHBlw7{qB=Kqk$$*`_$r7Pl7clFl5(_P*hH24#F%?yf zqh_4mQOWU#Vl&X;Y;`%L>ZzTvJ;Kf`z;gJ!&D~vKiMBX0hVRnA7?NN{T>Tw4GO?bO zqd*O&b(r>oAveKD-gRN78BtIPUv&o732Y$BoCSNNj&-Fjo5<#;qnyrzN3Y#1t3hk9 z51+XpA!nB&yM;prOyxXH9efbyGTTgt=t4<=5^L#jwbkE@ccDwbHA**Pg4CyR7qIuE zbDHIh@aQ^|3K2AH!5!!RMSJh{*fT_4w>g~$PE`%}aqh0Y^Y|sne>o;SlFHeny5ssYhKBqrmuO6FTZO+FO$s zOVzxpoX)5+WQV;ev51R?6j@Xw0_h4lhhKFSTT(3`rm)%Lx$HI-ertCR-aZaLq=8lm z+5`HdKFDp_((ZJFR&Jq%!$D+&IF(#Npn97dYVVwlj;72j)#*%VV(!}84;*Jf!1*an zgO@WUR&4O{0Q33jnDngNON66)qJiWt4%<+DqOdzL^GX|#ZH(B+RdmJJb3m#Cf%VeD z0NP_==HPPeE-yZR{%mfnvy=@xhVaB7>|t+;amu>bAewbpAmR+k0I9M8OoeCSey^>s zYhY8_Q_i{vqil#3Q32fKlI$NBeboR*akb^OZB>!lS4Ag{(qXJjQUu*W!KtDsug>h#8-GUH1n zf3iEkC3qL*7OTM|8dfScM`;kB4%0-m1f_r>8fv@$dwej1oGz(t9oTSUYSfKEp5Qd( z6lZq*&`?hs>Zs$WGqMo5;nf-MJXk48QEaQzD=aqq+Cvyr?Fq6VkBiT|^dO@gDq(NE zNkgXNF3WrfGPhW?_m<1W$6Od+Z4ypCbgqD zdN0-)C)u+nTb+)K>vgS?R@#GHq0^Azc6Za|MCJwI5jNNP0NMvO-Ds%2 z7(RsOrNPQyNw(m!1@5*}ZkM~{j6B^-Al?-x+~aXvk8&QBtlsO9ZB9Gabc#mSBeO%c z*Bnh(Gh$_y29P&sb6>*(vo@o;K|_Y9jj*+?>udJ7vqBwawE6}#eO@~B+E@5X~G%7g*u+wfo}7e@YLL*b7yi-WMs+unpba9t2~f!qa2b= z#ay6niyNUY=d4tFq>_Rx_{MfUA+p)2-VhcVyko)1rd+{+UV0>{4K5tc^ly=cuqPcr ze>RIx=2C17*)NwhnmoN<+i@Q z^TG#ew75%h!l4$5dS`2kC0Imt-Gw8Asd78R6o`(X3|lA%CF8|uk34b)-ORf#$?1$N zmb~2Sh+(xm-R)E)uVy4)Kn|i)+T2~Kg5oU)%MGUm_h7a;xhF%dCC*xPm4Olqe0wCa z>0z!2!U||jQ&_KB;8mkY!r;3b_*ji>v}KWj$WXL;<$I&x**0~HsVwy zg4dlBO-nAz`Z#bl0-*p6e-2$VX+e zI4dZ0W0KqagHF-7kS0O!zhogqo)-4B5F!uvafvP+pG6zEVNSimV90$}UM`l9u)v`| z5t@@h2#hNi&G#JRAHhPb4kuxg9AgG4HBDx(spOOG;#8Aax9B6c({|uyC)8aHhoO%0 zV{1w}0Oy`#g~EuU55p0WG$8=~u=O6n1hoeox-x_T(hWke>=XB9b>l{fIb7Hw&Z$ey zf|5bD3pxxtw`%DDtfZ6p7i?WO;s8PIv9)GL0}_pUQMoQQ6ss+xDiI7h5ws!Ve7}qX zCXSkB&8sY&SckLoFO)Y*aQe{}fk>%s<{aSAzp2P#NEPWi8y$e3dVuB za*j{8kJKKE287fFN8^RGghM!fqw$of?nE)!(Di`H5FRW!MAygQ@34=!I@9_Xn+!29 z25=5J!ZI49!fIbyt2E{yIEgh#f#V}M8BR+B+HXW10Ok&?TAmOciR1V@HmuS(?6ilo zYy)CtT@}Xw5_k%iox8ug>H1Nc6M2Q&Jc#cx?J=D$>6M|g{%wL10m^}^Ok7yWekiR> z(n#;+3^^@@HSqwR=*%V{hKHQC@Bl#wK^Ii>B5{R<;vuz_GeT%gj)S0BK^ zw&8*(D4&ONV!hLmTh}Rx__)zzaJx(g%Fewgtkye1?l`h3;j#$2yEt$o`&f?ue_Q7s z+tisQ@Xyx{1*SvU3KgwJ-KwfuRTUbk+CR2hty-a~tE!`_D>S33qp4QAnyS@Qttz$u z%xG4-l$Lh-0OA-zl8+=LCJAu}Bm_td0TV((9vBBg9ym`(FyuwZ+llSFzjJ*Pn@<1n zJ?Gr(bH3*}=R4nb?sbe7Se&!qT#MJ&Nsrd`;JZ7&Nb%sk$`LTXAp}iD9ky zkg+3HCKI=H0?Cf${1xrWFY?`zChK7t+}}h;hX~b&yjs_yq}4c|t)XsNtaGyph={Bk zXkrE%Q$!k#Q7Y0~4=imJF9Tc@So6nJt!Kk&p<^ifGreYmCs1Q4HRV z**UX3&(YuDHDM5nEeBEIXsr3ePyeHUt_2$r|j7m(DQBjB8Tpz*< ziuHBgiIU)Qg+bReg*ewxTa$d%+nJc|xx)xEhx~E^^X(Mer)mj#l}8! zzMT>> zAg(hi`WF_bh7%gaHa!}VccmnXmi4+af8a{z9aaF&#KTEm&+3ehjgB~4D^~QTTu;`a z{9JvwwDMH_m2O^0;25i-2n>UTB8G+gU~azGS6$a|ZHOZ>YM4@V;eAFUx9_v+b3F*v z7G^z6j)O|Nx(HpmzOuf)wzizUSTTQjx1*`CEj&rkD?Zk7d`>@c_(UKyaCdZ|qtSon zT+5KGUuMFsjVF08eKKIOq2NSA=g`RDjmApKfnteWdzkrHc4=K(_|Bc93z-|6@m9JT z>jPJZnd8p6@cAQC6rf%|Ny>QQVP8{C*%9CA%bk6F*Dv};_2b3oy4fjPiiFM`D=CyH zljl~ZEBjh+Z`(lT=JM&0wo_hxsPs(J&0C#~l}Q!ruGi}h*EP3ZI_-^VSK+amnu;Nv zar|OSb3F!%iJAuwr?;Y_xIfc4ciOv>={j`u*wI|embrIoHc4~bdqtmS?bH$n^6V4D zvr`kELFEgwf2SsDlH+j;lD$*2XPTRpB}nd0EfJ0^k0ALZpJ*!zv0u<)L9HOc0YQ%n zD(h%ZwxHF5TAQc`1wAY1xUk9*l&|i6sqqK$Jh_$&bW?C_caA$xa1W|(mqxSYdbHr# zEd6)sh!pFP;D_*(cWK#c_2dg)X5rRGYk}Z(7Cs{43I%Utb@i3T*yVW+%M!&sXc5>$ z$#EA6A)7=bo?r(f$5SkXViXMog3GyCULl;cz5}BNh363=T$TmmS9(C0mdKhIro zoFCaYhjJ8yDU@z`<`@)Z<*@A5UGhk!#LKc!-(CgYgYt2Nb;H4+4g`7akm`&D<@G~&L0SR>&e>oP&&nAM z2E(WwY+k2S>IB?Wm6g?^6|dPt_>wl*!>0(cH0>1cK%CmyK{0unz_h*f@wbAx{LZ(0wS%G_H#lw{Tp$ym0ZZazzLwWwA6%TS#RB z*bu)sYe6d_c#;FybBf!AIlW-eyh_Md!y1OI1R*0*pQ*A369S)edUw`_AQ&& z^O1jI@uk~T_@{ggZ;+D7_@Mu-;^LPz2dOwrr3Z%DD#1BtY{{rPEljI1*22_97x<)g zeEcV^w0CVzb0{*!8$*5RKhEdKIxt2_$FuF@laS)f|{dlCJ*o>?q{ge^A zn`uRYkxUSR@JuNmN>9#y5cBik@(ZJNR*8~DqJh(jgx}A-M_I`nii#>ANNTni><%@- zOz}zFG+tJz9_5Ac;7v&B%$P8eEHH^$ZI)vVvq9;dTn`IQe4*Ty876NicaeSn7Kz5R zRNoarSFJn~t6+>W*<<6B@LH)!X-O+C66E_GVHCTcUO|F11U=};sfo8pI*du2ig4Bh zDy$ovQ=TxWPwPi}1|{>TT$we&aVD5O zbFFX7pez}I3CW=+vgsTxvcAPx&A{euQ%bIo9nqpO*#P&9JSvyQ%ZU6`uK#D{GSIy; z@R`{XP7@{X%)zB(SsS84-6ABH!HYB%LXpbhm2MHLDy)>2WL-sH5I^&$SCx4Y{kfV> zBxid>I$5}TW$rL?Sxql&J`PsBYkpTp+yYD|xi-s+lDC|x0fL0G24zpv`nG5JIAY4IvsZ+8(7-Gm%BhC}E2Sk_Hrhs_Icw}VArUsi7z4{V z%;`nVUGJO>pH&n82xG-QF05NP7URAlXST3$eroH8RAY6e>0nuSG_b)pguYH{{$cT4b&p^e!Q;TQutm|w zQtKc$c*RnXsc-2IVjk8!qj5-S5#_})OG?cMHA1Ap5)CB4Z>6+QI3)U05`7eDt#+)T zydtaf5t-7Vl+lHwV|jqh@)wyRa$Q8GEXF;^WL7w4&>hmVqiij*MQo+Cq^c>!rmr|- zigLHwZ4#f-;S&dzA;IgXL@&|0v@ajgbiu{GjN;lkbkiU;K=HdqtWEE=mKGly>;KP^I3Gh$j7G%+4(H`kakIk>8hN; zCZ9!XZREJy?R*xUr&W%f&jM`cv+#_a&%(d$d=?nXA#w6q5NhYMP#`;>g~H0Qb3On= zMeKYQDme&^d=^?@0Em1R8cfdB3RJ4?d=?to&S#+$dbvwJ3%%F{L_P~0EJyAynHT7L zQLf~(FjB4qkU|!NS+F@!tpGBY2S0R(nqR(hMpGDW|R%qn2=(F0+XVLZA z&S%l*wPYw%nH@Ty?R*w}Nmxoc10R6Vmvuc5`7HX1kk5gT&!Ss(EfD!EIw<7RAjO>Y z3h8Pf@>w)Wj0G|)16>7$d=}R8Jm}>%`7FdiTqXov08Ty& zPneo~7VTsRqoTP<;Mc>=EcFkYm3sZzx4-|q+X9DZW{CD4XT(L{9m z;lkLB{=S9-KkWN-+t!z!E>yEBTRpKwy|LquRb}mCgYpG?lZD%)xmltW^K;Qj_B`}Q zTa2eSm+-Jwk8f0)KiE;)&^|}Bnm2Hdn7>RcEiVk8JMh1sy=Ew7RPb1#+OSDIzvFl3 z&QC5aO_&4bhLs0ngN^_9*7~haR&w8~HW=!;U%&6Go0^H=GtuISb>@S1{n?IJPH?+K znd>rM{-OBZcw)rtGS|f)^jysTc-u*Cm8y*2{-O0|EI!OQ%;1gR9p3jjI;?zZ-P3Ak zeq=r|zz{U!&Ii}Nd$yJv$JKg7y_Mbjz)bX!ec@c5sQl2+jT0(klltB_ztAJe97{p> z#(JpLD&v{w^V*_`F2*45(k|O^0qRNR{4jfR{)T)wC9!b+&ljPcQ5i1vNy)?I4*BlN zV)w2W8==-J=ga@v773aGc!m#bZ-VAm&d1+9KiO`cH(e_?_H19@0))h^a>+4BR*04+D79l)CTi8qHHYcl9qXbU?eLjPGv88_XK`jhAgxMkmC}%K6r*c;X`2 zJkDs#?=}goNjW@y=gImp9-jEOn-E%*bEB(muAclLSA6)d&lo)rTb1#`e~q0rE0Hj< z?^i-~d~o62!Ee%w6Fo@(!o5eQvMH61ex2r%y$ z1?^VqYK584_QXqfL3@~0ZdUYJ6Umam?J0ARg0%SmW&1|+UpPmF6RK?~2)98KE^#E*06`A`vxAvSM z!|E`Iv3&BmX|UU>(DZ=iY<>uKM-`B;X3XqfKVxHV_OM?QWJKkgZZ?Ysx6Oi$szc^J z4pg}2K<+9HVyx_Q&4Wc$p1GGE`eNOJjqNcVw|^_hJ(X+jfya4c(Z+sc`{Y|e?yDU0 z2X>|Yumm!u4w~N+7h?Bi4|`w^tFI+LD-xsogw|6)SL z)z|zVWMz9A68~-$Vaul(Bau*F@fb*CV;ZvXY8sOG>ng%g0&g1J_N4uH=;Oauyrmmf zz|q%JaQsg;%$9#n3Ottr`;<~&@<$$+N`dn)u2GlYTLa^NNrD8p4y-|yYf!^Z_;4>| zU;FKA#J*11*E##TXkVA@Ys|jJ?Q0_aIt%ZenD^8#k{)>ieD$BJ*A<(?l6{@GuhaJR zzI`29s{=YwS_59qYf$wXl%IrXtHf7pVC=uw!00QTG3ck511)nfd@b1+S!64$l_P_&~dMXVGG1ihplC^4S+E`7zn}$5xl7?Ja zpF-5$)v?ZuSouvFa&L3ooQ>$}`*_HS>ZQecDnnK7QvS%@2xldA4)iJ$w^#+sp zq_K)H@e>~{+xh`yY-4P1hv8ShDpKT4(|-lvGx%Gbm z9`5EZwyKW(5mLTRZQpH@1;=$!K%jHhG1fT_nMB2hBT5`W^D0@WsAjvXLA1NpT$ax zamRp1KNABk2(~?zzgaNx03(t$)PdW%jqW53KClKdhKX(7$#a&2x5{|hYQy}7S z;A1TRr}!A+ir{_3KNRmnoD`1ZeJXB=xGy<;W=8xKfpht|*L~m~RSql;PPg*O@&u?$ zRp9rCLv&Le!yOV&sZ&+rCy5JnLmkI~67Nc&Li09IhpNKK5~nPrs`06=oOEWmPZBFQ7~60*#+kTP|P%m#&K7L2l6koooPqPUCQBYRF zjiTukq9uZig3&NUheE;;G_kPJvt=~~0~ZlwbHaD>=~~UjBE!E%Y3T7@kgk_C`+8lT zpT91>b{=LQzD;>fqxz#`&?FobT7mdfLj?JkN#m4d2gkbnA+Tk)pvce;#{12ohd`h! zNKX$xmpYL*aIHNE0_3pBLWME1{V%9pg+>cRmH^tKz&Jz%$E$)yS=2|dK%;n|I<-bq z1W+;vWaH^0P64V!2A$o>2}6UHE0Wf6LCb|i6>y*!Fermgh6+No17xTXpvnZ%+YidG z5~W~)>a79$>-^%7f$;Bw2D!y*$D@iGg8VbYnI=GFybvG>63j_RG6l$dwz;0I3Im6b zR#`BpcRXb>?eiQbR%^-(f&0zX)(-hjzfHZk5iUKN8T=kac3KuCrtBf4!W0q+MDRS@ z_rWU?e|WIBePDKIb9pyZ_+fozPa#Zxz4_4@4FLs0Q<}b9HQ3+(1L-gVu5<0NuFwUo zYJw~_pY=J{;PbyC%y>OVdGfxAlH?Ysj0zGHAs`~2QyUj_vF%0)|Kr@Y--_~k0Dk+i z=5+;f%oNS2?kx&>cQmqdt5JyJe0hKuiFk znR9V?K7v3=Jldw;bz1_Q5eZ`CHfbW9fxCmp%@xKw@T2LrMzKw z!s3h36Mcza8ztk2e2eUqVNVWd_yV~A;VRlzPD&6tobNpA!iB2upIT@=OVC6jA zKjso51*Z8Epk^iE`>Q$|j6Tk3tmlV}JMH8vLus z(h^$YQR9^pU&jXaTCn(s!gmzl3#n9#lQHDEzl-ccmE>`VXXICYnXJfNfU6AW&-*H8 zoA0K=suos($>o|!J(-0gF<#7Ev^bM#X>R#w!Fue{4!;pZB9%6iHfMbVdwh5tbmxwQ z9Euz?B5O>CZ;kJbUxwF$&zhl73O%2eF{;kC#6g&0o{pMsuc6KGz~Fd$YQzNOL{jVikp@C!IU7b}Q0Ix2W-rc~Wk<5Z@<7!-9I zya&FRAUA}DNau&j7O9)G4CBX;;|z0rzt$H2aCzA z;aq7}WtL!;bKp1$Mj5W(y5d{OmY*V@LZ0$whGZ6DuK#0IZC349{b|)}wR_e0-02+W z{B-rw)gebThbiZt-OVt{OXw@ z>0En@2`Q1v9+HpZi5f{=P4yXvPE|~OtV-7u*7Vf8*IcTS`=fWtbZYxY%SMGzD+?)$ zKWqF~d39Fxpj(#hCe{vC9Q_>qy_(%B``OzW!dd1S%sJnK(F65^?ZY(j1Q7=D9|0Eu zA14>r2{#*u&eP&;u7Qfdih*M-b3*e1=bT$^+|tkS;}~gfX}D^(Wszled0yiw`ve#5 zbItSjMOhtL>(wi^3mX$cL%u&>6AKVo{5YPx|4M_@>0aXIa4IKmB0mF(Uj4h4?kE}!L zlw{wFdqena!ntnFlsSw28!iX?E8z><1dRg8AN1JJX}C=^Kl{>Wh2x1|aN%1rHsP(L zmiQUC&%Rjn3>=j#CtsS>TpV2AaeE#a_o%M7Ig7S^aWyGq19;QMEBS%WCy+ zt!xeO2z!#cPQ!4)q=G+>*c)6P6pGk&hB&mzpmg+8yDg093(kd^Qc#xx+^1!Z^ERo-;aBg&(61N*ft>wvqep+H7Y1L3asUf9=dqC9<8!nvR@ZCH_bjyo+%Ln zaeTVs>r`6n8kbu=bgs83dZapVD5KPH-C5Z6RohKHEU)H#$1TPiQr}f}v{f~3tUT9m zVpW6YN=hUc1GTtPDw4;>?P~76wwYiXrI>15TBR-OYW`rrO);o)s4A~{s*`R#*wIol zSoFE~v|U~OE8p__{8aX|_|&fIQKzR?zROB%aVGQ%xtj1gW}nc&R{pO`ftS^N>}1pA z?@35*BkptEiCDh4izC{Tl#uoT{nS9pS%;=$I z-6iFFZ#Q=lxDiKSOxWIY;J48#^Q<)~n4V0~b6Gvi0gJ>03RC*vG{k82fkk!`+E zLD%I`bWslRH)5IYmVbVi?7JqeBiwOXx%oMCLf6lGfl0e%re(P~N+LoF8S9>p3U3+K z`d{?B%q6CCMQ~j%6j}@($8P@~#_3;mI^0n_8n02ee6AL%5t8w9c;A+-)wMtU{y2WF zC0OHfr+6wbdpZB(#j1DFdFg41ML*B8>vH&vu*HsMgQ%6d{r<`A;T+c;;X+|u-z(0e z_N{yM{RH*}_2fs>NB#F++pQ1D9n?z{_^{lMvZ|EqLzPza)h*V z%2VjN^sRbo&G)kPvVC);i!_7oP4q+McJ{?&q-;j{QTWj30nv#m7WNqUacem9n=Jj3!$p$C7^P)%U9|c0HF=+xX!y3Ygwx8;?kJ&0HU5%nqA#;F` zAeTX+C}haJnoE1tAQdQ4)cjuV3|mle%{0G$?Y@U^-r%Wu{nE5gZ5|(sxTD0;eWPLj z<{*fpD^>%=kQ$V9%KfQL&k;R(*0s9~bOynOK(;AGXXVs^Nk~-4i-Cc$Bwr2X0PByw z^zXT*N25dY4J(b`q4h%CB7o+fu)KMF|DSTEBAeM3u4&^Z?@B=5WTU>4`~{2}K)G z2==~ba!=^@0j=plsb03T&QVbXTL{L`&l!CY}2+1f#f6RAZS&!9|`wraL} zw&Hx3i^oF?bgP_#brA8N2Ax4&xpQy@^Oi!ywU6#7%_u3u<0l4xGFR1qv?e^NUf%$H zq#z-a$7;u=AopT|QiI$EBl?hLX=Hs`6-QlbUY|fm@sB+q3z`9maLUYbXCa#&a1LUk zM5yUkQ7C?&f3KhmH~RP<@Un7fD4Gmad|UER5ep$-4ANLrFq(^=EWH0B3&b<1_sfi& z7gR8>IFDTSMPh?{KrB9)2{-4(yA5tY75GXE5ZfKp6(;R5_)p;wML)I=c8MX5hf#fd=vs!P9b zL_khrxMSpG4g>n2WAYhGNCEI0u9*k#s{(B-aemAG1vK%f6hsRg1bw_9NIBr)M<=ou z;UfZhY(@yKsD0mlkZCzaaG5BMKZ_t2YHwq{+Kah*NJEA!Q5M(-vzKN`LR1~5&vZcs z=14DH71RTfqwq;M3C56SyM^V|rSWtX-V#j`0_;x>`UbwD1^o=)Nf(ayXL)eK5=E|A zyrd!v$59nc`%(^h#c^aTzA?Yzl5r7Pgy90xBK02%=7KX8OhW+sAojM1UCy8nB?N23 zdLf>>iQ_>zLcqG5jVy_c_;p5Fe*Nvxjxizx@vd%r(uL)hw)kqh zrX;iD0ny8u57{=#!`P=zFMDBNjfrZSN-U8K*5xvdVd)=(apfQ`Ymi$o#vGX}51rVn&<70vJ^3-tl__;>PXG(Y zPqJw;vBW^s_JRji(Zde3op5%yAe0k|Yka6N6a<%lYpD9uE^}lnRCDMvuA=a8rHHNh zkV79M_ph5t`^8DnWxxU}n3x9Ik@IJv$=o@Bd&O^T&=s7M!MtGpKa>T1o<8r4@V6W8VSAzb8@Q%T91fbp$UNrfqEho7YkwAP{`Xi?_YdFVXF#@|QXe?8C^e2cyK{zv_ zNKhwidk8Fftcu)j=FQgJ?;wibL59O(@cjK;Msti95xm)be|vY;;zvWa(D%jIZdFkD znMKH*bTLABvkSTtM#{(%;6<2`g-=#pERp8d3 zfKV0{qoDo&^`LASfj*mKIPw-fe-{+SrKkX5#XSKxfYku%gfW~_AVV={>Q3Hi8x1=9 zg*HLtAc`ycA+*yeMR=)m5WSyv3yoFmgdTBAmTsvH(O#yqK1!K8xE(zX{e>lre$19U zoo_4P0`HM|kUq=p>xoylf1tV;Q7IHBf;dPSVwoo=d;tIQORr_(bAaaH2c!|3}a`iN$jRg-|Fh~P=gRwGvAB7{lH^ES6KA7Tf!_)XcTzu&&f&w7!q|l~ zgYsZ;{_aSD8OE6*oy?j~rbyn#3^h-3obRkNhmpXWJ;qz87YT_@4)YSGIco5g$zM4^9+C3UcoAs&0 z%|wTkeksdVQ3DGiZ-GI(Np6{f-5)8%!d6Qrlsu%npvxYbj1PYhN1Oy7 zs1mLJ3*y%9uE6mA=LY`w$eK5@*KYUvf}!_gNf1~&zfF?`9kvC5*jO6uDdMxH`+m;lvp1ZrW`ZV^h(vAFrzdY=l)`1mb?T z>#e_TEXq!&cz^RgK2~V+&Q;A?L76Qyl;JHG7%=(FK70ZS1fPT~!+N!J_%gQmNDS%H1jI0ggUuVo}0 z1-wYU_|w4j9|Lhj!rgpN9w5(o+7Y%Q?=^2YN)LD>7CZo5_su zMqaJ{tW<3{gmsbM(V2VuBI`D!uS!pwuJV4P~!0SOWPuq@JV(SeaJvTBlOaGp<3 z%H~1*x}H7=C>@yZIaWw6m9tAcp%*_XE$r0`N{m2h({}~O>Z~uTGUSPH`J?erZ`}Yo zTz&k@6}>(FhUbc-t-up~XFcms4ml#y78u=$RkivxW{p%gvdISjWo_7SK{q~=KIF?~ z2g9l@N_54Yc1sryy=9_YjJaC^223@6j-o`J&cNe1-dv5Y{k4b7c z7K*U`7{uLr@$gm8-J2O?_?U(KG~d(k6D{aZ^!tyF@N;FRo?n??&y1x0vUJsB5GzVp z@GhWVr+3{c=k2t$TxKnF#g~MWr6S}v;}tpm%U0T2??YL?)pt8Q59BWK__v?LMipBD z0dmckm=%e{bsStLw_4D-dg&ns8H@&TNrlHePK2@fSL}3q&i)p1TqYKKr#6xB8cm^4 z5kw%GYEEfu^n}Yv3u9X@38>VCOcH(?;8^%6X0T=@Gjk?u(T-@~TNxew z46o>l#Zc#?MxCjAFMVcmB@-QO-oG6@YbYgCgdp?J5nrhc69S!7qARofl@P#Vl+O9^ zHPTz#npCyI!N{zi_3nqzyu|RBrjwBRjV2->3BhnmmaAAx-YX@_?%N&By_C`yTI5K` zpVVI0xG*^@mzy@40=d2pxau1O$qT0BwM^LJ?4({X@Rhlacka<4-0c1L<1Rd?+jk#4 zOxn5#0W*(02Uv`=KJA~1FJDIf<@Eixx6B-c2~gZ&d@i5L(SQ8gU@w(xsl?m#*rt&c zzw(BY6jW!Kkg$`pl8ja53BHW;M7DqxV7^b0m4DWW{3W(B5FMYg2df#XV{aAwnU%kHvK%mXAL_ zXvOfm2EU*%^Z>6S6R~1txl*7CaJa~Xv{25=(Jfav9B9sl*FR!Po&=-Mm7~URlDXar zwjF4PVVdJd=Ok_o>pH3q@K9@PnZym`p zGJbKS(NsdJ5It8GA{p=IJI^97d|2;*Y%BDvze+g!e;dMW-861|> z80#&3`C73?!ni=96u86p+5HLc93gl^iy2?=dxkNE?joml#W{_`1uWr$1%Z>LJ~2HM z+Hq)feZP+u`BppPtc68u%=2&$s);JuNmt#Su&OulSqMj}ZHqV?hJkd5%}=|Fhiw^T8chg1?oNrQ|WiCJs2Tr7>>9N(T< zDx63*&gbL^dFn5^+-Yu%lb|~&YGA=-Mt*l}`xc?#zcP+c@3PCJ{%4<@S@(cFgBNV< z$Z?~l(nhu<;QfQOO>)yw?;G*`|`NGmsTd_TB10eFi?KqlPG+pY)zhk z*cT;HWKELSzm(esc3ny#?~uiJX+H4BY#87mfcsR{Y5WbP5=ZLW?3BQv$-u_#u2VJE z&=ByfV`zUg-rzJwqBpuxj#qt>m0LpDWSl&?vCwi`<|ZVQ}um#q7*wBQE29lOXA)0 z_w&8dZ%XVq@Pgm*Zq(UR|7x=z%P}Qh{ePC-SEsa|t})g>{94V|?M3}CC2rNzy1&EY zX=lmF!A`ZcS6|owwrj(M*vr3ClhDC!==KKn+b2ALz(C@nLO{@AMH%suqH)QNbKX>d_EL^Oi5H{(U8ux$qK37?L4*mI!hNhxX zKi)PoS~rV0^IAN`Po*$~r$X?EU-oKS>V^x0A>Er8r5vwES?$7)T_4<|+2L-^0^IIe z;*1qag1%TsWJ&PjTo9(UC1Nn|q&v}ZP^p;xj?bhpuXmuXK=7QrN`f zt$L{0#Y-B=<#iZ>TO_?yX&18z%#jUn(qD+2VW_U*;OV~>;XgBWq|I;9xCWN8m&zVn zLeytyDV1YsKYX1BN8A~SzL#R1UZ!I_b$*cF_PpS{PyHjyxn3eVIG98{ys za#AbVXZcg|pZ+@@8Kf^LQIk9Ve(PMv&U($&1Q^fF@z!=o6FBd!_+cUz#=dwP&8pRA zx(mM%f}^7K_#`YNN+9%j=OSkNX5Kh;dm5JQFBIvnYCyD#=*E-P^~Y^zE)bh-$K2DG zr@yAf09N|<loF*e-^{Kiw1x%i zKBpjk0v9e6=xj;M>t=I1e-1VNid}aDe6#40NM;T8jz9I}UFM%?g=AvAyBiT8^{qPZ z^9=H@Jy1g-&)61Om=y+jQS6fgV^3x6cH$X=N9p11Ie@hfsWcbtjQq+(eV?twe>GuR z=XDbQBH`#-8rOft)gHT}dHz#m^VFNNjYun{7HgrJKBi}N^mE_aB6YN6OR1Vrd?{Q3 zB4s5o1$MJoZ6bg3?Y9=HnS_Y+ILzGM4!<50HSr*(#k!mPtBK+TPPzTxWNn(>>Npm; zJ$hPDR|iEVlOt6yH4O%0{sdf?NA$o&FQ6?|P>=h+o&%z=Ny$N!KS!y&o!dfqF{q&X z+Mlv;G(K?W83QU#Su7EwOL_@8Okj3JaL|va4eeGl#qe1%#j#7~Gmj>lD)_%c+~bQ> z#6a8-g=OTcbzkViw1)NktR~3f6q(H4aggB0jMBBVhyRM~J`F47=y>e$N$K2r2$z&c zLS!n}$anW05l<=?6O9n8PSw1#6}<9Yv5bB9uKSl9Uw&suz{WwZVHrW?U&rMtlq+b# z_T;>tTO_tjL1FC0Z_T9tj+tIn$#=wxN;I7tzY4Fm;Zuiy`& z1gt@$@7KQta+L6z&TReyYRKiY%w@b=*g(XesGylxd~&r&h|oMpen@ z>!Gm88A}B}(%*%@qvILkWyWEtQ`u|BiBI$A)7c25uQCZ&q~v>=wZt`ZQD{xPd2#TL z3^OTH5N~_8X9A3ODPgjoJCPxCtp4=Ym1LPwJ8c@X_@A>hQZwzyrXy1p{oQFSF<;Pe z_=r;C)iDhb9nDflLkSx&;x$D6${G4P+*iUYJDt$@NBc?|ppG-UH-I}6dBoNJAVUP$ zDZp&@{2NM06SNq{w!tl>=!M9V2mix+*|;Hu7?JbK%PBX_T~qYn-D-}ZbYSYD*#L2| zQH#LLCVMELlQPo2GPC897qC%>WerZz#6X^hym^9E!1+Y8fCc}B^qV0)_OUFm7jgx-4@YluTP!3W7tOV zFt9gV@E6Y)%?-hBS&;f#(($^P1gbMD0qz6?cFIQ&o(eRwRjo8h^>gf+)=AjF(#^Wj z`|TqUqPXwOU6aI}XxFzz7R=>(8fu9)IQ*0@nu@;uLaF5A#?8cO@`^c*U#j?+vR$5% zz?7X5+uSlWd>+R<^e~dP%P7)868Fyu^Wx({KGd_A^wYECxfu>!@2(@c){8sZwEmam z(bETtI;bG(kR1p99KY|L-}OmuPAVAu0G(jK0#}5CA9!%&F02isb3> z;Q#7N)tR{Lof!ozjX0XKWGDNZbOpQ5emVr!K@1&};HcTqsF8L&@R#de02Mf6 zJ^!ID=?SoQK#D9s@Sh&q;0P$dFgBS;TZ}~WcJ&|^1+~Y&ivrAbJ5}Zc|AX~Mhfi+>z2Ofr=N5U5unxqGAq=EVE49FqKjARFFGgzh+n{qFanrk-F{z4>uE*G z@^w%%U7mOKb>fiCKt)&e=x9pVg3r;BNR6cWW%86QdZ-jhBoh4TMf9T0fM^-NVOEfK z!Rv1}lpix^mbZ0R?Ht3c00S}FoIqQ3j*(u82ON1B;+xdB1L(Tt* zzBO=>K5qxq9U!ic&&=8L7K5Gm1BQ1uqFa&c6+lH(fmIODRc0Lq^Nc@L0-9_*DY6(p zQBgaFQ@#146rUMWSK=HL-1mb%-ulI08h<>ttl^>ErsaD%3eP#E z7o44t3#kk3ZXuS(|8lM6xs%D3KaXHTb|lOg*siNFbQ9RXA^U4J5R)3}*YpkV&h+r( zjMbeZyZ48Wn+PB&U!KyaoXCL-jZaAX&r;I4b(XksRA-$UIisF9SPjz8EZ0X33yQBy zcH|XZqsErNw;qWG2oBmf)C}}kP~;MdHq=2R$8op>-8SWM7VZ0_YfNrq2-_{##w>L=U2Ht}ApeSR5KR@jw`Y5K@{`53b8R_qacN#rt(oc)w3Vo4RN-0*Kgw{GwAW1-->=rOfgL39mc%N{QcR zE}ukVVZ=2^fK_L#aBL&G+R>ZlsO7?Twf_7Ca7-I<_QXrE`fQp!6=JFlbj~ne-bWkK zv|H%tNpOubK!|^mjc?O%3vHCP2Ix?ZV z{_oDtEX%OD-(A?6kTBGJJPB#H7XjA(ny~*s0c576sxUtRtVHE({mp@urp$h^FG)>y zlIWCJ_3G$}*7kKpK5|7-ME`H3svc(+p7ZhnVDb-C+H#lc=z;1Ldc#xKAHwZ@qc1n! zXnVwL0FO)q@wRR^%o^fb+@#fGg&U1BrVO>7&_aljiwbPepNYzE8bSnIIcEW1%tKeU z47z?}QB=LoWlQD+>M4XD$|CH{Sf&SP_}Ug(SmN~p1{3eAr-0I>{lGJ&z6GDimeG3x zxH?Yo?Uxq$TIwz2a>s3;0j!B;H-r-HjGx^8Cy$XB9Ym)D{qpD&?%StiWxPj8{ZX^Z zs}Oa)HHrnMDH*`d1$1XYD+44ow+v>`Eu`so1Xn#AAlemX(StU|x|V*DH!9io0}~Q3O){YA=_;ng0mS@|Y^O2@ai}3= zi0_%4;%a>NplTer5FLL8bLHOIMki(D?dY5fu%bSn!=A*{zP)*cOC048)J*pp*nPH2 z#ro(B!}q+tohdsUEf|d#2T&29!m|Bg+BAmMpZaK?n@yzOdOH4{{EOIkV)M2H{}NJ- z>jcq^lICqptAx$U-;6)1IZoL*i9+OUnyRUZ% z?N;OzIooqnio#@KL2V9AWrClrEOfwsV1*V`%<&6ue&<91a4_zzNxooxvhx*~khbnk z4a*(F>>XSGTi$PO&jm#_b0YPu{bMBCUn=I`Rbv;@@nu&LkL7M|iAOWw@`#oZ04^r) zn-M3#Ne9F6a^L_$_xI0id~A!)XAR&X(1Vzi7XH8W*Ar@P=(qZGgxja2BD4FZQLJ}oycV#=A8vqgU-}HQMerlo+ey=@o&{ZkF zaaFZ_B%l!(Ip6H&dGaoXGN#uAd$gD*Ot5e=k!VQaRWoN}=! z2?ODI*aBXUo9|Yo3zsN6SQ1d}jlNFkGM^v6v}qXWJu-U(sYqLs|o zSfuCgmS8O!cgYHXXp5Gun(sd-1>ryc;Ex9EYxL~ z!~rpF=xB;Q;JV)UdC%QoR|z$qwo=rdb_NdoY4XIZhY5T5iLSIE$Wfa=BSMBA8C?G! z#2$xQzE-xT)HS0WLF)UH`VY-gKyz$B)Y#V?YfK_R}1FTAyf51{@oAk zbexzR$1#xk{Kw$~+YUPm-G8i;dMGwHXMh`yrE`KQR{1-I&a(jq= zl__E{ME#l&9Jjz^*=wDLcdXmkN>*rnYHgBJ+F@P1Y^)QmUb7;RF z0)#y`KON{uaEW6o^L1;^abek)tK}9fwV}PNaRjN*+dB)%H(p*$%WV zzis2HQM2ByC7?a~j$OR4LKcl>4A#nNVaT~Z!+gh^n>A|=8sG0l-}hupgab00|Ga#~ z5qI8fN9LX%R`!fmY3zyv51$#b1(pKamlq+E&>P}sWV z;Im6n17I*EBW`aoB7YnEY~MF_*06iujA#1R*EL4R#}=)^XBSrftS~nI@*p|;fJI~2 zuz>(7>bjMMHU7w3nRerEK6DVtAUY7+i6YUIBrQs{R##NNyjPfM{^uC>6cVlJdx=~I z6nP>+;gEt{M+aV_t0%n)U7bNT2^TBM;n2I>Fb--(Bq^_>$lbZ?+;|$f<)s=PfX0(A zUO5c6B`iNv=FCLn;Wc~%yjvxcKre05KOO+qi``ayQ)e~1H0?2Th5xu2mq40JZzjXd za$7JOgW1H$*fwK&eWCFJ6bha&CBPvy;$U!+kby`DxV7lk1ONm8tB&-c9*{+jtDiM! z$y7x@l_{|dZT||Pb|METYO&ck+e}I5q}52qyKVW`^bxvrLJO%<54{PUZ+r7jeZ?&t zMEX8p?1mq^yGzsJi`B6is|{bpv;04-LR4i2?p!_E~&3}Gdgwu&Of8;6B>+~#7mzJiFN+Fk!!a|nuqtS z#QP85GgATzD;4%q>E2TX;7Wf1zW1EfVnUrY@AUVYGew3Shq8X}wN8?ZB_4$PI&d3} zZf`C&5F*H$LYVH2vD<&IujN|I#J9zmkk%b7z8->|WFN;oZWlaj8D(DRu@UlciD6lX&(EHBLK14-4KZ%PV z`G=v1i5L2;e!;p}o%^0b#QM3cTwaJb&G>%*&(sDdZB^lT_nL{adl%BAtMEh#oz4CD z>lfk+gg7^Cd{sb7S<5&uw!sY8AlRNI-9K6Y-?%d7>Gd*J#z!A8-}P!!aZ_A99U9J} zqvHr>Jql@ytvgP28MWOv513f{yL@< zRiXw9II_mGFC3;g#ZSuvLYOZzyyO zV~rW<5q+X>R+Q3g>^Ul&ttRwzrQwFn^+Q9B;!}}Z(O?!YhAQb7L6)2GIhBqkv~iwE z@n2e@`=Vu;2@>Mht!xBLVu*LDf-Gi}<5JJrHhJ2pK~sSb(q^S4Ud#U5ezu~jyCd{- zmnSP9{*}XKu0Wgyy*?KWZN@zMJv|<$5qY-=CNF&5!EjF3@mTwl^){)$l3>TbFzea5 zE#2{jV@d6eT?lfaPeX?tl<>zbI%m8OW7tGbuhgW**x?>eAD>%j_#KO>n|8LG_~^=I zWgHc0fRe%Wwdy0Fd(=zJp9Ib{WoGoT%jP3ebbsoYFfTB4(T+|K7D0Ys!y1Sd82j1j zjSd+9f?ls|)H%Mp7%$shtL|=Ki9^>dAekGmX@b%C(dR=P>d5(U*6Dxo^URYBAQt)M z3_**i{SPmuDk=#FjVf?M35Qg^4`z@`XO`EVz5wk2S_5gLgXB;uIjyA#VUU1@3XnMj zhB;rFf9digSB?(!EI@Ge1i@g41PLIa%7jUC)GNQV4kuBN2BJZI8-|nyz8@uD(SI(G zA0q5Zm0Q!NN{Y%{k_X!zr+EExLmQcs1)Alm*l=QBH$wf2_p4V$zs*Jq-!|3^M0&uz zt*7Xh`~)bZejNn}c{$8RVaja)T>60c$yg(7jnp7@w3+V-bb^t}OXLQ7_m#5>r$c!z zPRZm(F0(=B46v72M1nZsXdSiBjej(MngC!xuD7IByT{jV#$u{Go$>G`AD{b4Lk$@6 zMrq{HvcC^UeX?hHtm7-Wjml9vHX;DZP}SuG`7)GDvHq|;7aq%+3h(n~=+*(r-^{*a z&6#CmAtchf+AjvUjf+W}*$cny1O?$h@|df9tH4b7K;f1aKSDKjTNIkHRv;e{@Tj$U zacta_-}fQM=DMmh_Crav%f@!TIkF(Q(IpKY-|sIkA|Adl7OmGLv3VoIy6xR}EZRA0 zTss4r0@3B$DvBG)E^?CZIyp*Z%7pSAi`zy1wD%h*v_OIn=p`Vr))~3J#^s?d#s!Ot ziDQNVYlOKNXm7)2nb+2iH*AwR@@dEq}T*c|!pT%gYHzP4^$LAHZp+vjj$ z2y0zRZy?GZSXa1ll!N_qBzcW zPS@9166ve+U`V3s+~6pqqSXD4&t7VAzg2zX0nVg>e&Bf=tMXt)M$*+BK#AUtN?Qh;Rzew6FC-+HV?3Dw!bXP&13CIS( z@1$`vApS3*uhTgvAJG7Ee7rN&S7dF3p<}+~lHvV%U%Znj->VdWD~}0Pt2Ca~)oF|$ z0Oc|@Np?oG`85uN`QVqb3Y~^>zNi>}M8G~?ro~rD%@t@nS0l+oB*{B9`E|loDpw&d z6$(`WBwrfl#(gIkK))n(vo1`9_}=`H zj(}PJVyNGL)gZIUX=H6qjC_eCz}@uHm3fDGfcmXr$*25SW81+CIQ-~1Nz7K~7!cbF ze>E4XnZLULZfvqTJ5b*cUR-Izf~8<5h3TNQPz z+s6>w0kBOYo;mVO{j>qp@LhO16~US~ogJE(u`|4tY834WH}%E+!eSakB8H~G&)=OJ zfHCW+o~0lK=Q+2qi+7}1G{DIFIf49pO21NB(u1}E9#Vzok;*17O#8x-HDSo2GEGSj zQG&$fr)}kF-`L$eJs{JkTab8(zmY2};h!SCxFd&)92tW2i(Ikpvww+fDexxW26s^u42nQ0r60H+a(jxS1k! zQ9Cw>n&ec<@$hF}(nE?M+r!mXX)$Jj$qQJJzssBnMK4u>2FcUiw7H{|0b}TE6FPBi zD?cJP6Mj2T&^f7)5x~D|jw^TuI36oKoG0v*RsDcf=>SF{Un#n1x;l1mC!^x*H}Bt< z-mX@dy<)xHbbvkXqK_{vW3q)8FpSyF%>&>Alk{4$8K=A{1VB9U@y{?UUUDc64D>_)8@D%wo`r&!+btBhtB9pFlpm`!`_EQ7UJ_a zQwQWe*IzhKuLt^8g3j@Xk$exQPkxKY=TGQ}0cFA0ZNnLoD2a%Hf*i}CMHedbe7Me< zp94T>f@mA>PXaJdzZq@8!h-Xc4d}hdNWJ0p3%!eG6EKu+7`lH%AF!?th0= zrg>cm)YK`Md?yN7xIeCLySgJGdo@x!Qyda9@&X0&z6Ml=cp{O;0IKXV_k)Xp(QiJ2 z1StHWx7!a&Ysux=%o!qyQe!)6Pw)&=ng3)zahdxhQp<$gfR(T*fi7}k!e;-So#b^XruDf%>c2vQQhg%#j69LJIUmbV%-7(GPjVJOZtr!Wgk#{d z9F3W$pHmlp6`#lud*uDus-f=Uv$MmlFQShRA#xbM&q*3dmW7o$dD$5|T zGLsAt7@1--kSSxox~6~eshN&NB<#0zA)au1EXNndb+fk78cFlJ!>5Ey1;T)~W-ryv zp>3yLOqJH_kLU7D?Y_*Ny3-b!BCik1_pbnMIH}0|oZk+1Tfm!9{)AolsUlp00+(Y4 z`sO|O1E515f((ZEVj7novN5ThTJV=-T>dPvjInCMVt~t2wXRBh<5oOyfz-BV#O0*R zLVWq~maUsea9b+Q6Gc2N^1`y)ymAknlny2W(#Ea-^6>V0j1_1E163Qs`>X;&c;GFe zX4<653sm$jC!!GNl@5u4yg(494e;s(7G~4p$+W2{<4Hn1wc~ukPXQxkZ}MVE!h-aQ z*R542rXQJ!tC1-A%j`JPN4|71HIUmAhqk%ZM*O_WM7Qk67OLzDI2o$J z=gPq(h5F5GsGoVJ`qR4Gkd`*SA$G?b+iDU|L13b&a(<7d5c>dFiD+My3!I*?kktt? zw34{}NKKCkOX>zMBA|>NTCKFb1SA1tF{+mJ@e2eHYU&Bjg?KVXkte`wTe|?I5eMGv zd=w>?G{|}d|MupRQO4WzKBvt`&7y5!upT~Hh~r3?H_po~4FWAS;cIN55CYWQj%*3< zBlrpk^_>mzJ~c{jFw9Z^*9Q2ng{ddB6b5<8wewV_CG-KhkN?}qt;a3`3)FHXi{#44XF>s*3yHEK2##W{Hb3Q)1KkJ?t1t!!TcX6>C(2|DuRgZ)l z^(XDWfJ5Rd(wy^t>-JPzoh~uk3G*oH=K&z*oAGspdUg9I`nb5AzSw@>5zj)u@z5wq z6@&YCGoXzz64-n}0|m5fYbc^$zQZV8*cmD40aZu9_w*5l1` zpl0njBoO`#lplcB9?tel$H9xfR0%?YvaAoC$5GiSaA?F1_qXVG+e#|v^0F{joq7ud zT7eY#0d3^$1!Dd6eR26=(Tl0e5r=182o*>o#10W!9%r3crrX&IP4w&yMX0k$lrAgjj-)TzWB|FQLzc#HAAK4P$?-c=sDAR+I zEuc~L=aG@KB)y|E+%A!M+uKJVV50qwh;LXX2Jl1CxaT~!^8SR{xIwt|nw-yxS1qfC zKwHblC(`t-K-wNz;s+=Z`$>BgM^YL^n5=1?c4?~cOC%~5I?}TMbx-7bykUh~&Z&0Lg!z4V zkPnojfCEw9)4g5>MNW87%g_g8>&p+aLOee_$$=E%MPOK)HcOAbAL!Nhg_|!J*b)JD>w?E;EV=&uKv8J6oZ0b=nQcvU_${Jl<7XB z&kone+nZSSvhN~iJdh%q?*0DqL!wQ&xqQQ(XX{<-D6kc{!|hnww0ZhdD@>B}i{Omx}8DRWC zs1?MIJPkBmi~h9+0%@BMQ9KOs#$_^Vv5IC^%xXzUUApZSqGvp#6cCkCa*9B&49WkI z{g$&D42%LPgIByKafE$mr@E(5CyP*I-a9|czc16Qg*Tl*xo`W>{_j419x!pPPich> zeeKQs5K=cJ8L=W1;J*J?7os0!P_J_<%R3s!Kbzay70DS&m&g6XXV+;j?DpnhJGiv! zCl><^)7Cwea{%W(my#h!E^!v79KN6$y+Lpg{vi z{T5H~1?2SSSU{U~kDd0-X15CO&yj6A>r17`A-haTMjI=IS! zD7r4Zbi>jjwKSr%3L+r8w5)`5iGY+KNH?r32uLgo0*i>GfJnZmG)tFANk}Ov-7WQ9 zz90KzW@ql4GxyFt_de%&PJ2+);ukti5mu1Ofn#}8eF!#ssYX$Cfa@6=xFZbMJ}MV5 zPgLl|cS~X4ucRaKY&+}dx@(hdzdu)Lh(It~0Uzo=2!M>`jZZdtOFdZg#5Vx{&g}RJ zc{!`W`sDauopr|i*oSe{NY$`kh|Kb>WjF2!O}7XYF%=NpvBI+SfJ$&hu>t)LG9yoE z4ls=GDb_d?b_ebDwRvaMZZS65yGtNhP}+fi&eezj8y*s=te)**@flOMJJx8)S`mWS z(mV16i^AN!U1$gCLHQ&n;G$qH^Hf6ouY1HKbLn?j`)1YI5d#>IkI$IvCA%B)qpjsv z6$V8qDyA+`Bi;g&Xuv?z&|m&WD;EcXxEa{bNh&@^jkp{^)tz44ea^CUI=#oeIhM20 z0s~(@AR$W(0LsDNY!qGQ{i^n?JE#1^B8PILtCYW++GPW|pUvvVY;3|^~NZ(AD7=RTy zHb86tw7#Gu^t!#9Tp7IVl$|jg#1jFgNlFL1D;xoCWUK5I^AjXnt365|tOrO-KXgYj zH=djcG8x$`z2go4xdIdxECASb#OEQbPKAL*zi#M=;numjr8o5)bxFa~PsIinCpEi|6k>F&tf-8+4GdG5FXz;(2~$L}({Y$j}Na z1_zFgtL{q+r0iM)vBSVewZL3T&_zNI6VuVqPGWL_Aiz9_gIxV_5G82_TWhcxSd9O7 zxC)K(yOJ76aeCVdQhR+WIFkd=2-Yfv)U=44Hl1kInh5M{iZ{3sA!h6Q4>JlEW`DaT z*NA)raDFa}AeU%yLj#Li1_?;TDOwY|0<9qm-f$YRB%L#Hu&FV!1QYvszMY<1IfvQn&v%M0=QKCdo^N`p=5C4 z1vs2H=EWbDu<-D-Dfh6bA1qjd1ah`?;vF=W3Z>lf3dR5c$h?Ph5*cub1iLVpTo3w+ zc#^3$MyyXu!$TWZ_(~`Xmdv;)NhF~H9#@ogJcW~~6~uW^C)H^|gLhvFbUa$Gdnh3~ zLp-3qc?*tg0#c$bRsKHPf6WA0alnY)rjHi1`eN=lZN6Uww`-%(Q>J0K8+88}-Y

8@bmB>O1p;2*%BC~g+>Id(@r?PGJIf#kfBkBh4=y7SHpFsE^ zO?e4Z~G_XUrXM+v54U)Pv!poy{((w9@b zMzF0~*w#$2q4|i?;@()yARN&ATMy+r{;1dxj85NU-@=d#@|q8YV`bak}aCEW!wG`K!j4clDyso{%S(+zg5 zw3M~2uMhLd)$gBAhhX-;)A>pWZqDk6&6Zek?FGiyFjG$LWf%&V^z76d86^?<*G3)G zFGp`$NgDM2unRH{9TT3HQ!J5iw>L}c`Me`u zHas%)KdyTbPRD~8p%jILMCqbl?;|zccoyi*WeLvE$xTE-!k-Kx*#SR)=?>Ne^@C2F zT()9b;<{tI#NA@5W5uNA7979J!&dfl(d%db*tusbtX#JX>APZRLkOZ5k9~cG47eC78&r|zmu6_l+jS3l?9FF`$N-Zsz2Jr4H24i^w4ON$<5c@G!mBll+ zUwSctA56aMvf(es3yLXotgTp|_^m6Dn%15x>h1Vf|M$Gx=mm1y7@x-(7MJuzf-UWD zYt9HWMYh~O^V`1~){50Bkn%!qmmRZo>AZ5I7a4IM+(9_flhm2|i(%iY_h1q&FbH{& z%PBbv?2z14f8uU7+>tcA7nPRw-%oMt$Sm2!6nWZUukOyq#+?fizYPbn{IjXUEthA| zXqnnFTHC64!4xG%DJDmCO7d}C}dD~!o)i&!*DKKxH;|2EaQ zZKW<{4SH1Z`FzVxpXMhenW6t|8O;&@zNy5vZdax=h`B>Y=y}2-z6io23`!?SM-@5-f!>DV9v|VF7yU(!T`8DmSyLZ_{ zlYFK~DK9aCenDdV9`L5Al)B7(-zX!OV)%2?5|mHxX;~VQBMzd-(>D82PSBOF!!~m9 zHRsproze(R1t0KXX6kx)Cv;6XVyxl*q|Ra4_d}N!HjPGAn=&SC2F%LO>kfW-Y$cY* zmvqt3=aVf-N43YDbKjoXVAWBQeoDPkN4b<|v-rcX_zww$yTP6CMI2goC*;&%`neDa zAFk449pv=b?MH{1x67|5o!8A2I1>yP*63C@uEm|WFO`Y69F~bYOi9b=RWqJU@ocbv z8=KwFW*LoWnqIDLa3TjShV4|k=(SNQ!|)q{k-x$DlapcpcLn{Q6?T~Y4& zF2qc1|FnKneCK9bLfTfHTx})R_LEdSb56Ho^ZhaoJC{F=86g};4;m(tPAeU~Nrpm% zTFdY|*#4s(5~g>wNAta%oUv0Wd(Lt@I`{_kNO)SIcKnuGNBu`Ts8;E8fBl@-t#PC4 zx&mi=R#mw+J|C8jGVl+==`K!-myYlklad`fBKAwOH8MUk?U_MPw*z;mlE$G!^@rR% zpF}SIDw2&*3&;nZXwe`Q*z?~5||IDj~@JVftdKpCwMjI$_6h_ ztbH`R=eM4^F4A0SxHeMtap!5M?vSI?dMjo#m=hnoD*eS`m1fN>WIM8iddP1_h+9IV zHC(&YtWNAAOo}s=%u^#x=x%8{~)#-txdx+ zbTQFSE79eD*usmabpjGgeu0;{&Td1$F5yHWAxC1EaS6%O3CHr8-DrZ*t(wynJDj;y z&vB^|UMnl6pSIe)={(!> zGS!}UTMGt5{9$>^L(vOC^OjURI;Y}$jFQK|t)^I)-JyUcnZSOh+dSvIC4?F6Te2FNDCq9p^+g6`*%q^4sr|mmxP@h4M z{d1K>a!W-&g32jVqmQ=&q9v1h8XQ{QR!t=|8LZK2&Q^VSq7QX$H2AR{VIe!tHMIHt zgs(SCu0jPh?(AW!up8TnXanW~Ghbdgimj zBz+bbJ{w>hW)=h%oP33{o2g4 zNj~;E4?6#d4hWot!h#i9+OWg!oHVDk1C7Bby~ENkB9X_uzoO8K**f3fgpi-N)fVO| z&yu7)y2TD-pb|{3?fEQ^>Rg`BK!<;r+rHI6u{lI9voP8G9_4f^i-;pDB#OW*1ab|bWOEpHa^wlV# zsbI4+Re3?mU*8aXH`?Y)p_zpZPyB*JRuANBOKE4p7`cTN`$;fkC8VH6&n5r-Z_n9* zYIVq|MW*Idh(BZtA0RdN&}6nS-cJdPNdEXo7EX-xMANw+2zy+S`B0tqxm%c`^j~Xs zIW6SA7I`-sx5nZkw#)%WE#b&_ll0kblWTP%3^fvit}DzCah=0f3i?j>)_Aj^gHCo6 z;|nkd6%q*nDl#`znc{qsY?YDfFVwUj@=j~tM}=Y*sB+*O^lm?1Co0sQuYI>&U5l!k z*p4^GAuVJ4<^hzIIrf~D^@QfXUEk@Lu|7hjNUV;*&5YDEl|+3U%jl6#@%!HsvL_@w zLuzBG{nA@bsxLx#r~4Qo7m6co^z`)~ongX1?esRNq>_u~u@0q27M}dxqH`NdI9avL z!*|(p7X`+FrIXWNoaTaYCM9tt%=r%)(%o$^!0- z)UST$XGwk+=+m6wnlBD5$(==v57tJ}rDm%T!n@|NLSXRcJO{P(?Q zL=s6{dR$r$YZJ(WCvB+|Op66`BlH%h*%?276`eF;9;y+Yw&*iKO^DNlThb-dY^sgT zieQ4vWF&XB!74VDMG4DC`)^!e@?nMRS`Y*U=RP>boI?)P{s{~ka3t{p`s7R+=cF4)#ru4W8cIP&7BAzir zHu+uk%+0epLCGztq2*#T6;%q~67)VVWEjW)J5acatIFeVjTWB*%hB-Xq0bDC+o^_!Rf-Cw5M2SL3eM5lbddShqF=e77vWtvZYCAu@} z_&=LRTVT%7Q3&056}UNQDS0F2cvKt%zr`%o0T!CA`u%S0U@4t_;+5&}9+(aVE=&8^ zB396+yE;d6Wa86vJWDi_YflH#Oef{LeyaK%3$3yB_os_Gr)Uy_=%fX0k3a~V?>D)3I|?x&LRXjSuH z+rOPV&ko5<-JMkj9-m%3{9cg}qaye$SXcR;b~X7OCd&_El;1PULmh09M45s`QM%=U zW8(>BGF6D#6_+iw`82WHL4)ypTi^UTTI+NZL3GUw4TjxfjMx~b+AqGx(O1rHS;ob*o?IhFNY0-VukqZ0j!H4gF`hKyUTD6%J z%(-+=9&ja>`-+nr5_IoJYRqVg>nD6}H` z*ZgY(q!h#Ig#7pk@&7s{0Bpc^BK@xsOcB;zI-ildQ+6gLkTv)6&?(B~sf}5;5YDJW zv^!4&qCDTCVA@x5us+uq&L%6Rqu@9^#ocyWO#`y#SVAi$xCpE2^`%+JOL8w|fdeEz zErN?!n%1IcQDRYhbc(fU4B>oA@KVwWQw&kmhQnCK-BqStLcPYKeRulNC_6k%&+4IJQ&^3h$a13H6Rh1Hy z7!$t>D<9uRh3a(eA-CNZKz)U)hY44+TN3#xTK7v1lIf-0@J<)a)1hic^3wIKEoCAt z?B1%_YQ80FM#5VjtXW895fd-4Wo}-LA5;P<&y~}}-N(qJ4HH5_#C7R6vKp>b1Uxhd zjy4w_SRMd7rXYl2PN%&d1>%LKgq2y!$ECz2FU z*o9WrKnv4K5vxQ%p)IgC=t5}Nc30TceNZ874$e=>?>|h!Ljw-90WB}FkSYgYCzL#^ zVJK+lutHO~ip~8#Z3IKOEI0}42?IzAgc(6@=dqv_1rB)V5ioeC(AzOkpe&(Vibym3 zScDvaOuFyx7wmkcAA+^Pp?uwacWd5L1pL+}K70ht0jCmB7m(2B0=g>@ZPZc4c^u=M hKYgNx$Jr$TL^6@gU4w>37!=BbXsT+flp>yn{SUVq)nEVs literal 0 HcmV?d00001 diff --git a/Mina.NET.Core.sln b/Mina.NET.Core.sln index 5289870..cf3b070 100644 --- a/Mina.NET.Core.sln +++ b/Mina.NET.Core.sln @@ -41,6 +41,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject Directory.Build.props = Directory.Build.props Directory.Build.targets = Directory.Build.targets + ReleaseNotes.csproj.import = ReleaseNotes.csproj.import EndProjectSection EndProject Global diff --git a/Mina.NET/Mina.NET.Core.csproj b/Mina.NET/Mina.NET.Core.csproj index c37ee3d..c0669e0 100644 --- a/Mina.NET/Mina.NET.Core.csproj +++ b/Mina.NET/Mina.NET.Core.csproj @@ -1,13 +1,24 @@ + + Mina.NET.Core netstandard2.0 - 2.0.13 + 2.0.15 Longshine Async socket library for high performance and high scalability network applications. Copyright © Longshine 2013-2022 27d6430a-d2b6-4eb7-8026-6b106301d91f $(LibraryOutputDir) + https://github.com/UCan927/Mina.NET + https://github.com/UCan927/Mina.NET + git + Apache-2.0 + Icon.png + async;socket;MINA;Netty;NIO;SocketAsyncEventArgs;.NET Core; + true + mina.snk + false @@ -37,9 +48,20 @@ + + + + + + + + + + + diff --git a/ReleaseNotes.csproj.import b/ReleaseNotes.csproj.import new file mode 100644 index 0000000..edd30ad --- /dev/null +++ b/ReleaseNotes.csproj.import @@ -0,0 +1,42 @@ + + + * 2.0.15 + - Added .NET Core support + - Fix the problem that UDP does not work in mono +* 2.0.12 + - Fixed memory leak in SocketAcceptor + - Fixed unhandled exceptions in sending/receiving in SocketSession + - Fixed missing WriteTimeout in IoSessionConfig (thanks @UCan927) +* 2.0.11 + - Added client mode in SslFilter (thanks @ddfczm) + - Fixed invalid reading in SslFilter + - Fixed incorrect use of Semaphore in ProtocolCodecFilter +* 2.0.10 + - Fixed potential performance degradation (thanks @gmav) + - Fixed IConnectFuture.Cancel() +* 2.0.9 - Apache MINA 2.0.9 + - Added InputClosed event + - Added support for UDP multicast + - Added throughput calculation + - Updated Common.Logging to v3.0.0 + - Fixed a lot +* 2.0.7.1 + - Added test for KeepAliveFilter + - Fixed incorrect IoEventType + - Fixed incorrect method calls in socket transport +* 2.0.7 - First release based on Apache MINA 2.0.7 + - Unified yet simple API for various transport types: + - TCP/IP & UDP/IP via .NET asynchronous socket + - serial communication + - loopback (in-application pipe) + - Extensible filters + - Low-level and high-level API: + - low-level: uses IoBuffers + - high-level: uses user-defined message objects and codecs + - Highly customizable thread model + - Out-of-the-box SSL · TLS + - Overload shielding & traffic throttling + - Stream-based I/O support via StreamIoHandler + - Tested + + \ No newline at end of file From cf980604822e20e5a6213564b5822eb1d8bc0d7a Mon Sep 17 00:00:00 2001 From: UCan927 Date: Mon, 24 Jan 2022 11:13:55 +0800 Subject: [PATCH 10/13] Rename Icon PSD filename suffix; --- Icon => Icon.psd | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename Icon => Icon.psd (100%) diff --git a/Icon b/Icon.psd similarity index 100% rename from Icon rename to Icon.psd From 42b5e40568bf1189942d2ec01d33d7a3f74d2520 Mon Sep 17 00:00:00 2001 From: UCan927 Date: Mon, 24 Jan 2022 11:57:35 +0800 Subject: [PATCH 11/13] Clean up duplicate tags --- Mina.NET/Mina.NET.Core.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/Mina.NET/Mina.NET.Core.csproj b/Mina.NET/Mina.NET.Core.csproj index c0669e0..4b72ac5 100644 --- a/Mina.NET/Mina.NET.Core.csproj +++ b/Mina.NET/Mina.NET.Core.csproj @@ -8,7 +8,6 @@ Longshine Async socket library for high performance and high scalability network applications. Copyright © Longshine 2013-2022 - 27d6430a-d2b6-4eb7-8026-6b106301d91f $(LibraryOutputDir) https://github.com/UCan927/Mina.NET https://github.com/UCan927/Mina.NET From 3067d7696a54b018f33a1303c0e02153af146bac Mon Sep 17 00:00:00 2001 From: UCan927 Date: Wed, 13 Apr 2022 18:08:50 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E9=87=8D=E8=BD=BDSerialEndPoint=E7=9A=84?= =?UTF-8?q?ToString=E6=96=B9=E6=B3=95=EF=BC=8C=E4=BE=BF=E4=BA=8E=E5=8F=8B?= =?UTF-8?q?=E5=A5=BD=E8=AE=B0=E5=BD=95=E6=97=A5=E5=BF=97;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mina.NET/Transport/Serial/SerialEndPoint.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Mina.NET/Transport/Serial/SerialEndPoint.cs b/Mina.NET/Transport/Serial/SerialEndPoint.cs index 95b3273..ead45e9 100644 --- a/Mina.NET/Transport/Serial/SerialEndPoint.cs +++ b/Mina.NET/Transport/Serial/SerialEndPoint.cs @@ -82,6 +82,11 @@ public StopBits StopBits { get { return _stopBits; } } + + public override string ToString() + { + return $"{_portName}:{_baudRate}"; + } } } #endif \ No newline at end of file From d0b897d80517d2211d9bcea81cde22663988f220 Mon Sep 17 00:00:00 2001 From: UCan927 Date: Wed, 13 Apr 2022 18:10:31 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E6=8F=90=E5=8D=87=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Mina.NET/Mina.NET.Core.csproj | 2 +- ReleaseNotes.csproj.import | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Mina.NET/Mina.NET.Core.csproj b/Mina.NET/Mina.NET.Core.csproj index 4b72ac5..b9f6241 100644 --- a/Mina.NET/Mina.NET.Core.csproj +++ b/Mina.NET/Mina.NET.Core.csproj @@ -4,7 +4,7 @@ Mina.NET.Core netstandard2.0 - 2.0.15 + 2.0.16 Longshine Async socket library for high performance and high scalability network applications. Copyright © Longshine 2013-2022 diff --git a/ReleaseNotes.csproj.import b/ReleaseNotes.csproj.import index edd30ad..a6ecde3 100644 --- a/ReleaseNotes.csproj.import +++ b/ReleaseNotes.csproj.import @@ -1,6 +1,8 @@ - * 2.0.15 + * 2.0.16 + - Override the ToString method of SerialEndPoint for friendly logging. +* 2.0.15 - Added .NET Core support - Fix the problem that UDP does not work in mono * 2.0.12