Skip to content

Commit 4c44c07

Browse files
authored
Merge pull request #128 from samcic/master
Updated precompiler directives to support .net 5 and above
2 parents 9a050cd + 43485ed commit 4c44c07

18 files changed

+1773
-197
lines changed

Changelog.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@ This project uses [semantic versioning](http://semver.org/spec/v2.0.0.html). Ref
33
*[Semantic Versioning in Practice](https://www.jering.tech/articles/semantic-versioning-in-practice)*
44
for an overview of semantic versioning.
55

6-
## [Unreleased](https://github.com/JeringTech/Javascript.NodeJS/compare/6.2.0...HEAD)
6+
## [Unreleased](https://github.com/JeringTech/Javascript.NodeJS/compare/6.3.0...HEAD)
7+
8+
## [6.3.0](https://github.com/JeringTech/Javascript.NodeJS/compare/6.2.0...6.3.0) - Dec 27, 2021
9+
### Additions
10+
- Added net6.0 target. ([#128](https://github.com/JeringTech/Javascript.NodeJS/pull/128))
11+
### Fixes
12+
- Now supports HTTP2.0 for net6.0 and beyond. ([#128](https://github.com/JeringTech/Javascript.NodeJS/pull/128))
713

814
## [6.2.0](https://github.com/JeringTech/Javascript.NodeJS/compare/6.1.0...6.2.0) - Nov 26, 2021
915
### Additions

ReadMe.md

+2
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ Assert.Equal(8, result);
7070
- .NET Framework 4.6.1
7171
- .NET Core 3.1
7272
- .NET 5.0
73+
- .NET 6.0
7374

7475
## Platforms
7576
- Windows
@@ -1764,6 +1765,7 @@ Contributions are welcome!
17641765
- [dustinsoftware](https://github.com/dustinsoftware)
17651766
- [blushingpenguin](https://github.com/blushingpenguin)
17661767
- [flcdrg](https://github.com/flcdrg)
1768+
- [samcic](https://github.com/samcic)
17671769

17681770
## About
17691771
Follow [@JeringTech](https://twitter.com/JeringTech) for updates and more.

perf/NodeJS/Jering.Javascript.NodeJS.Performance.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>netcoreapp5.0</TargetFramework>
4+
<TargetFramework>net6.0</TargetFramework>
55
<OutputType>Exe</OutputType>
66
<IsPackable>false</IsPackable>
77
<DefaultItemExcludes>Javascript\node_modules\**;$(DefaultItemExcludes)</DefaultItemExcludes>

perf/NodeJS/packages.lock.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"version": 1,
33
"dependencies": {
4-
".NETCoreApp,Version=v5.0": {
4+
"net6.0": {
55
"BenchmarkDotNet": {
66
"type": "Direct",
77
"requested": "[0.12.1, )",

src/NodeJS/Jering.Javascript.NodeJS.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>netstandard2.0;netcoreapp3.1;net461;net5.0</TargetFrameworks>
5-
<TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">netstandard2.0;net5.0;netcoreapp3.1</TargetFrameworks>
4+
<TargetFrameworks>netstandard2.0;netcoreapp3.1;net461;net5.0;net6.0</TargetFrameworks>
5+
<TargetFrameworks Condition="'$(OS)' != 'Windows_NT'">netstandard2.0;net5.0;netcoreapp3.1;net6.0</TargetFrameworks>
66
<PackageId>Jering.Javascript.NodeJS</PackageId>
77
<Authors>JeremyTCD</Authors>
88
<Title>Invoke Javascript in NodeJS, from C#</Title>

src/NodeJS/NodeJSServiceImplementations/OutOfProcess/Http/HttpNodeJSService.cs

+9-9
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class HttpNodeJSService : OutOfProcessNodeJSService
2424
private readonly IJsonService _jsonService;
2525
private readonly ILogger<HttpNodeJSService> _logger;
2626
private readonly IHttpClientService _httpClientService;
27-
#if NETCOREAPP3_1 || NET5_0
27+
#if NETCOREAPP3_1 || NET5_0_OR_GREATER
2828
private readonly Version _httpVersion;
2929
#endif
3030

@@ -66,7 +66,7 @@ public HttpNodeJSService(IOptions<OutOfProcessNodeJSServiceOptions> outOfProcess
6666
monitorService,
6767
taskService,
6868
typeof(HttpNodeJSService).GetTypeInfo().Assembly,
69-
#if NETCOREAPP3_1 || NET5_0
69+
#if NETCOREAPP3_1 || NET5_0_OR_GREATER
7070
httpNodeJSServiceOptionsAccessor.Value.Version == HttpVersion.Version20 ? HTTP20_SERVER_SCRIPT_NAME : HTTP11_SERVER_SCRIPT_NAME)
7171
#else
7272
HTTP11_SERVER_SCRIPT_NAME)
@@ -77,7 +77,7 @@ public HttpNodeJSService(IOptions<OutOfProcessNodeJSServiceOptions> outOfProcess
7777
_jsonService = jsonService;
7878
_logger = logger;
7979
_httpContentFactory = httpContentFactory;
80-
#if NETCOREAPP3_1 || NET5_0
80+
#if NETCOREAPP3_1 || NET5_0_OR_GREATER
8181
_httpVersion = httpNodeJSServiceOptionsAccessor.Value.Version == HttpVersion.Version20 ? HttpVersion.Version20 : HttpVersion.Version11;
8282
#endif
8383
}
@@ -88,10 +88,10 @@ public HttpNodeJSService(IOptions<OutOfProcessNodeJSServiceOptions> outOfProcess
8888
using HttpContent httpContent = _httpContentFactory.Create(invocationRequest);
8989
using var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, _endpoint)
9090
{
91-
#if NETCOREAPP3_1 || NET5_0
91+
#if NETCOREAPP3_1 || NET5_0_OR_GREATER
9292
Version = _httpVersion,
9393
#endif
94-
#if NET5_0
94+
#if NET5_0_OR_GREATER
9595
VersionPolicy = HttpVersionPolicy.RequestVersionExact,
9696
#endif
9797
Content = httpContent,
@@ -116,7 +116,7 @@ public HttpNodeJSService(IOptions<OutOfProcessNodeJSServiceOptions> outOfProcess
116116

117117
if (httpResponseMessage.StatusCode == HttpStatusCode.InternalServerError)
118118
{
119-
#if NET5_0
119+
#if NET5_0_OR_GREATER
120120
using Stream stream = await httpResponseMessage.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
121121
#else
122122
using Stream stream = await httpResponseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);
@@ -133,7 +133,7 @@ public HttpNodeJSService(IOptions<OutOfProcessNodeJSServiceOptions> outOfProcess
133133
}
134134
else if (typeof(T) == typeof(string))
135135
{
136-
#if NET5_0
136+
#if NET5_0_OR_GREATER
137137
string result = await httpResponseMessage.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
138138
#else
139139
string result = await httpResponseMessage.Content.ReadAsStringAsync().ConfigureAwait(false);
@@ -142,7 +142,7 @@ public HttpNodeJSService(IOptions<OutOfProcessNodeJSServiceOptions> outOfProcess
142142
}
143143
else if (typeof(T) == typeof(Stream))
144144
{
145-
#if NET5_0
145+
#if NET5_0_OR_GREATER
146146
Stream stream = await httpResponseMessage.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
147147
#else
148148
Stream stream = await httpResponseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);
@@ -151,7 +151,7 @@ public HttpNodeJSService(IOptions<OutOfProcessNodeJSServiceOptions> outOfProcess
151151
}
152152
else
153153
{
154-
#if NET5_0
154+
#if NET5_0_OR_GREATER
155155
using Stream stream = await httpResponseMessage.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
156156
#else
157157
using Stream stream = await httpResponseMessage.Content.ReadAsStreamAsync().ConfigureAwait(false);

src/NodeJS/NodeJSServiceImplementations/OutOfProcess/Http/HttpNodeJSServiceOptions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Jering.Javascript.NodeJS
88
/// </summary>
99
public class HttpNodeJSServiceOptions
1010
{
11-
#if NETCOREAPP3_1 || NET5_0
11+
#if NETCOREAPP3_1 || NET5_0_OR_GREATER
1212
/// <summary>The HTTP version to use.</summary>
1313
/// <remarks>
1414
/// <para>This value can be <see cref="HttpVersion.Version11"/> or <see cref="HttpVersion.Version20"/>. <see cref="HttpVersion.Version11"/> is faster than <see cref="HttpVersion.Version20"/>,

src/NodeJS/NodeJSServiceImplementations/OutOfProcess/NodeJSProcessFactory.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ internal ProcessStartInfo CreateStartInfo(string nodeServerScript)
3333
{
3434
nodeServerScript = EscapeCommandLineArg(nodeServerScript); // TODO can we escape before embedding? Would avoid an allocation every time we start a NodeJS process.
3535

36-
#if NET5_0
36+
#if NET5_0_OR_GREATER
3737
int currentProcessPid = Environment.ProcessId;
3838
#else
3939
int currentProcessPid = Process.GetCurrentProcess().Id;

src/NodeJS/Utils/JsonService.cs

+8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@
33
using System.Text.Json;
44
using System.Threading;
55
using System.Threading.Tasks;
6+
#if NET6_0_OR_GREATER
7+
using System.Text.Json.Serialization;
8+
#endif
69

710
namespace Jering.Javascript.NodeJS
811
{
@@ -16,7 +19,12 @@ public class JsonService : IJsonService
1619
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
1720

1821
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
22+
23+
#if NET6_0_OR_GREATER
24+
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, // https://docs.microsoft.com/en-sg/dotnet/fundamentals/syslib-diagnostics/syslib0020
25+
#else
1926
IgnoreNullValues = true,
27+
#endif
2028

2129
PropertyNameCaseInsensitive = true
2230
};

src/NodeJS/packages.lock.json

+167-11
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,6 @@
182182
"type": "Transitive",
183183
"resolved": "5.0.0",
184184
"contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
185-
},
186-
"jering.javascript.nodejs.documentationgenerators": {
187-
"type": "Project"
188185
}
189186
},
190187
".NETFramework,Version=v4.6.1": {
@@ -431,9 +428,6 @@
431428
"type": "Transitive",
432429
"resolved": "4.5.0",
433430
"contentHash": "okurQJO6NRE/apDIP23ajJ0hpiNmJ+f0BwOlB/cSqTLQlw5upkf+5+96+iG2Jw40G1fCVCyPz/FhIABUjMR+RQ=="
434-
},
435-
"jering.javascript.nodejs.documentationgenerators": {
436-
"type": "Project"
437431
}
438432
},
439433
".NETStandard,Version=v2.0": {
@@ -687,9 +681,6 @@
687681
"dependencies": {
688682
"System.Runtime.CompilerServices.Unsafe": "4.5.3"
689683
}
690-
},
691-
"jering.javascript.nodejs.documentationgenerators": {
692-
"type": "Project"
693684
}
694685
},
695686
".NETCoreApp,Version=v5.0": {
@@ -858,9 +849,174 @@
858849
"type": "Transitive",
859850
"resolved": "1.0.0",
860851
"contentHash": "G8DuQY8/DK5NN+3jm5wcMcd9QYD90UV7MiLmdljSJixi3U/vNaeBKmmXUqI4DJCOeWizIUEh4ALhSt58mR+5eg=="
852+
}
853+
},
854+
"net6.0": {
855+
"Microsoft.AspNetCore.Hosting.Abstractions": {
856+
"type": "Direct",
857+
"requested": "[2.2.0, )",
858+
"resolved": "2.2.0",
859+
"contentHash": "ubycklv+ZY7Kutdwuy1W4upWcZ6VFR8WUXU7l7B2+mvbDBBPAcfpi+E+Y5GFe+Q157YfA3C49D2GCjAZc7Mobw==",
860+
"dependencies": {
861+
"Microsoft.AspNetCore.Hosting.Server.Abstractions": "2.2.0",
862+
"Microsoft.AspNetCore.Http.Abstractions": "2.2.0",
863+
"Microsoft.Extensions.Hosting.Abstractions": "2.2.0"
864+
}
861865
},
862-
"jering.javascript.nodejs.documentationgenerators": {
863-
"type": "Project"
866+
"Microsoft.Extensions.DependencyInjection": {
867+
"type": "Direct",
868+
"requested": "[5.0.1, )",
869+
"resolved": "5.0.1",
870+
"contentHash": "//mDNrYeiJ0eh/awFhDFJQzkRVra/njU5Y4fyK7X29g5HScrzbUkKOKlyTtygthcGFt4zNC8G5CFCjb/oizomA==",
871+
"dependencies": {
872+
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0"
873+
}
874+
},
875+
"Microsoft.Extensions.Http": {
876+
"type": "Direct",
877+
"requested": "[5.0.0, )",
878+
"resolved": "5.0.0",
879+
"contentHash": "kT1ijDKZuSUhBtYoC1sXrmVKP7mA08h9Xrsr4VrS/QOtiKCEtUTTd7dd3XI9dwAb46tZSak13q/zdIcr4jqbyg==",
880+
"dependencies": {
881+
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
882+
"Microsoft.Extensions.Logging": "5.0.0",
883+
"Microsoft.Extensions.Logging.Abstractions": "5.0.0",
884+
"Microsoft.Extensions.Options": "5.0.0"
885+
}
886+
},
887+
"Microsoft.Extensions.Logging": {
888+
"type": "Direct",
889+
"requested": "[5.0.0, )",
890+
"resolved": "5.0.0",
891+
"contentHash": "MgOwK6tPzB6YNH21wssJcw/2MKwee8b2gI7SllYfn6rvTpIrVvVS5HAjSU2vqSku1fwqRvWP0MdIi14qjd93Aw==",
892+
"dependencies": {
893+
"Microsoft.Extensions.DependencyInjection": "5.0.0",
894+
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
895+
"Microsoft.Extensions.Logging.Abstractions": "5.0.0",
896+
"Microsoft.Extensions.Options": "5.0.0"
897+
}
898+
},
899+
"Microsoft.Extensions.Options": {
900+
"type": "Direct",
901+
"requested": "[5.0.0, )",
902+
"resolved": "5.0.0",
903+
"contentHash": "CBvR92TCJ5uBIdd9/HzDSrxYak+0W/3+yxrNg8Qm6Bmrkh5L+nu6m3WeazQehcZ5q1/6dDA7J5YdQjim0165zg==",
904+
"dependencies": {
905+
"Microsoft.Extensions.DependencyInjection.Abstractions": "5.0.0",
906+
"Microsoft.Extensions.Primitives": "5.0.0"
907+
}
908+
},
909+
"Microsoft.SourceLink.GitHub": {
910+
"type": "Direct",
911+
"requested": "[1.0.0, )",
912+
"resolved": "1.0.0",
913+
"contentHash": "aZyGyGg2nFSxix+xMkPmlmZSsnGQ3w+mIG23LTxJZHN+GPwTQ5FpPgDo7RMOq+Kcf5D4hFWfXkGhoGstawX13Q==",
914+
"dependencies": {
915+
"Microsoft.Build.Tasks.Git": "1.0.0",
916+
"Microsoft.SourceLink.Common": "1.0.0"
917+
}
918+
},
919+
"Nullable": {
920+
"type": "Direct",
921+
"requested": "[1.3.0, )",
922+
"resolved": "1.3.0",
923+
"contentHash": "xHAviTdTY3n+t1nEPN4JPRQR5lI124qRKVw+U9H7dO5sDNPpzoWeo/MQy7dSUmv9eD3k/CJVKokz1tFK+JOzRw=="
924+
},
925+
"System.Text.Encodings.Web": {
926+
"type": "Direct",
927+
"requested": "[5.0.1, )",
928+
"resolved": "5.0.1",
929+
"contentHash": "KmJ+CJXizDofbq6mpqDoRRLcxgOd2z9X3XoFNULSbvbqVRZkFX3istvr+MUjL6Zw1RT+RNdoI4GYidIINtgvqQ=="
930+
},
931+
"System.Text.Json": {
932+
"type": "Direct",
933+
"requested": "[5.0.2, )",
934+
"resolved": "5.0.2",
935+
"contentHash": "I47dVIGiV6SfAyppphxqupertT/5oZkYLDCX6vC3HpOI4ZLjyoKAreUoem2ie6G0RbRuFrlqz/PcTQjfb2DOfQ=="
936+
},
937+
"Yarn.MSBuild": {
938+
"type": "Direct",
939+
"requested": "[1.22.10, )",
940+
"resolved": "1.22.10",
941+
"contentHash": "bcSeuS8ovq0VHhAmRuUWf2VZA4I9KrBxjUqSP7ZpkpBCL1YqR81BKGN/13LC06PueavdjSuV8Yyx+Z4b8Rnk9A=="
942+
},
943+
"Microsoft.AspNetCore.Hosting.Server.Abstractions": {
944+
"type": "Transitive",
945+
"resolved": "2.2.0",
946+
"contentHash": "1PMijw8RMtuQF60SsD/JlKtVfvh4NORAhF4wjysdABhlhTrYmtgssqyncR0Stq5vqtjplZcj6kbT4LRTglt9IQ==",
947+
"dependencies": {
948+
"Microsoft.AspNetCore.Http.Features": "2.2.0",
949+
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0"
950+
}
951+
},
952+
"Microsoft.AspNetCore.Http.Abstractions": {
953+
"type": "Transitive",
954+
"resolved": "2.2.0",
955+
"contentHash": "Nxs7Z1q3f1STfLYKJSVXCs1iBl+Ya6E8o4Oy1bCxJ/rNI44E/0f6tbsrVqAWfB7jlnJfyaAtIalBVxPKUPQb4Q==",
956+
"dependencies": {
957+
"Microsoft.AspNetCore.Http.Features": "2.2.0",
958+
"System.Text.Encodings.Web": "4.5.0"
959+
}
960+
},
961+
"Microsoft.AspNetCore.Http.Features": {
962+
"type": "Transitive",
963+
"resolved": "2.2.0",
964+
"contentHash": "ziFz5zH8f33En4dX81LW84I6XrYXKf9jg6aM39cM+LffN9KJahViKZ61dGMSO2gd3e+qe5yBRwsesvyqlZaSMg==",
965+
"dependencies": {
966+
"Microsoft.Extensions.Primitives": "2.2.0"
967+
}
968+
},
969+
"Microsoft.Build.Tasks.Git": {
970+
"type": "Transitive",
971+
"resolved": "1.0.0",
972+
"contentHash": "z2fpmmt+1Jfl+ZnBki9nSP08S1/tbEOxFdsK1rSR+LBehIJz1Xv9/6qOOoGNqlwnAGGVGis1Oj6S8Kt9COEYlQ=="
973+
},
974+
"Microsoft.Extensions.Configuration.Abstractions": {
975+
"type": "Transitive",
976+
"resolved": "2.2.0",
977+
"contentHash": "65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==",
978+
"dependencies": {
979+
"Microsoft.Extensions.Primitives": "2.2.0"
980+
}
981+
},
982+
"Microsoft.Extensions.DependencyInjection.Abstractions": {
983+
"type": "Transitive",
984+
"resolved": "5.0.0",
985+
"contentHash": "ORj7Zh81gC69TyvmcUm9tSzytcy8AVousi+IVRAI8nLieQjOFryRusSFh7+aLk16FN9pQNqJAiMd7BTKINK0kA=="
986+
},
987+
"Microsoft.Extensions.FileProviders.Abstractions": {
988+
"type": "Transitive",
989+
"resolved": "2.2.0",
990+
"contentHash": "EcnaSsPTqx2MGnHrmWOD0ugbuuqVT8iICqSqPzi45V5/MA1LjUNb0kwgcxBGqizV1R+WeBK7/Gw25Jzkyk9bIw==",
991+
"dependencies": {
992+
"Microsoft.Extensions.Primitives": "2.2.0"
993+
}
994+
},
995+
"Microsoft.Extensions.Hosting.Abstractions": {
996+
"type": "Transitive",
997+
"resolved": "2.2.0",
998+
"contentHash": "+k4AEn68HOJat5gj1TWa6X28WlirNQO9sPIIeQbia+91n03esEtMSSoekSTpMjUzjqtJWQN3McVx0GvSPFHF/Q==",
999+
"dependencies": {
1000+
"Microsoft.Extensions.Configuration.Abstractions": "2.2.0",
1001+
"Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0",
1002+
"Microsoft.Extensions.FileProviders.Abstractions": "2.2.0",
1003+
"Microsoft.Extensions.Logging.Abstractions": "2.2.0"
1004+
}
1005+
},
1006+
"Microsoft.Extensions.Logging.Abstractions": {
1007+
"type": "Transitive",
1008+
"resolved": "5.0.0",
1009+
"contentHash": "NxP6ahFcBnnSfwNBi2KH2Oz8Xl5Sm2krjId/jRR3I7teFphwiUoUeZPwTNA21EX+5PtjqmyAvKaOeBXcJjcH/w=="
1010+
},
1011+
"Microsoft.Extensions.Primitives": {
1012+
"type": "Transitive",
1013+
"resolved": "5.0.0",
1014+
"contentHash": "cI/VWn9G1fghXrNDagX9nYaaB/nokkZn0HYAawGaELQrl8InSezfe9OnfPZLcJq3esXxygh3hkq2c3qoV3SDyQ=="
1015+
},
1016+
"Microsoft.SourceLink.Common": {
1017+
"type": "Transitive",
1018+
"resolved": "1.0.0",
1019+
"contentHash": "G8DuQY8/DK5NN+3jm5wcMcd9QYD90UV7MiLmdljSJixi3U/vNaeBKmmXUqI4DJCOeWizIUEh4ALhSt58mR+5eg=="
8641020
}
8651021
}
8661022
}

test/NodeJS/Helpers/StringBuilderLogger.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public bool IsEnabled(LogLevel logLevel)
2424
return true;
2525
}
2626

27-
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
27+
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
2828
{
2929
lock (_lock)
3030
{

0 commit comments

Comments
 (0)