Use dotnet core build also on Windows

Use dotnet core build also on Windows

--- build.cake
+++ build.cake
@@ -143,10 +143,7 @@
     .IsDependentOn("NuGetRestore")
     .Does(() =>
     {
-        if(IsRunningOnWindows())
-            MSBuild(SOLUTION_FILE, CreateMsBuildSettings());
-        else
-            DotNetCoreBuild(SOLUTION_FILE, CreateDotNetCoreBuildSettings());
+        DotNetCoreBuild(SOLUTION_FILE, CreateDotNetCoreBuildSettings());
     });

 DotNetCoreBuildSettings CreateDotNetCoreBuildSettings() =>
@@ -156,41 +153,6 @@
         NoRestore = true,
         Verbosity = DotNetCoreVerbosity.Minimal
     };
-
-MSBuildSettings CreateMsBuildSettings()
-{
-    var settings = new MSBuildSettings { Verbosity = Verbosity.Minimal, Configuration = configuration };
-
-    if (!BuildSystem.IsLocalBuild)
-    {
-        // Extra arguments for NuGet package creation: EmbedUntrackedSources and ContinuousIntegrationBuild for deterministic build
-        settings.ArgumentCustomization = args => args.Append("-p:EmbedUntrackedSources=true -p:ContinuousIntegrationBuild=true");
-    }
-
-    if (IsRunningOnWindows())
-    {
-        // Find MSBuild for Visual Studio 2019 and newer
-        DirectoryPath vsLatest = VSWhereLatest();
-        FilePath msBuildPath = vsLatest?.CombineWithFilePath("./MSBuild/Current/Bin/MSBuild.exe");
-
-        // Find MSBuild for Visual Studio 2017
-        if (msBuildPath != null && !FileExists(msBuildPath))
-            msBuildPath = vsLatest.CombineWithFilePath("./MSBuild/15.0/Bin/MSBuild.exe");
-
-        // Have we found MSBuild yet?
-        if (!FileExists(msBuildPath))
-        {
-            throw new Exception($"Failed to find MSBuild: {msBuildPath}");
-        }
-
-        Information("Building using MSBuild at " + msBuildPath);
-        settings.ToolPath = msBuildPath;
-    }
-    else
-        settings.ToolPath = Context.Tools.Resolve("msbuild");
-
-    return settings;
-}

 //////////////////////////////////////////////////////////////////////
 // TEST


テストケースのリファクタリング。

テストケースのリファクタリング。

--- EffectiveCSharp4/EffectiveCSharp4Test/Chapter1Test.cs
+++ EffectiveCSharp4/EffectiveCSharp4Test/Chapter1Test.cs
@@ -52,6 +52,8 @@

 		[TestCase("n", "Hidari")]
 		[TestCase(null, "Hidari")]
+		[TestCase("p", "    09012345678")]
+		[TestCase("pn", "    09012345678,               Hidari")]
 		public void ToStringWithFormatString(string format, string expect)
 		{
 			customer.ToString(format, null).Is(expect);
@@ -61,12 +63,6 @@
 		public void ToStringReturnsRevenue()
 		{
 			customer.ToString("r", null).Is(_expectedRevenue);
-		}
-
-		[Test]
-		public void ToStringReturnsContactPhone()
-		{
-			customer.ToString("p", null).Is("    09012345678");
 		}

 		[Test]
@@ -85,12 +81,6 @@
 		public void Phone_Revenue()
 		{
 			customer.ToString("pr", null).Is("    09012345678, " + _expectedRevenue);
-		}
-
-		[Test]
-		public void Phone_Name()
-		{
-			customer.ToString("pn", null).Is("    09012345678,               Hidari");
 		}

 		[Test]


Added Path.PointAtSegmentIndex and Path.LengthAtSegmentIndex

--- Engines/FlatRedBallXNA/FlatRedBall/Math/Paths/Path.cs
+++ Engines/FlatRedBallXNA/FlatRedBall/Math/Paths/Path.cs
@@ -371,5 +371,23 @@
             }

         }
+
+        public Vector2 PointAtSegmentIndex(int index)
+        {
+            var segment = Segments[index];
+            return new Vector2(segment.StartX, segment.StartY);
+        }
+
+        public float LengthAtSegmentIndex(int index)
+        {
+            var lengthSoFar = 0f;
+
+            for(int i = 0; i < index; i++)
+            {
+                lengthSoFar += Segments[i].CalculatedLength;
+            }
+
+            return lengthSoFar;
+        }
     }
 }


Changed Assembly Version

Changed Assembly Version

--- VersionInfo.cs
+++ VersionInfo.cs
@@ -11,8 +11,8 @@
 //
 // You can specify all the values or you can default the Revision and Build Numbers
 // by using the '*' as shown below:
-[assembly: AssemblyVersion("1.1.1.*")]
-[assembly: AssemblyFileVersion("1.1.1.5")]
+[assembly: AssemblyVersion("1.2.0.*")]
+[assembly: AssemblyFileVersion("1.2.0.0")]

 [assembly: AssemblyCopyright("Copyright   2014")]
 [assembly: AssemblyCompany("HBCL")]


Assert.True changed to Assert.Equal

Assert.True changed to Assert.Equal

--- tests/NLog.UnitTests/Common/InternalLoggerTests.cs
+++ tests/NLog.UnitTests/Common/InternalLoggerTests.cs
@@ -416,7 +416,7 @@
             // Set the log file, which will only create the needed directories
             InternalLogger.LogFile = tempFile;

-            Assert.True(Directory.Exists(randomSubDirectory) == shouldCreateDirectory);
+            Assert.Equal(Directory.Exists(randomSubDirectory), shouldCreateDirectory);

             try
             {
@@ -424,7 +424,7 @@

                 InternalLogger.Log(LogLevel.FromString(rawLogLevel), "File and Directory created.");

-                Assert.True(File.Exists(tempFile) == shouldCreateDirectory);
+                Assert.Equal(File.Exists(tempFile), shouldCreateDirectory);
             }
             finally
             {


check in white space change so lets me pull

--- tests/ServiceStack.Redis.Tests/RedisPubSubTests.cs
+++ tests/ServiceStack.Redis.Tests/RedisPubSubTests.cs
@@ -1,301 +1,301 @@
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.Threading;
-using NUnit.Framework;
-using ServiceStack.Common.Extensions;
-using ServiceStack.Text;
-
-namespace ServiceStack.Redis.Tests
-{
-	[TestFixture, Category("Integration")]
-	public class RedisPubSubTests
-		: RedisClientTestsBase
-	{
-        public override void OnBeforeEachTest()
-        {
-            base.OnBeforeEachTest();
-            Redis.NamespacePrefix = "RedisPubSubTests";
-        }
-
-		[Test]
-		public void Can_Subscribe_and_Publish_single_message()
-		{
-			var channelName = PrefixedKey("CHANNEL1");
-			const string message = "Hello, World!";
-		    var key = PrefixedKey("Can_Subscribe_and_Publish_single_message");
-
-            Redis.IncrementValue(key);
-
-			using (var subscription = Redis.CreateSubscription())
-			{
-				subscription.OnSubscribe = channel =>
-				{
-					Log("Subscribed to '{0}'", channel);
-					Assert.That(channel, Is.EqualTo(channelName));
-				};
-				subscription.OnUnSubscribe = channel =>
-				{
-					Log("UnSubscribed from '{0}'", channel);
-					Assert.That(channel, Is.EqualTo(channelName));
-				};
-				subscription.OnMessage = (channel, msg) =>
-				{
-					Log("Received '{0}' from channel '{1}'", msg, channel);
-					Assert.That(channel, Is.EqualTo(channelName));
-					Assert.That(msg, Is.EqualTo(message));
-					subscription.UnSubscribeFromAllChannels();
-				};
-
-				ThreadPool.QueueUserWorkItem(x =>
-				{
-                    Thread.Sleep(100); // to be sure that we have subscribers
-					using (var redisClient = CreateRedisClient())
-					{
-						Log("Publishing '{0}' to '{1}'", message, channelName);
-						redisClient.PublishMessage(channelName, message);
-					}
-				});
-
-				Log("Start Listening On " + channelName);
-				subscription.SubscribeToChannels(channelName); //blocking
-			}
-
-			Log("Using as normal client again...");
-            Redis.IncrementValue(key);
-            Assert.That(Redis.Get<int>(key), Is.EqualTo(2));
-		}
-
-        [Test]
-        public void Can_Subscribe_and_Publish_single_message_using_wildcard()
-        {
-            var channelWildcard = PrefixedKey("CHANNEL.*");
-            var channelName = PrefixedKey("CHANNEL.1");
-            const string message = "Hello, World!";
-            var key = PrefixedKey("Can_Subscribe_and_Publish_single_message");
-
-            Redis.IncrementValue(key);
-
-            using (var subscription = Redis.CreateSubscription())
-            {
-                subscription.OnSubscribe = channel =>
-                {
-                    Log("Subscribed to '{0}'", channelWildcard);
-                    Assert.That(channel, Is.EqualTo(channelWildcard));
-                };
-                subscription.OnUnSubscribe = channel =>
-                {
-                    Log("UnSubscribed from '{0}'", channelWildcard);
-                    Assert.That(channel, Is.EqualTo(channelWildcard));
-                };
-                subscription.OnMessage = (channel, msg) =>
-                {
-                    Log("Received '{0}' from channel '{1}'", msg, channel);
-                    Assert.That(channel, Is.EqualTo(channelWildcard));
-                    Assert.That(msg, Is.EqualTo(message), "we should get the message, not the channel");
-                    subscription.UnSubscribeFromAllChannels();
-                };
-
-                ThreadPool.QueueUserWorkItem(x =>
-                {
-                    Thread.Sleep(100); // to be sure that we have subscribers
-                    using (var redisClient = CreateRedisClient())
-                    {
-                        Log("Publishing '{0}' to '{1}'", message, channelName);
-                        redisClient.PublishMessage(channelName, message);
-                    }
-                });
-
-                Log("Start Listening On " + channelName);
-                subscription.SubscribeToChannelsMatching(channelWildcard); //blocking
-            }
-
-            Log("Using as normal client again...");
-            Redis.IncrementValue(key);
-            Assert.That(Redis.Get<int>(key), Is.EqualTo(2));
-        }
-
-        [Test]
-		public void Can_Subscribe_and_Publish_multiple_message()
-		{
-			var channelName = PrefixedKey("CHANNEL2");
-			const string messagePrefix = "MESSAGE ";
-            string key = PrefixedKey("Can_Subscribe_and_Publish_multiple_message");
-			const int publishMessageCount = 5;
-			var messagesReceived = 0;
-
-            Redis.IncrementValue(key);
-
-			using (var subscription = Redis.CreateSubscription())
-			{
-				subscription.OnSubscribe = channel =>
-				{
-					Log("Subscribed to '{0}'", channel);
-					Assert.That(channel, Is.EqualTo(channelName));
-				};
-				subscription.OnUnSubscribe = channel =>
-				{
-					Log("UnSubscribed from '{0}'", channel);
-					Assert.That(channel, Is.EqualTo(channelName));
-				};
-				subscription.OnMessage = (channel, msg) =>
-				{
-					Log("Received '{0}' from channel '{1}'", msg, channel);
-					Assert.That(channel, Is.EqualTo(channelName));
-					Assert.That(msg, Is.EqualTo(messagePrefix + messagesReceived++));
-
-					if (messagesReceived == publishMessageCount)
-					{
-						subscription.UnSubscribeFromAllChannels();
-					}
-				};
-
-				ThreadPool.QueueUserWorkItem(x =>
-				{
-                    Thread.Sleep(100); // to be sure that we have subscribers
-
-					using (var redisClient = CreateRedisClient())
-					{
-						for (var i = 0; i < publishMessageCount; i++)
-						{
-							var message = messagePrefix + i;
-							Log("Publishing '{0}' to '{1}'", message, channelName);
-							redisClient.PublishMessage(channelName, message);
-						}
-					}
-				});
-
-				Log("Start Listening On");
-				subscription.SubscribeToChannels(channelName); //blocking
-			}
-
-			Log("Using as normal client again...");
-            Redis.IncrementValue(key);
-            Assert.That(Redis.Get<int>(key), Is.EqualTo(2));
-
-			Assert.That(messagesReceived, Is.EqualTo(publishMessageCount));
-		}
-
-		[Test]
-		public void Can_Subscribe_and_Publish_message_to_multiple_channels()
-		{
-			var channelPrefix = PrefixedKey("CHANNEL3 ");
-			const string message = "MESSAGE";
-			const int publishChannelCount = 5;
-            var key = PrefixedKey("Can_Subscribe_and_Publish_message_to_multiple_channels");
-
-			var channels = new List<string>();
-			publishChannelCount.Times(i => channels.Add(channelPrefix + i));
-
-			var messagesReceived = 0;
-			var channelsSubscribed = 0;
-			var channelsUnSubscribed = 0;
-
-			Redis.IncrementValue(key);
-
-			using (var subscription = Redis.CreateSubscription())
-			{
-				subscription.OnSubscribe = channel =>
-				{
-					Log("Subscribed to '{0}'", channel);
-					Assert.That(channel, Is.EqualTo(channelPrefix + channelsSubscribed++));
-				};
-				subscription.OnUnSubscribe = channel =>
-				{
-					Log("UnSubscribed from '{0}'", channel);
-					Assert.That(channel, Is.EqualTo(channelPrefix + channelsUnSubscribed++));
-				};
-				subscription.OnMessage = (channel, msg) =>
-				{
-					Log("Received '{0}' from channel '{1}'", msg, channel);
-					Assert.That(channel, Is.EqualTo(channelPrefix + messagesReceived++));
-					Assert.That(msg, Is.EqualTo(message));
-
-					subscription.UnSubscribeFromChannels(channel);
-				};
-
-				ThreadPool.QueueUserWorkItem(x =>
-				{
-                    Thread.Sleep(100); // to be sure that we have subscribers
-
-					using (var redisClient = CreateRedisClient())
-					{
-						foreach (var channel in channels)
-						{
-							Log("Publishing '{0}' to '{1}'", message, channel);
-							redisClient.PublishMessage(channel, message);
-						}
-					}
-				});
-
-				Log("Start Listening On");
-				subscription.SubscribeToChannels(channels.ToArray()); //blocking
-			}
-
-			Log("Using as normal client again...");
-            Redis.IncrementValue(key);
-            Assert.That(Redis.Get<int>(key), Is.EqualTo(2));
-
-			Assert.That(messagesReceived, Is.EqualTo(publishChannelCount));
-			Assert.That(channelsSubscribed, Is.EqualTo(publishChannelCount));
-			Assert.That(channelsUnSubscribed, Is.EqualTo(publishChannelCount));
-		}
-
-		[Test]
-		public void Can_Subscribe_to_channel_pattern()
-		{
-			int msgs = 0;
-			using (var subscription = Redis.CreateSubscription())
-			{
-				subscription.OnMessage = (channel, msg) => {
-					Debug.WriteLine(String.Format("{0}: {1}", channel, msg + msgs++));
-					subscription.UnSubscribeFromChannelsMatching(PrefixedKey("CHANNEL4:TITLE*"));
-				};
-
-				ThreadPool.QueueUserWorkItem(x =>
-				{
-                    Thread.Sleep(100); // to be sure that we have subscribers
-
-					using (var redisClient = CreateRedisClient())
-					{
-						Log("Publishing msg...");
-						redisClient.Publish(PrefixedKey("CHANNEL4:TITLE1"), "hello".ToUtf8Bytes());
-					}
-				});
-
-				Log("Start Listening On");
-				subscription.SubscribeToChannelsMatching(PrefixedKey("CHANNEL4:TITLE*"));
-			}
-		}
-
-        [Test]
-        public void Can_Subscribe_to_multiplechannel_pattern()
-        {
-            var channels = new[] {PrefixedKey("CHANNEL5:TITLE*"), PrefixedKey("CHANNEL5:BODY*")};
-            int msgs = 0;
-            using (var subscription = Redis.CreateSubscription())
-            {
-                subscription.OnMessage = (channel, msg) =>
-                {
-                    Debug.WriteLine(String.Format("{0}: {1}", channel, msg + msgs++));
-                    subscription.UnSubscribeFromChannelsMatching(channels);
-                };
-
-                ThreadPool.QueueUserWorkItem(x =>
-                {
-                    Thread.Sleep(100); // to be sure that we have subscribers
-
-                    using (var redisClient = CreateRedisClient())
-                    {
-                        Log("Publishing msg...");
-                        redisClient.Publish(PrefixedKey("CHANNEL5:BODY"), "hello".ToUtf8Bytes());
-                    }
-                });
-
-                Log("Start Listening On");
-                subscription.SubscribeToChannelsMatching(channels);
-            }
-        }
-
-	}
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Threading;
+using NUnit.Framework;
+using ServiceStack.Common.Extensions;
+using ServiceStack.Text;
+
+namespace ServiceStack.Redis.Tests
+{
+	[TestFixture, Category("Integration")]
+	public class RedisPubSubTests
+		: RedisClientTestsBase
+	{
+        public override void OnBeforeEachTest()
+        {
+            base.OnBeforeEachTest();
+            Redis.NamespacePrefix = "RedisPubSubTests";
+        }
+
+		[Test]
+		public void Can_Subscribe_and_Publish_single_message()
+		{
+			var channelName = PrefixedKey("CHANNEL1");
+			const string message = "Hello, World!";
+		    var key = PrefixedKey("Can_Subscribe_and_Publish_single_message");
+
+            Redis.IncrementValue(key);
+
+			using (var subscription = Redis.CreateSubscription())
+			{
+				subscription.OnSubscribe = channel =>
+				{
+					Log("Subscribed to '{0}'", channel);
+					Assert.That(channel, Is.EqualTo(channelName));
+				};
+				subscription.OnUnSubscribe = channel =>
+				{
+					Log("UnSubscribed from '{0}'", channel);
+					Assert.That(channel, Is.EqualTo(channelName));
+				};
+				subscription.OnMessage = (channel, msg) =>
+				{
+					Log("Received '{0}' from channel '{1}'", msg, channel);
+					Assert.That(channel, Is.EqualTo(channelName));
+					Assert.That(msg, Is.EqualTo(message));
+					subscription.UnSubscribeFromAllChannels();
+				};
+
+				ThreadPool.QueueUserWorkItem(x =>
+				{
+                    Thread.Sleep(100); // to be sure that we have subscribers
+					using (var redisClient = CreateRedisClient())
+					{
+						Log("Publishing '{0}' to '{1}'", message, channelName);
+						redisClient.PublishMessage(channelName, message);
+					}
+				});
+
+				Log("Start Listening On " + channelName);
+				subscription.SubscribeToChannels(channelName); //blocking
+			}
+
+			Log("Using as normal client again...");
+            Redis.IncrementValue(key);
+            Assert.That(Redis.Get<int>(key), Is.EqualTo(2));
+		}
+
+        [Test]
+        public void Can_Subscribe_and_Publish_single_message_using_wildcard()
+        {
+            var channelWildcard = PrefixedKey("CHANNEL.*");
+            var channelName = PrefixedKey("CHANNEL.1");
+            const string message = "Hello, World!";
+            var key = PrefixedKey("Can_Subscribe_and_Publish_single_message");
+
+            Redis.IncrementValue(key);
+
+            using (var subscription = Redis.CreateSubscription())
+            {
+                subscription.OnSubscribe = channel =>
+                {
+                    Log("Subscribed to '{0}'", channelWildcard);
+                    Assert.That(channel, Is.EqualTo(channelWildcard));
+                };
+                subscription.OnUnSubscribe = channel =>
+                {
+                    Log("UnSubscribed from '{0}'", channelWildcard);
+                    Assert.That(channel, Is.EqualTo(channelWildcard));
+                };
+                subscription.OnMessage = (channel, msg) =>
+                {
+                    Log("Received '{0}' from channel '{1}'", msg, channel);
+                    Assert.That(channel, Is.EqualTo(channelWildcard));
+                    Assert.That(msg, Is.EqualTo(message), "we should get the message, not the channel");
+                    subscription.UnSubscribeFromAllChannels();
+                };
+
+                ThreadPool.QueueUserWorkItem(x =>
+                {
+                    Thread.Sleep(100); // to be sure that we have subscribers
+                    using (var redisClient = CreateRedisClient())
+                    {
+                        Log("Publishing '{0}' to '{1}'", message, channelName);
+                        redisClient.PublishMessage(channelName, message);
+                    }
+                });
+
+                Log("Start Listening On " + channelName);
+                subscription.SubscribeToChannelsMatching(channelWildcard); //blocking
+            }
+
+            Log("Using as normal client again...");
+            Redis.IncrementValue(key);
+            Assert.That(Redis.Get<int>(key), Is.EqualTo(2));
+        }
+
+        [Test]
+		public void Can_Subscribe_and_Publish_multiple_message()
+		{
+			var channelName = PrefixedKey("CHANNEL2");
+			const string messagePrefix = "MESSAGE ";
+            string key = PrefixedKey("Can_Subscribe_and_Publish_multiple_message");
+			const int publishMessageCount = 5;
+			var messagesReceived = 0;
+
+            Redis.IncrementValue(key);
+
+			using (var subscription = Redis.CreateSubscription())
+			{
+				subscription.OnSubscribe = channel =>
+				{
+					Log("Subscribed to '{0}'", channel);
+					Assert.That(channel, Is.EqualTo(channelName));
+				};
+				subscription.OnUnSubscribe = channel =>
+				{
+					Log("UnSubscribed from '{0}'", channel);
+					Assert.That(channel, Is.EqualTo(channelName));
+				};
+				subscription.OnMessage = (channel, msg) =>
+				{
+					Log("Received '{0}' from channel '{1}'", msg, channel);
+					Assert.That(channel, Is.EqualTo(channelName));
+					Assert.That(msg, Is.EqualTo(messagePrefix + messagesReceived++));
+
+					if (messagesReceived == publishMessageCount)
+					{
+						subscription.UnSubscribeFromAllChannels();
+					}
+				};
+
+				ThreadPool.QueueUserWorkItem(x =>
+				{
+                    Thread.Sleep(100); // to be sure that we have subscribers
+
+					using (var redisClient = CreateRedisClient())
+					{
+						for (var i = 0; i < publishMessageCount; i++)
+						{
+							var message = messagePrefix + i;
+							Log("Publishing '{0}' to '{1}'", message, channelName);
+							redisClient.PublishMessage(channelName, message);
+						}
+					}
+				});
+
+				Log("Start Listening On");
+				subscription.SubscribeToChannels(channelName); //blocking
+			}
+
+			Log("Using as normal client again...");
+            Redis.IncrementValue(key);
+            Assert.That(Redis.Get<int>(key), Is.EqualTo(2));
+
+			Assert.That(messagesReceived, Is.EqualTo(publishMessageCount));
+		}
+
+		[Test]
+		public void Can_Subscribe_and_Publish_message_to_multiple_channels()
+		{
+			var channelPrefix = PrefixedKey("CHANNEL3 ");
+			const string message = "MESSAGE";
+			const int publishChannelCount = 5;
+            var key = PrefixedKey("Can_Subscribe_and_Publish_message_to_multiple_channels");
+
+			var channels = new List<string>();
+			publishChannelCount.Times(i => channels.Add(channelPrefix + i));
+
+			var messagesReceived = 0;
+			var channelsSubscribed = 0;
+			var channelsUnSubscribed = 0;
+
+			Redis.IncrementValue(key);
+
+			using (var subscription = Redis.CreateSubscription())
+			{
+				subscription.OnSubscribe = channel =>
+				{
+					Log("Subscribed to '{0}'", channel);
+					Assert.That(channel, Is.EqualTo(channelPrefix + channelsSubscribed++));
+				};
+				subscription.OnUnSubscribe = channel =>
+				{
+					Log("UnSubscribed from '{0}'", channel);
+					Assert.That(channel, Is.EqualTo(channelPrefix + channelsUnSubscribed++));
+				};
+				subscription.OnMessage = (channel, msg) =>
+				{
+					Log("Received '{0}' from channel '{1}'", msg, channel);
+					Assert.That(channel, Is.EqualTo(channelPrefix + messagesReceived++));
+					Assert.That(msg, Is.EqualTo(message));
+
+					subscription.UnSubscribeFromChannels(channel);
+				};
+
+				ThreadPool.QueueUserWorkItem(x =>
+				{
+                    Thread.Sleep(100); // to be sure that we have subscribers
+
+					using (var redisClient = CreateRedisClient())
+					{
+						foreach (var channel in channels)
+						{
+							Log("Publishing '{0}' to '{1}'", message, channel);
+							redisClient.PublishMessage(channel, message);
+						}
+					}
+				});
+
+				Log("Start Listening On");
+				subscription.SubscribeToChannels(channels.ToArray()); //blocking
+			}
+
+			Log("Using as normal client again...");
+            Redis.IncrementValue(key);
+            Assert.That(Redis.Get<int>(key), Is.EqualTo(2));
+
+			Assert.That(messagesReceived, Is.EqualTo(publishChannelCount));
+			Assert.That(channelsSubscribed, Is.EqualTo(publishChannelCount));
+			Assert.That(channelsUnSubscribed, Is.EqualTo(publishChannelCount));
+		}
+
+		[Test]
+		public void Can_Subscribe_to_channel_pattern()
+		{
+			int msgs = 0;
+			using (var subscription = Redis.CreateSubscription())
+			{
+				subscription.OnMessage = (channel, msg) => {
+					Debug.WriteLine(String.Format("{0}: {1}", channel, msg + msgs++));
+					subscription.UnSubscribeFromChannelsMatching(PrefixedKey("CHANNEL4:TITLE*"));
+				};
+
+				ThreadPool.QueueUserWorkItem(x =>
+				{
+                    Thread.Sleep(100); // to be sure that we have subscribers
+
+					using (var redisClient = CreateRedisClient())
+					{
+						Log("Publishing msg...");
+						redisClient.Publish(PrefixedKey("CHANNEL4:TITLE1"), "hello".ToUtf8Bytes());
+					}
+				});
+
+				Log("Start Listening On");
+				subscription.SubscribeToChannelsMatching(PrefixedKey("CHANNEL4:TITLE*"));
+			}
+		}
+
+        [Test]
+        public void Can_Subscribe_to_multiplechannel_pattern()
+        {
+            var channels = new[] {PrefixedKey("CHANNEL5:TITLE*"), PrefixedKey("CHANNEL5:BODY*")};
+            int msgs = 0;
+            using (var subscription = Redis.CreateSubscription())
+            {
+                subscription.OnMessage = (channel, msg) =>
+                {
+                    Debug.WriteLine(String.Format("{0}: {1}", channel, msg + msgs++));
+                    subscription.UnSubscribeFromChannelsMatching(channels);
+                };
+
+                ThreadPool.QueueUserWorkItem(x =>
+                {
+                    Thread.Sleep(100); // to be sure that we have subscribers
+
+                    using (var redisClient = CreateRedisClient())
+                    {
+                        Log("Publishing msg...");
+                        redisClient.Publish(PrefixedKey("CHANNEL5:BODY"), "hello".ToUtf8Bytes());
+                    }
+                });
+
+                Log("Start Listening On");
+                subscription.SubscribeToChannelsMatching(channels);
+            }
+        }
+
+	}
 }


Fixed that collection change tracker were not deleted after aggregation.

--- Expressions/Expressions/Execution/ExecutionContext.cs
+++ Expressions/Expressions/Execution/ExecutionContext.cs
@@ -38,6 +38,7 @@
                 }
             }
             invalidNodes.Clear();
+            collectionChanges.Clear();

             return results;
         }


Support CurrentUICulture for .NET Standard 2.0

--- lib/ExpressionDescriptor.cs
+++ lib/ExpressionDescriptor.cs
@@ -14,14 +14,8 @@
     /// </summary>
     public class ExpressionDescriptor
     {
-        private static string s_defaultLocale;
-        public static void SetDefaultLocale(string locale)
-        {
-            s_defaultLocale = locale;
-        }
-
         private readonly char[] m_specialCharacters = new char[] { '/', '-', ',', '*' };
-        private readonly string[] m_24hourTimeFormatLocales = new string[] { "ru-RU", "uk-UA", "de-DE", "it-IT", "tr-TR", "pl-PL", "ro-RO" };
+        private readonly string[] m_24hourTimeFormatTwoLetterISOLanguageName = new string[] { "ru", "uk", "de", "it", "tr", "pl", "ro" };

         private string m_expression;
         private Options m_options;
@@ -48,8 +42,22 @@
             m_expressionParts = new string[7];
             m_parsed = false;

-            var locale = options.Locale ?? s_defaultLocale ?? "en";
-            m_culture = new CultureInfo(locale);
+            if (!string.IsNullOrEmpty(options.Locale))
+            {
+                m_culture = new CultureInfo(options.Locale);
+            }
+            else
+            {
+                // If options.Locale not specified...
+
+                #if NET_STANDARD_1
+                // .NET Standard 1.* will use English as default
+                m_culture = new CultureInfo("en-US");
+                #else
+                // .NET Standard >= 2.0 will use CurrentUICulture as default
+                m_culture = Thread.CurrentThread.CurrentUICulture;
+                #endif
+            }

             if (m_options.Use24HourTimeFormat != null)
             {
@@ -59,7 +67,7 @@
             else
             {
                 // 24HourTimeFormat not specified, default based on m_24hourTimeFormatLocales
-                m_use24HourTimeFormat = m_24hourTimeFormatLocales.Contains(locale);
+                m_use24HourTimeFormat = m_24hourTimeFormatTwoLetterISOLanguageName.Contains(m_culture.TwoLetterISOLanguageName);
             }
         }

@@ -262,7 +270,10 @@
                (s => s),
                (s => string.Format(Resources.ResourceManager.GetString("EveryX0Seconds", m_culture), s)),
                (s => Resources.ResourceManager.GetString("SecondsX0ThroughX1PastTheMinute", m_culture)),
-               (s => { try {
+               (s =>
+               {
+                   try
+                   {
                        return s == "0"
                    ? string.Empty
                            : (int.Parse(s) < 20)
@@ -270,7 +281,8 @@
                        : Resources.ResourceManager.GetString("AtX0SecondsPastTheMinuteGt20", m_culture) ?? Resources.ResourceManager.GetString("AtX0SecondsPastTheMinute", m_culture);

                    }
-                   catch { return CronExpressionDescriptor.Resources.AtX0SecondsPastTheMinute; }} ));
+                   catch { return CronExpressionDescriptor.Resources.AtX0SecondsPastTheMinute; }
+               }));

             return description;
         }
@@ -333,7 +345,9 @@
                 // we will not specified a DOW description.
                 description = string.Empty;

-            } else {
+            }
+            else
+            {
                 description = GetSegmentDescription(m_expressionParts[5],
                 Resources.ResourceManager.GetString("ComaEveryDay", m_culture),
               (s =>


Add Urgency enum

Add Urgency enum

--- src/CAPNet/Models/Info.cs
+++ src/CAPNet/Models/Info.cs
@@ -235,4 +235,13 @@
         /// </summary>
         Unknown
     }
+
+    public enum Urgency
+    {
+        Immediate,
+        Expected,
+        Future,
+        Past,
+        Unknown
+    }
 }


Added support of specifying directory with files to deploy.

--- src/CamundaCLI/Program.cs
+++ src/CamundaCLI/Program.cs
@@ -1,4 +1,5 @@
 using System;
+using System.IO;
 using System.Linq;

 using CommandLine;
@@ -23,12 +24,17 @@

 			cn.GetTask(Guid.Parse("dde93ad5-4518-11e6-a4a0-00155dc89912"));

-			var result = cn.Deploy(options.Name, options.Source, options.Files.ToArray());
+			var allFiles = options
+				.Files
+				.SelectMany(f => Directory.Exists(f) ? Directory.EnumerateFiles(f) : new[] {f})
+				.ToArray();
+
+			var result = cn.Deploy(options.Name, options.Source, allFiles);
 			Console.WriteLine($@"
 Deployed:
-  ID			 : {result.ID}
-  Name			 : {result.Name}
-  Source		 : {result.Source}
+  ID             : {result.ID}
+  Name           : {result.Name}
+  Source         : {result.Source}
   Deployment time: {result.DeploymentTime}
   Tentant ID     : {result.TenantID}
 ");


:fuelpump: 无语，一个无耻的手误。 :octopus: :baby_chick: :fu:

--- src/Components/Utility.cs
+++ src/Components/Utility.cs
@@ -317,7 +317,7 @@
 			if(collection != null && collection.Count > 0)
 				return false;

-			return false;
+			return true;
 		}
 	}
 }


Add option to force completion results to be used as alternatives, instead of completions.

--- src/ConsoleShell/Shell.cs
+++ src/ConsoleShell/Shell.cs
@@ -38,6 +38,12 @@
         public bool CtrlDIsEOF { get; set; } = true;
         public bool CtrlZIsEOF { get; set; } = Path.DirectorySeparatorChar == '\\';

+        /// <summary>
+        /// If <c>true</c>, the next time an autocompletion callback is performed,
+        /// the returned results will be considered "alternatives" rather than a "completion".
+        /// </summary>
+        public bool ForceCompletionsAsAlternatives = false;
+
         public ShellHistory History { get; private set; }

         /// <summary>
@@ -202,7 +208,7 @@
             lock (_lock)
             {
                 var complete = _container.CompleteInput(this, buff).ToArray();
-                string[] formattedComplete = null;
+                string[] formattedComplete = {};

                 if (CompletionFormatter != null)
                 {
@@ -210,7 +216,12 @@
                     CompletionFormatter = DefaultCompletionFormatter;
                 }

-                if (complete.Length == 1)
+                if (ForceCompletionsAsAlternatives)
+                {
+                    e.Alternatives                 = formattedComplete;
+                    ForceCompletionsAsAlternatives = false;
+                }
+                else if (complete.Length == 1)
                 {
                     e.Output = formattedComplete.First();
                 }


Disabled CSV plugin.

Disabled CSV plugin.

--- FRBDK/Glue/CsvPlugin/GlueCsvEditor/CsvEditorPlugin.cs
+++ FRBDK/Glue/CsvPlugin/GlueCsvEditor/CsvEditorPlugin.cs
@@ -86,19 +86,19 @@
             // Determine if a csv was selected
             if (selectedTreeNode != null && IsCsv(selectedTreeNode.Tag))
             {
-                if(_editor == null )
-                {
-                    CreateNewCsvControl(selectedTreeNode);
+                //if(_editor == null )
+                //{
+                //    CreateNewCsvControl(selectedTreeNode);

-                    pluginTab = base.CreateAndAddTab(_editor, "CSV", TabLocation.Center);
+                //    pluginTab = base.CreateAndAddTab(_editor, "CSV", TabLocation.Center);

-                }
-                else
-                {
-                    pluginTab.Show();
-                }
+                //}
+                //else
+                //{
+                //    pluginTab.Show();
+                //}

-                LoadFile(selectedTreeNode);
+                //LoadFile(selectedTreeNode);
             }
             else
             {


#39 Even better support for WebAPI.

#39 Even better support for WebAPI.

--- Framework/Cqrs.WebApi/Controllers/ClientController.cs
+++ Framework/Cqrs.WebApi/Controllers/ClientController.cs
@@ -46,31 +46,23 @@
 	{{
 		var url = '{1}{2}' + action.Url;
 		var data = {{}};
+		var bodyParameters = 0;
+		var complexParameters = 0;

 		if (action.Parameters.length == 1 && action.Parameters[0].Name == 'parameters')
 		{{
+			bodyParameters = 1;
 			data = parameters;
 		}}
 		else if (action.Parameters.length == 2 && action.Parameters[0].Name == 'entity' && action.Parameters[1].Name == 'rsn')
 		{{
+			bodyParameters = 1;
 			url = url.substring(0, url.length - 5) + parameters['Rsn'];
 			data = parameters;
 		}}
-		else if (window.api.unwrapParameters && action.Parameters.length == 1 && parameters.constructor !== Array)
-		{{
-			var parameter = action.Parameters[0];
-			if (parameter.IsUriParameter)
-			{{
-				url = url.replace('{{' + parameter.Name + '}}', typeof(parameters) === 'object' ? parameters[parameter.Name] : parameters);
-				data = null;
-			}}
-			else
-			{{
-				data = parameters;
-			}}
-		}}
 		else
 		{{
+			var lastBodyParameter = null;
 			$.each(action.Parameters, function (j, parameter)
 			{{
 				if (parameters[parameter.Name] === undefined)
@@ -83,6 +75,13 @@
 				}}
 				else if (data[parameter.Name] === undefined)
 				{{
+					if (parameter.IsBodyParameter)
+					{{
+						bodyParameters++;
+						lastBodyParameter = parameter.Name;
+					}}
+					else
+						complexParameters++;
 					data[parameter.Name] = parameters[parameter.Name];
 				}}
 				else
@@ -92,11 +91,17 @@
 			}});
 		}}

+		if (bodyParameters == 1 && complexParameters == 0)
+			data = data[lastBodyParameter];
+
+		if (bodyParameters == 0 && complexParameters == 0)
+			data = null;
+
 		if (window.api.useJson)
 			return $.ajax({{
 				type: action.Method,
 				url: url,
-				data: JSON.stringify(data),
+				data: data == null ? data : JSON.stringify(data),
 				contentType: 'application/json'
 			}});
 		return $.ajax({{
@@ -137,11 +142,13 @@
 		{
 			public string Name { get; set; }
 			public bool IsUriParameter { get; set; }
+			public bool IsBodyParameter { get; set; }

 			public ApiParameterModel(ApiParameterDescription apiParameterDescription)
 			{
 				Name = apiParameterDescription.Name;
 				IsUriParameter = apiParameterDescription.Source == ApiParameterSource.FromUri;
+				IsBodyParameter = apiParameterDescription.Source == ApiParameterSource.FromBody;
 			}
 		}
 	}


map test fix

map test fix

--- Hazelcast.Test/Hazelcast.Client.Test/ClientMapTest.cs
+++ Hazelcast.Test/Hazelcast.Client.Test/ClientMapTest.cs
@@ -623,7 +623,6 @@

             Assert.AreEqual("item1", entryView.GetKey());
             Assert.AreEqual("value1", entryView.GetValue());
-            Assert.AreNotEqual(0, entryView.GetLastUpdateTime());
         }

         //    @Test


Add ASCII optimization to string.ToLower/ToUpper on Unix

--- src/mscorlib/corefx/System/Globalization/TextInfo.Unix.cs
+++ src/mscorlib/corefx/System/Globalization/TextInfo.Unix.cs
@@ -36,9 +36,35 @@
             }

             string result = string.FastAllocateString(s.Length);
-            fixed (char* pBuf = result)
+
+            fixed (char* pResult = result)
             {
-                Interop.GlobalizationInterop.ChangeCase(s, s.Length, pBuf, result.Length, toUpper, m_needsTurkishCasing);
+                if (IsAsciiCasingSameAsInvariant && s.IsAscii())
+                {
+                    fixed (char* pSource = s)
+                    {
+                        int length = s.Length;
+                        char* a = pSource, b = pResult;
+                        if (toUpper)
+                        {
+                            while (length-- != 0)
+                            {
+                                *b++ = ToUpperAsciiInvariant(*a++);
+                            }
+                        }
+                        else
+                        {
+                            while (length-- != 0)
+                            {
+                                *b++ = ToLowerAsciiInvariant(*a++);
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    Interop.GlobalizationInterop.ChangeCase(s, s.Length, pResult, result.Length, toUpper, m_needsTurkishCasing);
+                }
             }

             return result;


Fixing breadcrumb on request edit page

Fixing breadcrumb on request edit page

--- AllReadyApp/Web-App/AllReady/Areas/Admin/Views/Request/Edit.cshtml
+++ AllReadyApp/Web-App/AllReady/Areas/Admin/Views/Request/Edit.cshtml
@@ -14,8 +14,8 @@
             }
             else
             {
-
@Model.Name

-
Edit

+
Requests

+
Edit @Model.Name

             }


Forgot to URL-encode the search query when it gets re-output to the page.

--- App/StackExchange.DataExplorer/Controllers/SavedQueryController.cs
+++ App/StackExchange.DataExplorer/Controllers/SavedQueryController.cs
@@ -324,7 +324,7 @@
             string href = "/" + site.Name.ToLower() + "/queries?order_by=" + order_by;

             if (searchCriteria.IsValid)
-                href += "&q=" + searchCriteria.RawInput;
+                href += "&q=" + HtmlUtilities.UrlEncode(searchCriteria.RawInput);

             ViewData["PageNumbers"] = new PageNumber(href + "&page=-1", Convert.ToInt32(Math.Ceiling(totalQueries / (decimal)currentPerPage)), currentPerPage,
                                                      currentPage - 1, "pager");


add installationMode to settings

add installationMode to settings

--- Assets/HappyFunTimes/HappyFunTimesCore/HFTHappyFunTimesSettings.cs
+++ Assets/HappyFunTimes/HappyFunTimesCore/HFTHappyFunTimesSettings.cs
@@ -39,6 +39,7 @@
 {
     public class HFTHappyFunTimesSettings : ScriptableObject
     {
+        public const string kHappyFunTimesInstallationModeKey = "HappyFunTimes.InstallationMode";
         public const string kHappyFunTimesShowMessagesKey = "HappyFunTimes.ShowMessages";
         public const string kHappyFunTimesDebugKey = "HappyFunTimes.Debug";

@@ -53,6 +54,18 @@
             set
             {
                 UpdateIfChanged(value, kHappyFunTimesShowMessagesKey);
+            }
+        }
+
+        static public bool installationMode
+        {
+            get
+            {
+                return GetBool(kHappyFunTimesInstallationModeKey);
+            }
+            set
+            {
+                UpdateIfChanged(value, kHappyFunTimesInstallationModeKey);
             }
         }


Added using back in

Added using back in

--- Assets/MRTK/SDK/Features/Utilities/Solvers/HandConstraintPalmUp.cs
+++ Assets/MRTK/SDK/Features/Utilities/Solvers/HandConstraintPalmUp.cs
@@ -2,6 +2,7 @@
 // Licensed under the MIT License. See LICENSE in the project root for license information.

 using Microsoft.MixedReality.Toolkit.Input;
+using NUnit.Framework;
 using UnityEngine;
 using UnityEngine.Assertions.Must;
 using UnityEngine.Serialization;


remove magic number

remove magic number

--- Assets/MixedRealityToolkit.Tests/PlayModeTests/BoundingBoxTests.cs
+++ Assets/MixedRealityToolkit.Tests/PlayModeTests/BoundingBoxTests.cs
@@ -112,6 +112,7 @@
         [UnityTest]
         public IEnumerator ScaleViaNearInteration()
         {
+            const int numSteps = 2;
             var bbox = InstantiateSceneAndDefaultBbox();
             bbox.ScaleHandleSize = 0.1f;
             yield return null;
@@ -127,9 +128,9 @@
             TestHand rightHand = new TestHand(Handedness.Right);
             yield return rightHand.Show(new Vector3(0, 0, 0.5f));
             var delta = new Vector3(0.1f, 0.1f, 0f);
-            yield return rightHand.MoveTo(frontRightCornerPos, 2);
+            yield return rightHand.MoveTo(frontRightCornerPos, numSteps);
             yield return rightHand.SetGesture(ArticulatedHandPose.GestureId.Pinch);
-            yield return rightHand.Move(delta, 2);
+            yield return rightHand.Move(delta, numSteps);

             var endBounds = bbox.GetComponent<BoxCollider>().bounds;
             TestUtilities.AssertAboutEqual(endBounds.center, new Vector3(0.033f, 0.033f, 1.467f), "endBounds incorrect center");


Move using block inside try/catch in Create to avoid issues with SaveAndReload of new empty AppointmentItems.

--- CalDavSynchronizer/Implementation/Events/OutlookEventRepository.cs
+++ CalDavSynchronizer/Implementation/Events/OutlookEventRepository.cs
@@ -287,11 +287,19 @@

       using (newAppointmentItemWrapper)
       {
-        IAppointmentItemWrapper initializedWrapper;
-
         try
         {
-          initializedWrapper = await entityInitializer(newAppointmentItemWrapper);
+          var initializedWrapper = await entityInitializer(newAppointmentItemWrapper);
+
+          using (initializedWrapper)
+          {
+            initializedWrapper.SaveAndReload();
+            context.DuplicateEventCleaner.AnnounceAppointment(AppointmentSlim.FromAppointmentItem(initializedWrapper.Inner));
+            var result = new EntityVersion<AppointmentId, DateTime>(
+              new AppointmentId(initializedWrapper.Inner.EntryID, initializedWrapper.Inner.GlobalAppointmentID),
+              initializedWrapper.Inner.LastModificationTime);
+            return result;
+          }
         }
         catch
         {
@@ -306,15 +314,7 @@
           throw;
         }

-        using (initializedWrapper)
-        {
-          initializedWrapper.SaveAndReload();
-          context.DuplicateEventCleaner.AnnounceAppointment(AppointmentSlim.FromAppointmentItem(initializedWrapper.Inner));
-          var result = new EntityVersion<AppointmentId, DateTime>(
-            new AppointmentId(initializedWrapper.Inner.EntryID, initializedWrapper.Inner.GlobalAppointmentID),
-            initializedWrapper.Inner.LastModificationTime);
-          return result;
-        }
+
       }
     }


Update Core.cs

Update Core.cs

--- XamIoc/Core.cs
+++ XamIoc/Core.cs
@@ -1,6 +1,5 @@
-using System;
+using System;
 using System.Collections.Generic;
-using System.Linq;
 using System.Text;
 using System.Reflection;


Filename Validation update

Filename Validation update

Only check the file name instead of fullname

--- Word2007/DaisyWord2007AddIn/Connect.cs
+++ Word2007/DaisyWord2007AddIn/Connect.cs
@@ -859,7 +859,7 @@
                 errorFileNameMessage.Append("Any commas (,) present in the file name should be removed, or they will be replaced by underscores automatically.");
             } else {
                 // TODO : specific name pattern following daisy book naming convention to find
-                authorizedNamePattern = @"^[a-zA-Z0-9_\-\.]+$";
+                authorizedNamePattern = @"^[a-zA-Z0-9_\-\.]+\.docx$";
                 errorFileNameMessage.Append("Only Alphanumerical letters (a-z, A-Z, 0-9), hyphens (-), dots (.) and underscores (_) are allowed in DAISY file names." +
                     "\r\nAny other characters (including spaces) will be replaced automaticaly by underscores.");
             }
@@ -872,7 +872,7 @@
             bool nameIsValid;
             do {
                 bool docIsRenamed = false;
-                if (!validator.IsMatch(currentDoc.FullName)) {
+                if (!validator.IsMatch(currentDoc.Name)) { // check only name (i assume it may still lead to problem if path has commas)
                     DialogResult userAnswer = MessageBox.Show(errorFileNameMessage.ToString(), "Unauthorized characters in the document filename", MessageBoxButtons.YesNoCancel,MessageBoxIcon.Warning);
                     if (userAnswer == DialogResult.Yes) {
                         Dialog dlg = this.applicationObject.Dialogs[Microsoft.Office.Interop.Word.WdWordDialog.wdDialogFileSaveAs];


[WPF] Crude position changed support

[WPF] Crude position changed support

--- Xwt.WPF/Xwt.WPFBackend/PanedBackend.cs
+++ Xwt.WPF/Xwt.WPFBackend/PanedBackend.cs
@@ -28,7 +28,9 @@
 using System.Linq;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Controls.Primitives;
 using Xwt.Backends;
+using Xwt.Engine;
 using Orientation = Xwt.Backends.Orientation;

 namespace Xwt.WPFBackend
@@ -64,6 +66,8 @@
 						HorizontalAlignment = HorizontalAlignment.Center,
 						Width = SplitterSize
 					};
+					splitter.DragDelta += SplitterOnDragDelta;
+
 					Grid.ColumnDefinitions.Insert (panel, new ColumnDefinition { Width = GridLength.Auto });
 					Grid.SetColumn (splitter, panel++);
 					Grid.Children.Add (splitter);
@@ -82,6 +86,8 @@
 						VerticalAlignment = VerticalAlignment.Center,
 						Height = SplitterSize
 					};
+					splitter.DragDelta += SplitterOnDragDelta;
+
 					Grid.RowDefinitions.Insert (panel, new RowDefinition { Height = GridLength.Auto });
 					Grid.SetRow (splitter, panel++);
 					Grid.Children.Add (splitter);
@@ -136,13 +142,46 @@
 			RemoveElementsForPanel (panel);
 		}

+		public override void EnableEvent (object eventId)
+		{
+			base.EnableEvent (eventId);
+
+			if (eventId is PanedEvent) {
+				switch ((PanedEvent)eventId) {
+				case PanedEvent.PositionChanged:
+					this.reportPositionChanged = true;
+					break;
+				}
+			}
+		}
+
+		public override void DisableEvent (object eventId)
+		{
+			base.DisableEvent (eventId);
+
+			if (eventId is PanedEvent) {
+				switch ((PanedEvent)eventId) {
+				case PanedEvent.PositionChanged:
+					this.reportPositionChanged = false;
+					break;
+				}
+			}
+		}
+
 		private const int SplitterSize = 4;
 		private Orientation direction;
+		private bool reportPositionChanged;

 		private Grid Grid
 		{
 			get { return (Grid) Widget; }
 			set { Widget = value; }
+		}
+
+		private void SplitterOnDragDelta (object sender, DragDeltaEventArgs e)
+		{
+			if (this.reportPositionChanged)
+				Toolkit.Invoke (((IPanedEventSink)EventSink).OnPositionChanged);
 		}

 		private void RemoveElementsForPanel (int panel)


[Xwt.XamMac] Gross hack to fix focusing for Xwt.TextEntry (again!)

It turns out we cannot rely on the base implementation of SetFocus
because the 'Widget' property is a different object in our subclass.

This means if we want focus to work, we have to override all the methods
and make sure we invoke the same code but using the correct object.

This makes focus work again.

--- Xwt.XamMac/Xwt.Mac/TextEntryBackend.cs
+++ Xwt.XamMac/Xwt.Mac/TextEntryBackend.cs
@@ -64,6 +64,7 @@
 				MultiLine = false;
 			}

+			canGetFocus = Widget.AcceptsFirstResponder ();
 			Frontend.MouseEntered += delegate {
 				checkMouseSelection = true;
 			};
@@ -236,6 +237,34 @@
 				});
 			}
 		}
+
+		#endregion
+
+
+		#region Gross Hack
+		// The 'Widget' property is not virtual and the one on the base class holds
+		// the 'CustomAlignedContainer' object and *not* the NSTextField object. As
+		// such everything that uses the 'Widget' property in the base class might be
+		// working on the wrong object. The focus methods definitely need to work on
+		// the NSTextField directly, so i've overridden those and made them interact
+		// with the NSTextField instead of the CustomAlignedContainer.
+		bool canGetFocus = true;
+		public override bool CanGetFocus {
+			get { return canGetFocus; }
+			set { canGetFocus = value && Widget.AcceptsFirstResponder (); }
+		}
+
+		public override void SetFocus ()
+		{
+			if (Widget.Window != null && CanGetFocus)
+				Widget.Window.MakeFirstResponder (Widget);
+		}
+
+		public override bool HasFocus {
+			get {
+				return Widget.Window != null && Widget.Window.FirstResponder == Widget;
+			}
+		}
 		#endregion
 	}

@@ -288,6 +317,11 @@
 				get; set;
 			}

+			public CustomCell ()
+			{
+
+			}
+
 			public override NSTextView FieldEditorForView (NSView aControlView)
 			{
 				if (editor == null) {
@@ -314,6 +348,11 @@
 				get; set;
 			}

+			public CustomEditor ()
+			{
+
+			}
+
 			public override void KeyDown (NSEvent theEvent)
 			{
 				Context.InvokeUserCode (delegate {


Fixed MultiMethod unit test

Fixed MultiMethod unit test

--- ZedSharp.UnitTests/MultiMethodTests.cs
+++ ZedSharp.UnitTests/MultiMethodTests.cs
@@ -9,7 +9,7 @@
         [TestMethod]
         public void SimpleDispatchTest()
         {
-            var multi = new MultiMethod<int, String>(x => x % 2 == 0)
+            var multi = new MultiMethod<int, bool, String>(x => x % 2 == 0)
                 .Add(true, _ => "Even")
                 .Add(false, _ => "Odd");


Bug fixed: LINQ式の遅延実行が重複して発行されパフォーマンスが悪化する問題を解消。

--- Implem.Pleasanter/Libraries/HtmlParts/HtmlBurnDown.cs
+++ Implem.Pleasanter/Libraries/HtmlParts/HtmlBurnDown.cs
@@ -67,7 +67,8 @@
                         .Where(p => p.Updator == o)
                         .Select(p => p.EarnedValueAdditions)
                         .Sum())
-                    .Distinct();
+                    .Distinct()
+                    .ToList();
                 var colspan = updators.Count() + 1;
                 var minTime = burnDown.MinTime;
                 var updatedMaxTime = burnDown.LatestUpdatedTime;


additional metrics

additional metrics

--- LatencyCollectorCore/Monitors/CiapiLatencyRecorder.cs
+++ LatencyCollectorCore/Monitors/CiapiLatencyRecorder.cs
@@ -20,13 +20,36 @@
 		{
 			if (info.Exception != null)
 			{
+				var now = DateTime.UtcNow;
+
 				_tracker.Log(info.Exception);
+
+				if (_lastExceptionTime > DateTime.MinValue)
+				{
+					var timeDiff = now - _lastExceptionTime;
+					_tracker.Log("TimeFromLastException CIAPI", timeDiff.TotalSeconds);
+				}
+
+				_lastExceptionTime = now;
 			}
 			else
 			{
+				var now = DateTime.UtcNow;
+
 				_tracker.LogLatency(info.Uri.ToString(), info.Watch.Elapsed.TotalSeconds);
+
+				if (_lastSuccessTime > DateTime.MinValue)
+				{
+					var timeDiff = now - _lastSuccessTime;
+					_tracker.Log("TimeFromLastSuccess CIAPI", timeDiff.TotalSeconds);
+				}
+
+				_lastSuccessTime = now;
 			}
 		}
+
+		private DateTime _lastSuccessTime = DateTime.MinValue;
+		private DateTime _lastExceptionTime = DateTime.MinValue;

 		public override void Start()
 		{


Fix Double Tap Prevention issue with Timer Offset

--- LiveSplit/LiveSplit.Core/Model/DoubleTapPrevention.cs
+++ LiveSplit/LiveSplit.Core/Model/DoubleTapPrevention.cs
@@ -19,6 +19,8 @@

         private TimeSpan Delay = new TimeSpan(0, 0, 0, 0, 300);
         private TimeSpan LongDelay = new TimeSpan(0, 0, 0, 0, 600);
+
+        private TimeStamp LastEvent;

         public ITimerModel InternalModel { get; set; }

@@ -49,48 +51,33 @@
         public DoubleTapPrevention(ITimerModel model)
         {
             InternalModel = model;
+            LastEvent = TimeStamp.Now - LongDelay;
         }

         protected bool CheckDoubleTap()
         {
-            TimeSpan? lastSplit = null;
-            if (CurrentState.Settings.DoubleTapPrevention)
-            {
-                var index = CurrentState.CurrentSplitIndex - 1;
-                while (index >= 0)
-                {
-                    if (CurrentState.Run[index].SplitTime.RealTime != null)
-                    {
-                        lastSplit = CurrentState.Run[index].SplitTime.RealTime.Value;
-                        break;
-                    }
-                    index--;
-                }
-            }
-            if (!CurrentState.Settings.DoubleTapPrevention
-                || (CurrentState.CurrentPhase == TimerPhase.Running
-                && (lastSplit == null || TimeStamp.Now - CurrentState.StartTime > lastSplit + Delay)
-                && CurrentState.CurrentTime.RealTime > CurrentState.TimePausedAt + Delay)
-                || (CurrentState.CurrentPhase == TimerPhase.Paused
-                && TimeStamp.Now - CurrentState.StartTime > CurrentState.TimePausedAt + Delay)
-                || (CurrentState.CurrentPhase == TimerPhase.Ended
-                && TimeStamp.Now - CurrentState.StartTime > CurrentState.CurrentTime.RealTime + LongDelay)
-                || (CurrentState.CurrentPhase == TimerPhase.NotRunning
-                && TimeStamp.Now - CurrentState.StartTime > Delay))
-                return true;
-            return false;
+            if (CurrentState.CurrentPhase == TimerPhase.Ended)
+                return TimeStamp.Now - LastEvent > LongDelay;
+
+            return TimeStamp.Now - LastEvent > Delay;
         }

         public void Start()
         {
             if (CheckDoubleTap())
+            {
                 InternalModel.Start();
+                LastEvent = TimeStamp.Now;
+            }
         }

         public void Split()
         {
             if (CheckDoubleTap())
+            {
                 InternalModel.Split();
+                LastEvent = TimeStamp.Now;
+            }
         }

         public void SkipSplit()
@@ -110,13 +97,19 @@
         public void Reset(bool updateSplits = true)
         {
             if (CheckDoubleTap())
+            {
                 InternalModel.Reset(updateSplits);
+                LastEvent = TimeStamp.Now;
+            }
         }

         public void Pause()
         {
             if (CheckDoubleTap())
+            {
                 InternalModel.Pause();
+                LastEvent = TimeStamp.Now;
+            }
         }

         public void UndoAllPauses()


Handle duplicates in trimming

Handle duplicates in trimming

Use last-in-wins (similar to what will happen with overwrite during
copy to output) when building the file graph.

We could instead merge the dependencies of the additional file but
that's not necessarily correct.

--- Microsoft.Packaging.Tools.Trimming/tasks/TrimFiles.cs
+++ Microsoft.Packaging.Tools.Trimming/tasks/TrimFiles.cs
@@ -307,14 +307,16 @@
             foreach(var runtimeItem in runtimeItems)
             {
                 var fileNode = new FileNode(runtimeItem, packages);
-                files.Add(fileNode.Name, fileNode);
+
+                // last in wins
+                files[fileNode.Name] = fileNode;
             }

             // root files are likely not in the RuntimeItems
             foreach (var rootFile in RootFiles)
             {
                 var fileNode = new FileNode(rootFile, packages);
-                if (!files.ContainsKey(fileNode.Name)  && File.Exists(fileNode.SourceFile))
+                if (!files.ContainsKey(fileNode.Name) && File.Exists(fileNode.SourceFile))
                 {
                     files.Add(fileNode.Name, fileNode);
                 }


fixed broken link on cancel button on Reminder Details page

--- MileageStats.Web/Views/Reminder/Details.Mobile.cshtml
+++ MileageStats.Web/Views/Reminder/Details.Mobile.cshtml
@@ -30,6 +30,6 @@

             }

-
Cancel

+
Cancel


Clean up trivia handling

Clean up trivia handling

--- MonoDevelop.AddinMaker/Pads/RoslynSyntaxVisualizer.cs
+++ MonoDevelop.AddinMaker/Pads/RoslynSyntaxVisualizer.cs
@@ -126,44 +126,46 @@
 			var leadingTrivia = syntaxNode.GetLeadingTrivia ();
 			var trailingTrivia = syntaxNode.GetTrailingTrivia ();

-			foreach (var trivia in leadingTrivia) {
-				SetNodeText (treeNavigator, trivia.GetType ().Name, trivia.Span, Colors.DarkRed);
-				treeNavigator.InsertAfter ();
-			}
+			AddLeadingTrivia (leadingTrivia);

 			SetNodeText (treeNavigator, syntaxNode.GetType ().Name, syntaxNode.Span, Colors.DarkBlue);

 			foreach (var child in syntaxNode.ChildNodesAndTokens ()) {
+				treeNavigator.AddChild ();
 				if (child.IsNode) {
-					AddNode (treeNavigator.AddChild (), child.AsNode ());
-					treeNavigator.MoveToParent ();
+					AddNode (treeNavigator, child.AsNode ());
 				} else {
-					treeNavigator.AddChild ();
 					var token = child.AsToken ();
 					if (token.LeadingTrivia != leadingTrivia) {
-						foreach (var trivia in token.LeadingTrivia) {
-							SetNodeText (treeNavigator, trivia.GetType ().Name, trivia.Span, Colors.DarkRed);
-							treeNavigator.InsertAfter ();
-						}
+						AddLeadingTrivia (token.LeadingTrivia);
 					}
-
 					SetNodeText (treeNavigator, token.GetType ().Name, token.Span, Colors.DarkGreen);
-
 					if (token.TrailingTrivia != trailingTrivia) {
-						foreach (var trivia in token.TrailingTrivia) {
-							treeNavigator.InsertAfter ();
-							SetNodeText (treeNavigator, trivia.GetType ().Name, trivia.Span, Colors.DarkRed);
-						}
+						AddTrailingTrivia (token.TrailingTrivia);
 					}
-
-					treeNavigator.MoveToParent ();
-				}
-			}
-
-			foreach (var trivia in trailingTrivia) {
-				treeNavigator.InsertAfter ();
-				SetNodeText (treeNavigator, trivia.GetType ().Name, trivia.Span, Colors.DarkRed);
-			}
+				}
+				treeNavigator.MoveToParent ();
+			}
+
+			AddTrailingTrivia (trailingTrivia);
+
+			void AddLeadingTrivia (SyntaxTriviaList triviaList)
+			{
+				foreach (var trivia in triviaList) {
+					AddTrivia (trivia);
+					treeNavigator.InsertAfter ();
+				}
+			}
+
+			void AddTrailingTrivia (SyntaxTriviaList triviaList)
+			{
+				foreach (var trivia in triviaList) {
+					treeNavigator.InsertAfter ();
+					AddTrivia (trivia);
+				}
+			}
+
+			void AddTrivia (SyntaxTrivia trivia) => SetNodeText (treeNavigator, trivia.GetType ().Name, trivia.Span, Colors.DarkRed);
 		}

 		void SetNodeText (TreeNavigator nav, string text, TextSpan span, Color color)


Rendering statically bound

Rendering statically bound

--- Mvc/ScMvcTest2/ScMvcTest2/Views/layouts/sample.cshtml
+++ Mvc/ScMvcTest2/ScMvcTest2/Views/layouts/sample.cshtml
@@ -1 +1,5 @@
-
Today's date is: @DateTime.Now.ToShortDateString()
+@using Sitecore.Mvc
+
+
Today's date is: @DateTime.Now.ToShortDateString()

+
+@Html.Sitecore().ViewRendering("/Views/PageHeader.cshtml")


Adjusted namespace tests

Adjusted namespace tests

--- NExtra.Tests/Extensions/AssemblyExtensionsBehavior.cs
+++ NExtra.Tests/Extensions/AssemblyExtensionsBehavior.cs
@@ -47,7 +47,9 @@
         {
             var result = Assembly.GetExecutingAssembly().GetNamespaceTypes("NExtra.Tests").ToList();

-            Assert.That(result, Is.GreaterThan(0));
+            Assert.That(result.Count, Is.EqualTo(2));
+            Assert.That(result.Contains(typeof(EventArgsBehavior)), Is.True);
+            Assert.That(result.Contains(typeof(NullableBehavior)), Is.True);
         }

         [Test]


You can now use .roleclr with only role name in order to get that role's color's hex

--- NadekoBot.Core/Modules/Administration/RoleCommands.cs
+++ NadekoBot.Core/Modules/Administration/RoleCommands.cs
@@ -270,8 +270,17 @@

             [NadekoCommand, Usage, Description, Aliases]
             [RequireContext(ContextType.Guild)]
-            [RequireUserPermission(GuildPermission.ManageRoles)]
-            [RequireBotPermission(GuildPermission.ManageRoles)]
+            [Priority(1)]
+            public async Task RoleColor([Remainder] IRole role)
+            {
+                await Context.Channel.SendConfirmAsync("Role Color", role.Color.RawValue.ToString("X"));
+            }
+
+            [NadekoCommand, Usage, Description, Aliases]
+            [RequireContext(ContextType.Guild)]
+            [RequireUserPermission(GuildPermission.ManageRoles)]
+            [RequireBotPermission(GuildPermission.ManageRoles)]
+            [Priority(0)]
             public async Task RoleColor(params string[] args)
             {
                 if (args.Length != 2 && args.Length != 4)


修改通用扩展处理名称

修改通用扩展处理名称

--- OSS.Common/Helpers/Extension/StringEncodeExtension.cs
+++ OSS.Common/Helpers/Extension/StringEncodeExtension.cs
@@ -45,11 +45,18 @@
         /// <summary>
         /// Uri解码处理
         /// </summary>
+        public static string SafeUnescapeDataString(this string input)
+        {
+            return string.IsNullOrEmpty(input) ? string.Empty : Uri.UnescapeDataString(input);
+        }
+
+
+        [Obsolete]
         public static string SafeUnescapeUriString(this string input)
         {
             return string.IsNullOrEmpty(input) ? string.Empty : Uri.UnescapeDataString(input);
         }
-
+
         #endregion


change integration tests

change integration tests

--- Octokit.Tests.Integration/Clients/TeamsClientTests.cs
+++ Octokit.Tests.Integration/Clients/TeamsClientTests.cs
@@ -121,16 +121,16 @@
         }
     }

-    public class TheAddOrUpdateTeamRepositoryMethod
+    public class TheAddOrUpdateTeamRepositoryMethod : IDisposable
     {
-        private readonly TeamContext _teamContext;
         private readonly IGitHubClient _github;
+        private Repository _repository;
+        private Team _team;

         public TheAddOrUpdateTeamRepositoryMethod()
         {
             _github = EnterpriseHelper.GetAuthenticatedClient();
-            var newTeam = new NewTeam(Guid.NewGuid().ToString());
-            _teamContext = _github.CreateTeamContext(EnterpriseHelper.Organization, newTeam).Result;
+
         }

         [OrganizationTest]
@@ -138,23 +138,31 @@
         {
             var repoName = Helper.MakeNameWithTimestamp("public-repo");

-            var team = _teamContext.Team;
+            var newTeam = new NewTeam(Guid.NewGuid().ToString());

-            using (var context = await _github.CreateRepositoryContext(new NewRepository(repoName)))
+            using (RepositoryContext context = await _github.CreateRepositoryContext(new NewRepository(repoName)))
+            using (TeamContext teamContext = _github.CreateTeamContext(EnterpriseHelper.Organization, newTeam).Result)
             {
-                var createdRepository = context.Repository;
+                _team = teamContext.Team;

-                var addRepo = await _github.Organization.Team.AddRepository(team.Id, team.Organization.Name, createdRepository.Name, new RepositoryPermissionRequest(Permission.Admin));
+                _repository = context.Repository;
+
+                var addRepo = await _github.Organization.Team.AddRepository(_team.Id, _team.Organization.Name, _repository.Name, new RepositoryPermissionRequest(Permission.Admin));

                 Assert.True(addRepo);

-                var addedRepo = await _github.Organization.Team.GetAllRepositories(team.Id);
+                var addedRepo = await _github.Organization.Team.GetAllRepositories(_team.Id);

                 //Check if permission was correctly applied
-                Assert.True(addedRepo.First(x => x.Id == createdRepository.Id).Permissions.Admin == true);
-
+                Assert.True(addedRepo.First(x => x.Id == _repository.Id).Permissions.Admin == true);

             }
         }
+
+        public void Dispose()
+        {
+            EnterpriseHelper.DeleteRepo(_repository);
+            EnterpriseHelper.DeleteTeam(_team);
+        }
     }
 }


Fix not sending TransferInfo when an asset is not found. This clogs up the sound pipeline in the viewer.

--- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -2777,6 +2777,19 @@
             }
         }

+        public void SendAssetNotFound(AssetRequestToClient req)
+        {
+            TransferInfoPacket Transfer = new TransferInfoPacket();
+            Transfer.TransferInfo.ChannelType = 2;
+            Transfer.TransferInfo.Status = -2;
+            Transfer.TransferInfo.TargetType = 0;
+            Transfer.TransferInfo.Params = req.Params;
+            Transfer.TransferInfo.Size = 0;
+            Transfer.TransferInfo.TransferID = req.TransferRequestID;
+            Transfer.Header.Zerocoded = true;
+            OutPacket(Transfer, ThrottleOutPacketType.Asset);
+        }
+
         public void SendTexture(AssetBase TextureAsset)
         {

@@ -12178,13 +12191,26 @@
         /// <param name="asset"></param>
         protected void AssetReceived(string id, Object sender, AssetBase asset)
         {
-            if (asset == null)
-                return;
-
             TransferRequestPacket transferRequest = (TransferRequestPacket)sender;

             UUID requestID = UUID.Zero;
             byte source = (byte)SourceType.Asset;
+
+            AssetRequestToClient req = new AssetRequestToClient();
+
+            if (asset == null)
+            {
+                req.AssetInf = null;
+                req.AssetRequestSource = source;
+                req.IsTextureRequest = false;
+                req.NumPackets = 0;
+                req.Params = transferRequest.TransferInfo.Params;
+                req.RequestAssetID = requestID;
+                req.TransferRequestID = transferRequest.TransferInfo.TransferID;
+
+                SendAssetNotFound(req);
+                return;
+            }

             if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset)
             {
@@ -12202,7 +12228,6 @@
                 return;

             // The asset is known to exist and is in our cache, so add it to the AssetRequests list
-            AssetRequestToClient req = new AssetRequestToClient();
             req.AssetInf = asset;
             req.AssetRequestSource = source;
             req.IsTextureRequest = false;


Remove debug spam

Remove debug spam

--- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -12307,7 +12307,7 @@
                 }
             }

-            m_log.DebugFormat("texture cached: hits {0}", cacheHits);
+            //m_log.DebugFormat("texture cached: hits {0}", cacheHits);

             cachedresp.Header.Zerocoded = true;
             OutPacket(cachedresp, ThrottleOutPacketType.Task);


llClientView: try to have only one thread per client processing  RegionHandleRequests. (code assumes packet handle is called async as it is not)

--- OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -8751,16 +8751,61 @@

         #region Parcel related packets

+        // acumulate several HandleRegionHandleRequest consecutive overlaping requests
+        // to be done with minimal resources as possible
+        // variables temporary here while in test
+
+        Queue<UUID> RegionHandleRequests = new Queue<UUID>();
+        bool RegionHandleRequestsInService = false;
+
         private bool HandleRegionHandleRequest(IClientAPI sender, Packet Pack)
         {
+            UUID currentUUID;
+
+            RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest;
+
+            if (handlerRegionHandleRequest == null)
+                return true;
+
             RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;

-            RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest;
-            if (handlerRegionHandleRequest != null)
-            {
-                handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID);
-            }
-            return true;
+            lock (RegionHandleRequests)
+            {
+                if (RegionHandleRequestsInService)
+                {
+                    // we are already busy doing a previus request
+                    // so enqueue it
+                    RegionHandleRequests.Enqueue(rhrPack.RequestBlock.RegionID);
+                    return true;
+                }
+
+                // else do it
+                currentUUID = rhrPack.RequestBlock.RegionID;
+                RegionHandleRequestsInService = true;
+            }
+
+            while (true)
+            {
+                handlerRegionHandleRequest(this, currentUUID);
+
+                lock (RegionHandleRequests)
+                {
+                    // exit condition, nothing to do or closed
+                    // current code seems to assume we may loose the handler at anytime,
+                    // so keep checking it
+                    handlerRegionHandleRequest = OnRegionHandleRequest;
+
+                    if (RegionHandleRequests.Count == 0 || !IsActive || handlerRegionHandleRequest == null)
+                    {
+                        RegionHandleRequests.Clear();
+                        RegionHandleRequestsInService = false;
+                        return true;
+                    }
+                    currentUUID = RegionHandleRequests.Dequeue();
+                }
+            }
+
+            return true; // actually unreached
         }

         private bool HandleParcelInfoRequest(IClientAPI sender, Packet Pack)


update to the folder

update to the folder

--- stankinsv2/solution/StankinsV2/StankinsVariousConsole/Program.cs
+++ stankinsv2/solution/StankinsV2/StankinsVariousConsole/Program.cs
@@ -72,13 +72,16 @@
         }
         static async Task<bool> GenerateApp()
         {
+            var templateFolder = @"C:\Users\Surface1\source\repos\TestWebAPI";
+            var lenTemplateFolder = templateFolder.Length;
+            var outputFolder = @"C:\test";
             var recExcel = new ReceiverExcel(@"TestExportExcel.xlsx");

             var data = await recExcel.TransformData(null);
             Console.WriteLine("in excel:"+data.DataToBeSentFurther.Count);

             var tableData = data.Metadata.Tables.First();
-            var rec = new ReceiverFilesInFolder(@"C:\Users\Surface1\source\repos\TestWebAPI","*.*",SearchOption.AllDirectories);
+            var rec = new ReceiverFilesInFolder(templateFolder,"*.*",SearchOption.AllDirectories);
             data = await rec.TransformData(data);
             Console.WriteLine("after files:"+data.DataToBeSentFurther.Count);

@@ -97,8 +100,9 @@
             Console.WriteLine("after one table byte:" + data.DataToBeSentFurther.Count);

             //SenderOutputToFolder
-            //await outFile.TransformData(data);
-            //SenderToRazorFromFile
+            //TransformerUpdateColumn
+            var up = new TransformerUpdateColumn("FullFileName_origin", data.DataToBeSentFurther[2].TableName, $"'{outputFolder}' + SUBSTRING(FullFileName_origin,{lenTemplateFolder+1},100)");
+            data = await up.TransformData(data);
             var x = data.DataToBeSentFurther;
             return true;
         }


Added Index for the snapshot and journal collection

--- src/Akka.Persistence.MongoDb/MongoDbExtension.cs
+++ src/Akka.Persistence.MongoDb/MongoDbExtension.cs
@@ -1,4 +1,5 @@
 using System;
+using System.Threading.Tasks;
 using Akka.Actor;
 using Akka.Persistence.MongoDb.Journal;
 using Akka.Persistence.MongoDb.Snapshot;
@@ -53,6 +54,9 @@
             var journalDatabase = client.GetDatabase(connectionString.DatabaseName);

             JournalCollection = journalDatabase.GetCollection<JournalEntry>(JournalSettings.Collection);
+            JournalCollection.Indexes.CreateOneAsync(
+                Builders<JournalEntry>.IndexKeys.Ascending(entry => entry.PersistenceId)
+                    .Descending(entry => entry.SequenceNr)).Wait();

             var snapshotDatabase = journalDatabase;
             // We only need another client if the connection strings aren't equal,
@@ -65,6 +69,9 @@
             }

             SnapshotCollection = snapshotDatabase.GetCollection<SnapshotEntry>(SnapshotStoreSettings.Collection);
+            SnapshotCollection.Indexes.CreateOneAsync(
+                Builders<SnapshotEntry>.IndexKeys.Ascending(entry => entry.PersistenceId)
+                    .Descending(entry => entry.SequenceNr)).Wait();
         }
     }
 }


Fix attached sounds from HUDs erroneously being delivered to other avatars

--- OpenSim/Region/CoreModules/World/Sound/SoundModule.cs
+++ OpenSim/Region/CoreModules/World/Sound/SoundModule.cs
@@ -62,6 +62,12 @@
         public virtual void PlayAttachedSound(
             UUID soundID, UUID ownerID, UUID objectID, double gain, Vector3 position, byte flags, float radius)
         {
+            SceneObjectPart part = m_scene.GetSceneObjectPart(objectID);
+            if (part == null)
+                return;
+
+            SceneObjectGroup grp = part.ParentGroup;
+
             m_scene.ForEachScenePresence(delegate(ScenePresence sp)
             {
                 if (sp.IsChildAgent)
@@ -70,6 +76,19 @@
                 double dis = Util.GetDistanceTo(sp.AbsolutePosition, position);
                 if (dis > 100.0) // Max audio distance
                     return;
+
+                if (grp.IsAttachment)
+                {
+
+                    if (grp.GetAttachmentPoint() > 30) // HUD
+                    {
+                        if (sp.ControllingClient.AgentId != grp.OwnerID)
+                            return;
+                    }
+
+                    if (sp.ControllingClient.AgentId == grp.OwnerID)
+                        dis = 0;
+                }

                 // Scale by distance
                 if (radius == 0)


Add tests for nullable reference types. (#32371)

Closes #31862.

--- src/Compilers/CSharp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs
+++ src/Compilers/CSharp/Test/Semantic/Semantics/NullableReferenceTypesTests.cs
@@ -71280,5 +71280,144 @@
                 Diagnostic(ErrorCode.WRN_NullabilityMismatchInAssignment, "(default, x)").WithArguments("(T?, object? x)", "(T? x, object y)").WithLocation(12, 32));
             comp.VerifyTypes();
         }
-    }
-}
+
+        [Fact]
+        [WorkItem(31862, "https://github.com/dotnet/roslyn/issues/31862")]
+        public void Issue31862_01()
+        {
+            var source =
+@"
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+public class Working<T> : IEnumerable<IEquatable<T>>
+{
+    public IEnumerator<IEquatable<T>> GetEnumerator() => null;
+
+    IEnumerator IEnumerable.GetEnumerator() => throw null;
+}
+
+public class Broken<T> : IEnumerable<IEquatable<T>>
+{
+    IEnumerator<IEquatable<T>> IEnumerable<IEquatable<T>>.GetEnumerator() => null;
+
+    IEnumerator IEnumerable.GetEnumerator() => throw null;
+}
+";
+            var comp = CreateCompilation(source, options: WithNonNullTypesTrue());
+            comp.VerifyDiagnostics(
+                // (8,58): warning CS8603: Possible null reference return.
+                //     public IEnumerator<IEquatable<T>> GetEnumerator() => null;
+                Diagnostic(ErrorCode.WRN_NullReferenceReturn, "null").WithLocation(8, 58),
+                // (15,78): warning CS8603: Possible null reference return.
+                //     IEnumerator<IEquatable<T>> IEnumerable<IEquatable<T>>.GetEnumerator() => null;
+                Diagnostic(ErrorCode.WRN_NullReferenceReturn, "null").WithLocation(15, 78)
+                );
+        }
+
+        [Fact]
+        [WorkItem(31862, "https://github.com/dotnet/roslyn/issues/31862")]
+        public void Issue31862_02()
+        {
+            var source =
+@"
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+public class Working<T> : IEnumerable<IEquatable<T>>
+{
+    public IEnumerator<IEquatable<T>?> GetEnumerator() => throw null;
+
+    IEnumerator IEnumerable.GetEnumerator() => throw null;
+}
+
+public class Broken<T> : IEnumerable<IEquatable<T>>
+{
+    IEnumerator<IEquatable<T>?> IEnumerable<IEquatable<T>>.GetEnumerator() => throw null;
+
+    IEnumerator IEnumerable.GetEnumerator() => throw null;
+}
+";
+            var comp = CreateCompilation(source, options: WithNonNullTypesTrue());
+            comp.VerifyDiagnostics(
+                // (8,40): warning CS8613: Nullability of reference types in return type doesn't match implicitly implemented member 'IEnumerator<IEquatable<T>> IEnumerable<IEquatable<T>>.GetEnumerator()'.
+                //     public IEnumerator<IEquatable<T>?> GetEnumerator() => throw null;
+                Diagnostic(ErrorCode.WRN_NullabilityMismatchInReturnTypeOnImplicitImplementation, "GetEnumerator").WithArguments("IEnumerator<IEquatable<T>> IEnumerable<IEquatable<T>>.GetEnumerator()").WithLocation(8, 40),
+                // (15,60): warning CS8616: Nullability of reference types in return type doesn't match implemented member 'IEnumerator<IEquatable<T>> IEnumerable<IEquatable<T>>.GetEnumerator()'.
+                //     IEnumerator<IEquatable<T>?> IEnumerable<IEquatable<T>>.GetEnumerator() => throw null;
+                Diagnostic(ErrorCode.WRN_NullabilityMismatchInReturnTypeOnExplicitImplementation, "GetEnumerator").WithArguments("IEnumerator<IEquatable<T>> IEnumerable<IEquatable<T>>.GetEnumerator()").WithLocation(15, 60)
+                );
+        }
+
+        [Fact]
+        [WorkItem(31862, "https://github.com/dotnet/roslyn/issues/31862")]
+        public void Issue31862_03()
+        {
+            var source =
+@"
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+public class Working<T> : IEnumerable<IEquatable<T>>
+{
+    public IEnumerator<IEquatable<T?>> GetEnumerator() => throw null;
+
+    IEnumerator IEnumerable.GetEnumerator() => throw null;
+}
+
+public class Broken<T> : IEnumerable<IEquatable<T>>
+{
+    IEnumerator<IEquatable<T?>> IEnumerable<IEquatable<T>>.GetEnumerator() => throw null;
+
+    IEnumerator IEnumerable.GetEnumerator() => throw null;
+}
+";
+            var comp = CreateCompilation(source, options: WithNonNullTypesTrue());
+            comp.VerifyDiagnostics(
+                // (8,35): error CS8627: A nullable type parameter must be known to be a value type or non-nullable reference type. Consider adding a 'class', 'struct', or type constraint.
+                //     public IEnumerator<IEquatable<T?>> GetEnumerator() => throw null;
+                Diagnostic(ErrorCode.ERR_NullableUnconstrainedTypeParameter, "T?").WithLocation(8, 35),
+                // (8,40): warning CS8613: Nullability of reference types in return type doesn't match implicitly implemented member 'IEnumerator<IEquatable<T>> IEnumerable<IEquatable<T>>.GetEnumerator()'.
+                //     public IEnumerator<IEquatable<T?>> GetEnumerator() => throw null;
+                Diagnostic(ErrorCode.WRN_NullabilityMismatchInReturnTypeOnImplicitImplementation, "GetEnumerator").WithArguments("IEnumerator<IEquatable<T>> IEnumerable<IEquatable<T>>.GetEnumerator()").WithLocation(8, 40),
+                // (15,28): error CS8627: A nullable type parameter must be known to be a value type or non-nullable reference type. Consider adding a 'class', 'struct', or type constraint.
+                //     IEnumerator<IEquatable<T?>> IEnumerable<IEquatable<T>>.GetEnumerator() => throw null;
+                Diagnostic(ErrorCode.ERR_NullableUnconstrainedTypeParameter, "T?").WithLocation(15, 28),
+                // (15,60): warning CS8616: Nullability of reference types in return type doesn't match implemented member 'IEnumerator<IEquatable<T>> IEnumerable<IEquatable<T>>.GetEnumerator()'.
+                //     IEnumerator<IEquatable<T?>> IEnumerable<IEquatable<T>>.GetEnumerator() => throw null;
+                Diagnostic(ErrorCode.WRN_NullabilityMismatchInReturnTypeOnExplicitImplementation, "GetEnumerator").WithArguments("IEnumerator<IEquatable<T>> IEnumerable<IEquatable<T>>.GetEnumerator()").WithLocation(15, 60)
+                );
+        }
+
+        [Fact]
+        [WorkItem(31862, "https://github.com/dotnet/roslyn/issues/31862")]
+        public void Issue31862_04()
+        {
+            var source =
+@"
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+public class Working<T> : IEnumerable<IEquatable<T>>
+{
+    public IEnumerator<IEquatable<T>>? GetEnumerator() => throw null;
+
+    IEnumerator IEnumerable.GetEnumerator() => throw null;
+}
+
+public class Broken<T> : IEnumerable<IEquatable<T>>
+{
+    IEnumerator<IEquatable<T>>? IEnumerable<IEquatable<T>>.GetEnumerator() => throw null;
+
+    IEnumerator IEnumerable.GetEnumerator() => throw null;
+}
+";
+            var comp = CreateCompilation(source, options: WithNonNullTypesTrue());
+            comp.VerifyDiagnostics();
+        }
+    }
+}


Minimize InitConfig() call

Minimize InitConfig() call

--- src/I18nUnity/Mgl/I18n.cs
+++ src/I18nUnity/Mgl/I18n.cs
@@ -58,27 +58,23 @@

         public static void SetLocale(string newLocale = null)
         {
-            if (newLocale != null)
-            {
-                _currentLocale = newLocale;
-                InitConfig();
-            }
+            Configure (_localePath, newLocale, _isLoggingMissing);
         }

         public static void SetPath(string localePath = null)
         {
-            if (localePath != null)
-            {
-                _localePath = localePath;
-                InitConfig();
-            }
+            Configure (localePath, _currentLocale, _isLoggingMissing);
         }

         public static void Configure(string localePath = null, string newLocale = null, bool logMissing = true)
         {
+            if (localePath != null) {
+                _localePath = localePath;
+            }
+            if (newLocale != null) {
+                _currentLocale = newLocale;
+            }
             _isLoggingMissing = logMissing;
-            SetPath(localePath);
-            SetLocale(newLocale);
             InitConfig();
         }


Added a ScaledDescription property to the ItemSpell class

--- src/ArgentPonyWarcraftClient/Models/ItemSpell.cs
+++ src/ArgentPonyWarcraftClient/Models/ItemSpell.cs
@@ -42,5 +42,11 @@
         /// </summary>
         [JsonProperty("trigger")]
         public string Trigger { get; set; }
+
+        /// <summary>
+        /// Get or sets the scaled description.
+        /// </summary>
+        [JsonProperty("scaledDescription")]
+        public string ScaledDescription { get; set; }
     }
 }


[Modify] Edit it

[Modify] Edit it

--- websocket-sharp/Net/WebSockets/WebSocketContext.cs
+++ websocket-sharp/Net/WebSockets/WebSocketContext.cs
@@ -174,13 +174,12 @@
     public abstract IEnumerable<string> SecWebSocketProtocols { get; }

     /// <summary>
-    /// Gets the value of the Sec-WebSocket-Version header included in the request.
-    /// </summary>
-    /// <remarks>
-    /// This property represents the WebSocket protocol version.
-    /// </remarks>
-    /// <value>
-    /// A <see cref="string"/> that represents the value of the Sec-WebSocket-Version header.
+    /// Gets the value of the Sec-WebSocket-Version header included in
+    /// the handshake request.
+    /// </summary>
+    /// <value>
+    /// A <see cref="string"/> that represents the WebSocket protocol
+    /// version specified by the client.
     /// </value>
     public abstract string SecWebSocketVersion { get; }


updated custom fields view added for code needed to pass the custom answers and field ids back to the controller, still associated with eachother

--- Purchasing.Web/Views/OrderMockup/_CustomFields.cshtml
+++ Purchasing.Web/Views/OrderMockup/_CustomFields.cshtml
@@ -13,14 +13,15 @@

-            @foreach (var customField in Model.CustomFields.OrderBy(x=>x.Rank))
+            @{ var customFields = Model.CustomFields.OrderBy(x => x.Rank).ToArray(); }
+            @for (int i = 0; i < customFields.Count(); i++)
             {
-                var answerIfAvailable = Model.Order.CustomFieldAnswers.Where(x => x.CustomField.Id == customField.Id).Select(x=>x.Answer).FirstOrDefault() ?? string.Empty;
+                var answerIfAvailable = Model.Order.CustomFieldAnswers.Where(x => x.CustomField.Id == customFields[i].Id).Select(x=>x.Answer).FirstOrDefault() ?? string.Empty;

-
@customField.Name

+
@customFields[i].Name

-                    <input type="hidden" name="customfield.id" value="@customField.Id" />
-                    <input name="customfield.answer" type="text" value="@answerIfAvailable" />
+                    <input type="hidden" name='@string.Format("customfields[{0}].id", i)' value="@customFields[i].Id" />
+                    <input name='@string.Format("customfields[{0}].answer", i)' type="text" value="@answerIfAvailable" />

             }


Simplified the stream to byte array conversion.

--- src/main/dot-net/Stumps.Base/Utility/StreamUtility.cs
+++ src/main/dot-net/Stumps.Base/Utility/StreamUtility.cs
@@ -29,27 +29,15 @@
                 throw new ArgumentNullException("stream");
             }

-            var buffer = new byte[StreamUtility.BufferSize];
-            byte[] outArray;
-
-            stream.Position = 0;
+            byte[] streamAsBytes;

             using (var ms = new MemoryStream())
             {
-
-                int bytesRead;
-                while ((bytesRead = stream.Read(buffer, 0, StreamUtility.BufferSize)) > 0)
-                {
-                    ms.Write(buffer, 0, bytesRead);
-                }
-
-                outArray = ms.ToArray();
-
+                stream.CopyTo(ms);
+                streamAsBytes = ms.ToArray();
             }

-            stream.Position = 0;
-
-            return outArray;
+            return streamAsBytes;

         }


fix(Local.cs): alterar visibilidade de construtor sem parâmetros.

--- modulo-ajax/CdZ/src/CdZ.Dominio/Cavaleiro/Local.cs
+++ modulo-ajax/CdZ/src/CdZ.Dominio/Cavaleiro/Local.cs
@@ -10,7 +10,7 @@
         /*
          * Precisamos deste construtor vazio por causa do Entity Framework.
          */
-        private Local() { }
+        public Local() { }

         /// <summary>
         /// Usado na criação.


Fix StyleCop error in ItemTemplateTest.cs

--- test/T4Toolbox.VisualStudio.IntegrationTests/ItemTemplateTest.cs
+++ test/T4Toolbox.VisualStudio.IntegrationTests/ItemTemplateTest.cs
@@ -51,9 +51,9 @@
                 ProjectItem projectItem = this.CreateTestProjectItem(templateName);

                 // Verify that project item created from full template has CustomTool/Generator set to enable T4 transformation
-                const string textTemplatingFileGenerator = "TextTemplatingFileGenerator";
-                Assert.AreEqual(textTemplatingFileGenerator, projectItem.GetItemAttribute(ItemMetadata.Generator));
-                Assert.AreEqual(textTemplatingFileGenerator, projectItem.Properties.Item(ProjectItemProperty.CustomTool).Value);
+                const string TextTemplatingFileGenerator = "TextTemplatingFileGenerator";
+                Assert.AreEqual(TextTemplatingFileGenerator, projectItem.GetItemAttribute(ItemMetadata.Generator));
+                Assert.AreEqual(TextTemplatingFileGenerator, projectItem.Properties.Item(ProjectItemProperty.CustomTool).Value);

                 // Verify that output file was automatically generated
                 ProjectItem outputItem = projectItem.ProjectItems.Cast<ProjectItem>().Single();


Remove async error handler from the publish connection.

--- examples/Benchmark/Benchmark.cs
+++ examples/Benchmark/Benchmark.cs
@@ -178,7 +178,7 @@
             };

             IConnection subConn = cf.CreateConnection(o);
-            IConnection pubConn = cf.CreateConnection(o);
+            IConnection pubConn = cf.CreateConnection(url);

             subConn.SubscribeAsync(subject, (sender, args) =>
             {


CLI - support for multiple generators

CLI - support for multiple generators

- You can specify `--gen` multiple times at the command line
- `--gen=Java` will automatically imply `--gen=C` first
- I don't think this breaks any command line argument validation

--- binder/CLI.cs
+++ binder/CLI.cs
@@ -9,7 +9,7 @@
 {
     public class CLI
     {
-        static string Generator;
+        static List<GeneratorKind> Generators;
         static string Platform;
         static string OutputDir;
         static string VsVersion;
@@ -28,7 +28,7 @@
                 .Select(s => s.StartsWith("VS", StringComparison.InvariantCulture) ? s.Substring(2) : s));

             var optionSet = new Mono.Options.OptionSet() {
-                { "gen=", "target generator (C, C++, Obj-C, Java)", v => Generator = v },
+                { "gen=", "target generator (C, C++, Obj-C, Java)", v => Generators.Add(ConvertToGeneratorKind(v)) },
                 { "p|platform=", "target platform (iOS, macOS, Android, Windows)", v => Platform = v },
                 { "o|out|outdir=", "output directory", v => OutputDir = v },
                 { "c|compile", "compiles the generated output", v => CompileCode = true },
@@ -41,7 +41,7 @@
                 { "h|help",  "show this message and exit",  v => showHelp = v != null },
             };

-            Generator = "C";
+            Generators = new List<GeneratorKind>();
             VsVersion = "latest";

             try
@@ -155,19 +155,22 @@
             if (options.OutputDir == null)
                 options.OutputDir = Directory.GetCurrentDirectory();

-            if (string.IsNullOrEmpty(Generator))
+            if (Generators.Count == 0)
             {
                 Console.Error.WriteLine("Please specify a target generator.");
                 return false;
             }

-            var generator = ConvertToGeneratorKind(Generator);
-            options.GeneratorKind = generator;
-
             if (string.IsNullOrEmpty(Platform))
             {
                 Console.Error.WriteLine("Please specify a target platform.");
                 return false;
+            }
+
+            //NOTE: Choosing Java generator, needs to imply the C generator
+            if (Generators.Contains(GeneratorKind.Java) && !Generators.Contains(GeneratorKind.C))
+            {
+                Generators.Insert(0, GeneratorKind.C);
             }

             var targetPlatform = ConvertToTargetPlatform(Platform);
@@ -195,9 +198,14 @@
             foreach (var assembly in Assemblies)
                 project.Assemblies.Add(assembly);

-            var driver = new Driver(project, options);
-
-            driver.Run();
+            foreach (var generator in Generators)
+            {
+                options.GeneratorKind = generator;
+
+                var driver = new Driver(project, options);
+
+                driver.Run();
+            }
         }
     }
 }


Expand profile pages

Expand profile pages

--- src/AtomicChessPuzzles/Views/User/Profile.cshtml
+++ src/AtomicChessPuzzles/Views/User/Profile.cshtml
@@ -4,3 +4,11 @@
 @model AtomicChessPuzzles.ViewModels.User

@Model.Username

+About:
+

+    @Model.About
+

+

+    Puzzles made: @Model.PuzzlesMade

+    Percentage correct: @Model.PercentageCorrect %
+


adding call to clone

adding call to clone

--- src/Grace/DependencyInjection/Impl/ActivationStrategyCollectionContainer.cs
+++ src/Grace/DependencyInjection/Impl/ActivationStrategyCollectionContainer.cs
@@ -192,7 +192,7 @@

                 foreach (var keyValuePair in Collections[i])
                 {
-                    newArray[i] = newArray[i].Add(keyValuePair.Key, keyValuePair.Value);
+                    newArray[i] = newArray[i].Add(keyValuePair.Key, keyValuePair.Value.Clone());
                 }
             }


Fixes #1576 PythonCore default description does not match 3.6 description Updates default description format.

--- Python/Product/VSInterpreters/PythonRegistrySearch.cs
+++ Python/Product/VSInterpreters/PythonRegistrySearch.cs
@@ -184,7 +184,7 @@
             var description = tagKey.GetValue("DisplayName") as string;
             if (string.IsNullOrEmpty(description)) {
                 if (pythonCoreCompatibility) {
-                    description = "Python {0} {1}".FormatUI(arch, version);
+                    description = "Python {0}{1: ()}".FormatUI(version, arch);
                 } else {
                     description = "{0} {1}".FormatUI(company, tag);
                 }


More defensive with auth method

More defensive with auth method

--- src/Libraries/Thinktecture.IdentityServer.Core/TokenService/TokenService.cs
+++ src/Libraries/Thinktecture.IdentityServer.Core/TokenService/TokenService.cs
@@ -77,7 +77,11 @@
                 principal.Identity.Name,
                 rst.AppliesTo.Uri.AbsoluteUri));

-            Tracing.Information("Authentication method: " + principal.Identities.First().FindFirst(ClaimTypes.AuthenticationMethod).Value);
+            var authenticationMethod = principal.Identities.First().FindFirst(ClaimTypes.AuthenticationMethod);
+            if (authenticationMethod != null)
+            {
+                Tracing.Information("Authentication method: " + authenticationMethod.Value);
+            }

             // analyze request
             var request = new Request(ConfigurationRepository);


We need to change the Help menu again.

We need to change the Help menu again.

--- src/BloomExe/Workspace/WorkspaceView.Designer.cs
+++ src/BloomExe/Workspace/WorkspaceView.Designer.cs
@@ -42,7 +42,7 @@
 			this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
 			this._releaseNotesMenuItem = new System.Windows.Forms.ToolStripMenuItem();
 			this.deepBloomMenuItem = new System.Windows.Forms.ToolStripMenuItem();
-			this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator();
+			this._divider1 = new System.Windows.Forms.ToolStripSeparator();
 			this.buildingReaderTemplatesMenuItem = new System.Windows.Forms.ToolStripMenuItem();
 			this.usingReaderTemplatesMenuItem = new System.Windows.Forms.ToolStripMenuItem();
 			this._divider2 = new System.Windows.Forms.ToolStripSeparator();
@@ -113,7 +113,7 @@
 			this._toolStrip.Location = new System.Drawing.Point(0, 0);
 			this._toolStrip.Name = "_toolStrip";
 			this._toolStrip.RightToLeft = System.Windows.Forms.RightToLeft.No;
-			this._toolStrip.Size = new System.Drawing.Size(272, 65);
+			this._toolStrip.Size = new System.Drawing.Size(272, 46);
 			this._toolStrip.TabIndex = 28;
 			this._toolStrip.Text = "_toolStrip";
 			//
@@ -156,7 +156,7 @@
             this.toolStripSeparator1,
             this._releaseNotesMenuItem,
             this.deepBloomMenuItem,
-            this.toolStripMenuItem1,
+            this._divider1,
             this.buildingReaderTemplatesMenuItem,
             this.usingReaderTemplatesMenuItem,
             this._divider2,
@@ -219,10 +219,10 @@
 			this.deepBloomMenuItem.Text = "Deep Bloom Paper";
 			this.deepBloomMenuItem.Click += new System.EventHandler(this.deepBloomMenuItem_Click);
 			//
-			// toolStripMenuItem1
-			//
-			this.toolStripMenuItem1.Name = "toolStripMenuItem1";
-			this.toolStripMenuItem1.Size = new System.Drawing.Size(212, 6);
+			// _divider1
+			//
+			this._divider1.Name = "_divider1";
+			this._divider1.Size = new System.Drawing.Size(212, 6);
 			//
 			// buildingReaderTemplatesMenuItem
 			//
@@ -493,7 +493,7 @@
 		private System.Windows.Forms.ToolStripMenuItem deepBloomMenuItem;
 		private System.Windows.Forms.ToolStripMenuItem buildingReaderTemplatesMenuItem;
 		private System.Windows.Forms.ToolStripMenuItem usingReaderTemplatesMenuItem;
-		private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1;
+		private System.Windows.Forms.ToolStripSeparator _divider1;

     }


Added Sanitize for external logins as well

--- src/Libraries/Thinktecture.IdentityServer.Core/TokenService/TokenService.cs
+++ src/Libraries/Thinktecture.IdentityServer.Core/TokenService/TokenService.cs
@@ -159,7 +159,7 @@
             IdentityProvider idp = null;
             if (IdentityProviderRepository.TryGet(idpClaim.Value, out idp))
             {
-                var transformedClaims = ClaimsTransformationRulesRepository.ProcessClaims(principal, idp, requestDetails);
+                var transformedClaims = ClaimsTransformationRulesRepository.ProcessClaims(SanitizeInternalClaims(principal), idp, requestDetails);
                 return new ClaimsIdentity(transformedClaims, "External");
             }


Fall back to using old command when GetServer isn't supported. (#41649)

--- src/Caching/StackExchangeRedis/src/RedisCache.cs
+++ src/Caching/StackExchangeRedis/src/RedisCache.cs
@@ -292,13 +292,22 @@
     {
         _ = _connection ?? throw new InvalidOperationException($"{nameof(_connection)} cannot be null.");

-        foreach (var endPoint in _connection.GetEndPoints())
-        {
-            if (_connection.GetServer(endPoint).Version < ServerVersionWithExtendedSetCommand)
-            {
-                _setScript = SetScriptPreExtendedSetCommand;
-                return;
-            }
+        try
+        {
+            foreach (var endPoint in _connection.GetEndPoints())
+            {
+                if (_connection.GetServer(endPoint).Version < ServerVersionWithExtendedSetCommand)
+                {
+                    _setScript = SetScriptPreExtendedSetCommand;
+                    return;
+                }
+            }
+        }
+        catch (NotSupportedException)
+        {
+            // The GetServer call may not be supported with some configurations, in which
+            // case let's also fall back to using the older command.
+            _setScript = SetScriptPreExtendedSetCommand;
         }
     }