[SharpDX] Add Matrix3x2.Rotation() about a center point

--- Source/SharpDX/Matrix3x2.cs
+++ Source/SharpDX/Matrix3x2.cs
@@ -667,6 +667,30 @@
         }

         /// <summary>
+        /// Creates a matrix that rotates about a specified center.
+        /// </summary>
+        /// <param name="angle">Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis.</param>
+        /// <param name="center">The center of the rotation.</param>
+        /// <returns>The created rotation matrix.</returns>
+        public static Matrix3x2 Rotation(float angle, Vector2 center)
+        {
+            Matrix3x2 result;
+            Rotation(angle, center, out result);
+            return result;
+        }
+
+        /// <summary>
+        /// Creates a matrix that rotates about a specified center.
+        /// </summary>
+        /// <param name="angle">Angle of rotation in radians. Angles are measured clockwise when looking along the rotation axis.</param>
+        /// <param name="center">The center of the rotation.</param>
+        /// <param name="result">When the method completes, contains the created rotation matrix.</param>
+        public static void Rotation(float angle, Vector2 center, out Matrix3x2 result)
+        {
+            result = Translation(-center) * Rotation(angle) * Translation(center);
+        }
+
+        /// <summary>
         /// Creates a transformation matrix.
         /// </summary>
         /// <param name="xScale">Scaling factor that is applied along the x-axis.</param>


Removed Todo

Removed Todo

--- SqlServerValidationToolkit.Configurator/Controls/Columns/ColumnEditViewViewModel.cs
+++ SqlServerValidationToolkit.Configurator/Controls/Columns/ColumnEditViewViewModel.cs
@@ -151,16 +151,6 @@
                 return Column.IsNumeric;
             }
         }
-        public bool IsDateTime
-        {
-            get
-            {
-                if (Column == null)
-                    return false;
-                //TODO: Fix
-                return !Column.IsNumeric;
-            }
-        }

         public bool IsString
         {


[Tests]: Fix test xhtml string in document tags test

--- Source/Tests/ParserTests.cs
+++ Source/Tests/ParserTests.cs
@@ -270,12 +270,12 @@
         public void XhtmlDocumentTags()
         {
             string testString =
-                @"<?xml version=\""1.0\"" encoding=\""UTF-8\""?>
+                @"<?xml version=""1.0"" encoding=""UTF-8""?>

-                <meta name=\""Author\"" content=\""Иван Шимко\""/>
-                <meta name=\""publisher\"" content=\""Home\""/>
-                <meta name=\""meta:page-count\"" content=\""1\""/>
-                <meta name=\""dc:publisher\"" content=\""Home\""/>
+                <meta name=""Author"" content=""Иван Шимко""/>
+                <meta name=""publisher"" content=""Home""/>
+                <meta name=""meta:page-count"" content=""1""/>
+                <meta name=""dc:publisher"" content=""Home""/>
                 <title>Title</title>

Title


Was clipping the content on 2019.3

Was clipping the content on 2019.3


-debug Fix Serialisation.TraverseObjectGraph crashing on null namespace

--- Sigma.Core/Persistence/Serialisation.cs
+++ Sigma.Core/Persistence/Serialisation.cs
@@ -199,7 +199,7 @@
 					{
 						// Note: I am completely aware how awful this "optimisation" is, but it works and there currently is no time to implement a better system.
 						string ns = value.GetType().Namespace;
-						bool boringType = ns.StartsWith("System") && !ns.StartsWith("System.Collections") || ns.StartsWith("log4net");
+						bool boringType = ns == null || (ns.StartsWith("System") && !ns.StartsWith("System.Collections") || ns.StartsWith("log4net"));

 						if (!boringType && !traversedObjects.Contains(value) && !Attribute.IsDefined(field, typeof(NonSerializedAttribute)))
 						{


FileNameValidatorAttribute with InvalidCharts (.miFile.txt is a valid file but was not accepted)

--- Signum.Entities/ValidationAttributes.cs
+++ Signum.Entities/ValidationAttributes.cs
@@ -14,6 +14,7 @@
 using Signum.Utilities.Reflection;
 using System.Globalization;
 using Signum.Entities.Basics;
+using System.IO;

 namespace Signum.Entities
 {
@@ -267,17 +268,42 @@
         }
     }

-    public class FileNameValidatorAttribute : RegexValidatorAttribute
-    {
-        public static readonly Regex FileNameRegex = new Regex(@"^(?!^(PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d|\..*)(\..+)?$)[^\x00-\x1f\"";|/]+$");
+    public class FileNameValidatorAttribute : ValidatorAttribute
+    {
+        public static readonly char[] InvalidCharts = Path.GetInvalidPathChars();
+
+        static readonly Regex invalidChartsRegex = new Regex("[" + Regex.Escape(new string(Path.GetInvalidFileNameChars())) + "]");
+
         public FileNameValidatorAttribute()
-            : base(FileNameRegex)
-        {
-        }
-
-        public override string FormatName
+        {
+        }
+
+        public string FormatName
         {
             get { return ValidationMessage.FileName.NiceToString(); }
+        }
+
+        public override string HelpMessage
+        {
+            get { return ValidationMessage.HaveValid0Format.NiceToString().Formato(FormatName); }
+        }
+
+        protected override string OverrideError(object value)
+        {
+            string str = (string)value;
+
+            if (str == null)
+                return null;
+
+            if (str.IndexOfAny(InvalidCharts) == -1)
+                return null;
+
+            return ValidationMessage._0DoesNotHaveAValid0Format.NiceToString().Formato(FormatName);
+        }
+
+        public static string RemoveInvalidCharts(string a)
+        {
+            return invalidChartsRegex.Replace(a, "");
         }
     }


Мангачан криво парсил имена с >'<.

Мангачан криво парсил имена с >'<.

--- Sites/Hentaichan.me/Mangachan/Parser.cs
+++ Sites/Hentaichan.me/Mangachan/Parser.cs
@@ -51,10 +51,10 @@
         document.LoadHtml(Page.GetPage(chapter.Uri).Content);
         var enName = Regex.Match(document.DocumentNode.InnerHtml, @"\""name\"":\""(.*?)\""", RegexOptions.IgnoreCase);
         if (enName.Success)
-          localizedName.English = WebUtility.HtmlDecode(enName.Groups[1].Value);
+          localizedName.English = WebUtility.HtmlDecode(enName.Groups[1].Value.Replace("\\'", "'"));
         var ruName = Regex.Match(document.DocumentNode.InnerHtml, @"\""rus_name\"":\""\((.*?)\)\""", RegexOptions.IgnoreCase);
         if (ruName.Success)
-          localizedName.Russian = WebUtility.HtmlDecode(ruName.Groups[1].Value);
+          localizedName.Russian = WebUtility.HtmlDecode(ruName.Groups[1].Value.Replace("\\'", "'"));
       }
       catch (NullReferenceException ex) { Log.Exception(ex); }


Remove accidental debugging statements

Remove accidental debugging statements

--- SlicerConfiguration/UIFields/UIField.cs
+++ SlicerConfiguration/UIFields/UIField.cs
@@ -40,8 +40,6 @@
 		{
 			string convertedValue = this.ConvertValue(newValue);

-			Console.WriteLine($"SetValue: {newValue}/{convertedValue}/{userInitiated}");
-
 			if (this.Value != convertedValue)
 			{
 				this.Value = convertedValue;


Increase app startup timeout to 1 minute

--- Tests/Boxed.Templates.Test/Framework/ProjectExtensions.cs
+++ Tests/Boxed.Templates.Test/Framework/ProjectExtensions.cs
@@ -183,7 +183,7 @@
                 "dotnet",
                 $"run --urls {urlsParameter}",
                 cancellationTokenSource.Token);
-            await WaitForStart(urls.First(), timeout ?? TimeSpan.FromSeconds(10));
+            await WaitForStart(urls.First(), timeout ?? TimeSpan.FromMinutes(1));

             return new DisposableAction(
                 () =>


Fixed issue when Clear not using default state

--- MyHalp/MyCursor.cs
+++ MyHalp/MyCursor.cs
@@ -32,25 +32,13 @@
         {
             _defaultState = defaultState;
         }
-
+
         /// <summary>
-        /// Ticks MyCursor.
+        /// Should be called when the game window gained focus (use OnApplicationFocus(bool)).
         /// </summary>
-        public static void Tick()
+        public static void OnFocus()
         {
-            // update lock mode
-
-            CursorLockMode mode;
-            if (Stack.Count > 0)
-            {
-                mode = Stack.Peek() == MyCursorState.Hide ? CursorLockMode.Locked : CursorLockMode.None;
-            }
-            else
-            {
-                mode = _defaultState == MyCursorState.Hide ? CursorLockMode.Locked : CursorLockMode.None;
-            }
-
-            Cursor.lockState = mode;
+            Use(Stack.Count > 0 ? Stack.Peek() : _defaultState);
         }

         /// <summary>
@@ -80,6 +68,9 @@
         public static void Clear()
         {
             Stack.Clear();
+
+            // use default
+            Use(_defaultState);
         }

         // private


Fixed error when scanning services with badly formatted filenames

--- source/UninstallTools/Startup/Service/ServiceEntry.cs
+++ source/UninstallTools/Startup/Service/ServiceEntry.cs
@@ -18,21 +18,25 @@
             EntryLongName = displayName;

             Command = command;
-            CommandFilePath = ProcessTools.SeparateArgsFromCommand(command).FileName;
-
+
+            if (ProcessStartCommand.TryParse(command, out var pc))
+                CommandFilePath = pc.FileName;
+            else if (File.Exists(command))
+                CommandFilePath = command;
+
             FillInformationFromFile(CommandFilePath);
         }

         public override string ParentShortName
         {
             get { return Localisation.Startup_ShortName_Service; }
-            protected set {  }
+            protected set { }
         }

         public override string ParentLongName
         {
             get { return Localisation.Startup_ShortName_Service; }
-            protected set {  }
+            protected set { }
         }

         public override bool Disabled
@@ -75,12 +79,12 @@

             using (var key = RegistryTools.OpenRegistryKey(path))
             {
-                if(key == null)
+                if (key == null)
                     throw new IOException();
             }

             var filename = PathTools.SanitizeFileName(FullLongName) + ".reg";
-            RegistryTools.ExportRegistry(Path.Combine(backupPath, filename), new[] {path});
+            RegistryTools.ExportRegistry(Path.Combine(backupPath, filename), new[] { path });
         }
     }
 }


Fix for multiple issues involving layers with tint, fade and artifacts for iOS.

--- cocos2d/layers_scenes_transitions_nodes/CCLayerColor.cs
+++ cocos2d/layers_scenes_transitions_nodes/CCLayerColor.cs
@@ -39,6 +39,7 @@
         protected VertexPositionColor[] m_pVertices = new VertexPositionColor[4];
         private VertexBuffer m_pVertexBuffer;
         protected bool m_bChanged;
+        protected bool m_opacityChanged;

         public CCLayerColor()
         {
@@ -111,6 +112,7 @@
             m_tColor.B = color.B;
             m_cOpacity = color.A;

+            m_opacityChanged = true;
             UpdateColor();

             ContentSize = new CCSize(width, height);
@@ -190,6 +192,8 @@
             set
             {
                 m_cOpacity = value;
+                // make sure that UpdateColor knows that the change was due to opacity.
+                m_opacityChanged = true;
                 UpdateColor();
             }
         }
@@ -200,13 +204,16 @@
             set
             {
                 m_tColor = value;
+                m_opacityChanged = false;
                 UpdateColor();
             }
         }

         public bool IsOpacityModifyRGB
         {
-            get { return false; }
+            get {
+                return false;
+            }
             set { }
         }

@@ -236,9 +243,22 @@
         {
             var color = new Color(m_tColor.R / 255.0f, m_tColor.G / 255.0f, m_tColor.B / 255.0f, m_cOpacity / 255.0f);

+            // This was placed in an #ifdef so as not to break other systems.
+#if IOS
+            // This checks if the method was caused by an opacity modification or not.
+            if (m_opacityChanged)
+            {
+                color.R *= color.A;
+                color.G *= color.A;
+                color.B *= color.A;
+            }
+#endif
+
             m_pVertices[0].Color = m_pVertices[1].Color = m_pVertices[2].Color = m_pVertices[3].Color = color;

             m_bChanged = true;
+            m_opacityChanged = false;
         }
     }
+
 }


Couple fixes

Couple fixes

--- TwitchLeecher/TwitchLeecher.Gui/Services/DialogService.cs
+++ TwitchLeecher/TwitchLeecher.Gui/Services/DialogService.cs
@@ -1,4 +1,5 @@
-using Ninject;
+using Microsoft.WindowsAPICodePack.Dialogs;
+using Ninject;
 using System;
 using System.Windows;
 using System.Windows.Forms;
@@ -9,7 +10,6 @@
 using TwitchLeecher.Services.Interfaces;
 using Cursors = System.Windows.Input.Cursors;
 using SaveFileDialog = Microsoft.Win32.SaveFileDialog;
-using Microsoft.WindowsAPICodePack.Dialogs;

 namespace TwitchLeecher.Gui.Services
 {
@@ -88,19 +88,23 @@

         public void ShowFolderBrowserDialog(string folder, Action<bool, string> dialogCompleteCallback)
         {
-            if (CommonOpenFileDialog.IsPlatformSupported)
+            if (CommonFileDialog.IsPlatformSupported)
             {
-                CommonOpenFileDialog cofd = new CommonOpenFileDialog();
-                cofd.IsFolderPicker = true;
+                using (CommonOpenFileDialog cofd = new CommonOpenFileDialog())
+                {
+                    cofd.IsFolderPicker = true;

-                if (!string.IsNullOrWhiteSpace(folder))
-                {
-                    cofd.InitialDirectory = folder;
+                    if (!string.IsNullOrWhiteSpace(folder))
+                    {
+                        cofd.InitialDirectory = folder;
+                    }
+
+                    CommonFileDialogResult result = cofd.ShowDialog();
+
+                    bool canceled = result != CommonFileDialogResult.Ok;
+
+                    dialogCompleteCallback(canceled, canceled ? null : cofd.FileName);
                 }
-
-                CommonFileDialogResult result = cofd.ShowDialog();
-
-                dialogCompleteCallback(result != CommonFileDialogResult.Ok, cofd.FileName);
             }
             else
             {


test zorder

test zorder

--- Unity/Demos/Assets/Scripts/DragonBones/unity/UnitySlot.cs
+++ Unity/Demos/Assets/Scripts/DragonBones/unity/UnitySlot.cs
@@ -1,4 +1,5 @@
 using UnityEngine;
+using UnityEngine.Rendering;

 namespace DragonBones
 {
@@ -127,7 +128,7 @@
             if (_renderDisplay.transform.parent != container.transform)
             {
                 _renderDisplay.transform.SetParent(container.transform);
-
+
                 _helpVector3.Set(0.0f, 0.0f, -_zOrder * (_proxy.zSpace + 0.001f));

                 _renderDisplay.transform.localPosition = _helpVector3;
@@ -176,6 +177,28 @@

 			_renderDisplay.transform.localPosition = _helpVector3;
         }
+
+        private void _SetZorder()
+        {
+#if UNITY_5_6_OR_NEWER
+            var armatureComp = _armature.proxy as UnityArmatureComponent;
+            var sortingGroup = armatureComp.GetComponent<SortingGroup>();
+            if (sortingGroup == null)
+            {
+                sortingGroup = armatureComp.GetComponent<SortingGroup>();
+            }
+
+            //sortingGroup.sortingOrder = _zOrder;
+#endif
+
+            _helpVector3.Set(_renderDisplay.transform.localPosition.x, _renderDisplay.transform.localPosition.y, -_zOrder * (_proxy.zSpace + 0.001f));
+            _renderDisplay.transform.localPosition = _helpVector3;
+            if (_renderer != null)
+            {
+                _renderer.sortingOrder = _zOrder;
+            }
+        }
+
         /**
          * @private
          */


Fix for server address to be auto-populated with what's specified in Unity Editor

--- UnityProject/Assets/Scripts/UI/Lobby/GUI_LobbyDialogue.cs
+++ UnityProject/Assets/Scripts/UI/Lobby/GUI_LobbyDialogue.cs
@@ -10,7 +10,7 @@
     {

         private const string DefaultServer = "localhost";
-        private const string DefaultPort = "7777";
+        private const int DefaultPort = 7777;
         private const string UserNamePlayerPref = "PlayerName";

         public GameObject startGamePanel;
@@ -26,18 +26,16 @@
         private CustomNetworkManager networkManager;

         // Lifecycle
-        void Start ()
+        void Start()
         {
-	        networkManager = CustomNetworkManager.Instance;
-            serverAddressInput.text = DefaultServer;
-            serverPortInput.text = DefaultPort;
+            networkManager = CustomNetworkManager.Instance;

             InitPlayerName();

             ShowStartGamePanel();
         }

-        void Update ()
+        void Update()
         {
             serverAddressInput.interactable = !hostServerToggle.isOn;
             serverPortInput.interactable = !hostServerToggle.isOn;
@@ -54,6 +52,12 @@
                 return;
             }
             if (!startGamePanel.activeInHierarchy)
+            {
+                return;
+            }
+
+            // Return if no network address is specified
+            if (string.IsNullOrEmpty(serverAddressInput.text))
             {
                 return;
             }
@@ -97,22 +101,20 @@
         }

         // Game handlers
-        void StartSelfHostedGame()
-        {
-            gameObject.SetActive(false);
-        }
-
         void ConnectToServer()
         {
             if (Managers.instance.isForRelease)
             {
                 networkManager.networkAddress = Managers.instance.serverIP;
-                networkManager.networkPort = int.Parse(DefaultPort);
+                networkManager.networkPort = DefaultPort;
                 networkManager.StartClient();
                 return;
             }

+            // Set network address
             networkManager.networkAddress = serverAddressInput.text;
+
+            // Set network port
             int port = 0;
             if (serverPortInput.text.Length >= 4)
             {
@@ -120,16 +122,17 @@
             }
             if (port == 0)
             {
-                networkManager.networkPort = int.Parse(DefaultPort);
+                networkManager.networkPort = DefaultPort;
             }
             else
             {
                 networkManager.networkPort = port;
             }
+
+            // Start network client
             networkManager.StartClient();
         }

-        // Player name helpers
         void InitPlayerName()
         {
             string steamName = "";


Now copies files to clipboard for module box moderation.

--- UnnITBooster/StudentMarking/frmAutomaticMarkingMachine.cs
+++ UnnITBooster/StudentMarking/frmAutomaticMarkingMachine.cs
@@ -20,7 +20,7 @@

 namespace StudentsFetcher.StudentMarking
 {
-    [AMMFormAttributes(ButtonText = "Automatic marking machine", Order = 1)]
+    [AMMFormAttributes(ButtonText = "Automatic marking machine", Order = 1)]
     public partial class FrmAutomaticMarkingMachine : Form
     {
         private ClsConfig _config;
@@ -29,11 +29,11 @@
         {
             InitializeComponent();
             LoadSettings();
-
-        }
-
+
+        }
+
         #region marking
-
+
         void txtStudentId_KeyDown(object sender, KeyEventArgs e)
         {
             if (e.KeyCode == Keys.Enter)
@@ -70,7 +70,7 @@

                     if (cmp == -1)
                         cmp = 0;
-
+
                     var m = flComponents.Controls[cmp] as ucComponentMark;
                     m.TabStop = false;
                     m.MarkValue = val;
@@ -87,7 +87,7 @@
                 UpdateDocumentsList();

                 // show student picure.
-
+
                 var dt = _config.GetDataTable("SELECT SUB_NumericUserId from tb_submissions where SUB_Id = " + GetStudentNumber());
                 if (dt.Rows.Count == 1)
                 {
@@ -116,14 +116,14 @@
                     return;
                 }

-                var mc =  _config.GetMarkCalculator();
+                var mc = _config.GetMarkCalculator();
                 var sb = new StringBuilder();
                 var sbDataUpload = new StringBuilder();
                 foreach (DataRow item in dt.Rows)
                 {
                     var totmark = mc.GetFinalMark(item["SUB_NumericUserId"].ToString(), _config);

-                    sb.AppendFormat("{0}\t{1}\t{2}\t{3}\t{5}\t{4}\t{6}\r\n",
+                    sb.AppendFormat("{0}\t{1}\t{2}\t{3}\t{5}\t{4}\t{6}\r\n",
                         item["SUB_id"],
                         item["SUB_LastName"],
                         item["SUB_FirstName"],
@@ -138,7 +138,7 @@
                         item["SUB_FirstName"],
                         item["SUB_UserID"],
                         item["SUB_NumericUserID"],
-                        totmark,
+                        totmark,
                         item["SUB_email"]
                         );
                 }
@@ -187,9 +187,9 @@
                 cmbDocuments.SelectedIndex = 0;
             }

-            cmbDocuments.ForeColor =
-                cmbDocuments.Items.Count > 1
-                ? Color.Red
+            cmbDocuments.ForeColor =
+                cmbDocuments.Items.Count > 1
+                ? Color.Red
                 : Color.Black;

         }
@@ -201,7 +201,7 @@
             if (!d.Exists)
                 return validFiles;
             var dirs = d.GetDirectories();
-
+
             foreach (var item in dirs)
             {
                 var files = item.GetFiles(sId + "*.*");
@@ -209,7 +209,7 @@
                 {
                     var subfile = Path.Combine(item.Name, file.Name);
                     validFiles.Add(subfile);
-
+
                 }
             }
             return validFiles;
@@ -260,6 +260,10 @@
                 else if (m5.Success)
                 {
                     RemoveComment(m5);
+                }
+                else if (txtSearch.Text == "CopyFilesById")
+                {
+                    CopyFilesById();
                 }
                 else if (txtSearch.Text == "missing")
                 {
@@ -282,6 +286,8 @@
                         "   required ids in textbox (one per row)\r\n " +
                         "CommentCount\r\n" +
                         "   SELECT count(scom_id) as count, SCOM_ptr_Submission FROM TB_SubComments group by SCOM_ptr_Submission order by count(scom_id) desc\r\n" +
+                        "CopyFilesById\r\n" +
+                        "   used to copy files to clipboard for the module box (by userid)\r\n " +
                         "WhoGotComment <#>\r\n" +
                         "   lists students that got a specific comment in their feedback\r\n " +
                         "ids\r\n" +
@@ -293,14 +299,18 @@
                         "missing\r\n" +
                         "   finds marks not added to mcrf (use all relevant lists)" +
                         "   required ids in textbox (one per row, e.g. '11039298/1')\r\n ";
-
-
                 }
                 else
                 {
                     SearchCommentInLibrary();
                 }
             }
+        }
+
+        private void CopyFilesById()
+        {
+            var allIds = txtLibReport.Text.Split(new[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
+            CopyFiles(allIds);
         }

         private void WriteFeedbackFile()
@@ -341,8 +351,8 @@

             txtLibReport.Text = "Submissions:\r\n";
             var sql = "delete from TB_SubComments where "
-                      + "SCOM_ptr_Submission = " + GetStudentNumber()
-                      +" AND SCOM_ptr_Comment = " + m5.Groups[1].Value;
+                      + "SCOM_ptr_Submission = " + GetStudentNumber()
+                      + " AND SCOM_ptr_Comment = " + m5.Groups[1].Value;

             _config.Execute(sql);
@@ -363,7 +373,7 @@
             {
                 var lookForId = r["sub_numericUserId"].ToString();

-                var rEx = new Regex("" + lookForId +@"/(\d)");
+                var rEx = new Regex("" + lookForId + @"/(\d)");

                 var bFound = false;
                 foreach (var reqId in allIds)
@@ -384,11 +394,42 @@
         private void GetCommentUse(Match m4)
         {
             txtLibReport.Text = "Submissions:\r\n";
-            var sql = "SELECT SCOM_ptr_Submission FROM TB_SubComments where SCOM_ptr_comment = " + m4.Groups[1].Value;
+            var sql = "SELECT SCOM_ptr_Submission, TB_Submissions.SUB_UserID FROM TB_SubComments inner join TB_Submissions on SCOM_ptr_Submission = SUB_ID where SCOM_ptr_comment = " + m4.Groups[1].Value;
             var dt = _config.GetDataTable(sql);
+
+            var reqIds = new List<string>();
+
             foreach (DataRow item in dt.Rows)
             {
-                txtLibReport.Text += item[0] + "\r\n";
+                txtLibReport.Text += $"{item[0]}\t{item[1]}\r\n";
+                // this submission's files
+                reqIds.Add(item[1].ToString());
+            }
+            // also copy files to clipboard
+            //
+            CopyFiles(reqIds);
+        }
+
+        private void CopyFiles(IEnumerable<string> reqIds)
+        {
+            var fNames = new List<string>();
+            var folderName = _config.GetFolderName();
+            foreach (var sId in reqIds)
+            {
+
+                var validFiles = GetValidFiles(folderName, sId).ToArray();
+
+                foreach (var file in validFiles)
+                {
+                    fNames.Add(Path.Combine(folderName, file));
+                }
+
+            }
+            if (fNames.Any())
+            {
+                Clipboard.Clear();
+                Clipboard.SetData(DataFormats.FileDrop, fNames.ToArray());
+                txtLibReport.Text += $"{fNames.Count} Files copied to clipboard.";
             }
         }


Update KSPCompatible.cs

Update KSPCompatible.cs

--- LmpGlobal/KSPCompatible.cs
+++ LmpGlobal/KSPCompatible.cs
@@ -4,7 +4,7 @@
 {
     public static class KspCompatible
     {
-        public static readonly Version MinKspVersion = new Version("1.4.0");
+        public static readonly Version MinKspVersion = new Version("1.4.3");
         public static readonly Version MaxKspVersion = new Version("1.4.9");
     }
 }


Break out Xamarin vs non-Xamarin code in this class.

--- Source/Csla.Xaml.Shared/PropertyInfo.cs
+++ Source/Csla.Xaml.Shared/PropertyInfo.cs
@@ -16,6 +16,8 @@
 #if NETFX_CORE
 using Windows.UI.Xaml;
 using Windows.UI.Xaml.Data;
+#elif XAMARIN
+using Xamarin.Forms;
 #else
 using System.Windows.Controls;
 using System.Windows;
@@ -27,25 +29,36 @@
   /// <summary>
   /// Expose metastate information about a property.
   /// </summary>
+#if XAMARIN
+  public class PropertyInfo : Element, INotifyPropertyChanged
+  {
+
+#else
   public class PropertyInfo : FrameworkElement, INotifyPropertyChanged
   {
+    private const string _dependencyPropertySuffix = "Property";
+#endif
     private bool _loading = true;
-    private const string _dependencyPropertySuffix = "Property";

     /// <summary>
     /// Creates an instance of the object.
     /// </summary>
     public PropertyInfo()
     {
+#if XAMARIN
+      _loading = false;
+      UpdateState();
+#else
+      BrokenRules = new ObservableCollection<BrokenRule>();
       Visibility = Visibility.Collapsed;
       Height = 20;
       Width = 20;
-      BrokenRules = new ObservableCollection<BrokenRule>();
       Loaded += (o, e) =>
       {
         _loading = false;
         UpdateState();
       };
+#endif
     }

     /// <summary>
@@ -59,8 +72,25 @@
       UpdateState();
     }

-    #region BrokenRules property
-
+#region BrokenRules property
+
+#if XAMARIN
+    /// <summary>
+    /// Gets the broken rules collection from the
+    /// business object.
+    /// </summary>
+    public static readonly BindableProperty BrokenRulesProperty =
+      BindableProperty.Create("BrokenRules", typeof(ObservableCollection<BrokenRule>), typeof(PropertyInfo), new ObservableCollection<BrokenRule>());
+    /// <summary>
+    /// Gets the broken rules collection from the
+    /// business object.
+    /// </summary>
+    public ObservableCollection<BrokenRule> BrokenRules
+    {
+      get { return (ObservableCollection<BrokenRule>)this.GetValue(BrokenRulesProperty); }
+      set { SetValue(BrokenRulesProperty, value); }
+    }
+#else
     /// <summary>
     /// Gets the broken rules collection from the
     /// business object.
@@ -81,10 +111,14 @@
       get { return (ObservableCollection<BrokenRule>)GetValue(BrokenRulesProperty); }
       private set { SetValue(BrokenRulesProperty, value); }
     }
-
-    #endregion
-
-    #region MyDataContext Property
+#endif
+
+#endregion
+
+#region MyDataContext Property
+
+#if XAMARIN
+#else
     /// <summary>
     /// Used to monitor for changes in the binding path.
     /// </summary>
@@ -102,10 +136,14 @@
     {
       ((PropertyInfo)sender).SetSource(true);
     }
+#endif

     #endregion

-    #region RelativeBinding Property
+#region RelativeBinding Property
+
+#if XAMARIN
+#else

     /// <summary>
     /// Used to monitor for changes in the binding path.
@@ -124,11 +162,49 @@
     {
       ((PropertyInfo)sender).SetSource(true);
     }
+#endif

     #endregion

-    #region Source property
-
+#region Source property
+
+    private object _source = null;
+    /// <summary>
+    /// Gets or sets the Source.
+    /// </summary>
+    /// <value>The source.</value>
+    protected object Source
+    {
+      get
+      {
+        return _source;
+      }
+      set
+      {
+        _source = value;
+      }
+    }
+
+    private string _bindingPath = string.Empty;
+    /// <summary>
+    /// Gets or sets the binding path.
+    /// </summary>
+    /// <value>The binding path.</value>
+    protected string BindingPath
+    {
+      get
+      {
+        return _bindingPath;
+      }
+      set
+      {
+        _bindingPath = value;
+      }
+    }
+
+#if XAMARIN
+    // TODO: set source and bindingpath properties
+#else
     /// <summary>
     /// Gets or sets the source business
     /// property to which this control is bound.
@@ -164,40 +240,6 @@
       {
         SetValue(PropertyProperty, value);
         SetSource(false);
-      }
-    }
-
-    private object _source = null;
-    /// <summary>
-    /// Gets or sets the Source.
-    /// </summary>
-    /// <value>The source.</value>
-    protected object Source
-    {
-      get
-      {
-        return _source;
-      }
-      set
-      {
-        _source = value;
-      }
-    }
-
-    private string _bindingPath = string.Empty;
-    /// <summary>
-    /// Gets or sets the binding path.
-    /// </summary>
-    /// <value>The binding path.</value>
-    protected string BindingPath
-    {
-      get
-      {
-        return _bindingPath;
-      }
-      set
-      {
-        _bindingPath = value;
       }
     }

@@ -400,6 +442,7 @@

       return null;
     }
+#endif

     private void HandleSourceEvents(object old, object source)
     {
@@ -458,9 +501,9 @@
       }
     }

-    #endregion
-
-    #region State properties
+#endregion
+
+#region State properties

     private bool _canRead = true;
     /// <summary>
@@ -540,7 +583,7 @@

     private RuleSeverity _worst;
     /// <summary>
-    /// Gets a valud indicating the worst
+    /// Gets a value indicating the worst
     /// severity of all broken rules
     /// for this property (if IsValid is
     /// false).
@@ -578,9 +621,9 @@
       }
     }

-    #endregion
-
-    #region State management
+#endregion
+
+#region State management

     /// <summary>
     /// Updates the state on control Property.
@@ -593,8 +636,8 @@
       var iarw = Source as Csla.Security.IAuthorizeReadWrite;
       if (iarw != null)
       {
-        CanWrite = iarw.CanWriteProperty(_bindingPath);
-        CanRead = iarw.CanReadProperty(_bindingPath);
+        CanWrite = iarw.CanWriteProperty(BindingPath);
+        CanRead = iarw.CanReadProperty(BindingPath);
       }

       BusinessBase businessObject = Source as BusinessBase;
@@ -644,10 +687,11 @@
       }
     }

-    #endregion
-
-    #region INotifyPropertyChanged Members
-
+#endregion
+
+#region INotifyPropertyChanged Members
+
+#if !XAMARIN
     /// <summary>
     /// Event raised when a property has changed.
     /// </summary>
@@ -662,7 +706,8 @@
       if (PropertyChanged != null)
         PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
     }
-
-    #endregion
+#endif
+
+#endregion
   }
 }


Abstracted the StringReader creation.

Abstracted the StringReader creation.

--- YamlDotNet.RepresentationModel.Test/SerializationTests.cs
+++ YamlDotNet.RepresentationModel.Test/SerializationTests.cs
@@ -64,7 +64,7 @@
 			Dump.WriteLine(buffer);

 			var deserializer = new Deserializer();
-			var copy = deserializer.Deserialize<X>(new StringReader(buffer.ToString()));
+			var copy = deserializer.Deserialize<X>(UsingReaderFor(buffer));

 			copy.ShouldHave().AllProperties().EqualTo(original);
 		}
@@ -188,7 +188,7 @@
 			var z = new[] { new Z { aaa = "Yo" }};

 			serializer.Serialize(buffer, z);
-			var result = deserializer.Deserialize<IEnumerable<Z>>(new StringReader(buffer.ToString()));
+			var result = deserializer.Deserialize<IEnumerable<Z>>(UsingReaderFor(buffer));

 			result.Should().ContainSingle(item => "Yo".Equals(item.aaa));
 		}
@@ -203,7 +203,7 @@

 			serializer.Serialize(buffer, original, typeof(List<int>));
 			Dump.WriteLine(buffer);
-			var copy = deserializer.Deserialize<List<int>>(new StringReader(buffer.ToString()));
+			var copy = deserializer.Deserialize<List<int>>(UsingReaderFor(buffer));

 			copy.Should().Equal(original);
 		}
@@ -227,7 +227,7 @@
 			var flags = StringFormatFlags.NoClip | StringFormatFlags.NoFontFallback;

 			serializer.Serialize(buffer, flags);
-			var result = deserializer.Deserialize<StringFormatFlags>(new StringReader(buffer.ToString()));
+			var result = deserializer.Deserialize<StringFormatFlags>(UsingReaderFor(buffer));

 			result.Should().Be(flags);
 		}
@@ -391,7 +391,7 @@
 			Dump.WriteLine(buffer);

 			deserializer.RegisterTypeConverter(new ParameterizedCtorConverter());
-			var copy = deserializer.Deserialize<ParameterizedCtor>(new StringReader(buffer.ToString()));
+			var copy = deserializer.Deserialize<ParameterizedCtor>(UsingReaderFor(buffer));

 			copy.Value.Should().Be("Yo");
 		}
@@ -437,7 +437,7 @@

 			serializer.Serialize(buffer, entries);
 			Dump.WriteLine(buffer);
-			var result = deserializer.Deserialize<Dictionary<string, string>>(new StringReader(buffer.ToString()));
+			var result = deserializer.Deserialize<Dictionary<string, string>>(UsingReaderFor(buffer));

 			result.Should().Equal(entries);
 		}
@@ -452,7 +452,7 @@

 			serializer.Serialize(buffer, data);
 			Dump.WriteLine(buffer);
-			var result = deserializer.Deserialize<Dictionary<string, string>>(new StringReader(buffer.ToString()));
+			var result = deserializer.Deserialize<Dictionary<string, string>>(UsingReaderFor(buffer));

 			result.Should().Equal(new Dictionary<string, string> {
 				{ "Key", "3" }
@@ -523,7 +523,7 @@

 			serializer.Serialize(buffer, original, typeof(X));
 			Dump.WriteLine(buffer);
-			var copy = deserializer.Deserialize<X>(new StringReader(buffer.ToString()));
+			var copy = deserializer.Deserialize<X>(UsingReaderFor(buffer));

 			copy.MyString.Should().BeNull();
 		}
@@ -538,7 +538,7 @@

 			serializer.Serialize(buffer, original);
 			Dump.WriteLine(buffer);
-			var copy = deserializer.Deserialize<ContainsIgnore>(new StringReader(buffer.ToString()));
+			var copy = deserializer.Deserialize<ContainsIgnore>(UsingReaderFor(buffer));

 			copy.IgnoreMe.Should().BeNull();
 		}
@@ -562,7 +562,7 @@
 				RegularParent = new Child { ParentProp = "foo", ChildProp = "bar" },
 			});
 			Dump.WriteLine(buffer);
-			var result = deserializer.Deserialize<ParentChildContainer>(new StringReader(buffer.ToString()));
+			var result = deserializer.Deserialize<ParentChildContainer>(UsingReaderFor(buffer));

 			result.SomeScalar.Should().Be("Hello");
 			result.RegularParent.Should().BeOfType<Child>().And
@@ -582,7 +582,7 @@
 				ParentWithSerializeAs = new Child { ParentProp = "foo", ChildProp = "bar" },
 			});
 			Dump.WriteLine(buffer);
-			var result = deserializer.Deserialize<ParentChildContainer>(new StringReader(buffer.ToString()));
+			var result = deserializer.Deserialize<ParentChildContainer>(UsingReaderFor(buffer));

 			result.ParentWithSerializeAs.Should().BeOfType<Parent>().And
 				.Subject.As<Parent>().ShouldHave().SharedProperties().EqualTo(new { ParentProp = "foo" });
@@ -624,11 +624,10 @@
 			var writer = new StringWriter();
 			serializer.Serialize(writer, input, typeof(T));

-			var serialized = writer.ToString();
-			Dump.WriteLine("serialized =\n-----\n{0}", serialized);
-
-			var deserializer = new Deserializer();
-			return deserializer.Deserialize<T>(new StringReader(serialized));
+			Dump.WriteLine("serialized =\n-----\n{0}", writer);
+
+			var deserializer = new Deserializer();
+			return deserializer.Deserialize<T>(UsingReaderFor(writer));
 		}

 		[Fact]
@@ -640,7 +639,7 @@

 			serializer.Serialize(buffer, new object[] {1, 2, "3"});
 			Dump.WriteLine(buffer);
-			var result = deserializer.Deserialize<int[]>(new StringReader(buffer.ToString()));
+			var result = deserializer.Deserialize<int[]>(UsingReaderFor(buffer));

 			result.Should().Equal(1, 2, 3);
 		}
@@ -752,8 +751,7 @@
 		{
 			var deserializer = new Deserializer(namingConvention: convention);

-			var reader = new StringReader(Lines(yaml));
-			var result = deserializer.Deserialize<ConventionTest>(reader);
+			var result = deserializer.Deserialize<ConventionTest>(UsingReaderFor(Lines(yaml)));

 			result.ShouldHave().SharedProperties().EqualTo(new {
 				FirstTest = "First",
@@ -772,12 +770,12 @@
 			var input = new ConventionTest { AliasTest = "Fourth" };

 			serializer.Serialize(writer, input, input.GetType());
-			var serialized = writer.ToString();
+			var text = writer.ToString();

 			// Todo: use RegEx once FluentAssertions 2.2 is released
-			serialized.TrimEnd('\r', '\n').Should().Be("fourthTest: Fourth");
-
-			var output = deserializer.Deserialize<ConventionTest>(new StringReader(serialized));
+			text.TrimEnd('\r', '\n').Should().Be("fourthTest: Fourth");
+
+			var output = deserializer.Deserialize<ConventionTest>(UsingReaderFor(text));

 			output.AliasTest.Should().Be(input.AliasTest);
 		}
@@ -938,7 +936,7 @@
 		{
 			var deserializer = new Deserializer();

-			var array = deserializer.Deserialize<int[]>(new StringReader(""));
+			var array = deserializer.Deserialize<int[]>(UsingReaderFor(""));

 			array.Should().BeNull();
 		}
@@ -1050,11 +1048,11 @@
 		public void ForwardReferencesWorkInGenericLists()
 		{
 			var deserializer = new Deserializer();
-			var reader = new StringReader(Lines(
+			var text = Lines(
 				"- *forward",
-				"- &forward ForwardReference"));
-
-			var result = deserializer.Deserialize<string[]>(reader);
+				"- &forward ForwardReference");
+
+			var result = deserializer.Deserialize<string[]>(UsingReaderFor(text));

 			result.Should().Equal(new[] { "ForwardReference", "ForwardReference" });
 		}
@@ -1063,12 +1061,11 @@
 		public void ForwardReferencesWorkInNonGenericLists()
 		{
 			var deserializer = new Deserializer();
-
-			var reader = new StringReader(Lines(
+			var text = Lines(
 				"- *forward",
-				"- &forward ForwardReference"));
-
-			var result = deserializer.Deserialize<ArrayList>(reader);
+				"- &forward ForwardReference");
+
+			var result = deserializer.Deserialize<ArrayList>(UsingReaderFor(text));

 			result.Should().Equal(new[] { "ForwardReference", "ForwardReference" });
 		}
@@ -1077,14 +1074,14 @@
 		public void ForwardReferencesWorkInGenericDictionaries()
 		{
 			var deserializer = new Deserializer();
-			var reader = new StringReader(Lines(
+			var text = Lines(
 				"key1: *forward",
 				"*forwardKey: ForwardKeyValue",
 				"*forward: *forward",
 				"key2: &forward ForwardReference",
-				"key3: &forwardKey key4"));
-
-			var result = deserializer.Deserialize<Dictionary<string, string>>(reader);
+				"key3: &forwardKey key4");
+
+			var result = deserializer.Deserialize<Dictionary<string, string>>(UsingReaderFor(text));

 			result.Should().Equal(new Dictionary<string, string> {
 				{ "ForwardReference", "ForwardReference" },
@@ -1099,14 +1096,14 @@
 		public void ForwardReferencesWorkInNonGenericDictionaries()
 		{
 			var deserializer = new Deserializer();
-			var reader = new StringReader(Lines(
+			var text = Lines(
 				"key1: *forward",
 				"*forwardKey: ForwardKeyValue",
 				"*forward: *forward",
 				"key2: &forward ForwardReference",
-				"key3: &forwardKey key4"));
-
-			var result = deserializer.Deserialize<Hashtable>(reader);
+				"key3: &forwardKey key4");
+
+			var result = deserializer.Deserialize<Hashtable>(UsingReaderFor(text));

 			result.Should().BeEquivalentTo(
 				Entry("ForwardReference", "ForwardReference"),
@@ -1125,11 +1122,11 @@
 		public void ForwardReferencesWorkInObjects()
 		{
 			var deserializer = new Deserializer();
-			var reader = new StringReader(Lines(
+			var text = Lines(
 				"Nothing: *forward",
-				"MyString: &forward ForwardReference"));
-
-			var result = deserializer.Deserialize<X>(reader);
+				"MyString: &forward ForwardReference");
+
+			var result = deserializer.Deserialize<X>(UsingReaderFor(text));

 			result.ShouldHave().SharedProperties().EqualTo(
 				new { Nothing = "ForwardReference", MyString = "ForwardReference" });
@@ -1139,11 +1136,11 @@
 		public void UndefinedForwardReferencesFail()
 		{
 			var deserializer = new Deserializer();
-			var reader = new StringReader(Lines(
-					"Nothing: *forward",
-					"MyString: ForwardReference"));
-
-			Action action = () => deserializer.Deserialize<X>(reader);
+			var text = Lines(
+				"Nothing: *forward",
+				"MyString: ForwardReference");
+
+			Action action = () => deserializer.Deserialize<X>(UsingReaderFor(text));

 			action.ShouldThrow<AnchorNotFoundException>();
 		}
@@ -1172,6 +1169,16 @@
 				MyNullableWithValue = 8;
 			}
 		}
+
+		private StringReader UsingReaderFor(StringWriter buffer)
+		{
+			return UsingReaderFor(buffer.ToString());
+		}
+
+		private StringReader UsingReaderFor(string text)
+		{
+			return new StringReader(text);
+		}
 	}
 }


Check for skins folder also

Check for skins folder also

--- osu.Desktop/OsuGameDesktop.cs
+++ osu.Desktop/OsuGameDesktop.cs
@@ -92,7 +92,7 @@
         {
             protected override string LocateBasePath()
             {
-                bool checkExists(string p) => Directory.Exists(Path.Combine(p, "Songs"));
+                bool checkExists(string p) => Directory.Exists(Path.Combine(p, "Songs")) && Directory.Exists(Path.Combine(p, "Skins"));

                 string stableInstallPath;


Extract method RegisterTypes

Extract method RegisterTypes

--- FTF.Specs/Context.cs
+++ FTF.Specs/Context.cs
@@ -40,9 +40,9 @@
             set { _currentUser = value; }
         }

-        private readonly Container _container;
+        private Container _container;

-        private readonly Scope _scope;
+        private Scope _scope;

         public GenerateNoteId NextId { get; set; }

@@ -50,6 +50,13 @@
         {
             GetCurrentDate = () => DateTime.Now;
             NextId = () => _container.GetInstance<IQueryable<Note>>().NextId();
+            _container = RegisterTypes();
+
+            Transaction = _container.GetInstance<DbContext>().Database.BeginTransaction();
+        }
+
+        private Container RegisterTypes()
+        {
             _container = new Container();
             _container.Options.DefaultScopedLifestyle = new LifetimeScopeLifestyle();
             _container.Register<Create>(() => _container.GetInstance<CreateHandler>().Create);
@@ -62,7 +69,8 @@
             _container.Register<GetCurrentUser>(() => () => CurrentUser);
             _container.Register<ValidateNote>(() => NoteValidator.Validate);
             _container.Register<IQueryable<Note>>(() => _container.GetInstance<DbContext>().Notes);
-            _container.Register(() => new DbContext("name=FTF.Tests", new DropCreateDatabaseAlways<DbContext>()), Lifestyle.Scoped);
+            _container.Register(() => new DbContext("name=FTF.Tests", new DropCreateDatabaseAlways<DbContext>()),
+                Lifestyle.Scoped);
             _container.Register<Delete>(() => _container.GetInstance<DeleteHandler>().Delete);
             _container.Register<DeleteHandler>();
             _container.Register<Retrieve>(() => _container.GetInstance<Queries>().Retrieve);
@@ -83,7 +91,8 @@
             _container.Register<UpdateHandler>();

             _scope = _container.BeginLifetimeScope();
-            Transaction = _container.GetInstance<DbContext>().Database.BeginTransaction();
+
+            return _container;
         }

         public void StoreException(Action func)


Changed layout of main form.

Changed layout of main form.

--- FormMain.Designer.cs
+++ FormMain.Designer.cs
@@ -110,7 +110,7 @@
             | System.Windows.Forms.AnchorStyles.Left)
             | System.Windows.Forms.AnchorStyles.Right)));
             this.splitPages.IsSplitterFixed = true;
-            this.splitPages.Location = new System.Drawing.Point(12, 49);
+            this.splitPages.Location = new System.Drawing.Point(12, 117);
             this.splitPages.Name = "splitPages";
             //
             // splitPages.Panel1
@@ -120,7 +120,7 @@
             // splitPages.Panel2
             //
             this.splitPages.Panel2.Controls.Add(this.picEnd);
-            this.splitPages.Size = new System.Drawing.Size(574, 310);
+            this.splitPages.Size = new System.Drawing.Size(574, 314);
             this.splitPages.SplitterDistance = 286;
             this.splitPages.TabIndex = 4;
             //
@@ -129,7 +129,7 @@
             this.picStart.Dock = System.Windows.Forms.DockStyle.Fill;
             this.picStart.Location = new System.Drawing.Point(0, 0);
             this.picStart.Name = "picStart";
-            this.picStart.Size = new System.Drawing.Size(286, 310);
+            this.picStart.Size = new System.Drawing.Size(286, 314);
             this.picStart.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
             this.picStart.TabIndex = 0;
             this.picStart.TabStop = false;
@@ -139,15 +139,15 @@
             this.picEnd.Dock = System.Windows.Forms.DockStyle.Fill;
             this.picEnd.Location = new System.Drawing.Point(0, 0);
             this.picEnd.Name = "picEnd";
-            this.picEnd.Size = new System.Drawing.Size(284, 310);
+            this.picEnd.Size = new System.Drawing.Size(284, 314);
             this.picEnd.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
             this.picEnd.TabIndex = 0;
             this.picEnd.TabStop = false;
             //
             // btnBack
             //
-            this.btnBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-            this.btnBack.Location = new System.Drawing.Point(431, 360);
+            this.btnBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnBack.Location = new System.Drawing.Point(433, 51);
             this.btnBack.Name = "btnBack";
             this.btnBack.Size = new System.Drawing.Size(75, 23);
             this.btnBack.TabIndex = 5;
@@ -157,8 +157,8 @@
             //
             // btnNext
             //
-            this.btnNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-            this.btnNext.Location = new System.Drawing.Point(512, 360);
+            this.btnNext.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnNext.Location = new System.Drawing.Point(514, 51);
             this.btnNext.Name = "btnNext";
             this.btnNext.Size = new System.Drawing.Size(75, 23);
             this.btnNext.TabIndex = 6;
@@ -168,9 +168,8 @@
             //
             // label2
             //
-            this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
             this.label2.AutoSize = true;
-            this.label2.Location = new System.Drawing.Point(16, 370);
+            this.label2.Location = new System.Drawing.Point(18, 63);
             this.label2.Name = "label2";
             this.label2.Size = new System.Drawing.Size(33, 13);
             this.label2.TabIndex = 7;
@@ -178,19 +177,19 @@
             //
             // textArtist
             //
-            this.textArtist.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-            this.textArtist.Location = new System.Drawing.Point(55, 367);
+            this.textArtist.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.textArtist.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.textArtist.Location = new System.Drawing.Point(57, 58);
             this.textArtist.Name = "textArtist";
-            this.textArtist.Size = new System.Drawing.Size(368, 20);
+            this.textArtist.Size = new System.Drawing.Size(368, 22);
             this.textArtist.TabIndex = 8;
             this.textArtist.TextChanged += new System.EventHandler(this.text_Changed);
             //
             // label3
             //
-            this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
             this.label3.AutoSize = true;
-            this.label3.Location = new System.Drawing.Point(16, 397);
+            this.label3.Location = new System.Drawing.Point(18, 90);
             this.label3.Name = "label3";
             this.label3.Size = new System.Drawing.Size(30, 13);
             this.label3.TabIndex = 9;
@@ -198,18 +197,19 @@
             //
             // textTitle
             //
-            this.textTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
-            | System.Windows.Forms.AnchorStyles.Right)));
-            this.textTitle.Location = new System.Drawing.Point(55, 394);
+            this.textTitle.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.textTitle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.textTitle.Location = new System.Drawing.Point(57, 85);
             this.textTitle.Name = "textTitle";
-            this.textTitle.Size = new System.Drawing.Size(368, 20);
+            this.textTitle.Size = new System.Drawing.Size(368, 22);
             this.textTitle.TabIndex = 10;
             this.textTitle.TextChanged += new System.EventHandler(this.text_Changed);
             //
             // btnSave
             //
-            this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-            this.btnSave.Location = new System.Drawing.Point(431, 397);
+            this.btnSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnSave.Location = new System.Drawing.Point(433, 88);
             this.btnSave.Name = "btnSave";
             this.btnSave.Size = new System.Drawing.Size(75, 23);
             this.btnSave.TabIndex = 11;
@@ -219,8 +219,8 @@
             //
             // btnDelete
             //
-            this.btnDelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
-            this.btnDelete.Location = new System.Drawing.Point(512, 397);
+            this.btnDelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnDelete.Location = new System.Drawing.Point(514, 88);
             this.btnDelete.Name = "btnDelete";
             this.btnDelete.Size = new System.Drawing.Size(75, 23);
             this.btnDelete.TabIndex = 12;


(GH-179) Log passed arguments/options

(GH-179) Log passed arguments/options

--- Source/GitReleaseManager.Cli/Program.cs
+++ Source/GitReleaseManager.Cli/Program.cs
@@ -45,6 +45,7 @@
                 return await Parser.Default.ParseArguments<CreateSubOptions, DiscardSubOptions, AddAssetSubOptions, CloseSubOptions, PublishSubOptions, ExportSubOptions, InitSubOptions, ShowConfigSubOptions, LabelSubOptions>(args)
                     .WithParsed<BaseSubOptions>(CreateFiglet)
                     .WithParsed<BaseSubOptions>(ConfigureLogging)
+                    .WithParsed<BaseSubOptions>(LogOptions)
                     .MapResult(
                     (CreateSubOptions opts) => CreateReleaseAsync(opts),
                     (DiscardSubOptions opts) => DiscardReleaseAsync(opts),
@@ -235,5 +236,8 @@

             Log.Logger = config.CreateLogger();
         }
+
+        private static void LogOptions(BaseSubOptions options)
+            => Log.Verbose("{@Options}", options);
     }
 }