don't copy some setters

don't copy some setters

--- Wox.Core/Resource/Theme.cs
+++ Wox.Core/Resource/Theme.cs
@@ -119,7 +119,6 @@
             };

             Style queryBoxStyle = dict["QueryBoxStyle"] as Style;
-
             if (queryBoxStyle != null)
             {
                 queryBoxStyle.Setters.Add(new Setter(TextBox.FontFamilyProperty, new FontFamily(Settings.QueryBoxFont)));
@@ -133,12 +132,13 @@
                     queryBoxStyle.Setters.Add(new Setter(TextBox.CaretBrushProperty, foregroundPropertyValue));
             }

-            var queryTextSuggestionBoxStyle = new Style(typeof (TextBox), queryBoxStyle);
+            var queryTextSuggestionBoxStyle = new Style(typeof(TextBox), queryBoxStyle);
             bool hasSuggestion = false;
             if (dict.Contains("QueryTextSuggestionBoxStyle")) {
                 queryTextSuggestionBoxStyle = dict["QueryTextSuggestionBoxStyle"] as Style;
                 hasSuggestion = true;
             }
+            dict["QueryTextSuggestionBoxStyle"] = queryTextSuggestionBoxStyle;
             if (queryTextSuggestionBoxStyle != null)
             {
                 queryTextSuggestionBoxStyle.Setters.Add(new Setter(TextBox.FontFamilyProperty, new FontFamily(Settings.QueryBoxFont)));
@@ -150,15 +150,24 @@
             var queryBoxStyleSetters = queryBoxStyle.Setters.OfType<Setter>().ToList();
             var queryTextSuggestionBoxStyleSetters = queryTextSuggestionBoxStyle.Setters.OfType<Setter>().ToList();
             foreach (Setter setter in queryBoxStyleSetters) {
+                if (setter.Property == TextBox.BackgroundProperty)
+                    continue;
+                if (setter.Property == TextBox.ForegroundProperty)
+                    continue;
                 if (queryTextSuggestionBoxStyleSetters.All(x => x.Property != setter.Property))
                     queryTextSuggestionBoxStyle.Setters.Add(setter);
             }

             if (!hasSuggestion) {
-                queryTextSuggestionBoxStyle.Setters.OfType<Setter>().FirstOrDefault(x => x.Property == TextBox.BackgroundProperty).Value =
-                    queryBoxStyle.Setters.OfType<Setter>().FirstOrDefault(x => x.Property == TextBox.BackgroundProperty)?.Value ??
+                var backgroundBrush = queryBoxStyle.Setters.OfType<Setter>().FirstOrDefault(x => x.Property == TextBox.BackgroundProperty)?.Value ??
                     (dict["BaseQuerySuggestionBoxStyle"] as Style).Setters.OfType<Setter>().FirstOrDefault(x => x.Property == TextBox.BackgroundProperty).Value;
                 queryBoxStyle.Setters.OfType<Setter>().FirstOrDefault(x => x.Property == TextBox.BackgroundProperty).Value = Brushes.Transparent;
+                if (queryTextSuggestionBoxStyle.Setters.OfType<Setter>().Any(x => x.Property == TextBox.BackgroundProperty)) {
+                    queryTextSuggestionBoxStyle.Setters.OfType<Setter>().First(x => x.Property == TextBox.BackgroundProperty).Value = backgroundBrush;
+                }
+                else {
+                    queryTextSuggestionBoxStyle.Setters.Add(new Setter(TextBox.BackgroundProperty, backgroundBrush));
+                }
             }

             Style resultItemStyle = dict["ItemTitleStyle"] as Style;


Inherit interface

Inherit interface

--- XmlDict/XmlDictNodeList.cs
+++ XmlDict/XmlDictNodeList.cs
@@ -3,7 +3,7 @@

 namespace XmlDict
 {
-    public class XmlDictNodeList
+    public class XmlDictNodeList : IXmlDict
     {
         private List<XmlDictNode> _dictionaries = new List<XmlDictNode>();


In case of syntax error, do not report an empty range.

--- YamlDotNet/Core/Scanner.cs
+++ YamlDotNet/Core/Scanner.cs
@@ -492,8 +492,11 @@
 			}

 			// If we don't determine the token type so far, it is an error.
-			var mark = cursor.Mark();
-			throw new SyntaxErrorException(mark, mark, "While scanning for the next token, find character that cannot start any token.");
+			var start = cursor.Mark();
+			Skip();
+			var end = cursor.Mark();
+
+			throw new SyntaxErrorException(start, end, "While scanning for the next token, find character that cannot start any token.");
 		}

 		private bool CheckWhiteSpace()


Created UI actions for repeat mode functionality; this is where the repeat

2008-02-27  Aaron Bockover  <abock@gnome.org>

    * src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackRepeatActions.cs:
    Created UI actions for repeat mode functionality; this is where the
    repeat mode can be accessed and is stored/loaded from configuration;
    the UI actions are set up here

    * src/Core/Banshee.ThickClient/Banshee.Gui.Widgets/RepeatActionButton.cs:
    A special button that syncs its state with the PlaybackRepeatActions and
    presents the actions as a popup menu

    * src/Clients/Nereid/Nereid/PlayerInterface.cs: Make the footer actually
    a Gtk.Toolbar, pack the new RepeatActionButton, and do some allocation
    magic to ensure the status bar is always centered on the toolbar; moved
    the only two schema items that are still at the client level into here

    * src/Core/Banshee.ThickClient/Banshee.Gui/BansheeIconFactory.cs: Added
    the media-repeat icons into the stock

    * src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackActions.cs: Load the
    PlaybackRepeatActions as a child set of actions

    * src/Clients/Nereid/Nereid/PlayerWindowSchema.cs: Removed

    * src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml:
    Added a ToolbarFooter object

    * src/Libraries/Hyena/Hyena/StringUtil.cs: Added UnderCaseToCamelCase
    method that does the opposite of what CamelCaseToUnderCaseDoes; use
    a StringBuilder for the latter

    * tests/Hyena/StringUtilTests.cs: Added some tests for the above two methods

svn path=/trunk/banshee/; revision=3343

--- Hyena/Hyena/StringUtil.cs
+++ Hyena/Hyena/StringUtil.cs
@@ -27,6 +27,7 @@
 //

 using System;
+using System.Text;
 using System.Globalization;
 using System.Text.RegularExpressions;

@@ -66,7 +67,7 @@
                 return null;
             }

-            string undercase = String.Empty;
+            StringBuilder undercase = new StringBuilder ();
             string [] tokens = Regex.Split (s, "([A-Z]{1}[a-z]+)");

             for (int i = 0; i < tokens.Length; i++) {
@@ -74,13 +75,42 @@
                     continue;
                 }

-                undercase += tokens[i].ToLower ();
+                undercase.Append (tokens[i].ToLower ());
                 if (i < tokens.Length - 2) {
-                    undercase += "_";
+                    undercase.Append ('_');
                 }
             }

-            return undercase;
+            return undercase.ToString ();
+        }
+
+        public static string UnderCaseToCamelCase (string s)
+        {
+            if (String.IsNullOrEmpty (s)) {
+                return null;
+            }
+
+            StringBuilder builder = new StringBuilder ();
+
+            for (int i = 0, n = s.Length, b = -1; i < n; i++) {
+                if (b < 0 && s[i] != '_') {
+                    builder.Append (Char.ToUpper (s[i]));
+                    b = i;
+                } else if (s[i] == '_' && i + 1 < n && s[i + 1] != '_') {
+                    if (builder.Length > 0 && Char.IsUpper (builder[builder.Length - 1])) {
+                        builder.Append (Char.ToLower (s[i + 1]));
+                    } else {
+                        builder.Append (Char.ToUpper (s[i + 1]));
+                    }
+                    i++;
+                    b = i;
+                } else if (s[i] != '_') {
+                    builder.Append (Char.ToLower (s[i]));
+                    b = i;
+                }
+            }
+
+            return builder.ToString ();
         }
     }
 }


made ignored tests explicit

made ignored tests explicit

--- StatePrinter.Tests/TestingAssistance/USerStory.cs
+++ StatePrinter.Tests/TestingAssistance/USerStory.cs
@@ -40,7 +40,7 @@
         }
     }

-    [Ignore("Run these in order to see how Nunit integrates with the testing assistance")]
+    [Explicit("Run these in order to see how Nunit integrates with the testing assistance")]
     [TestFixture]
     class Userstory
     {


Reorder comparison in tests

Reorder comparison in tests

--- SurveyMonkeyTests/WebClientInfrastructureTests.cs
+++ SurveyMonkeyTests/WebClientInfrastructureTests.cs
@@ -45,19 +45,19 @@
             //Should be no rate limit first time
             stopwatch.Start();
             api.GetSurveys();
-            Assert.GreaterOrEqual(toleranceMilliseconds, stopwatch.ElapsedMilliseconds);
+            Assert.LessOrEqual(stopwatch.ElapsedMilliseconds, toleranceMilliseconds);

             //Second request should be rate limited
             stopwatch.Restart();
             api.GetSurveys();
-            Assert.LessOrEqual(defaultRateLimitMilliseconds - toleranceMilliseconds, stopwatch.ElapsedMilliseconds);
-            Assert.GreaterOrEqual(defaultRateLimitMilliseconds + toleranceMilliseconds, stopwatch.ElapsedMilliseconds);
+            Assert.GreaterOrEqual(stopwatch.ElapsedMilliseconds, defaultRateLimitMilliseconds - toleranceMilliseconds);
+            Assert.LessOrEqual(stopwatch.ElapsedMilliseconds, defaultRateLimitMilliseconds + toleranceMilliseconds);

             //Check subsequent requests are rate limited too
             stopwatch.Restart();
             api.GetSurveys();
-            Assert.LessOrEqual(defaultRateLimitMilliseconds - toleranceMilliseconds, stopwatch.ElapsedMilliseconds);
-            Assert.GreaterOrEqual(defaultRateLimitMilliseconds + toleranceMilliseconds, stopwatch.ElapsedMilliseconds);
+            Assert.GreaterOrEqual(stopwatch.ElapsedMilliseconds, defaultRateLimitMilliseconds - toleranceMilliseconds);
+            Assert.LessOrEqual(stopwatch.ElapsedMilliseconds, defaultRateLimitMilliseconds + toleranceMilliseconds);
         }
     }
 }


Fixes c0a529a421cb47145a32078770205e42545e7021

--- System/compmod/system/diagnostics/TypedElement.cs
+++ System/compmod/system/diagnostics/TypedElement.cs
@@ -11,7 +11,7 @@

 namespace System.Diagnostics {
     internal class TypedElement : ConfigurationElement {
-#if BOOTSTRAP
+#if BOOTSTRAP_BASIC
         protected static readonly ConfigurationProperty _propTypeName = new ConfigurationProperty("type", typeof(string), String.Empty, ConfigurationPropertyOptions.IsRequired);
 #else
         protected static readonly ConfigurationProperty _propTypeName = new ConfigurationProperty("type", typeof(string), String.Empty, ConfigurationPropertyOptions.IsRequired | ConfigurationPropertyOptions.IsTypeStringTransformationRequired);


Local UserData Default #CHANGE: Duality applications now default to storing their user data in the local folder, rather then the OS user directory.

--- Duality/Utility/DualityAppData.cs
+++ Duality/Utility/DualityAppData.cs
@@ -12,19 +12,19 @@
 	/// </summary>
 	public class DualityAppData
 	{
-		private	string				appName					= "Duality Application";
-		private	string				authorName				= "Unknown";
-		private	string				websiteUrl				= "http://www.adamslair.net";
-		private	uint				version					= 0;
-		private	ContentRef<Scene>	startScene				= null;
-		private	float				speedOfSound			= 360.0f;
-		private	float				soundDopplerFactor		= 1.0f;
-		private	float				physicsVelThreshold		= 0.5f * PhysicsUnit.VelocityToDuality;
-		private	bool				physicsFixedTime		= false;
-		private	bool				localUserData			= false;
-		private	bool				multisampleBackBuffer	= true;
-		private string[]			skipBackends			= null;
-		private	object				customData				= null;
+		private string            appName               = "Duality Application";
+		private string            authorName            = "Unknown";
+		private string            websiteUrl            = "http://www.adamslair.net";
+		private uint              version               = 0;
+		private ContentRef<Scene> startScene            = null;
+		private float             speedOfSound          = 360.0f;
+		private float             soundDopplerFactor    = 1.0f;
+		private float             physicsVelThreshold   = 0.5f * PhysicsUnit.VelocityToDuality;
+		private bool              physicsFixedTime      = false;
+		private bool              localUserData         = true;
+		private bool              multisampleBackBuffer = true;
+		private string[]          skipBackends          = null;
+		private object            customData            = null;

 		/// <summary>
 		/// [GET / SET] The name of your application / game. It will also be used as a window title by the launcher app.


Remove unused FileReadBufferSize property.

The last reference was removed in revision 20f7b42945.

--- Duplicati/Library/Main/Options.cs
+++ Duplicati/Library/Main/Options.cs
@@ -1369,22 +1369,6 @@
         }

         /// <summary>
-        /// Gets the size the read-ahead buffer
-        /// </summary>
-        public long FileReadBufferSize
-        {
-            get
-            {
-                string tmp;
-                if (!m_options.TryGetValue("file-read-buffer-size", out tmp))
-                    tmp = DEFAULT_READ_BUFFER_SIZE;
-
-                long t = Library.Utility.Sizeparser.ParseSize(tmp, "mb");
-                return (int)t;
-            }
-        }
-
-        /// <summary>
         /// Gets a flag indicating if metadata for files and folders should be ignored
         /// </summary>
         public bool SkipMetadata


Skip Leaderboard test wich timeouts frequently.

--- applications/leaderboard/LeaderboardTest/Tests.cs
+++ applications/leaderboard/LeaderboardTest/Tests.cs
@@ -82,7 +82,7 @@
                 _fixture.ProjectId, _fixture.InstanceId, _fixture.DatabaseId);
         }

-        [Fact]
+        [Fact(Skip = "https://github.com/GoogleCloudPlatform/dotnet-docs-samples/issues/928")]
         void TestLeaderboard()
         {
             // Insert Player records.


Canonicalize filepaths containing native system sub-directory

--- EarTrumpet/UI/Controls/ImageEx.cs
+++ EarTrumpet/UI/Controls/ImageEx.cs
@@ -3,6 +3,7 @@
 using EarTrumpet.UI.Helpers;
 using System;
 using System.Diagnostics;
+using System.IO;
 using System.Text;
 using System.Windows;
 using System.Windows.Controls;
@@ -19,6 +20,8 @@
           "SourceEx", typeof(IAppIconSource), typeof(ImageEx), new PropertyMetadata(null, new PropertyChangedCallback(OnSourceExChanged)));

         private uint _dpi;
+        private static readonly string _windowsPath = Environment.GetFolderPath(Environment.SpecialFolder.Windows);
+        private static readonly string _systemPath = Environment.GetFolderPath(Environment.SpecialFolder.System);

         public ImageEx()
         {
@@ -102,6 +105,7 @@

         public static ImageSource LoadShellIcon(string path, bool isDesktopApp, int cx, int cy)
         {
+            path = CanonicalizePath(path);
             var item = isDesktopApp ? Shell32.SHCreateItemFromParsingName(path, IntPtr.Zero, typeof(IShellItem2).GUID) :
                 Shell32.SHCreateItemInKnownFolder(FolderIds.AppsFolder, Shell32.KF_FLAG_DONT_VERIFY, path, typeof(IShellItem2).GUID);

@@ -118,6 +122,15 @@
             }
         }

+        private static string CanonicalizePath(string path)
+        {
+            if (Path.GetDirectoryName(path).StartsWith(_systemPath, StringComparison.InvariantCultureIgnoreCase))
+            {
+                path = Path.Combine(_windowsPath, "sysnative", path.Substring(_systemPath.Length + 1));
+            }
+            return path;
+        }
+
         private uint GetWindowDpi() => User32.GetDpiForWindow(((HwndSource)PresentationSource.FromVisual(this)).Handle);
         private static void OnSourceExChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) => ((ImageEx)d).OnSourceExChanged();
     }


LastElement() tests.

LastElement() tests.

--- sources/HDocument.Tests/HQuery/ElementTest.cs
+++ sources/HDocument.Tests/HQuery/ElementTest.cs
@@ -406,6 +406,27 @@

         #endregion

+        #region LastElement()
+
+        [Fact]
+        public void TestLastElement()
+        {
+            var element1 = new HElement("div", "Content");
+            var element2 = new HElement("div", "Content2");
+
+            var elements = new HElement[] { element1, element2, null };
+            Assert.Same(element2, elements.LastElement().Single());
+
+            elements = new HElement[] { null };
+            Assert.Equal(0, elements.LastElement().Count());
+
+            elements = null;
+            Assert.Equal(0, elements.LastElement().Count());
+
+        }
+
+        #endregion
+
         #region Html()

         [Fact]


Added NewLine() to ILogger

Added NewLine() to ILogger

--- UniversalUnityHooks.Logging/Interfaces/ILogger.cs
+++ UniversalUnityHooks.Logging/Interfaces/ILogger.cs
@@ -19,5 +19,7 @@
         void LogError(string message);

         void LogCritical(string message);
+
+        void NewLine();
     }
 }


correction on change view

correction on change view

--- VTigerManagerDemoControls/KeyValueDataGridView.cs
+++ VTigerManagerDemoControls/KeyValueDataGridView.cs
@@ -131,10 +131,20 @@
                 foreach (DataRow inRow in inputTable.Rows)
                 {
                     //string colValue = inRow[iCol].ToString();
-                    if ((string)inRow[iCol] == "")
-                        row[i] = DBNull.Value;
-                    else
-                        row[i] = inRow[iCol];
+                    try
+                    {
+
+                        if (string.IsNullOrEmpty(inRow[iCol].ToString()))
+                            row[i] = DBNull.Value;
+                        else
+                            row[i] = inRow[iCol];
+                    }
+                    catch (Exception e)
+                    {
+
+
+                    }
+
                     i++;
                 }
                 outputTable.Rows.Add(row);


Delete Target.cs

Delete Target.cs

--- GUI/Target.cs
+++ GUI/Target.cs
@@ -1,8 +0,0 @@
-using System;
-
-public class Class1
-{
-	public Class1()
-	{
-	}
-}


Fix broken build.

Fix broken build.

--- src/Agent.Worker/Build/TfsVCSourceProvider.cs
+++ src/Agent.Worker/Build/TfsVCSourceProvider.cs
@@ -123,7 +123,7 @@
                     }
 #else
                     // Undo pending changes.
-                    ITfsVCStatus tfStatus = await tf.StatusAsync();
+                    ITfsVCStatus tfStatus = await tf.StatusAsync(localPath: sourcesDirectory);
                     if (tfStatus?.HasPendingChanges ?? false)
                     {
                         await tf.UndoAsync(localPath: sourcesDirectory);


Minor changes

Minor changes

--- WWCP_Core/Commands/SendCDRs/OnSendCDRsDelegate.cs
+++ WWCP_Core/Commands/SendCDRs/OnSendCDRsDelegate.cs
@@ -30,21 +30,6 @@
 {

     /// <summary>
-    /// Create a SendChargeDetailRecord request.
-    /// </summary>
-    /// <param name="Timestamp">The timestamp of the request.</param>
-    /// <param name="CancellationToken">A token to cancel this request.</param>
-    /// <param name="EventTrackingId">An unique event tracking identification for correlating this request with other events.</param>
-    /// <param name="ChargeDetailRecords">An enumeration of charge detail records.</param>
-    /// <param name="RequestTimeout">An optional timeout for this request.</param>
-    public delegate Task<SendCDRsResult> OnChargeDetailRecordDelegate(DateTime                         Timestamp,
-                                                                      CancellationToken                CancellationToken,
-                                                                      EventTracking_Id                 EventTrackingId,
-                                                                      IEnumerable<ChargeDetailRecord>  ChargeDetailRecords,
-                                                                      TimeSpan?                        RequestTimeout  = null);
-
-
-    /// <summary>
     /// An event fired whenever a charge detail record will be send.
     /// </summary>
     /// <param name="LogTimestamp">The timestamp of the logging.</param>
@@ -65,6 +50,21 @@
                                                   IEnumerable<ChargeDetailRecord>  DroppedChargeDetailRecords,
                                                   IEnumerable<ChargeDetailRecord>  ForwardedChargeDetailRecords,
                                                   TimeSpan?                        RequestTimeout);
+
+
+    /// <summary>
+    /// Create a SendChargeDetailRecord request.
+    /// </summary>
+    /// <param name="Timestamp">The timestamp of the request.</param>
+    /// <param name="CancellationToken">A token to cancel this request.</param>
+    /// <param name="EventTrackingId">An unique event tracking identification for correlating this request with other events.</param>
+    /// <param name="ChargeDetailRecords">An enumeration of charge detail records.</param>
+    /// <param name="RequestTimeout">An optional timeout for this request.</param>
+    public delegate Task<SendCDRsResult> OnChargeDetailRecordDelegate(DateTime                         Timestamp,
+                                                                      CancellationToken                CancellationToken,
+                                                                      EventTracking_Id                 EventTrackingId,
+                                                                      IEnumerable<ChargeDetailRecord>  ChargeDetailRecords,
+                                                                      TimeSpan?                        RequestTimeout  = null);

     /// <summary>


Fist test of working pgm

Fist test of working pgm

--- Irmelin/Form1.Designer.cs
+++ Irmelin/Form1.Designer.cs
@@ -40,10 +40,10 @@
             // gamePicture
             //
             this.gamePicture.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
-            this.gamePicture.Location = new System.Drawing.Point(50, 240);
-            this.gamePicture.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.gamePicture.Location = new System.Drawing.Point(25, 125);
+            this.gamePicture.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
             this.gamePicture.Name = "gamePicture";
-            this.gamePicture.Size = new System.Drawing.Size(2000, 923);
+            this.gamePicture.Size = new System.Drawing.Size(1000, 480);
             this.gamePicture.TabIndex = 1;
             this.gamePicture.TabStop = false;
             //
@@ -52,22 +52,21 @@
             this.lblPlatform.BackColor = System.Drawing.Color.Gainsboro;
             this.lblPlatform.Font = new System.Drawing.Font("Segoe UI Semibold", 40F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
             this.lblPlatform.ForeColor = System.Drawing.Color.DimGray;
-            this.lblPlatform.Location = new System.Drawing.Point(42, 17);
-            this.lblPlatform.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.lblPlatform.Location = new System.Drawing.Point(21, 9);
+            this.lblPlatform.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
             this.lblPlatform.Name = "lblPlatform";
-            this.lblPlatform.Size = new System.Drawing.Size(2000, 144);
+            this.lblPlatform.Size = new System.Drawing.Size(1000, 75);
             this.lblPlatform.TabIndex = 3;
             this.lblPlatform.Text = "Super Nintendo Entertainment System";
-            this.lblPlatform.Click += new System.EventHandler(this.lblPlatform_Click);
             //
             // panel1
             //
             this.panel1.BackColor = System.Drawing.Color.Gainsboro;
             this.panel1.Controls.Add(this.lblPlatform);
             this.panel1.Location = new System.Drawing.Point(0, 0);
-            this.panel1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.panel1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
             this.panel1.Name = "panel1";
-            this.panel1.Size = new System.Drawing.Size(2100, 192);
+            this.panel1.Size = new System.Drawing.Size(1050, 100);
             this.panel1.TabIndex = 4;
             //
             // labelModel
@@ -75,10 +74,10 @@
             this.labelModel.BackColor = System.Drawing.Color.DarkGray;
             this.labelModel.Font = new System.Drawing.Font("Segoe UI Semilight", 26F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
             this.labelModel.ForeColor = System.Drawing.Color.DimGray;
-            this.labelModel.Location = new System.Drawing.Point(50, 1202);
-            this.labelModel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
+            this.labelModel.Location = new System.Drawing.Point(25, 625);
+            this.labelModel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
             this.labelModel.Name = "labelModel";
-            this.labelModel.Size = new System.Drawing.Size(2000, 96);
+            this.labelModel.Size = new System.Drawing.Size(1000, 50);
             this.labelModel.TabIndex = 5;
             this.labelModel.Text = "Arkanoid, 1981";
             this.labelModel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
@@ -87,18 +86,18 @@
             // panel2
             //
             this.panel2.BackColor = System.Drawing.Color.Gainsboro;
-            this.panel2.Location = new System.Drawing.Point(0, 3038);
-            this.panel2.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.panel2.Location = new System.Drawing.Point(0, 1580);
+            this.panel2.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
             this.panel2.Name = "panel2";
-            this.panel2.Size = new System.Drawing.Size(2100, 192);
+            this.panel2.Size = new System.Drawing.Size(1050, 100);
             this.panel2.TabIndex = 5;
             //
             // Form1
             //
-            this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F);
+            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
             this.BackColor = System.Drawing.Color.DarkGray;
-            this.ClientSize = new System.Drawing.Size(2100, 1918);
+            this.ClientSize = new System.Drawing.Size(1050, 1680);
             this.ControlBox = false;
             this.Controls.Add(this.panel2);
             this.Controls.Add(this.labelModel);
@@ -107,7 +106,7 @@
             this.DoubleBuffered = true;
             this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
             this.KeyPreview = true;
-            this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
+            this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
             this.MaximizeBox = false;
             this.MinimizeBox = false;
             this.Name = "Form1";


remove redundant code

remove redundant code

--- tests/Xbehave.Test/Infrastructure/TypeExtensions.cs
+++ tests/Xbehave.Test/Infrastructure/TypeExtensions.cs
@@ -7,7 +7,6 @@
     using System.Linq;
     using System.Reflection;
     using System.Threading;
-    using System.Threading.Tasks;

     internal static class TypeExtensions
     {
@@ -40,16 +39,6 @@
             }
         }

-        public static async Task SaveTestEventAsync(this Type feature, string @event)
-        {
-            await Task.Delay(1);
-            using (var file = File.Create(Path.Combine(feature.GetDirectoryName(), string.Concat(@event, ".", feature.Name))))
-            using (var writer = new StreamWriter(file))
-            {
-                await writer.WriteAsync(DateTime.Now.Ticks.ToString(CultureInfo.InvariantCulture));
-            }
-        }
-
         private static string GetDirectoryName(this Type feature) =>
             Path.GetDirectoryName(feature.GetTypeInfo().Assembly.GetLocalCodeBase());
     }


Converted TagOpt.cs line endings to CRLF.

--- GitSharp.Core/Transport/TagOpt.cs
+++ GitSharp.Core/Transport/TagOpt.cs
@@ -1,104 +1,104 @@
-/*
- * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or
- * without modification, are permitted provided that the following
- * conditions are met:
- *
- * - Redistributions of source code must retain the above copyright
- *   notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above
- *   copyright notice, this list of conditions and the following
- *   disclaimer in the documentation and/or other materials provided
- *   with the distribution.
- *
- * - Neither the name of the Git Development Community nor the
- *   names of its contributors may be used to endorse or promote
- *   products derived from this software without specific prior
- *   written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-using System;
-
-namespace GitSharp.Core.Transport
-{
-
-    /** Specification of annotated tag behavior during fetch. */
-    public class TagOpt
-    {
-        /**
- * Automatically follow tags if we fetch the thing they point at.
- * <para />
- * This is the default behavior and tries to balance the benefit of having
- * an annotated tag against the cost of possibly objects that are only on
- * branches we care nothing about. Annotated tags are fetched only if we can
- * prove that we already have (or will have when the fetch completes) the
- * object the annotated tag peels (dereferences) to.
- */
-        public static readonly TagOpt AUTO_FOLLOW = new TagOpt(string.Empty);
-
-        /**
- * Never fetch tags, even if we have the thing it points at.
- * <para />
- * This option must be requested by the user and always avoids fetching
- * annotated tags. It is most useful if the location you are fetching from
- * publishes annotated tags, but you are not interested in the tags and only
- * want their branches.
- */
-        public static readonly TagOpt NO_TAGS = new TagOpt("--no-tags");
-
-        /**
- * Always fetch tags, even if we do not have the thing it points at.
- * <para />
- * Unlike {@link #AUTO_FOLLOW} the tag is always obtained. This may cause
- * hundreds of megabytes of objects to be fetched if the receiving
- * repository does not yet have the necessary dependencies.
- */
-        public static readonly TagOpt FETCH_TAGS = new TagOpt("--tags");
-
-        /**
-         * workaround to match java style
-         */
-        private static readonly TagOpt[] values = new[] { NO_TAGS, FETCH_TAGS };
-
-        public string Option { get; private set; }
-
-        private TagOpt(string o)
-        {
-            Option = o;
-        }
-
-        public static TagOpt fromOption(string o)
-        {
-            if (string.IsNullOrEmpty(o))
-            {
-                return AUTO_FOLLOW;
-            }
-
-            foreach (TagOpt tagopt in values)
-            {
-                if (tagopt.Option.Equals(o))
-                    return tagopt;
-            }
-            throw new ArgumentException("Invalid tag option: " + o);
-        }
-    }
-
+/*
+ * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org>
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above
+ *   copyright notice, this list of conditions and the following
+ *   disclaimer in the documentation and/or other materials provided
+ *   with the distribution.
+ *
+ * - Neither the name of the Git Development Community nor the
+ *   names of its contributors may be used to endorse or promote
+ *   products derived from this software without specific prior
+ *   written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+
+namespace GitSharp.Core.Transport
+{
+
+    /** Specification of annotated tag behavior during fetch. */
+    public class TagOpt
+    {
+        /**
+ * Automatically follow tags if we fetch the thing they point at.
+ * <para />
+ * This is the default behavior and tries to balance the benefit of having
+ * an annotated tag against the cost of possibly objects that are only on
+ * branches we care nothing about. Annotated tags are fetched only if we can
+ * prove that we already have (or will have when the fetch completes) the
+ * object the annotated tag peels (dereferences) to.
+ */
+        public static readonly TagOpt AUTO_FOLLOW = new TagOpt(string.Empty);
+
+        /**
+ * Never fetch tags, even if we have the thing it points at.
+ * <para />
+ * This option must be requested by the user and always avoids fetching
+ * annotated tags. It is most useful if the location you are fetching from
+ * publishes annotated tags, but you are not interested in the tags and only
+ * want their branches.
+ */
+        public static readonly TagOpt NO_TAGS = new TagOpt("--no-tags");
+
+        /**
+ * Always fetch tags, even if we do not have the thing it points at.
+ * <para />
+ * Unlike {@link #AUTO_FOLLOW} the tag is always obtained. This may cause
+ * hundreds of megabytes of objects to be fetched if the receiving
+ * repository does not yet have the necessary dependencies.
+ */
+        public static readonly TagOpt FETCH_TAGS = new TagOpt("--tags");
+
+        /**
+         * workaround to match java style
+         */
+        private static readonly TagOpt[] values = new[] { NO_TAGS, FETCH_TAGS };
+
+        public string Option { get; private set; }
+
+        private TagOpt(string o)
+        {
+            Option = o;
+        }
+
+        public static TagOpt fromOption(string o)
+        {
+            if (string.IsNullOrEmpty(o))
+            {
+                return AUTO_FOLLOW;
+            }
+
+            foreach (TagOpt tagopt in values)
+            {
+                if (tagopt.Option.Equals(o))
+                    return tagopt;
+            }
+            throw new ArgumentException("Invalid tag option: " + o);
+        }
+    }
+
 }


Can now change verb type

Can now change verb type

--- WebEditor/WebEditor/Views/Edit/VerbsEditor.cshtml
+++ WebEditor/WebEditor/Views/Edit/VerbsEditor.cshtml
@@ -28,7 +28,7 @@

             @Html.CheckBox("verbs-select-" + attr.AttributeName, new { @class = "verbs-select" })
             @attr.AttributeName
-            @Html.DropDownList("verbs-type-" + attr.AttributeName, typesList)
+            @Html.DropDownList("verbs-type-" + attr.AttributeName, typesList, new { @class = "multi-dropdown", data_key = attr.AttributeName })

             @if (scriptValue != null)
             {


Ensure sources header is wide enough for the label (BL-250)

--- src/BloomExe/CollectionTab/LibraryListView.cs
+++ src/BloomExe/CollectionTab/LibraryListView.cs
@@ -240,7 +240,10 @@
 																				"Sources For New Shells");
 			string bookSourceHeading = L10NSharp.LocalizationManager.GetString("CollectionTab.bookSourceHeading",
 																			   "Sources For New Books");
-				bookSourcesHeader.Label.Text = _model.IsShellProject ? shellSourceHeading : bookSourceHeading;
+			bookSourcesHeader.Label.Text = _model.IsShellProject ? shellSourceHeading : bookSourceHeading;
+			// Don't truncate the heading: see https://jira.sil.org/browse/BL-250.
+			if (bookSourcesHeader.Width < bookSourcesHeader.Label.Width)
+				bookSourcesHeader.Width = bookSourcesHeader.Label.Width;
 			invisibleHackPartner = new Label() {Text = "", Width = 0};
 			_sourceBooksFlow.Controls.Add(invisibleHackPartner);
 			_sourceBooksFlow.Controls.Add(bookSourcesHeader);


Set version to 0.9.0.

Set version to 0.9.0.

--- GitTfs/Properties/AssemblyInfo.cs
+++ GitTfs/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@
 // You can specify all the values or you can default the Build and Revision Numbers
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("0.0.0.0")]
-[assembly: AssemblyFileVersion("0.0.0.0")]
+[assembly: AssemblyVersion("0.9.0.0")]
+[assembly: AssemblyFileVersion("0.9.0.0")]


whitespace.

whitespace.

--- src/Chinchilla/WorkerPoolWorkersController.cs
+++ src/Chinchilla/WorkerPoolWorkersController.cs
@@ -43,6 +43,7 @@

                 throw new ChinchillaException(message);
             }
+
             return worker;
         }
     }


Enable some tests for DbLinq.SqlServer_test.

Should have done this with the previous commit, which fixed the tests for SQL
Server's Northwind DB...

git-svn-id: 1800f71f313d917366f95485fa960eed04b40598@1123 33146b6e-df29-0410-a1ca-39be37fb9416

--- src/DbLinq/Test/Providers/ReadTest_Complex.cs
+++ src/DbLinq/Test/Providers/ReadTest_Complex.cs
@@ -107,9 +107,6 @@
             Assert.AreEqual(productCount, 1, "Expected one pen, got count=" + productCount);
         }

-#if !DEBUG && (SQLITE || (MSSQL && !MONO_STRICT))
-        [Explicit]
-#endif
         [Test]
         public void D2_SelectPensByLocalPropertyAndConstant()
         {
@@ -193,9 +190,6 @@

 #endif

-#if !DEBUG && (MSSQL && !MONO_STRICT)
-        [Explicit]
-#endif
         [Test]
         public void F7_ExplicitJoin()
         {
@@ -474,9 +468,6 @@
             var list = q.ToList();
         }

-#if !DEBUG && (MSSQL && !MONO_STRICT)
-        [Explicit]
-#endif
         [Test(Description = "provide a list of customers and employees who live in London.")]
         public void O3_OperatorUnion()
         {


fixed compliation flag to prevent debug logging in release mode

--- src/DbTransmogrifier/Logging/LogConfigurer.cs
+++ src/DbTransmogrifier/Logging/LogConfigurer.cs
@@ -6,7 +6,7 @@
     {
         public static void Configure()
         {
-#if RELEASE
+#if !DEBUG
             LoggerFactory.RegisterBeforeLogInterceptor(
                 (type, logLevel, message) => (logLevel != LogLevel.Debug));
 #endif


DisplayMember and ValueMember made strictly obsolete.

--- src/DotVVM.Framework/Controls/SelectorBase.cs
+++ src/DotVVM.Framework/Controls/SelectorBase.cs
@@ -34,26 +34,26 @@
         /// <summary>
         /// Gets or sets the name of property in the DataSource collection that will be displayed in the control.
         /// </summary>
-        [Obsolete("Use ItemTextBinding property instead")]
+        [Obsolete("Use ItemTextBinding property instead", true)]
         public string DisplayMember
         {
             get { return (string)GetValue(DisplayMemberProperty); }
             set { SetValue(DisplayMemberProperty, value); }
         }
-        [Obsolete("Use ItemTextBinding property instead")]
+        [Obsolete("Use ItemTextBinding property instead", true)]
         public static readonly DotvvmProperty DisplayMemberProperty =
             DotvvmProperty.Register<string, SelectorBase>(t => t.DisplayMember, "");

         /// <summary>
         /// Gets or sets the name of property in the DataSource collection that will be passed to the SelectedValue property when the item is selected.
         /// </summary>
-        [Obsolete("Use ItemValueBinding property instead")]
+        [Obsolete("Use ItemValueBinding property instead", true)]
         public string ValueMember
         {
             get { return (string)GetValue(ValueMemberProperty); }
             set { SetValue(ValueMemberProperty, value); }
         }
-        [Obsolete("Use ItemValueBinding property instead")]
+        [Obsolete("Use ItemValueBinding property instead", true)]
         public static readonly DotvvmProperty ValueMemberProperty =
             DotvvmProperty.Register<string, SelectorBase>(t => t.ValueMember, "");

@@ -122,15 +122,20 @@
                     yield return new ControlUsageError("Return type of ItemValueBinding has to be a primitive type!", valueBinding.DothtmlNode);
                 }
             }
+        }

+        [ControlUsageValidator]
+        [Obsolete("This must be obsolete to compile...")]
+        public static IEnumerable<ControlUsageError> ValidateObsoleteProperties(ResolvedControl control)
+        {
             // validate usage of obsolete properties
             if (control.Properties.GetValueOrDefault(DisplayMemberProperty) is ResolvedPropertySetter displayMember)
             {
-                yield return new ControlUsageError("Property DisplayMemberProperty is obsolite. Please use ItemTextBinding instead.", displayMember.DothtmlNode);
+                yield return new ControlUsageError("Property DisplayMemberProperty is obsolete. Please use ItemTextBinding instead.", displayMember.DothtmlNode);
             }
             if (control.Properties.GetValueOrDefault(ValueMemberProperty) is ResolvedPropertySetter valueMember)
             {
-                yield return new ControlUsageError("Property DisplayMemberProperty is obsolite. Please use ItemTextBinding instead.", valueMember.DothtmlNode);
+                yield return new ControlUsageError("Property DisplayMemberProperty is obsolete. Please use ItemValueBinding instead.", valueMember.DothtmlNode);
             }
         }
     }


Add Koan attribute to koan methods in AboutControllers.

--- Koans/AboutControllers.cs
+++ Koans/AboutControllers.cs
@@ -71,6 +71,7 @@

     public static partial class AboutControllers
     {
+        [Koan]
         public static void CreateAnEchoController()
         {
             using (var config = new HttpConfiguration())
@@ -105,6 +106,7 @@

     public static partial class AboutControllers
     {
+        [Koan]
         public static void AreYouSureYouMadeAnEchoController()
         {
             using (var config = new HttpConfiguration())


Fix ListBoxRow text not updating color. Also changed code to get color from skin

--- GwenCS/Gwen/Control/ListBoxRow.cs
+++ GwenCS/Gwen/Control/ListBoxRow.cs
@@ -30,12 +30,12 @@
             get { return m_Selected; }
             set
             {
+                Skin.Renderer.InvalidateCachedText(Text);
                 m_Selected = value;
-                // TODO: Get these values from the skin.
                 if (value)
-                    SetTextColor(Color.White);
+                    SetTextColor(Skin.Colors.Label.Bright);
                 else
-                    SetTextColor(Color.Black);
+                    SetTextColor(Skin.Colors.Label.Default);
             }
         }


Deprecated ColumnResourcesImpl

Deprecated ColumnResourcesImpl

--- main/Smartsheet/Api/Internal/ColumnResourcesImpl.cs
+++ main/Smartsheet/Api/Internal/ColumnResourcesImpl.cs
@@ -16,25 +16,18 @@
 //    limitations under the License.
 //    %[license]

+using Smartsheet.Api.Models;
+using System;
+using System.ComponentModel;
 namespace Smartsheet.Api.Internal
 {
-
-
-
-	using HttpEntity = Api.Internal.Http.HttpEntity;
-	using HttpMethod = Api.Internal.Http.HttpMethod;
-	using HttpRequest = Api.Internal.Http.HttpRequest;
-	using HttpResponse = Api.Internal.Http.HttpResponse;
-	using Utils = Api.Internal.Utility.Utility;
-	using Column = Api.Models.Column;
-	using System.Net;
-	using System;
-
 	/// <summary>
 	/// This is the implementation of the ColumnResources.
 	///
 	/// Thread Safety: This class is thread safe because it is immutable and its base class is thread safe.
 	/// </summary>
+	[Obsolete("Deprecated", true)]
+	[EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
 	public class ColumnResourcesImpl : AbstractResources, ColumnResources
 	{

@@ -45,77 +38,24 @@
 		///   IllegalArgumentException : if any argument is null
 		/// </summary>
 		/// <param name="smartsheet"> the Smartsheet </param>
+		[Obsolete("Deprecated", true)]
+		[EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
 		public ColumnResourcesImpl(SmartsheetImpl smartsheet) : base(smartsheet)
 		{
 		}

-		/// <summary>
-		/// Update a column.
-		///
-		/// It mirrors To the following Smartsheet REST API method: PUT /column/{Id}
-		///
-		/// Exceptions:
-		///   IllegalArgumentException : if any argument is null
-		///   InvalidRequestException : if there is any problem with the REST API request
-		///   AuthorizationException : if there is any problem with the REST API authorization(access token)
-		///   ResourceNotFoundException : if the resource can not be found
-		///   ServiceUnavailableException : if the REST API service is not available (possibly due To rate limiting)
-		///   SmartsheetRestException : if there is any other REST API related error occurred during the operation
-		///   SmartsheetException : if there is any other error occurred during the operation
-		/// </summary>
-		/// <param name="column"> the column To update limited To the following attributes: Index (column's new Index in the sheet),
-		/// Title, SheetId, Type, Options (optional), Symbol (optional), SystemColumnType (optional),
-		/// AutoNumberFormat (optional) </param>
-		/// <returns> the updated sheet (note that if there is no such resource, this method will throw
-		/// ResourceNotFoundException rather than returning null). </returns>
-		/// <exception cref="SmartsheetException"> the Smartsheet exception </exception>
+		[Obsolete("Deprecated", true)]
+		[EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
 		public virtual Column UpdateColumn(Column column)
 		{
-			Utils.ThrowIfNull(column);
-
-			return this.UpdateResource("column/" + column.Id, typeof(Column), column);
+			throw new NotSupportedException();
 		}

-		/// <summary>
-		/// Delete a column.
-		///
-		/// It mirrors To the following Smartsheet REST API method: DELETE /column/{Id}
-		///
-		/// Exceptions:
-		///   InvalidRequestException : if there is any problem with the REST API request
-		///   AuthorizationException : if there is any problem with the REST API authorization(access token)
-		///   ResourceNotFoundException : if the resource can not be found
-		///   ServiceUnavailableException : if the REST API service is not available (possibly due To rate limiting)
-		///   SmartsheetRestException : if there is any other REST API related error occurred during the operation
-		///   SmartsheetException : if there is any other error occurred during the operation
-		/// </summary>
-		/// <param name="id"> the ID of the column </param>
-		/// <param name="sheetId"> the ID of the sheet </param>
-		/// <exception cref="SmartsheetException"> the Smartsheet exception </exception>
+		[Obsolete("Deprecated", true)]
+		[EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
 		public virtual void DeleteColumn(long id, long sheetId)
 		{
-			HttpRequest request = null;
-				request = CreateHttpRequest(new Uri(Smartsheet.BaseURI, "column/"+id), HttpMethod.DELETE);
-
-			Column column = new Column();
-			column.SheetId = sheetId;
-
-				request.Entity = serializeToEntity<Column>(column);
-
-			HttpResponse response = Smartsheet.HttpClient.Request(request);
-
-			switch (response.StatusCode)
-			{
-				case HttpStatusCode.OK:
-					this.Smartsheet.JsonSerializer.deserializeResult<object>(response.Entity.GetContent());
-					break;
-				default:
-					HandleError(response);
-				break;
-			}
-
-			this.Smartsheet.HttpClient.ReleaseConnection();
-
+			throw new NotSupportedException();
 		}
 	}


Fix input issue with Vive controllers.

Fix input issue with Vive controllers.

--- HoneySelectVR/HoneyInterpreter.cs
+++ HoneySelectVR/HoneyInterpreter.cs
@@ -17,7 +17,6 @@
         private FieldInfo _MaleField = typeof(HScene).GetField("chaMale", BindingFlags.NonPublic | BindingFlags.Instance);
         private HoneyActor _Female;
         private HoneyActor _Male;
-

         protected override void OnLevel(int level)
         {
@@ -51,6 +50,25 @@
             base.OnUpdate();
         }

+        bool _ExitSceneDetected = false;
+        /// <summary>
+        /// Workaround because ExitScene sets the timeScale to zero, which causes a number of issues with the input.
+        /// </summary>
+        protected override void OnLateUpdate()
+        {
+            base.OnLateUpdate();
+
+            bool exitScene = Singleton<Scene>.Instance.AddSceneName == SceneNames.Exit;
+            if (exitScene != _ExitSceneDetected)
+            {
+                if (exitScene)
+                {
+                    Time.timeScale = 1.0f;
+                }
+                _ExitSceneDetected = exitScene;
+            }
+        }
+
         public override IEnumerable<IActor> Actors
         {
             get


Fix retry condition

Fix retry condition

--- Libraries/Http/Monitor.cs
+++ Libraries/Http/Monitor.cs
@@ -18,6 +18,7 @@
 using System;
 using System.Collections.Generic;
 using System.Threading.Tasks;
+using System.Net;
 using System.Net.Http;
 using Cube.Conversions;
 using Cube.Log;
@@ -295,7 +296,11 @@
         /* ----------------------------------------------------------------- */
         protected virtual void Publish(TValue value)
         {
-            foreach (var action in Subscriptions) action(value);
+            foreach (var action in Subscriptions)
+            {
+                try { action(value); }
+                catch (Exception err) { this.LogWarn(err.ToString()); }
+            }
         }

         #region IDisposable
@@ -400,7 +405,6 @@
                 catch (Exception err)
                 {
                     Fail(err.ToString());
-                    if (!(err is TaskCanceledException) && !(err is HttpRequestException)) break;
                     await Task.Delay(RetryInterval);
                 }
             }


correct reference

correct reference

--- mikeandwan.us/Views/Tools/NetworkingFileSize.cshtml
+++ mikeandwan.us/Views/Tools/NetworkingFileSize.cshtml
@@ -8,9 +8,9 @@
 }

 @section scripts_footer {
-    <script type="text/javascript" src="/js/bandwidth/inline.js"></script>
-    <script type="text/javascript" src="/js/bandwidth/polyfills.bundle.js"></script>
-    <script type="text/javascript" src="/js/bandwidth/main.bundle.js"></script>
+    <script type="text/javascript" src="/js/filesize/inline.js"></script>
+    <script type="text/javascript" src="/js/filesize/polyfills.bundle.js"></script>
+    <script type="text/javascript" src="/js/filesize/main.bundle.js"></script>
 }

 @section header {


update Enumerable

update Enumerable

--- my_aspnetmvc_learning/Controllers/TaskController.cs
+++ my_aspnetmvc_learning/Controllers/TaskController.cs
@@ -1,4 +1,5 @@
-using NLog;
+using System.Globalization;
+using NLog;
 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
@@ -95,13 +96,13 @@
             long total = 0;
             // Use type parameter to make subtotal a long, not an int
             Parallel.For<long>(0, nums.Length, () => 0, (j, loop, subtotal) =>
-            {
-                subtotal += nums[j];
-                return subtotal;
-            },
-                (x) => Interlocked.Add(ref total, x)
-                );
-            return Content(total.ToString());
+                {
+                    subtotal += nums[j];
+                    return subtotal;
+                },
+                x => Interlocked.Add(ref total, x)
+            );
+            return Content(total.ToString(CultureInfo.InvariantCulture));
         }
     }
 }


open now opens dirs only, traversal optimized

--- MainWindow.cs
+++ MainWindow.cs
@@ -121,17 +121,17 @@
 	protected void openDoc (object sender, EventArgs e)
 	{
 		FileChooserDialog d = new FileChooserDialog (
-								  "OPEN STUFF", this, FileChooserAction.Open,
-			                      "OPEN!", ResponseType.Accept,
-			                      "NOPE", ResponseType.Cancel
-		                      );
+			"OPEN STUFF", this, FileChooserAction.SelectFolder,
+			"OPEN!", ResponseType.Accept,
+			"NOPE", ResponseType.Cancel
+		);
 		if ((ResponseType)d.Run () == ResponseType.Accept)
-			newTab (System.IO.Path.GetFileName (d.Filename),
-				System.IO.File.ReadAllText (d.Filename));
+			//newTab (System.IO.Path.GetFileName (d.Filename),
+			//	System.IO.File.ReadAllText (d.Filename));
 		//((TextView)notebook.Children [notebook.Page]).Buffer.Text =
 		try {
 			new System.Threading.Thread (threadAdapter)
-				.Start ( System.IO.Path.GetDirectoryName(
+				.Start ( /*System.IO.Path.GetDirectoryName*/ (
 					System.IO.Path.GetFullPath (d.Filename)));
 		} catch(Exception x) {
 			Console.WriteLine (x.Message);
@@ -229,7 +229,8 @@
 			else
 				p = t.AppendValues(parent, new string [] { System.IO.Path.GetFileName(root), System.IO.Path.GetFullPath(root), } );
 			foreach (string d in System.IO.Directory.GetDirectories(root)) {
-				this.populateTree (t,d,p);
+				if (parent.Equals(TreeIter.Zero))
+					this.populateTree (t,d,p);
 				continue;
 			}
 			foreach (string f in System.IO.Directory.GetFiles(root,"*")) {
@@ -247,9 +248,12 @@
 		TreeIter i;
 		((TreeStore)tree.Model).GetIter (out i, args.Path);
 		if (System.IO.Directory.Exists ((string)((TreeStore)tree.Model).GetValue (i, 1)))
-			return;
-		newTab ((string)((TreeStore)tree.Model).GetValue (i, 0),
-			System.IO.File.ReadAllText ((string)((TreeStore)tree.Model).GetValue (i, 1)));
+			foreach (string d in System.IO.Directory.GetDirectories((string)((TreeStore)tree.Model).GetValue (i, 1)))
+				populateTree ((TreeStore)tree.Model, System.IO.Path.GetFullPath (d), i);
+		else
+			newTab ((string)((TreeStore)tree.Model).GetValue (i, 0),
+				System.IO.File.ReadAllText ((string)(
+					(TreeStore)tree.Model).GetValue (i, 1)));
 		return;
 	}
 }


Load the .mmc if possible, speeding up the loading / "patching" process

--- MonoMod/JIT/MonoModJIT.cs
+++ MonoMod/JIT/MonoModJIT.cs
@@ -46,6 +46,13 @@
             }

             CheckChecksum();
+
+            if (IsPatched) {
+                OriginalModule = null;
+                Module = null;
+                IsParsed = true;
+                PatchedAssembly = Assembly.LoadFrom(Out.FullName);
+            }
         }

         public void CheckChecksum() {
@@ -153,7 +160,7 @@

         public override void AutoPatch(bool read = true, bool write = true) {
             //Reading outside of AutoPatch disables modding. Ironically modding twice can kill MonoModJIT
-            if (!IsPatched) {
+            if (!IsPatched && !IsParsed) {
                 base.AutoPatch(false, write);
                 IsPatched = true;
             }


Work on recovery.

Work on recovery.

--- N2.Visualizer/Recovery.cs
+++ N2.Visualizer/Recovery.cs
@@ -47,6 +47,7 @@
     public void Strategy(int startTextPos, Parser parser)
     {
       Reset();
+      var maxFailPos = parser.MaxFailPos;
       var timer = System.Diagnostics.Stopwatch.StartNew();
       _recoveryStack     = parser.RecoveryStack.NToList() as RecoveryStack;
       var curTextPos    = startTextPos;
@@ -72,7 +73,10 @@
         parser.MaxFailPos = _bestResult.EndPos; // HACK!!!
       }
       else
+      {
         parser.ParsingMode = ParsingMode.Recovery;
+        parser.MaxFailPos = maxFailPos;
+      }

       Reset();
     }


Fix Recovery.

Fix Recovery.

--- N2.Visualizer/Recovery.cs
+++ N2.Visualizer/Recovery.cs
@@ -123,12 +123,13 @@

       for (var stack = _bestResult.Stack.Tail as RecoveryStack; stack != null; stack = stack.Tail as RecoveryStack)
       {
-        if (stack.Head.IsRootAst)
-        {
-          var state = parser.ast[stack.Head.AstPtr + 2];
-          Debug.Assert(state >= 0);
-          parser.ast[stack.Head.AstPtr + 2] = ~state;
-        }
+        if (stack.Head.RuleParser is ExtensibleRuleParser)
+          continue;
+        var state = stack.Head.FailState;
+        Debug.Assert(state >= 0);
+        while (!stack.Head.IsRootAst)
+          stack = stack.Tail as RecoveryStack;
+        parser.ast[stack.Head.AstPtr + 2] = ~state;
       }
     }


Fixed useless using

Fixed useless using

--- NBi.genbiL/Parser/Case.cs
+++ NBi.genbiL/Parser/Case.cs
@@ -1,5 +1,4 @@
 using System;
-using System.Linq;
 using System.Linq;
 using NBi.GenbiL.Action;
 using NBi.GenbiL.Action.Case;


Add helper SendToAddressAsync(Script) to RPCClient

--- NBitcoin/RPC/RPCClient.cs
+++ NBitcoin/RPC/RPCClient.cs
@@ -1643,6 +1643,53 @@
 		/// <summary>
 		/// Requires wallet support. Requires an unlocked wallet or an unencrypted wallet.
 		/// </summary>
+		/// <param name="scriptPubKey">The destination where coins should be sent</param>
+		/// <param name="amount">The amount to spend</param>
+		/// <param name="commentTx">A locally-stored (not broadcast) comment assigned to this transaction. Default is no comment</param>
+		/// <param name="commentDest">A locally-stored (not broadcast) comment assigned to this transaction. Meant to be used for describing who the payment was sent to. Default is no comment</param>
+		/// <param name="subtractFeeFromAmount">The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. </param>
+		/// <param name="replaceable">Allow this transaction to be replaced by a transaction with higher fees. </param>
+		/// <returns>The TXID of the sent transaction</returns>
+		public uint256 SendToAddress(
+			Script scriptPubKey,
+			Money amount,
+			string commentTx = null,
+			string commentDest = null,
+			bool subtractFeeFromAmount = false,
+			bool replaceable = false
+		)
+		{
+			uint256 txid = null;
+
+			txid = SendToAddressAsync(scriptPubKey, amount, commentTx, commentDest, subtractFeeFromAmount, replaceable).GetAwaiter().GetResult();
+			return txid;
+		}
+
+		/// <summary>
+		/// Requires wallet support. Requires an unlocked wallet or an unencrypted wallet.
+		/// </summary>
+		/// <param name="scriptPubKey">The destination where coins should be sent</param>
+		/// <param name="amount">The amount to spend</param>
+		/// <param name="commentTx">A locally-stored (not broadcast) comment assigned to this transaction. Default is no comment</param>
+		/// <param name="commentDest">A locally-stored (not broadcast) comment assigned to this transaction. Meant to be used for describing who the payment was sent to. Default is no comment</param>
+		/// <param name="subtractFeeFromAmount">The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. </param>
+		/// <param name="replaceable">Allow this transaction to be replaced by a transaction with higher fees. </param>
+		/// <returns>The TXID of the sent transaction</returns>
+		public Task<uint256> SendToAddressAsync(
+			Script scriptPubKey,
+			Money amount,
+			string commentTx = null,
+			string commentDest = null,
+			bool subtractFeeFromAmount = false,
+			bool replaceable = false
+			)
+		{
+			return SendToAddressAsync(scriptPubKey.GetDestinationAddress(Network), amount, commentTx, commentDest, subtractFeeFromAmount, replaceable);
+		}
+
+		/// <summary>
+		/// Requires wallet support. Requires an unlocked wallet or an unencrypted wallet.
+		/// </summary>
 		/// <param name="address">A P2PKH or P2SH address to which the bitcoins should be sent</param>
 		/// <param name="amount">The amount to spend</param>
 		/// <param name="commentTx">A locally-stored (not broadcast) comment assigned to this transaction. Default is no comment</param>


Added commentary, added missing file

Added commentary, added missing file

--- NefitSharp/NefitClient.cs
+++ NefitSharp/NefitClient.cs
@@ -50,7 +50,6 @@
         /// <summary>
         /// Indicates if there was an general authentication error
         /// </summary>
-
         public bool AuthenticationError
         {
             get { return !_serialAccessKeyValid || !_passwordValid; }
@@ -308,6 +307,12 @@

         #region Sync Methods

+        #region Programs
+        /// <summary>
+        /// Returns the active user program, can only be 0, 1 or 2
+        /// Use this in the <see cref="Program"/> command to get the active program
+        /// </summary>
+        /// <returns>A value between 0 and 2, or <see cref="int.MinValue"/> if the command fails</returns>
         public int ActiveProgram()
         {
             try
@@ -321,13 +326,18 @@
             return int.MinValue;
         }

-        public ProgramSwitch[] Program(int index)
-        {
-            try
-            {
-                if (index >= 0 && index < 3)
-                {
-                    NefitProgram[] program0 = Get<NefitProgram[]>("/ecus/rrc/userprogram/program" + index);
+        /// <summary>
+        /// Returns the requested user program defined in switch points
+        /// </summary>
+        /// <param name="programNumber">The program number which to request from the Easy</param>
+        /// <returns>An array of ProgramSwitches (converted to the next timestamp of the switch) or null if the command fails</returns>
+        public ProgramSwitch[] Program(int programNumber)
+        {
+            try
+            {
+                if (programNumber >= 0 && programNumber < 3)
+                {
+                    NefitProgram[] program0 = Get<NefitProgram[]>("/ecus/rrc/userprogram/program" + programNumber);
                     if (program0 != null)
                     {
                         return Utils.ParseProgram(program0);
@@ -341,10 +351,16 @@
             return null;
         }

+        /// <summary>
+        /// Returns the user definable switch point names, there are 2 custom names configurable
+        /// </summary>
+        /// <param name="nameIndex">The index of the name, can only be 0 or 1</param>
+        /// <returns>The name of the switchpoint or null if the command fails</returns>
         public string SwitchpointName(int nameIndex)
         {
             try
             {
+                nameIndex--;
                 if (nameIndex >= 1 && nameIndex <= 2)
                 {
                     return Get<string>("/ecus/rrc/userprogram/userswitchpointname" + nameIndex);
@@ -357,7 +373,13 @@
             return null;
         }

-        public bool FireplaceFunctionActive()
+        #endregion
+
+        /// <summary>
+        /// Indicates if the fireplace function is currently activated
+        /// </summary>
+        /// <returns>True/false or null if the command fails</returns>
+        public bool? FireplaceFunctionActive()
         {
             try
             {
@@ -367,10 +389,14 @@
             {
                 ExceptionEvent(e);
             }
-            return false;
-        }
-
-        public bool PreheatingActive()
+            return null;
+        }
+
+        /// <summary>
+        /// Indicates if the preheating setting is active
+        /// </summary>
+        /// <returns>True/false or null if the command fails</returns>
+        public bool? PreheatingActive()
         {
             try
             {
@@ -380,9 +406,13 @@
             {
                 ExceptionEvent(e);
             }
-            return false;
-        }
-
+            return null;
+        }
+
+        /// <summary>
+        /// Returns the outdoor temperature measured by the Easy or collected over the internet
+        /// </summary>
+        /// <returns>The outdoor temperature or <see cref="Double.NaN"/> if the command fails</returns>
         public double OutdoorTemperature()
         {
             try
@@ -396,6 +426,10 @@
             return Double.NaN;
         }

+        /// <summary>
+        /// Inidicates the Easy service status
+        /// </summary>
+        /// <returns>Returns a string containing the Easy service status or null if the command fails</returns>
         public string EasyServiceStatus()
         {
             try
@@ -409,7 +443,11 @@
             return null;
         }

-        public bool IgnitionStatus()
+        /// <summary>
+        /// Returns the status of the ignition (presumably if the CV is heating)
+        /// </summary>
+        /// <returns>True/false or null if the command fails</returns>
+        public bool? IgnitionStatus()
         {
             try
             {
@@ -419,10 +457,14 @@
             {
                 ExceptionEvent(e);
             }
-            return false;
-        }
-
-        public bool RefillNeededStatus()
+            return null;
+        }
+
+        /// <summary>
+        /// Returns the status of the CV circuit, if a refill is needed
+        /// </summary>
+        /// <returns>True/false or null if the command fails</returns>
+        public bool? RefillNeededStatus()
         {
             try
             {
@@ -432,10 +474,14 @@
             {
                 ExceptionEvent(e);
             }
-            return false;
-        }
-
-        public bool ClosingValveStatus()
+            return null;
+        }
+
+        /// <summary>
+        /// Unknown
+        /// </summary>
+        /// <returns>True/false or null if the command fails</returns>
+        public bool? ClosingValveStatus()
         {
             try
             {
@@ -445,10 +491,14 @@
             {
                 ExceptionEvent(e);
             }
-            return false;
-        }
-
-        public bool ShortTappingStatus()
+            return null;
+        }
+
+        /// <summary>
+        /// Unknown
+        /// </summary>
+        /// <returns>True/false or null if the command fails</returns>
+        public bool? ShortTappingStatus()
         {
             try
             {
@@ -458,10 +508,14 @@
             {
                 ExceptionEvent(e);
             }
-            return false;
-        }
-
-        public bool SystemLeakingStatus()
+            return null;
+        }
+
+        /// <summary>
+        /// Indiciates if the Easy detected a leak
+        /// </summary>
+        /// <returns>True/false or null if the command fails</returns>
+        public bool? SystemLeakingStatus()
         {
             try
             {
@@ -471,9 +525,13 @@
             {
                 ExceptionEvent(e);
             }
-            return false;
-        }
-
+            return null;
+        }
+
+        /// <summary>
+        /// Returns the current pressure of the CV circuit
+        /// </summary>
+        /// <returns>The presure of the CV circuit or <see cref="Double.NaN"/> if the command fails</returns>
         public double SystemPressure()
         {
             try
@@ -487,6 +545,10 @@
             return Double.NaN;
         }

+        /// <summary>
+        /// Returns the current tempreature of the supply temperature of the CV circuit
+        /// </summary>
+        /// <returns>The presure of the CV circuit or <see cref="Double.NaN"/> if the command fails</returns>
         public double CentralHeatingSupplyTemperature()
         {
             try
@@ -500,6 +562,10 @@
             return Double.NaN;
         }

+        /// <summary>
+        /// Returns the current status of the central heating, note; the descriptions are in Dutch
+        /// </summary>
+        /// <returns>The current status of the central heating or null if the command fails</returns>
         public StatusCode GetStatusCode()
         {
             try
@@ -515,6 +581,10 @@
             return null;
         }

+        /// <summary>
+        /// Returns the current switch point (in other words what the CV is currently doing)
+        /// </summary>
+        /// <returns>The current switch point of the central heating or null if the command fails</returns>
         public ProgramSwitch GetCurrentSwitchPoint()
         {
             try
@@ -532,6 +602,10 @@
             return null;
         }

+        /// <summary>
+        /// Returns the next switch point (in other words what the CV will be doing)
+        /// </summary>
+        /// <returns>The current switch point of the central heating or null if the command fails</returns>
         public ProgramSwitch GetNextSwitchPoint()
         {
             try
@@ -764,7 +838,7 @@
             return null;
         }

-        public bool ThermalDesinfectEnabled()
+        public bool? ThermalDesinfectEnabled()
         {
             try
             {
@@ -774,7 +848,7 @@
             {
                 ExceptionEvent(e);
             }
-            return false;
+            return null;
         }

         public DateTime NextThermalDesinfect()
@@ -935,12 +1009,12 @@
             return await Task.Run(() => { return SwitchpointName(nameIndex); });
         }

-        public async Task<bool> FireplaceFunctionActiveAsync()
+        public async Task<bool?> FireplaceFunctionActiveAsync()
         {
             return await Task.Run(() => { return FireplaceFunctionActive(); });
         }

-        public async Task<bool> PreheatingActiveAsync()
+        public async Task<bool?> PreheatingActiveAsync()
         {
             return await Task.Run(() => { return PreheatingActive(); });
         }
@@ -955,27 +1029,27 @@
             return await Task.Run(() => { return EasyServiceStatus(); });
         }

-        public async Task<bool> IgnitionStatusAsync()
+        public async Task<bool?> IgnitionStatusAsync()
         {
             return await Task.Run(() => { return IgnitionStatus(); });
         }

-        public async Task<bool> RefillNeededStatusAsync()
+        public async Task<bool?> RefillNeededStatusAsync()
         {
             return await Task.Run(() => { return RefillNeededStatus(); });
         }

-        public async Task<bool> ClosingValveStatusAsync()
+        public async Task<bool?> ClosingValveStatusAsync()
         {
             return await Task.Run(() => { return ClosingValveStatus(); });
         }

-        public async Task<bool> ShortTappingStatusAsync()
+        public async Task<bool?> ShortTappingStatusAsync()
         {
             return await Task.Run(() => { return ShortTappingStatus(); });
         }

-        public async Task<bool> SystemLeakingStatusAsync()
+        public async Task<bool?> SystemLeakingStatusAsync()
         {
             return await Task.Run(() => { return SystemLeakingStatus(); });
         }
@@ -1070,7 +1144,7 @@
             return await Task.Run(() => { return CVBurnerMake(); });
         }

-        public async Task<bool> ThermalDesinfectEnabledAsync()
+        public async Task<bool?> ThermalDesinfectEnabledAsync()
         {
             return await Task.Run(() => { return ThermalDesinfectEnabled(); });
         }


Normalize doc summary capitalization

Normalize doc summary capitalization

--- Nez.Portable/ECS/Scene.cs
+++ Nez.Portable/ECS/Scene.cs
@@ -1066,7 +1066,7 @@

 		/// <summary>
-		/// Returns the first enabled loaded object of Type T
+		/// returns the first enabled loaded object of Type T
 		/// </summary>
 		/// <returns>The object of type.</returns>
 		/// <typeparam name="T">The 1st type parameter.</typeparam>
@@ -1077,7 +1077,7 @@

 		/// <summary>
-		/// Returns a list of all enabled loaded objects of Type T
+		/// returns a list of all enabled loaded objects of Type T
 		/// </summary>
 		/// <returns>The objects of type.</returns>
 		/// <typeparam name="T">The 1st type parameter.</typeparam>
@@ -1105,7 +1105,7 @@

 		/// <summary>
-		/// Removes an EntitySystem processor from the scene
+		/// removes an EntitySystem processor from the scene
 		/// </summary>
 		/// <param name="processor">Processor.</param>
 		public void removeEntityProcessor( EntitySystem processor )
@@ -1115,7 +1115,7 @@

 		/// <summary>
-		/// Gets an EntitySystem processor
+		/// gets an EntitySystem processor
 		/// </summary>
 		/// <returns>The processor.</returns>
 		/// <typeparam name="T">The 1st type parameter.</typeparam>


Timer now static

Timer now static

--- NfxLab.Sensors/Program.cs
+++ NfxLab.Sensors/Program.cs
@@ -17,12 +17,16 @@
         static Log Log;
         static TemperatureHumiditySensorPro Sensor;
         static XivelyClient XivelyClient;
+        static Timer Timer;

         public static void Main()
         {
             try
             {
-                Log = new Log(new FileAppender(Configuration.LogPath), new DebugAppender());
+                Log = new Log(
+                    //new FileAppender(Configuration.LogPath),
+                    new DebugAppender()
+                    );
                 Log.Info("Starting");

                 Log.Info("Initializing sensor");
@@ -33,7 +37,7 @@
                 XivelyClient = new XivelyClient(Configuration.XivelyApiKey, Configuration.XivelyFeedId);

                 Log.Info("Starting the timer");
-                var timer = new Timer(SendUpdate, null, new TimeSpan(0, 0, 0), Configuration.Interval);
+                Timer = new Timer(SendUpdate, null, new TimeSpan(0, 0, 1), Configuration.Interval);

                 Log.Info("Started");
                 Thread.Sleep(Timeout.Infinite);
@@ -47,7 +51,7 @@
         private static void SendUpdate(object state)
         {
             using (Log.ProfileBlock("Reading sensor"))
-                Sensor.Read();
+            Sensor.Read();

             Log.Info("Temperature:", Sensor.Temperature, "Humidity:", Sensor.Humidity);


Fixed comment and catch.

Fixed comment and catch.

--- NtApiDotNet/NtSecurity.cs
+++ NtApiDotNet/NtSecurity.cs
@@ -225,7 +225,7 @@
         public static extern NtStatus RtlCreateServiceSid([In] UnicodeString pServiceName,
             SafeBuffer pServiceSid, [In, Out] ref int cbServiceSid);

-        // Capability SID needs 9 RIDS (0x2C bytes), Group SID needs 10 (0x30 bytes)
+        // Group SID needs 9 RIDS (0x2C bytes), Capability SID needs 10 (0x30 bytes)
         [DllImport("ntdll.dll")]
         public static extern NtStatus RtlDeriveCapabilitySidsFromName(
             UnicodeString CapabilityName, SafeBuffer CapabilityGroupSid, SafeBuffer CapabilitySid);
@@ -1430,7 +1430,7 @@
                         known_capabilities.Add(sid, name);
                     }
                 }
-                catch
+                catch(EntryPointNotFoundException)
                 {
                     // Catch here in case the RtlDeriveCapabilitySid function isn't supported.
                 }


Fixed encoding of unicode surrogates

Fixed encoding of unicode surrogates

--- Nustache.Core/Encoders.cs
+++ Nustache.Core/Encoders.cs
@@ -47,10 +47,17 @@
                         sb.Append("&");
                         break;
                     default:
-                        if (text[i] > 159)
+                        var ch = text[i];
+                        if (ch > 159)
                         {
                             sb.Append("&#");
-                            sb.Append(((int)text[i]).ToString(CultureInfo.InvariantCulture));
+                            if (char.IsHighSurrogate(ch) && (i + 1) < len) {
+                                // convert surrogates to their decimal value
+                                sb.Append(char.ConvertToUtf32(ch, text[i+1]));
+                                i++;
+                            } else {
+                                sb.Append(((int)ch).ToString(CultureInfo.InvariantCulture));
+                            }
                             sb.Append(";");
                         }
                         else


add `CreateContent` method

add `CreateContent` method

--- osu.Framework/Graphics/Containers/Markdown/MarkdownImage.cs
+++ osu.Framework/Graphics/Containers/Markdown/MarkdownImage.cs
@@ -27,8 +27,10 @@
         [BackgroundDependencyLoader]
         private void load()
         {
-            InternalChild = new DelayedLoadWrapper(CreateImageContainer(url));
+            InternalChild = CreateContent(url);
         }
+
+        protected virtual Drawable CreateContent(string url) => new DelayedLoadWrapper(CreateImageContainer(url));

         protected virtual ImageContainer CreateImageContainer(string url)
         {


Fixed findings of the CodeCrack analyzer

--- src/FixieSpec/SpecificationStepTypeScanner.cs
+++ src/FixieSpec/SpecificationStepTypeScanner.cs
@@ -120,7 +120,7 @@
             /// <returns>
             /// The scrubbed metod name.
             /// </returns>
-            private string ScrubMethodName(MethodInfo methodToMatch)
+            static string ScrubMethodName(MethodInfo methodToMatch)
             {
                 return methodToMatch.Name.Replace("_", string.Empty);
             }


Fix inspection

Fix inspection

--- osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs
+++ osu.Game.Rulesets.Osu/Difficulty/OsuDifficultyCalculator.cs
@@ -38,7 +38,7 @@
             double aimRating = Math.Sqrt(skills[0].DifficultyValue()) * difficulty_multiplier;
             double aimRatingNoSliders = Math.Sqrt(skills[1].DifficultyValue()) * difficulty_multiplier;
             double speedRating = Math.Sqrt(skills[2].DifficultyValue()) * difficulty_multiplier;
-            double speedNotes = (skills[2] as Speed).RelevantNoteCount();
+            double speedNotes = ((Speed)skills[2]).RelevantNoteCount();
             double flashlightRating = Math.Sqrt(skills[3].DifficultyValue()) * difficulty_multiplier;

             double sliderFactor = aimRating > 0 ? aimRatingNoSliders / aimRating : 1;


Add debugger step through (#2385)

Add debugger step through (#2385)

--- src/FodyNlogAdapter/Adapters/LoggerAdapter.cs
+++ src/FodyNlogAdapter/Adapters/LoggerAdapter.cs
@@ -37,6 +37,7 @@
             return logger;
         }

+        [DebuggerStepThrough]
         public void TraceEnter(string methodInfo, string[] paramNames, object[] paramValues)
         {
             if (this.logger.IsTraceEnabled)
@@ -70,6 +71,7 @@
             }
         }

+        [DebuggerStepThrough]
         public void TraceLeave(string methodInfo, long startTicks, long endTicks, string[] paramNames, object[] paramValues)
         {
             if (this.logger.IsTraceEnabled)


Tests for BeatDivisorControl

Tests for BeatDivisorControl

--- osu.Game.Tests/Visual/Editor/TestSceneBeatDivisorControl.cs
+++ osu.Game.Tests/Visual/Editor/TestSceneBeatDivisorControl.cs
@@ -3,6 +3,7 @@

 using System;
 using System.Collections.Generic;
+using NUnit.Framework;
 using osu.Framework.Allocation;
 using osu.Framework.Graphics;
 using osu.Game.Screens.Edit;
@@ -11,19 +12,66 @@

 namespace osu.Game.Tests.Visual.Editor
 {
-    public class TestSceneBeatDivisorControl : OsuTestScene
+    public class TestSceneBeatDivisorControl : ManualInputManagerTestScene
     {
         public override IReadOnlyList<Type> RequiredTypes => new[] { typeof(BindableBeatDivisor) };
+        private BeatDivisorControl beatDivisorControl;
+        private BindableBeatDivisor bindableBeatDivisor;

         [BackgroundDependencyLoader]
         private void load()
         {
-            Child = new BeatDivisorControl(new BindableBeatDivisor())
+            Child = beatDivisorControl = new BeatDivisorControl(bindableBeatDivisor = new BindableBeatDivisor())
             {
                 Anchor = Anchor.Centre,
                 Origin = Anchor.Centre,
                 Size = new Vector2(90, 90)
             };
         }
+
+        [Test]
+        public void TestBindableBeatDivisor()
+        {
+            AddStep("Reset", () => reset());
+            AddRepeatStep("Move previous", () => bindableBeatDivisor.Previous(), 4);
+            AddAssert("Position at 4", () => bindableBeatDivisor.Value == 4);
+            AddRepeatStep("Move next", () => bindableBeatDivisor.Next(), 3);
+            AddAssert("Position at 12", () => bindableBeatDivisor.Value == 12);
+        }
+
+        [Test]
+        public void TestMouseInput()
+        {
+            AddStep("Reset", () => reset());
+            AddStep("Move to marker", () =>
+            {
+                InputManager.MoveMouseTo(beatDivisorControl, new Vector2(38, -18));
+                InputManager.PressButton(osuTK.Input.MouseButton.Left);
+            });
+            AddStep("Mote to divisor 8", () =>
+            {
+                InputManager.MoveMouseTo(beatDivisorControl, new Vector2(0, -18));
+                InputManager.ReleaseButton(osuTK.Input.MouseButton.Left);
+            });
+            AddAssert("Position at 8", () => bindableBeatDivisor.Value == 8);
+            AddStep("Prepare to move marker", () => { InputManager.PressButton(osuTK.Input.MouseButton.Left); });
+            AddStep("Trigger marker jump", () =>
+            {
+                InputManager.MoveMouseTo(beatDivisorControl, new Vector2(30, -18));
+            });
+            AddStep("Move to divisor ~10", () =>
+            {
+                InputManager.MoveMouseTo(beatDivisorControl, new Vector2(10, -18));
+                InputManager.ReleaseButton(osuTK.Input.MouseButton.Left);
+            });
+            AddAssert("Position clamped to 8", () => bindableBeatDivisor.Value == 8);
+
+        }
+
+        private void reset()
+        {
+            bindableBeatDivisor.Value = 16;
+            InputManager.MoveMouseTo(beatDivisorControl, new Vector2(beatDivisorControl.Width, beatDivisorControl.Height));
+        }
     }
 }


Style fix

Style fix

--- src/FubarDev.FtpServer/FtpCommandCollector.cs
+++ src/FubarDev.FtpServer/FtpCommandCollector.cs
@@ -172,7 +172,7 @@
             /// <inheritdoc />
             protected override IEnumerable<FtpCommand> InterruptProcess()
             {
-                return new []
+                return new[]
                 {
                     new FtpCommand("ABOR", null),
                 };


Use regular test steps rather than one-time set up and scheduling

--- osu.Game.Tests/Visual/Ranking/TestSceneStarRatingDisplay.cs
+++ osu.Game.Tests/Visual/Ranking/TestSceneStarRatingDisplay.cs
@@ -12,12 +12,12 @@
 {
     public class TestSceneStarRatingDisplay : OsuTestScene
     {
-        [SetUp]
-        public void SetUp() => Schedule(() =>
+        [Test]
+        public void TestDisplay()
         {
-            StarRatingDisplay changingStarRating;
+            StarRatingDisplay changingStarRating = null;

-            Child = new FillFlowContainer
+            AddStep("load displays", () => Child = new FillFlowContainer
             {
                 Anchor = Anchor.Centre,
                 Origin = Anchor.Centre,
@@ -32,12 +32,12 @@
                     new StarRatingDisplay(new StarDifficulty(10.11, 0)),
                     changingStarRating = new StarRatingDisplay(),
                 }
-            };
+            });

-            Scheduler.AddDelayed(() =>
+            AddRepeatStep("change bottom rating", () =>
             {
                 changingStarRating.Current.Value = new StarDifficulty(RNG.NextDouble(0, 10), RNG.Next());
-            }, 500, true);
-        });
+            }, 10);
+        }
     }
 }


[Tests] Fix ServerUserHandlerTests.DisconnectNull

--- src/Gablarski.Tests/ServerUserHandlerTests.cs
+++ src/Gablarski.Tests/ServerUserHandlerTests.cs
@@ -37,6 +37,7 @@
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Threading.Tasks;
 using Gablarski.Messages;
 using Gablarski.Server;
 using Gablarski.Tests.Mocks;
@@ -106,8 +107,8 @@
 		[Test]
 		public void DisconnectNull()
 		{
-			Assert.Throws<ArgumentNullException> (() => handler.DisconnectAsync ((IConnection)null));
-			Assert.Throws<ArgumentNullException> (() => handler.DisconnectAsync ((Func<IConnection, bool>)null));
+			AsyncAssert.Throws<ArgumentNullException> (() => handler.DisconnectAsync ((IConnection)null));
+			AsyncAssert.Throws<ArgumentNullException> (() => handler.DisconnectAsync ((Func<IConnection, bool>)null));
 		}

 		[Test]


Add failing test

Add failing test

--- osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
+++ osu.Game.Tests/Visual/SongSelect/TestScenePlaySongSelect.cs
@@ -243,6 +243,22 @@
         }

         [Test]
+        public void TestModsRetainedBetweenSongSelect()
+        {
+            AddAssert("empty mods", () => !Mods.Value.Any());
+
+            createSongSelect();
+
+            addRulesetImportStep(0);
+
+            changeMods(new OsuModHardRock());
+
+            createSongSelect();
+
+            AddAssert("mods retained", () => Mods.Value.Any());
+        }
+
+        [Test]
         public void TestStartAfterUnMatchingFilterDoesNotStart()
         {
             createSongSelect();


added content testing on scenario 3

added content testing on scenario 3

--- contrib/Test/AutofacContrib.Tests.Attributed/ContainerBuilderExtensionTestFixture.cs
+++ contrib/Test/AutofacContrib.Tests.Attributed/ContainerBuilderExtensionTestFixture.cs
@@ -114,5 +114,25 @@
             Assert.That(items.Count(), Is.EqualTo(2));
         }

+        [Test]
+        public void scenario_3_validate_registration_content()
+        {
+            // arrange
+            var builder = new ContainerBuilder();
+
+            builder.RegisterUsingMetadataAttributes<IExportScenario3, IExportScenario3Metadata>(p => true,
+                Assembly.GetExecutingAssembly());
+
+            // act
+            var items = builder.Build().Resolve<IEnumerable<Lazy<IExportScenario3, IExportScenario3Metadata>>>();
+
+            // assert
+            Assert.That(items.Where(p => p.Metadata.Name == "sid").Count(), Is.EqualTo(1));
+            Assert.That(items.Where(p => p.Metadata.Name == "nancy").Count(), Is.EqualTo(1));
+
+            Assert.That(items.Where(p => p.Metadata.Name == "the-cats").Count(), Is.EqualTo(0));
+
+        }
+
     }
 }


Fixed Unit Test. Failed only on Dev10 since Dev11 caught the exception
silently

1. Validated by successfully running build.cmd on a machine with Dev10

--- test/VisualStudio.Test/PackageRestoreManagerTest.cs
+++ test/VisualStudio.Test/PackageRestoreManagerTest.cs
@@ -491,6 +491,7 @@
             packageManager.Setup(p => p.LocalRepository).Returns(localRepository);

             var packageManagerFactory = new Mock<IVsPackageManagerFactory>();
+            packageManagerFactory.Setup(p => p.CreatePackageManager()).Returns(packageManager.Object);
             packageManagerFactory.Setup(p => p.CreatePackageManagerWithAllPackageSources()).Returns(packageManager.Object);

             var packageRestore = CreateInstance(


add offset check

add offset check

--- Jint.Tests/Runtime/EngineTests.cs
+++ Jint.Tests/Runtime/EngineTests.cs
@@ -741,13 +741,6 @@
         [Fact]
         public void ParseShouldReturnNumber()
         {
-
-
-            RunTest(@"
-                var d = Date.parse('1970-01-01');
-                assert(d === 0);
-            ");
-
             var engine = new Engine();

             var result = engine.Execute("Date.parse('1970-01-01');").GetCompletionValue().AsNumber();
@@ -757,12 +750,10 @@
         [Fact]
         public void UtcShouldUseUtc()
         {
-
-
-            RunTest(@"
-                var d = Date.UTC(1970,0,1);
-                assert(d === 0);
-            ");
+            if (TimeZoneInfo.Local.BaseUtcOffset.Equals(new TimeSpan(0)))
+            {
+                throw new Exception("Test is not valid if the Local timezone offset is the same as UTC.");
+            }

             var engine = new Engine();


Update OsuDifficultyCalculator.cs

Update OsuDifficultyCalculator.cs

--- osu.Game.Rulesets.Osu/OsuDifficultyCalculator.cs
+++ osu.Game.Rulesets.Osu/OsuDifficultyCalculator.cs
@@ -3,7 +3,6 @@

 using osu.Game.Beatmaps;
 using osu.Game.Rulesets.Beatmaps;
-using osu.Game.Rulesets.Objects.Types;
 using osu.Game.Rulesets.Osu.Beatmaps;
 using osu.Game.Rulesets.Osu.Objects;
 using System;
@@ -190,4 +189,4 @@
             Aim,
         };
     }
-}+}


Add test cases for new randomizer behaviour

--- osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs
+++ osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs
@@ -128,6 +128,20 @@
             selectedSets.Pop();
         });

+        private bool selectedBeatmapVisible()
+        {
+            var currentlySelected = carousel.Items.FirstOrDefault(s => s.Item is CarouselBeatmap && s.Item.State == CarouselItemState.Selected);
+            if (currentlySelected == null)
+                return true;
+            return !currentlySelected.Item.Filtered;
+        }
+
+        private void checkInvisibleDifficultiesUnselectable()
+        {
+            nextRandom();
+            AddAssert("Selection is visible", selectedBeatmapVisible);
+        }
+
         /// <summary>
         /// Test keyboard traversal
         /// </summary>
@@ -222,6 +236,15 @@

             nextRandom();
             AddAssert("ensure repeat", () => selectedSets.Contains(carousel.SelectedBeatmapSet));
+
+            AddStep("Add set with 100 difficulties", () => carousel.UpdateBeatmapSet(createTestBeatmapSetWith100Difficulties(set_count + 1)));
+            AddStep("Filter Extra", () => carousel.Filter(new FilterCriteria { SearchText = "Extra 10" }, false));
+            checkInvisibleDifficultiesUnselectable();
+            checkInvisibleDifficultiesUnselectable();
+            checkInvisibleDifficultiesUnselectable();
+            checkInvisibleDifficultiesUnselectable();
+            checkInvisibleDifficultiesUnselectable();
+            AddStep("Un-filter", () => carousel.Filter(new FilterCriteria(), false));
         }

         /// <summary>
@@ -384,6 +407,40 @@
             };
         }

+        private BeatmapSetInfo createTestBeatmapSetWith100Difficulties(int i)
+        {
+            var toReturn = new BeatmapSetInfo
+            {
+                ID = i,
+                OnlineBeatmapSetID = i,
+                Hash = new MemoryStream(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())).ComputeMD5Hash(),
+                Metadata = new BeatmapMetadata
+                {
+                    OnlineBeatmapSetID = i,
+                    // Create random metadata, then we can check if sorting works based on these
+                    Artist = $"peppy{i.ToString().PadLeft(6, '0')}",
+                    Title = $"test set #{i}!",
+                    AuthorString = string.Concat(Enumerable.Repeat((char)('z' - Math.Min(25, i - 1)), 5))
+                },
+                Beatmaps = new List<BeatmapInfo>(),
+            };
+            for (int b = 1; b < 101; b++)
+            {
+                toReturn.Beatmaps.Add(new BeatmapInfo
+                {
+                    OnlineBeatmapID = b * 10,
+                    Path = $"extra{b}.osu",
+                    Version = $"Extra {b}",
+                    StarDifficulty = 2,
+                    BaseDifficulty = new BeatmapDifficulty
+                    {
+                        OverallDifficulty = 3.5f,
+                    }
+                });
+            }
+            return toReturn;
+        }
+
         private class TestBeatmapCarousel : BeatmapCarousel
         {
             public new List<DrawableCarouselItem> Items => base.Items;


Fix incorrect indexing

Fix incorrect indexing

--- osu.Game/Online/Multiplayer/MultiplayerClient.cs
+++ osu.Game/Online/Multiplayer/MultiplayerClient.cs
@@ -622,7 +622,7 @@

                 Debug.Assert(APIRoom != null);

-                int index = APIRoom.Playlist.Where(p => p.ID == item.ID).Select((_, i) => i).Single();
+                int index = APIRoom.Playlist.Select((i, index) => (i, index)).Single(kvp => kvp.i.ID == item.ID).index;
                 APIRoom.Playlist.RemoveAt(index);
                 APIRoom.Playlist.Insert(index, playlistItem);
             }).ConfigureAwait(false);


Make mode selector selected line non-relative. (#352)

* mode selector line has the correct length now
* calculation is now a 'one-liner'
* Line length is absolute now
* Line length is calculated inline

--- osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
+++ osu.Game/Overlays/Toolbar/ToolbarModeSelector.cs
@@ -41,12 +41,11 @@
                     Direction = FlowDirections.Horizontal,
                     Anchor = Anchor.TopCentre,
                     Origin = Anchor.TopCentre,
-                    Padding = new MarginPadding { Left = 10, Right = 10 },
+                    Padding = new MarginPadding { Left = padding, Right = padding },
                 },
                 modeButtonLine = new Container
                 {
-                    RelativeSizeAxes = Axes.X,
-                    Size = new Vector2(0.3f, 3),
+                    Size = new Vector2(padding * 2 + ToolbarButton.WIDTH, 3),
                     Anchor = Anchor.BottomLeft,
                     Origin = Anchor.TopLeft,
                     Masking = true,


Remove `DefaultScoreCounter` animation for the time being

May add this back in the future, but for now it's causing issues as it
operates on `this`. The default skin may be changing quite a bit in the
near future, so we can decide what to do about animation at that point
in time.

--- osu.Game/Screens/Play/HUD/DefaultScoreCounter.cs
+++ osu.Game/Screens/Play/HUD/DefaultScoreCounter.cs
@@ -24,12 +24,6 @@
         private void load(OsuColour colours)
         {
             Colour = colours.BlueLighter;
-
-            // todo: check if default once health display is skinnable
-            hud?.ShowHealthbar.BindValueChanged(healthBar =>
-            {
-                this.MoveToY(healthBar.NewValue ? 30 : 0, HUDOverlay.FADE_DURATION, HUDOverlay.FADE_EASING);
-            }, true);
         }
     }
 }


Don't clone beatmap unnecessarily

Don't clone beatmap unnecessarily

--- osu.Game/Screens/Select/Details/AdvancedStats.cs
+++ osu.Game/Screens/Select/Details/AdvancedStats.cs
@@ -68,41 +68,39 @@

         private void updateStatistics()
         {
-            BeatmapInfo processed = Beatmap?.Clone();
-
-            if (processed != null && mods.Value.Any(m => m is IApplicableToDifficulty))
-            {
-                processed.BaseDifficulty = processed.BaseDifficulty.Clone();
+            var baseDifficulty = Beatmap?.BaseDifficulty;
+            var adjustedDifficulty = baseDifficulty;
+
+            if (baseDifficulty != null && mods.Value.Any(m => m is IApplicableToDifficulty))
+            {
+                adjustedDifficulty = adjustedDifficulty?.Clone();

                 foreach (var mod in mods.Value.OfType<IApplicableToDifficulty>())
-                    mod.ApplyToDifficulty(processed.BaseDifficulty);
-            }
-
-            BeatmapDifficulty baseDifficulty = Beatmap?.BaseDifficulty;
-            BeatmapDifficulty moddedDifficulty = processed?.BaseDifficulty;
+                    mod.ApplyToDifficulty(adjustedDifficulty);
+            }

             //mania specific
-            if ((processed?.Ruleset?.ID ?? 0) == 3)
+            if ((Beatmap?.Ruleset?.ID ?? 0) == 3)
             {
                 firstValue.Title = "Key Amount";
                 firstValue.BaseValue = (int)MathF.Round(baseDifficulty?.CircleSize ?? 0);
-                firstValue.ModdedValue = (int)MathF.Round(moddedDifficulty?.CircleSize ?? 0);
+                firstValue.ModdedValue = (int)MathF.Round(adjustedDifficulty?.CircleSize ?? 0);
             }
             else
             {
                 firstValue.Title = "Circle Size";
                 firstValue.BaseValue = baseDifficulty?.CircleSize ?? 0;
-                firstValue.ModdedValue = moddedDifficulty?.CircleSize ?? 0;
+                firstValue.ModdedValue = adjustedDifficulty?.CircleSize ?? 0;
             }

             hpDrain.BaseValue = baseDifficulty?.DrainRate ?? 0;
             accuracy.BaseValue = baseDifficulty?.OverallDifficulty ?? 0;
             approachRate.BaseValue = baseDifficulty?.ApproachRate ?? 0;
-            starDifficulty.BaseValue = (float)(processed?.StarDifficulty ?? 0);
-
-            hpDrain.ModdedValue = moddedDifficulty?.DrainRate ?? 0;
-            accuracy.ModdedValue = moddedDifficulty?.OverallDifficulty ?? 0;
-            approachRate.ModdedValue = moddedDifficulty?.ApproachRate ?? 0;
+            starDifficulty.BaseValue = (float)(Beatmap?.StarDifficulty ?? 0);
+
+            hpDrain.ModdedValue = adjustedDifficulty?.DrainRate ?? 0;
+            accuracy.ModdedValue = adjustedDifficulty?.OverallDifficulty ?? 0;
+            approachRate.ModdedValue = adjustedDifficulty?.ApproachRate ?? 0;
         }

         private class StatisticRow : Container, IHasAccentColour


Split out common selection quad logic

Split out common selection quad logic

--- osu.Game/Skinning/Editor/SkinSelectionHandler.cs
+++ osu.Game/Skinning/Editor/SkinSelectionHandler.cs
@@ -7,6 +7,7 @@
 using osu.Framework.Allocation;
 using osu.Framework.Extensions.EnumExtensions;
 using osu.Framework.Graphics;
+using osu.Framework.Graphics.Primitives;
 using osu.Framework.Graphics.UserInterface;
 using osu.Game.Extensions;
 using osu.Game.Graphics.UserInterface;
@@ -38,8 +39,7 @@
             }
             else
             {
-                var selectionQuad = GetSurroundingQuad(SelectedBlueprints.SelectMany(b =>
-                    b.Item.ScreenSpaceDrawQuad.GetVertices().ToArray()));
+                var selectionQuad = getSelectionQuad();

                 referenceOrigin ??= selectionQuad.Centre;

@@ -63,8 +63,7 @@

             adjustScaleFromAnchor(ref scale, anchor);

-            var selectionQuad = GetSurroundingQuad(SelectedBlueprints.SelectMany(b =>
-                b.Item.ScreenSpaceDrawQuad.GetVertices().ToArray()));
+            var selectionQuad = getSelectionQuad();

             // the selection quad is always upright, so use a rect to make mutating the values easier.
             var adjustedRect = selectionQuad.AABBFloat;
@@ -220,6 +219,13 @@
             }
         }

+        /// <summary>
+        /// A screen-space quad surrounding all selected drawables, accounting for their full displayed size.
+        /// </summary>
+        /// <returns></returns>
+        private Quad getSelectionQuad() =>
+            GetSurroundingQuad(SelectedBlueprints.SelectMany(b => b.Item.ScreenSpaceDrawQuad.GetVertices().ToArray()));
+
         private void applyAnchor(Anchor anchor)
         {
             foreach (var item in SelectedItems)