Use Theory instead of Fact so each ETL is tested separately

--- src/TraceEvent/TraceEvent.Tests/GeneralParsing.cs
+++ src/TraceEvent/TraceEvent.Tests/GeneralParsing.cs
@@ -1,10 +1,11 @@
 using System;
+using System.Collections.Generic;
+using System.Diagnostics;
 using System.IO;
+using System.Linq;
+using System.Text;
+using Microsoft.Diagnostics.Tracing;
 using Microsoft.Diagnostics.Tracing.Etlx;
-using Microsoft.Diagnostics.Tracing;
-using System.Diagnostics;
-using System.Text;
-using System.Collections.Generic;
 using Xunit;
 using Xunit.Abstractions;

@@ -71,14 +72,25 @@
             s_fileUnzipped = true;
         }

+        public static IEnumerable<object[]> TestEtlFiles
+        {
+            get
+            {
+                // The test data is contained in files of the same name, but with a .zip extension.
+                // Only the names are returned since the extracted files will be in a different directory.
+                return from file in Directory.EnumerateFiles(TestDataDir, "*.etl.zip")
+                       select new[] { Path.GetFileNameWithoutExtension(file) };
+            }
+        }
+
         /// <summary>
         /// This test simply scans all the events in the ETL.ZIP files in TestDataDir
         /// and scans them (so you should get asserts if there is parsing problem)
         /// and insures that no more than .1% of the events are
         /// </summary>
-
-        [Fact]
-        public void ETW_GeneralParsing_Basic()
+        [Theory]
+        [MemberData(nameof(TestEtlFiles))]
+        public void ETW_GeneralParsing_Basic(string etlFileName)
         {
             _output.WriteLine("In ETW_General_Basic");
             Assert.True(Directory.Exists(TestDataDir));
@@ -88,192 +100,186 @@
             Directory.CreateDirectory(OutputDir);
             _output.WriteLine(string.Format("OutputDir: {0}", Path.GetFullPath(OutputDir)));

+            string etlFilePath = Path.Combine(UnZippedDataDir, etlFileName);
             bool anyFailure = false;
-            foreach (var etlFilePath in Directory.EnumerateFiles(UnZippedDataDir, "*.etl"))
-            {
-                // *.etl includes *.etlx (don't know why), filter those out.
-                if (!etlFilePath.EndsWith("etl", StringComparison.OrdinalIgnoreCase))
-                    continue;
-
-                _output.WriteLine(string.Format("Processing the file {0}, Making ETLX and scanning.", Path.GetFullPath(etlFilePath)));
-                string eltxFilePath = Path.ChangeExtension(etlFilePath, ".etlx");
-
-                // See if we have a cooresponding baseline file
-                string baselineName = Path.Combine(Path.GetFullPath(TestDataDir),
-                    Path.GetFileNameWithoutExtension(etlFilePath) + ".baseline.txt");
-                string outputName = Path.Combine(OutputDir,
-                    Path.GetFileNameWithoutExtension(etlFilePath) + ".txt");
-                TextWriter outputFile = File.CreateText(outputName);
-
-                StreamReader baselineFile = null;
-                if (File.Exists(baselineName))
-                    baselineFile = File.OpenText(baselineName);
-                else
-                {
-                    _output.WriteLine("WARNING: No baseline file");
-                    _output.WriteLine(string.Format("    ETL FILE: {0}", Path.GetFullPath(etlFilePath)));
-                    _output.WriteLine(string.Format("    NonExistant Baseline File: {0}", baselineName));
-                    _output.WriteLine("To Create a baseline file");
-                    _output.WriteLine(string.Format("    copy /y \"{0}\" \"{1}\"",
-                        Path.GetFullPath(outputName),
-                        Path.GetFullPath(baselineName)
-                        ));
-                }
-
-                bool unexpectedUnknownEvent = false;
-                int firstFailLineNum = 0;
-                int mismatchCount = 0;
-                int lineNum = 0;
-                var histogram = new SortedDictionary<string, int>(StringComparer.Ordinal);
-
-                // TraceLog traceLog = TraceLog.OpenOrConvert(etlFilePath);    // This one can be used during developent of test itself
-                TraceLog traceLog = new TraceLog(TraceLog.CreateFromEventTraceLogFile(etlFilePath));
-
-                var traceSource = traceLog.Events.GetSource();
-                traceSource.AllEvents += delegate (TraceEvent data)
-                {
-                    string eventName = data.ProviderName + "/" + data.EventName;
-
-                    // We are going to skip dynamic events from the CLR provider.
-                    // The issue is that this depends on exactly which manifest is present
-                    // on the machine, and I just don't want to deal with the noise of
-                    // failures because you have a slightly different one.
-                    if (data.ProviderName == "DotNet")
+            _output.WriteLine(string.Format("Processing the file {0}, Making ETLX and scanning.", Path.GetFullPath(etlFilePath)));
+            string eltxFilePath = Path.ChangeExtension(etlFilePath, ".etlx");
+
+            // See if we have a cooresponding baseline file
+            string baselineName = Path.Combine(Path.GetFullPath(TestDataDir),
+                Path.GetFileNameWithoutExtension(etlFilePath) + ".baseline.txt");
+            string outputName = Path.Combine(OutputDir,
+                Path.GetFileNameWithoutExtension(etlFilePath) + ".txt");
+            TextWriter outputFile = File.CreateText(outputName);
+
+            StreamReader baselineFile = null;
+            if (File.Exists(baselineName))
+                baselineFile = File.OpenText(baselineName);
+            else
+            {
+                _output.WriteLine("WARNING: No baseline file");
+                _output.WriteLine(string.Format("    ETL FILE: {0}", Path.GetFullPath(etlFilePath)));
+                _output.WriteLine(string.Format("    NonExistant Baseline File: {0}", baselineName));
+                _output.WriteLine("To Create a baseline file");
+                _output.WriteLine(string.Format("    copy /y \"{0}\" \"{1}\"",
+                    Path.GetFullPath(outputName),
+                    Path.GetFullPath(baselineName)
+                    ));
+            }
+
+            bool unexpectedUnknownEvent = false;
+            int firstFailLineNum = 0;
+            int mismatchCount = 0;
+            int lineNum = 0;
+            var histogram = new SortedDictionary<string, int>(StringComparer.Ordinal);
+
+            // TraceLog traceLog = TraceLog.OpenOrConvert(etlFilePath);    // This one can be used during developent of test itself
+            TraceLog traceLog = new TraceLog(TraceLog.CreateFromEventTraceLogFile(etlFilePath));
+
+            var traceSource = traceLog.Events.GetSource();
+            traceSource.AllEvents += delegate (TraceEvent data)
+            {
+                string eventName = data.ProviderName + "/" + data.EventName;
+
+                // We are going to skip dynamic events from the CLR provider.
+                // The issue is that this depends on exactly which manifest is present
+                // on the machine, and I just don't want to deal with the noise of
+                // failures because you have a slightly different one.
+                if (data.ProviderName == "DotNet")
+                    return;
+
+                // We don't want to use the manifest for CLR Private events since
+                // different machines might have different manifests.
+                if (data.ProviderName == "Microsoft-Windows-DotNETRuntimePrivate")
+                {
+                    if (data.GetType().Name == "DynamicTraceEventData" || data.EventName.StartsWith("EventID"))
                         return;
-
-                    // We don't want to use the manifest for CLR Private events since
-                    // different machines might have different manifests.
-                    if (data.ProviderName == "Microsoft-Windows-DotNETRuntimePrivate")
+                }
+                // Same problem with classic OS events.   We don't want to rely on the OS to parse since this could vary between baseline and test.
+                else if (data.ProviderName == "MSNT_SystemTrace")
+                {
+                    // However we to allow a couple of 'known good' ones through so we test some aspects of the OS parsing logic in TraceEvent.
+                    if (data.EventName != "SystemConfig/Platform" && data.EventName != "Image/KernelBase")
+                        return;
+                }
+                // In theory we have the same problem with any event that the OS supplies the parsing.   I dont want to be too agressive about
+                // turning them off, however becasuse I want those code paths tested
+
+
+                // TODO FIX NOW, this is broken and should be fixed.
+                // We are hacking it here so we don't turn off the test completely.
+                if (eventName == "DotNet/CLR.SKUOrVersion")
+                    return;
+
+                int count = IncCount(histogram, eventName);
+
+                // To keep the baseline size under control, we only check at
+                // most 5 of each event type.
+                const int MaxEventPerType = 5;
+
+                if (count > MaxEventPerType)
+                    return;
+
+                string parsedEvent = Parse(data);
+                lineNum++;
+                outputFile.WriteLine(parsedEvent);      // Make the new output file.
+
+                string expectedParsedEvent = null;
+                if (baselineFile != null)
+                    expectedParsedEvent = baselineFile.ReadLine();
+                if (expectedParsedEvent == null)
+                    expectedParsedEvent = "";
+
+                // If we have baseline, it should match what we have in the file.
+                if (baselineFile != null && parsedEvent != expectedParsedEvent)
+                {
+                    mismatchCount++;
+                    if (firstFailLineNum == 0)
                     {
-                        if (data.GetType().Name == "DynamicTraceEventData" || data.EventName.StartsWith("EventID"))
-                            return;
-                    }
-                    // Same problem with classic OS events.   We don't want to rely on the OS to parse since this could vary between baseline and test.
-                    else if (data.ProviderName == "MSNT_SystemTrace")
-                    {
-                        // However we to allow a couple of 'known good' ones through so we test some aspects of the OS parsing logic in TraceEvent.
-                        if (data.EventName != "SystemConfig/Platform" && data.EventName != "Image/KernelBase")
-                            return;
-                    }
-                    // In theory we have the same problem with any event that the OS supplies the parsing.   I dont want to be too agressive about
-                    // turning them off, however becasuse I want those code paths tested
-
-
-                    // TODO FIX NOW, this is broken and should be fixed.
-                    // We are hacking it here so we don't turn off the test completely.
-                    if (eventName == "DotNet/CLR.SKUOrVersion")
-                        return;
-
-                    int count = IncCount(histogram, eventName);
-
-                    // To keep the baseline size under control, we only check at
-                    // most 5 of each event type.
-                    const int MaxEventPerType = 5;
-
-                    if (count > MaxEventPerType)
-                        return;
-
-                    string parsedEvent = Parse(data);
-                    lineNum++;
-                    outputFile.WriteLine(parsedEvent);      // Make the new output file.
-
-                    string expectedParsedEvent = null;
-                    if (baselineFile != null)
-                        expectedParsedEvent = baselineFile.ReadLine();
-                    if (expectedParsedEvent == null)
-                        expectedParsedEvent = "";
-
-                    // If we have baseline, it should match what we have in the file.
-                    if (baselineFile != null && parsedEvent != expectedParsedEvent)
-                    {
-                        mismatchCount++;
-                        if (firstFailLineNum == 0)
-                        {
-                            firstFailLineNum = lineNum;
-                            anyFailure = true;
-                            _output.WriteLine(string.Format("ERROR: File {0}: event not equal to expected on line {1}", etlFilePath, lineNum));
-                            _output.WriteLine(string.Format("   Expected: {0}", expectedParsedEvent));
-                            _output.WriteLine(string.Format("   Actual  : {0}", parsedEvent));
-
-                            _output.WriteLine("To Compare output and baseline (baseline is SECOND)");
-                            _output.WriteLine(string.Format("    windiff \"{0}\" \"{1}\"",
-                                Path.GetFullPath(outputName),
-                                Path.GetFullPath(baselineName)
-                                ));
-
-                            _output.WriteLine("To Update baseline file");
-                            _output.WriteLine(string.Format("    copy /y \"{0}\" \"{1}\"",
-                                Path.GetFullPath(outputName),
-                                Path.Combine(OriginalBaselineDir, Path.GetFileNameWithoutExtension(etlFilePath) + ".baseline.txt")
-                                ));
-                        }
-                    }
-
-                    // Even if we don't have a baseline, we can check that the event names are OK.
-                    if (0 <= eventName.IndexOf('('))   // Unknown events have () in them
-                    {
-                        // Some expected events we don't handle today.
-                        if (data.EventName != "EventID(65534)" &&       // Manifest events
-                            data.ProviderName != "Microsoft-Windows-DNS-Client" &&
-                            eventName != "KernelTraceControl/ImageID/Opcode(34)" &&
-                            eventName != "Windows Kernel/DiskIO/Opcode(16)" &&
-                            eventName != "Windows Kernel/SysConfig/Opcode(37)")
-                        {
-                            _output.WriteLine(string.Format("ERROR: File {0}: has unknown event {1} at {2:n3} MSec",
-                                etlFilePath, eventName, data.TimeStampRelativeMSec));
-
-                            // Assert throws an exception which gets swallowed in Process() so instead
-                            // we remember that we failed and assert outside th callback.
-                            unexpectedUnknownEvent = true;
-                        }
-                    }
-                };
-
-                /********************* PROCESSING ***************************/
-                traceSource.Process();
-
-                // Validation after processing, first we check that the histograms are the same as the baseline
-
-                // We also want to check that the count of events is the same as the baseline.
-                bool histogramMismatch = false;
-                foreach (var keyValue in histogram)
-                {
-                    var histogramLine = "COUNT " + keyValue.Key + ":" + keyValue.Value;
-
-                    outputFile.WriteLine(histogramLine);
-                    var expectedistogramLine = baselineFile.ReadLine();
-                    lineNum++;
-
-                    if (!histogramMismatch && expectedistogramLine != histogramLine)
-                    {
-                        histogramMismatch = true;
-                        _output.WriteLine(string.Format("ERROR: File {0}: histogram not equal on  {1}", etlFilePath, lineNum));
-                        _output.WriteLine(string.Format("   Expected: {0}", histogramLine));
-                        _output.WriteLine(string.Format("   Actual  : {0}", expectedistogramLine));
+                        firstFailLineNum = lineNum;
+                        anyFailure = true;
+                        _output.WriteLine(string.Format("ERROR: File {0}: event not equal to expected on line {1}", etlFilePath, lineNum));
+                        _output.WriteLine(string.Format("   Expected: {0}", expectedParsedEvent));
+                        _output.WriteLine(string.Format("   Actual  : {0}", parsedEvent));

                         _output.WriteLine("To Compare output and baseline (baseline is SECOND)");
                         _output.WriteLine(string.Format("    windiff \"{0}\" \"{1}\"",
                             Path.GetFullPath(outputName),
                             Path.GetFullPath(baselineName)
                             ));
+
                         _output.WriteLine("To Update baseline file");
                         _output.WriteLine(string.Format("    copy /y \"{0}\" \"{1}\"",
                             Path.GetFullPath(outputName),
-                            Path.GetFullPath(baselineName)
+                            Path.Combine(OriginalBaselineDir, Path.GetFileNameWithoutExtension(etlFilePath) + ".baseline.txt")
                             ));
-                        anyFailure = true;
                     }
                 }

-                outputFile.Close();
-                if (mismatchCount > 0)
-                    _output.WriteLine(string.Format("ERROR: File {0}: had {1} mismatches", etlFilePath, mismatchCount));
-
-                // If this fires, check the output for the TraceLine just before it for more details.
-                Assert.False(unexpectedUnknownEvent, "Check trace output for details.  Search for ERROR");
-                Assert.True(lineNum > 0);     // We had some events.
-
-            }
+                // Even if we don't have a baseline, we can check that the event names are OK.
+                if (0 <= eventName.IndexOf('('))   // Unknown events have () in them
+                {
+                    // Some expected events we don't handle today.
+                    if (data.EventName != "EventID(65534)" &&       // Manifest events
+                        data.ProviderName != "Microsoft-Windows-DNS-Client" &&
+                        eventName != "KernelTraceControl/ImageID/Opcode(34)" &&
+                        eventName != "Windows Kernel/DiskIO/Opcode(16)" &&
+                        eventName != "Windows Kernel/SysConfig/Opcode(37)")
+                    {
+                        _output.WriteLine(string.Format("ERROR: File {0}: has unknown event {1} at {2:n3} MSec",
+                            etlFilePath, eventName, data.TimeStampRelativeMSec));
+
+                        // Assert throws an exception which gets swallowed in Process() so instead
+                        // we remember that we failed and assert outside th callback.
+                        unexpectedUnknownEvent = true;
+                    }
+                }
+            };
+
+            /********************* PROCESSING ***************************/
+            traceSource.Process();
+
+            // Validation after processing, first we check that the histograms are the same as the baseline
+
+            // We also want to check that the count of events is the same as the baseline.
+            bool histogramMismatch = false;
+            foreach (var keyValue in histogram)
+            {
+                var histogramLine = "COUNT " + keyValue.Key + ":" + keyValue.Value;
+
+                outputFile.WriteLine(histogramLine);
+                var expectedistogramLine = baselineFile.ReadLine();
+                lineNum++;
+
+                if (!histogramMismatch && expectedistogramLine != histogramLine)
+                {
+                    histogramMismatch = true;
+                    _output.WriteLine(string.Format("ERROR: File {0}: histogram not equal on  {1}", etlFilePath, lineNum));
+                    _output.WriteLine(string.Format("   Expected: {0}", histogramLine));
+                    _output.WriteLine(string.Format("   Actual  : {0}", expectedistogramLine));
+
+                    _output.WriteLine("To Compare output and baseline (baseline is SECOND)");
+                    _output.WriteLine(string.Format("    windiff \"{0}\" \"{1}\"",
+                        Path.GetFullPath(outputName),
+                        Path.GetFullPath(baselineName)
+                        ));
+                    _output.WriteLine("To Update baseline file");
+                    _output.WriteLine(string.Format("    copy /y \"{0}\" \"{1}\"",
+                        Path.GetFullPath(outputName),
+                        Path.GetFullPath(baselineName)
+                        ));
+                    anyFailure = true;
+                }
+            }
+
+            outputFile.Close();
+            if (mismatchCount > 0)
+                _output.WriteLine(string.Format("ERROR: File {0}: had {1} mismatches", etlFilePath, mismatchCount));
+
+            // If this fires, check the output for the TraceLine just before it for more details.
+            Assert.False(unexpectedUnknownEvent, "Check trace output for details.  Search for ERROR");
+            Assert.True(lineNum > 0);     // We had some events.
+
             Assert.False(anyFailure, "Check trace output for details.  Search for ERROR");
         }


Ignoring dictionary tests as code comment cleary says they don't work anyway

--- src/Umbraco.Tests/BusinessLogic/DictionaryTest.cs
+++ src/Umbraco.Tests/BusinessLogic/DictionaryTest.cs
@@ -16,7 +16,7 @@
     ///This is a test class for Dictionary_DictionaryItemTest and is intended
     ///to contain all Dictionary_DictionaryItemTest Unit Tests
     ///</summary>
-    [TestFixture]
+    [TestFixture, NUnit.Framework.Ignore]
     public class DictionaryTest : BaseWebTest
     {
 		public override void Initialize()


Send notifications for rollbacks

Send notifications for rollbacks

--- src/Umbraco.Web/Compose/NotificationsComponent.cs
+++ src/Umbraco.Web/Compose/NotificationsComponent.cs
@@ -46,6 +46,9 @@

             //Send notifications for the unpublish action
             ContentService.Unpublished += (sender, args) => _notifier.Notify(_actions.GetAction<ActionUnpublish>(), args.PublishedEntities.ToArray());
+
+            //Send notifications for the rollback action
+            ContentService.RolledBack += (sender, args) => _notifier.Notify(_actions.GetAction<ActionRollback>(), args.Entity);
         }

         public void Terminate()


Fixing GetCropUrl overload

Fixing GetCropUrl overload

--- src/Umbraco.Web/ImageCropperTemplateExtensions.cs
+++ src/Umbraco.Web/ImageCropperTemplateExtensions.cs
@@ -70,15 +70,42 @@
             if (!string.IsNullOrEmpty(imageUrl))
             {
                 var imageResizerUrl = new StringBuilder();
-                //imageResizerUrl.Append(imageUrl);
+               // imageResizerUrl.Append(imageUrl);

                 if (!string.IsNullOrEmpty(imageCropperValue) && imageCropperValue.DetectIsJson())
                 {
                     var cropDataSet = imageCropperValue.SerializeToCropDataSet();
-                    imageResizerUrl.Append(cropDataSet.Src + cropDataSet.GetCropUrl(cropAlias));
+                    imageResizerUrl.Append(cropDataSet.Src);
+                    var crop = cropDataSet.Crops.FirstOrDefault(x => x.Alias == cropAlias);
+                    if (crop != null && crop.Coordinates != null)
+                    {
+                        imageResizerUrl.Append("?crop=");
+                        imageResizerUrl.Append(crop.Coordinates.X1).Append(",");
+                        imageResizerUrl.Append(crop.Coordinates.Y1).Append(",");
+                        imageResizerUrl.Append(crop.Coordinates.X2).Append(",");
+                        imageResizerUrl.Append(crop.Coordinates.Y2);
+                        imageResizerUrl.Append("&cropmode=percentage");
+                    }
+                    else
+                    {
+                        if (cropDataSet.HasFocalPoint())
+                        {
+                            imageResizerUrl.Append("?center=" + cropDataSet.FocalPoint.Top + "," + cropDataSet.FocalPoint.Left);
+                            imageResizerUrl.Append("&mode=crop");
+                        }
+                        else
+                        {
+                            imageResizerUrl.Append("?anchor=center");
+                            imageResizerUrl.Append("&mode=crop");
+                        }
+
+                    }
+
+                    //imageResizerUrl.Append(cropDataSet.Src + cropDataSet.GetCropUrl(cropAlias));
                 }
                 else
                 {
+                    imageResizerUrl.Append(imageUrl);
                     if (mode == null)
                     {
                         mode = Mode.Pad;


XML docs and a constructor that initializes tha Values collection

--- src/YouTrackSharp/AgileBoards/SwimlaneSettings.cs
+++ src/YouTrackSharp/AgileBoards/SwimlaneSettings.cs
@@ -3,14 +3,34 @@

 namespace YouTrackSharp.AgileBoards
 {
+    /// <summary>
+    /// A class that represents the swimlane settings of a board
+    /// </summary>
     public class SwimlaneSettings
     {
+        /// <summary>
+        /// Creates a new <see cref="SwimlaneSettings"/> object
+        /// </summary>
+        public SwimlaneSettings()
+        {
+            Values = new List<string>();
+        }
+
+        /// <summary>
+        /// Gets or sets the type used to determine how to represent swimlanes on a board
+        /// </summary>
         [JsonProperty("field")]
         public Field Field { get; set; }

+        /// <summary>
+        /// Gets or sets the default card type of a board
+        /// </summary>
         [JsonProperty("defaultCardType")]
         public string DefaultCardType { get; set; }

+        /// <summary>
+        /// Gets an <see cref="ICollection{string}"/> of the valus use to represent swimlanes
+        /// </summary>
         [JsonProperty("values")]
         public ICollection<string> Values { get; set; }
     }


added security to the file upload to avoid uploading .erl .beam or .yaws files

Former-commit-id: 9bc672eaeef55517288efe75e0dd1bb4219d4ed6

--- MeTLMeeting/SandRibbon/Components/Canvas/Image.cs
+++ MeTLMeeting/SandRibbon/Components/Canvas/Image.cs
@@ -740,7 +740,7 @@
                                     {
                                         foreach(var file in files)
                                         {
-                                            uploadFileForUse(file);
+                                                uploadFileForUse(file);
                                         }
                                     });
         }
@@ -867,6 +867,11 @@

         private void uploadFileForUse(string filename)
         {
+            if (filename.EndsWith(".yaws") || filename.EndsWith(".beam") || filename.EndsWith(".erl"))
+            {
+                MessageBox.Show("Sorry, MeTL cannot upload this file: " + filename);
+                return;
+            }
             string hostedFileName;
             if (!filename.Contains("http"))
             {


Updated the assembly version.

Updated the assembly version.

--- InterFAX.Api/Properties/AssemblyInfo.cs
+++ InterFAX.Api/Properties/AssemblyInfo.cs
@@ -8,7 +8,7 @@
 [assembly: AssemblyTitle("InterFAX.Api")]
 [assembly: AssemblyDescription("")]
 [assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("")]
+[assembly: AssemblyCompany("Interfax Communications Limited")]
 [assembly: AssemblyProduct("InterFAX.Api")]
 [assembly: AssemblyCopyright("Copyright ©  2016")]
 [assembly: AssemblyTrademark("")]
@@ -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("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyVersion("1.0.1.0")]
+[assembly: AssemblyFileVersion("1.0.1.29")]


Bumped the version.

Bumped the version.

--- JexusManager/Properties/AssemblyInfo.cs
+++ JexusManager/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@
 + "190a69a439dbfb969ebad72a6f7e2e047907da4a7b9c08c6e98d5f1be8b8cafaf3eb978914059a"
 + "245d4bc1")]

-[assembly: AssemblyVersion("12.0.66.0")]
-[assembly: AssemblyFileVersion("12.0.66.0")]
+[assembly: AssemblyVersion("12.0.67.0")]
+[assembly: AssemblyFileVersion("12.0.67.0")]


Bumped the version.

Bumped the version.

--- JexusManager/Properties/AssemblyInfo.cs
+++ JexusManager/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@
 + "190a69a439dbfb969ebad72a6f7e2e047907da4a7b9c08c6e98d5f1be8b8cafaf3eb978914059a"
 + "245d4bc1")]

-[assembly: AssemblyVersion("12.0.91.0")]
-[assembly: AssemblyFileVersion("12.0.91.0")]
+[assembly: AssemblyVersion("12.0.92.0")]
+[assembly: AssemblyFileVersion("12.0.92.0")]


versioning

versioning

--- King.Service/Properties/AssemblyInfo.cs
+++ King.Service/Properties/AssemblyInfo.cs
@@ -11,5 +11,5 @@
 [assembly: AssemblyCulture("")]
 [assembly: ComVisible(false)]
 [assembly: Guid("b2d41b3d-e0c9-4881-b09e-8e9bb4520341")]
-[assembly: AssemblyVersion("1.5.6.3")]
-[assembly: AssemblyFileVersion("1.5.6.3")]+[assembly: AssemblyVersion("1.5.6.4")]
+[assembly: AssemblyFileVersion("1.5.6.4")]


changed default claim types

changed default claim types

--- source/Clients/SampleAspNetWebApi/Middleware/IdentityServerBearerTokensAuthenticationOptions.cs
+++ source/Clients/SampleAspNetWebApi/Middleware/IdentityServerBearerTokensAuthenticationOptions.cs
@@ -34,8 +34,8 @@

             ClaimsCacheDuration = TimeSpan.FromMinutes(5);

-            NameClaimType = ClaimsIdentity.DefaultNameClaimType;
-            RoleClaimType = ClaimsIdentity.DefaultRoleClaimType;
+            NameClaimType = "name";
+            RoleClaimType = "role";
         }

         // common for local and validation endpoint


Reverse direction of UML arrows.

Reverse direction of UML arrows.

--- themes/Docs/Samson/Shared/Kind/_NamedType.cshtml
+++ themes/Docs/Samson/Shared/Kind/_NamedType.cshtml
@@ -115,7 +115,7 @@
 							{
 								for(int c = 0 ; c < derivedTypes.Count ; c++)
 								{
-									hierarchy.AppendLine($"\tType-->Derived{c}[\"{System.Net.WebUtility.HtmlEncode(derivedTypes[c].String(CodeAnalysisKeys.DisplayName))}\"]");
+									hierarchy.AppendLine($"\tDerived{c}[\"{System.Net.WebUtility.HtmlEncode(derivedTypes[c].String(CodeAnalysisKeys.DisplayName))}\"]-->Type");
 									if(derivedTypes[c].ContainsKey(Keys.WritePath))
 									{
 										hierarchy.AppendLine($"\tclick Derived{c} \"{(Context.GetLink(derivedTypes[c].FilePath("WritePath")))}\"");
@@ -126,7 +126,7 @@
 							{
 								for(int c = 0 ; c < implementingTypes.Count ; c++)
 								{
-									hierarchy.AppendLine($"\tType-.->Implementing{c}[\"{System.Net.WebUtility.HtmlEncode(implementingTypes[c].String(CodeAnalysisKeys.DisplayName))}\"]");
+									hierarchy.AppendLine($"\tImplementing{c}[\"{System.Net.WebUtility.HtmlEncode(implementingTypes[c].String(CodeAnalysisKeys.DisplayName))}\"]-.->Type");
 									if(implementingTypes[c].ContainsKey(Keys.WritePath))
 									{
 										hierarchy.AppendLine($"\tclick Implementing{c} \"{(Context.GetLink(implementingTypes[c].FilePath("WritePath")))}\"");


Add runtime constaint checking for TComplexType

--- src/FreecraftCore.Serializer.KnownTypes.Decorators/Decorators/ComplexTypeSerializerDecorator.cs
+++ src/FreecraftCore.Serializer.KnownTypes.Decorators/Decorators/ComplexTypeSerializerDecorator.cs
@@ -14,7 +14,7 @@
 	/// Represents a complex type definition that combines multiple knowntypes or other complex types.
 	/// </summary>
 	/// <typeparam name="TComplexType"></typeparam>
-	public class ComplexTypeSerializerDecorator<TComplexType> : ITypeSerializerStrategy<TComplexType>
+	public class ComplexTypeSerializerDecorator<TComplexType> : ITypeSerializerStrategy<TComplexType> //TComplex type should be a class. Can't constraint it though.
 	{
 		//New constaint is gone; this provided an efficient way to create new instances over Activator.CreateInstance.
 		//Search compiled lambda and new constaint operator on google to see dicussions about it
@@ -27,7 +27,7 @@
 		/// Ordered pairs of known serializer references and the memberinfos for wiremembers.
 		/// </summary>
 		[NotNull]
-		IEnumerable<IMemberSerializationMediator<TComplexType>> orderedMemberInfos { get; }
+		private IEnumerable<IMemberSerializationMediator<TComplexType>> orderedMemberInfos { get; }

 		//Complex types should NEVER require context. It should be designed to avoid context requireing complex types.
 		/// <inheritdoc />
@@ -38,6 +38,9 @@
 			//These can be empty. If there are no members on a type there won't be anything to serialize.
 			if (serializationDirections == null)
 				throw new ArgumentNullException(nameof(serializationDirections), $"Provided argument {nameof(serializationDirections)} is null.");
+
+			if(!typeof(TComplexType).IsClass)
+				throw new ArgumentException($"Provided generic Type: {typeof(TComplexType).FullName} must be a reference type.", nameof(TComplexType));

 			orderedMemberInfos = serializationDirections;
 		}


Add Move Impl

Add Move Impl

--- source/Cosmos.System2_Plugs/System/IO/FileImpl.cs
+++ source/Cosmos.System2_Plugs/System/IO/FileImpl.cs
@@ -155,6 +155,34 @@
             }
         }

+        public static void Move(string srcFile, string destFile)
+        {
+            if (File.Exists(destFile))
+            {
+                throw new IOException();
+            }
+            else
+            {
+                if (File.Exists(srcFile))
+                {
+                    try
+                    {
+                        byte[] srcFileBytes = File.ReadAllBytes(srcFile);
+                        File.WriteAllBytes(destFile, srcFileBytes);
+                    }
+                    catch (IOException ioEx)
+                    {
+                        throw new IOException("File Move", ioEx);
+                    }
+                }
+                else
+                {
+                    throw new FileNotFoundException();
+                }
+
+            }
+        }
+
         public static void Copy(string srcFile, string destFile)
         {
             try


Fix MvxCachedImageView NullReference when using ImageStream binding

This should fix the nullreference exception when binding the ImageStream property instead of ImagePath property.

--- source/FFImageLoading.Cross/MvxCachedImageView.cs
+++ source/FFImageLoading.Cross/MvxCachedImageView.cs
@@ -470,7 +470,7 @@
                 return null;

             if (imageStream != null)
-                return new ImageSourceBinding(ImageSource.Stream, "Stream");
+                return new ImageSourceBinding(imageStream);

             if (imagePath.StartsWith("res:", StringComparison.OrdinalIgnoreCase))
             {


Added some more options to the parser options.

--- source/System.CommandLine.Parser/ParserOptions.cs
+++ source/System.CommandLine.Parser/ParserOptions.cs
@@ -1,3 +1,5 @@
+
+using System.Runtime.InteropServices;

 namespace System.CommandLine
 {
@@ -13,11 +15,15 @@
         /// </summary>
         private static ParserOptions defaultOptions = new ParserOptions
         {
-            IgnoreCase = true
+            IgnoreCase = true,
+            NamedArgumentPrefix = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "/" : "--",
+            NamedArgumentAliasPrefix = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "/" : "-",
+            AllowMultiCharacterFlags = !RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
         };

         /// <summary>
-        /// Gets some sensible default options for the command line parser.
+        /// Gets some sensible default options for the command line parser. The default options are operating-system-aware, so for example <see cref="NamedArgumentPrefix"/> is set to "/" when being used under Windows,
+        /// but set to "--" when used under Linux or macOS.
         /// </summary>
         public static ParserOptions Default
         {
@@ -33,6 +39,42 @@
         /// </summary>
         public bool IgnoreCase { get; set; }

+        /// <summary>
+        /// Gets or sets the prefix that is used for named arguments. Under UNIX-like operating systems, this is usually two hyphen-minuses or dash characters: "--". Under Windows this is usually a single forward
+        /// slash "/".
+        /// </summary>
+        public string NamedArgumentPrefix { get; set; }
+
+        /// <summary>
+        /// Gets or sets the prefix that is used for the aliases of named arguments. Under UNIX-like operating systems, this is usually a single hyphen-minus or dash character: "-". Under Windows this is usually
+        /// a single forward slash "/".
+        /// </summary>
+        public string NamedArgumentAliasPrefix { get; set; }
+
+        /// <summary>
+        /// Contains a value that determines whether multiple flags can be combined into a single flag.
+        /// </summary>
+        private bool allowMultiCharacterFlags;
+
+        /// <summary>
+        /// Gets or sets a value that determines whether multiple flags can be combined into a single flag. For example if there are two named arguments of type boolean named "flag1" and "flag2" and there aliases
+        /// are "a" and "b" respectively, then the following notation is valid for setting both flags at once "-ab" (equivalent to "-ba") if <see cref="AllowMultiCharacterFlags"/> is set to true. This is just a
+        /// short-hand notation for the equivalent "-a -b". This notation is commmon in UNIX-like operating systems. Multi-character flags are only allowed if the prefix for named arguments is not the same as the
+        /// prefix for th aliases of named arguments. For example in Windows these prefixes are usually the both a forward slash "/". In this case multi-character flags may be mistaken for other named arguments
+        /// and are therefore forbidden. Consider the case where there are three named arguments "ab", "foo", and "bar", where "foo" and "bar" have the aliases "a" and "b" respectively. In this case the following
+        /// command line argument "/ab" may either be interpreted as "ab", or "foo" and "bar".
+        /// </summary>
+        public bool AllowMultiCharacterFlags
+        {
+            get => this.allowMultiCharacterFlags;
+            set
+            {
+                if (value && this.NamedArgumentPrefix == this.NamedArgumentAliasPrefix)
+                    throw new ArgumentException("If the same prefix is used for named arguments and for the aliases of named arguments, then multi-character flags may be ambigous and are therefore not allowed.");
+                this.allowMultiCharacterFlags = value;
+            }
+        }
+
         #endregion
     }
 }


added IJsonReader.DebugPrintTokens() extention

--- GameDevWare.Serialization.Unity/Assets/Plugins/GameDevWare.Serialization/JsonReaderExtentions.cs
+++ GameDevWare.Serialization.Unity/Assets/Plugins/GameDevWare.Serialization/JsonReaderExtentions.cs
@@ -14,6 +14,8 @@
 	https://unity3d.com/ru/legal/as_terms
 */
 using System;
+using System.Collections.Generic;
+using System.Text;

 // ReSharper disable once CheckNamespace
 namespace GameDevWare.Serialization
@@ -729,5 +731,38 @@

 			return value;
 		}
+
+		public static string DebugPrintTokens(this IJsonReader reader)
+		{
+			if (reader == null) throw new ArgumentNullException("reader");
+
+			var output = new StringBuilder();
+			var stack = new Stack<JsonToken>();
+			stack.Push(JsonToken.None);
+			while (reader.NextToken())
+			{
+				var strValue = reader.Token + (reader.Value.HasValue && reader.Value != null ? "[<" + reader.Value.Type.Name + "> " + JsonUtils.EscapeAndQuote(reader.Value.AsString).Trim('"') + "]" : "");
+
+				if (stack.Peek() != JsonToken.Member)
+				{
+					var endingTokenIndent = (reader.Token == JsonToken.EndOfObject || reader.Token == JsonToken.EndOfArray ? -1 : 0);
+					output.Append(Environment.NewLine);
+					for (var i = 0; i < System.Linq.Enumerable.Count(stack, t => t != JsonToken.Member && t != JsonToken.None) + endingTokenIndent; i++)
+						output.Append("\t");
+				}
+				else
+				{
+					output.Append(" ");
+				}
+
+				output.Append(strValue);
+
+				if (reader.Token == JsonToken.EndOfObject || reader.Token == JsonToken.EndOfArray || stack.Peek() == JsonToken.Member)
+					stack.Pop();
+				if (reader.Token == JsonToken.BeginObject || reader.Token == JsonToken.BeginArray || reader.Token == JsonToken.Member)
+					stack.Push(reader.Token);
+			}
+			return output.ToString();
+		}
 	}
 }


Aded runtime-official

Aded runtime-official

--- dotnet/Azure/runfo/RuntimeInfo.cs
+++ dotnet/Azure/runfo/RuntimeInfo.cs
@@ -16,6 +16,7 @@
     internal static readonly (string BuildName, string Project, int DefinitionId)[] BuildDefinitions = new[]
         {
             ("runtime", "public", 686),
+            ("runtime-official", "internal", 679),
             ("coreclr", "public", 655),
             ("libraries", "public", 675),
             ("libraries windows", "public", 676),


Changes to fix issue #84

Changes to fix issue #84

--- PushNotification/PushNotification/PushNotification.Plugin.Android/PushNotificationGcmListener.cs
+++ PushNotification/PushNotification/PushNotification.Plugin.Android/PushNotificationGcmListener.cs
@@ -249,8 +249,9 @@

             // Create a PendingIntent; we're only using one PendingIntent (ID = 0):
             const int pendingIntentId = 0;
-            PendingIntent resultPendingIntent = PendingIntent.GetActivity(context, pendingIntentId, resultIntent, PendingIntentFlags.OneShot);
-
+            var currentMillis = (long)DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
+            PendingIntent resultPendingIntent = PendingIntent.GetActivity(context, pendingIntentId, resultIntent, PendingIntentFlags.OneShot | PendingIntentFlags.UpdateCurrent );
+            resultPendingIntent.SetAction($"currentMillis");
             // Build the notification
             builder = new NotificationCompat.Builder(context)
                       .SetAutoCancel(true) // dismiss the notification from the notification area when the user clicks on it


timeline summary

timeline summary

--- dotnet/Azure/runfo/RuntimeInfo.cs
+++ dotnet/Azure/runfo/RuntimeInfo.cs
@@ -186,10 +186,10 @@
             nameRegex = new Regex(name, RegexOptions.Compiled | RegexOptions.IgnoreCase);
         }

-        Console.WriteLine($"Evaluating {builds.Count} bulids");
         Console.WriteLine("|Build|Kind|Timeline Record|");
         Console.WriteLine("|---|---|---|");
-        foreach (var tuple in await SearchTimelines(Server, builds, nameRegex, textRegex, buildLog))
+        var found = await SearchTimelines(Server, builds, nameRegex, textRegex, buildLog);
+        foreach (var tuple in found)
         {
             var build = tuple.Build;
             var kind = "Rolling";
@@ -199,6 +199,11 @@
             }
             Console.WriteLine($"|[{build.Id}]({DevOpsUtil.GetBuildUri(build)})|{kind}|{tuple.TimelineRecord.Name}|");
         }
+
+        var foundBuildCount = found.GroupBy(x => x.Build.Id).Count();
+        Console.WriteLine($"Evaluated {builds.Count} builds");
+        Console.WriteLine($"Impacted {foundBuildCount} bulids");
+        Console.WriteLine($"Impacted {found.Count} jobs");

         return ExitSuccess;


Ajuste no fechamento do gestor. #20000006-1933

--- Src/GestaoEscolar/WebControls/AlunoEfetivacaoObservacao/UCAlunoEfetivacaoObservacaoGeral.ascx.cs
+++ Src/GestaoEscolar/WebControls/AlunoEfetivacaoObservacao/UCAlunoEfetivacaoObservacaoGeral.ascx.cs
@@ -1467,13 +1467,16 @@
                                         ddlPareceres, lblNotaPosConselho, tpc_id, true, esconderPendencia, true, false);

                     bool existeAulaBimestre = false;
-                    bool.TryParse(Convert.ToString(DataBinder.Eval(e.Item.DataItem, "nota.existeAulaBimestre")), out existeAulaBimestre);
+                    if (DataBinder.Eval(e.Item.DataItem, "nota.existeAulaBimestre") != null)
+                        bool.TryParse(Convert.ToString(DataBinder.Eval(e.Item.DataItem, "nota.existeAulaBimestre")), out existeAulaBimestre);

                     bool possuiAnotacaoRP = false;
-                    bool.TryParse(DataBinder.Eval(e.Item.DataItem, "nota.possuiAnotacaoRP").ToString(), out possuiAnotacaoRP);
+                    if (DataBinder.Eval(e.Item.DataItem, "nota.possuiAnotacaoRP") != null)
+                        bool.TryParse(DataBinder.Eval(e.Item.DataItem, "nota.possuiAnotacaoRP").ToString(), out possuiAnotacaoRP);

                     bool existeAulaSemPlano = false;
-                    bool.TryParse(DataBinder.Eval(e.Item.DataItem, "nota.existeAulaSemPlano").ToString(), out existeAulaSemPlano);
+                    if (DataBinder.Eval(e.Item.DataItem, "nota.existeAulaSemPlano") != null)
+                        bool.TryParse(DataBinder.Eval(e.Item.DataItem, "nota.existeAulaSemPlano").ToString(), out existeAulaSemPlano);

                     eSituacaoMatriculaTurmaDisicplina SituacaoDisciplina = (eSituacaoMatriculaTurmaDisicplina)(DataBinder.Eval(e.Item.DataItem, "nota.SituacaoDisciplina") ?? eSituacaoMatriculaTurmaDisicplina.Ativo);

@@ -1493,9 +1496,12 @@
                     bool recuperacao = false;
                     bool enriquecimentoCurricular = false;
                     bool ensinoInfantil = false;
-                    bool.TryParse(Convert.ToString(DataBinder.Eval(e.Item.DataItem, "nota.recuperacao")), out recuperacao);
-                    bool.TryParse(Convert.ToString(DataBinder.Eval(e.Item.DataItem, "nota.enriquecimentoCurricular")), out enriquecimentoCurricular);
-                    bool.TryParse(Convert.ToString(DataBinder.Eval(e.Item.DataItem, "nota.ensinoInfantil")), out ensinoInfantil);
+                    if (DataBinder.Eval(e.Item.DataItem, "nota.recuperacao") != null)
+                        bool.TryParse(Convert.ToString(DataBinder.Eval(e.Item.DataItem, "nota.recuperacao")), out recuperacao);
+                    if (DataBinder.Eval(e.Item.DataItem, "nota.enriquecimentoCurricular") != null)
+                        bool.TryParse(Convert.ToString(DataBinder.Eval(e.Item.DataItem, "nota.enriquecimentoCurricular")), out enriquecimentoCurricular);
+                    if (DataBinder.Eval(e.Item.DataItem, "nota.ensinoInfantil") != null)
+                        bool.TryParse(Convert.ToString(DataBinder.Eval(e.Item.DataItem, "nota.ensinoInfantil")), out ensinoInfantil);

                     bool validarQtdAulas = (recuperacao || enriquecimentoCurricular || ensinoInfantil);
                     HtmlTableCell tdQtdFaltas = (HtmlTableCell)e.Item.FindControl("tdFaltas");


Changed the host name to a fixed dns

Changed the host name to a fixed dns

--- MultipleKinectsPlatform/Networks/SkeletonAgent.cs
+++ MultipleKinectsPlatform/Networks/SkeletonAgent.cs
@@ -22,7 +22,7 @@
         public SkeletonAgent()
         {
             this.httpPort = 1626;
-            this.host = "localhost";
+            this.host = "d6xhjv1s.d1.comp.nus.edu.sg";

             this.udpPort = 1625;


changed the way of checking if server is up

--- MultipleKinectsPlatform/Networks/SkeletonAgent.cs
+++ MultipleKinectsPlatform/Networks/SkeletonAgent.cs
@@ -24,10 +24,9 @@
             this.httpPort = 80;
             this.host = "d6xhjv1s.d1.comp.nus.edu.sg";

-            if(this.CheckForInternetConnection()){
+            if(!this.CheckForInternetConnection()){
                 this.host = "localhost";
             }
-

             this.udpPort = 1625;

@@ -36,17 +35,19 @@

         public override bool CheckForInternetConnection()
         {
+            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
             try
             {
-                using (var client = new WebClient())
-                using (var stream = client.OpenRead(this.host+":"+this.httpPort))
-                {
-                    return true;
-                }
+                s.Connect(this.host,this.httpPort);
+                return true;
             }
-            catch
+            catch (SocketException)
             {
                 return false;
+            }
+            finally
+            {
+                ((IDisposable)s).Dispose();
             }
         }


Code to add the dataset to the PROOF server.

--- LINQToTTree/SetupPROOFServer/Program.cs
+++ LINQToTTree/SetupPROOFServer/Program.cs
@@ -8,6 +8,13 @@
         /// Dataset name used by our tests... Contains only a single file.
         /// </summary>
         const string testDatasetName = "LINQTest";
+
+        /// <summary>
+        /// List of file paths that can be found on the PROOF server.
+        /// </summary>
+        static string[] testDataSetFileList = {
+                                                 "/phys/groups/tev/scratch3/users/btag/mc11/group.perf-flavtag.105016.J7_pythia_jetjet.BTAG_D3PD.PCTF.r2725.0.111203145120/group.perf-flavtag.50938_004742.EXT0._00003.BTAG_D3PD.pool.root",
+                                       };

         /// <summary>
         /// Simple setup for a PROOF server - so we can get it configured so all of our tests
@@ -23,6 +30,7 @@
             if (args.Length == 0)
             {
                 Console.WriteLine("Usage: SetupPROOFServer <proof-server>");
+                return;
             }

             string proofURI = string.Format("proof://{0}", args[0]);
@@ -40,9 +48,32 @@
             if (connection.ExistsDataSet(testDatasetName))
             {
                 Console.WriteLine("The test dataset exists");
+                return;
             }

             Console.WriteLine("Creating dataset {0}.", testDatasetName);
+
+            //
+            // Create & define the dataset.
+            //
+
+            var files = new ROOTNET.NTFileCollection(testDatasetName, string.Format("File list for {0}", testDatasetName));
+            foreach (var f in testDataSetFileList)
+            {
+                var finfo = new ROOTNET.NTFileInfo(f);
+                files.Add(finfo);
+            }
+            Console.WriteLine("Dataset {0} will contain {1} files.", testDatasetName, testDataSetFileList.Length);
+
+            if (!connection.RegisterDataSet(testDatasetName, files))
+            {
+                Console.WriteLine("Registration of the dataset unsuccessful");
+                return;
+            }
+
+            Console.WriteLine("Dataset registered");
+
+            connection.Close();
         }
     }
 }


apparently opensim only works if secure_inventory_server = true, who knew?  Reverting that.

--- OpenSim/Region/Application/ConfigurationLoader.cs
+++ OpenSim/Region/Application/ConfigurationLoader.cs
@@ -171,7 +171,7 @@
                 config.Set("user_recv_key", "null");
                 config.Set("asset_server_url", "http://127.0.0.1:" + AssetConfig.DefaultHttpPort.ToString());
                 config.Set("inventory_server_url", "http://127.0.0.1:" + InventoryConfig.DefaultHttpPort.ToString());
-                config.Set("secure_inventory_server", "false");
+                config.Set("secure_inventory_server", "true");
             }

             return defaultConfig;


Refactor KeyframeMotion to use one timer class per scene

--- OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
+++ OpenSim/Region/Framework/Scenes/KeyframeMotion.cs
@@ -22,25 +22,36 @@

 namespace OpenSim.Region.Framework.Scenes
 {
-    public static class KeyframeTimer
+    public class KeyframeTimer
     {
-        private static Timer m_timer;
-        private static Dictionary<KeyframeMotion, object> m_motions = new Dictionary<KeyframeMotion, object>();
-        private static object m_lockObject = new object();
-        private static object m_timerLock = new object();
-        public const double timerInterval = 50.0;
-
-        static KeyframeTimer()
+        private static Dictionary<Scene, KeyframeTimer>m_timers =
+                new Dictionary<Scene, KeyframeTimer>();
+
+        private Timer m_timer;
+        private Dictionary<KeyframeMotion, object> m_motions = new Dictionary<KeyframeMotion, object>();
+        private object m_lockObject = new object();
+        private object m_timerLock = new object();
+        private const double m_tickDuration = 50.0;
+        private Scene m_scene;
+
+        public double TickDuration
+        {
+            get { return m_tickDuration; }
+        }
+
+        public KeyframeTimer(Scene scene)
         {
             m_timer = new Timer();
-            m_timer.Interval = timerInterval;
+            m_timer.Interval = TickDuration;
             m_timer.AutoReset = true;
             m_timer.Elapsed += OnTimer;

+            m_scene = scene;
+
             m_timer.Start();
         }

-        private static void OnTimer(object sender, ElapsedEventArgs ea)
+        private void OnTimer(object sender, ElapsedEventArgs ea)
         {
             if (!Monitor.TryEnter(m_timerLock))
                 return;
@@ -58,7 +69,7 @@
                 {
                     try
                     {
-                        m.OnTimer();
+                        m.OnTimer(TickDuration);
                     }
                     catch (Exception inner)
                     {
@@ -78,17 +89,44 @@

         public static void Add(KeyframeMotion motion)
         {
-            lock (m_lockObject)
-            {
-                m_motions[motion] = null;
+            KeyframeTimer timer;
+
+            if (motion.Scene == null)
+                return;
+
+            lock (m_timers)
+            {
+                if (!m_timers.TryGetValue(motion.Scene, out timer))
+                {
+                    timer = new KeyframeTimer(motion.Scene);
+                    m_timers[motion.Scene] = timer;
+                }
+            }
+
+            lock (timer.m_lockObject)
+            {
+                timer.m_motions[motion] = null;
             }
         }

         public static void Remove(KeyframeMotion motion)
         {
-            lock (m_lockObject)
-            {
-                m_motions.Remove(motion);
+            KeyframeTimer timer;
+
+            if (motion.Scene == null)
+                return;
+
+            lock (m_timers)
+            {
+                if (!m_timers.TryGetValue(motion.Scene, out timer))
+                {
+                    return;
+                }
+            }
+
+            lock (timer.m_lockObject)
+            {
+                timer.m_motions.Remove(motion);
             }
         }
     }
@@ -156,12 +194,21 @@
         private DataFormat m_data = DataFormat.Translation | DataFormat.Rotation;

         private bool m_running = false;
+
         [NonSerialized()]
         private bool m_selected = false;

         private int m_iterations = 0;

         private int m_skipLoops = 0;
+
+        [NonSerialized()]
+        private Scene m_scene;
+
+        public Scene Scene
+        {
+            get { return m_scene; }
+        }

         public DataFormat Data
         {
@@ -221,8 +268,12 @@

                 newMotion.m_group = grp;

-                if (grp != null && grp.IsSelected)
-                    newMotion.m_selected = true;
+                if (grp != null)
+                {
+                    newMotion.m_scene = grp.Scene;
+                    if (grp.IsSelected)
+                        newMotion.m_selected = true;
+                }

                 newMotion.m_timerStopped = false;
                 newMotion.m_isCrossing = false;
@@ -246,6 +297,8 @@
                 return;

             m_group = grp;
+            m_scene = grp.Scene;
+
             Vector3 grppos = grp.AbsolutePosition;
             Vector3 offset = grppos - m_serializedPosition;
             // avoid doing it more than once
@@ -278,6 +331,7 @@
             {
                 m_basePosition = grp.AbsolutePosition;
                 m_baseRotation = grp.GroupRotation;
+                m_scene = grp.Scene;
             }

             m_timerStopped = true;
@@ -297,6 +351,7 @@
             KeyframeMotion newmotion = new KeyframeMotion(null, m_mode, m_data);

             newmotion.m_group = newgrp;
+            newmotion.m_scene = newgrp.Scene;

             if (m_keyframes != null)
             {
@@ -482,7 +537,7 @@
             }
         }

-        public void OnTimer()
+        public void OnTimer(double tickDuration)
         {
             if (m_skipLoops > 0)
             {
@@ -546,16 +601,16 @@
                 }

                 m_currentFrame = m_frames[0];
-                m_currentFrame.TimeMS += (int)KeyframeTimer.timerInterval;
+                m_currentFrame.TimeMS += (int)tickDuration;

                 //force a update on a keyframe transition
                 update = true;
             }

-            m_currentFrame.TimeMS -= (int)KeyframeTimer.timerInterval;
+            m_currentFrame.TimeMS -= (int)tickDuration;

             // Do the frame processing
-            double steps = (double)m_currentFrame.TimeMS / KeyframeTimer.timerInterval;
+            double steps = (double)m_currentFrame.TimeMS / tickDuration;

             if (steps <= 0.0)
             {


Fix bug in raw loading for connor.

Fix bug in raw loading for connor.

--- OpenSim/Region/Framework/Scenes/TerrainChannel.cs
+++ OpenSim/Region/Framework/Scenes/TerrainChannel.cs
@@ -181,7 +181,8 @@
                     taint[x / Constants.TerrainPatchSize, y / Constants.TerrainPatchSize] = true;
                     //m_tainted = true;
                     map[x, y] = value;
-                    m_cachedMap[y * map.GetLength(0) + x] = (float)value;
+                    if(m_cachedMap != null)
+                        m_cachedMap[y * map.GetLength(0) + x] = (float)value;
                 }
             }
         }


Add better sanity checks to failing finding the users home or custom URI on login.

--- OpenSim/Services/LLLoginService/LLLoginService.cs
+++ OpenSim/Services/LLLoginService/LLLoginService.cs
@@ -706,8 +706,6 @@

         protected GridRegion FindDestination(UserAccount account, UUID scopeID, UserInfo pinfo, UUID sessionID, string startLocation, GridRegion home, out string where, out Vector3 position, out Vector3 lookAt)
         {
-            m_log.DebugFormat("[LLOGIN SERVICE]: FindDestination for start location {0}", startLocation);
-
             where = "home";
             position = new Vector3(128, 128, 25);
             lookAt = new Vector3(0, 1, 0);
@@ -750,14 +748,33 @@
                         where = "safe";
                     }
                     else
-                    {
-                        m_log.WarnFormat("[LLOGIN SERVICE]: User {0} {1} does not have a valid home and this grid does not have default locations. Attempting to find random region",
-                            account.FirstName, account.LastName);
-                        defaults = m_GridService.GetRegionsByName(scopeID, "", 1);
-                        if (defaults != null && defaults.Count > 0)
-                        {
-                            region = defaults[0];
-                            where = "safe";
+                    {
+                        List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.ScopeID, 0, 0);
+                        if (fallbacks != null && fallbacks.Count > 0)
+                        {
+                            region = fallbacks[0];
+                            where = "safe";
+                        }
+                        else
+                        {
+                            //Try to find any safe region
+                            List<GridRegion> safeRegions = m_GridService.GetSafeRegions(account.ScopeID, 0, 0);
+                            if (safeRegions != null && safeRegions.Count > 0)
+                            {
+                                region = safeRegions[0];
+                                where = "safe";
+                            }
+                            else
+                            {
+                                m_log.WarnFormat("[LLOGIN SERVICE]: User {0} {1} does not have a valid home and this grid does not have default locations. Attempting to find random region",
+                                    account.FirstName, account.LastName);
+                                defaults = m_GridService.GetRegionsByName(scopeID, "", 1);
+                                if (defaults != null && defaults.Count > 0)
+                                {
+                                    region = defaults[0];
+                                    where = "safe";
+                                }
+                            }
                         }
                     }
                 }
@@ -845,8 +862,27 @@
                                 }
                                 else
                                 {
-                                    m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, Grid does not provide default regions.", startLocation);
-                                    return null;
+                                    List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.ScopeID, 0, 0);
+                                    if (fallbacks != null && fallbacks.Count > 0)
+                                    {
+                                        where = "safe";
+                                        return fallbacks[0];
+                                    }
+                                    else
+                                    {
+                                        //Try to find any safe region
+                                        List<GridRegion> safeRegions = m_GridService.GetSafeRegions(account.ScopeID, 0, 0);
+                                        if (safeRegions != null && safeRegions.Count > 0)
+                                        {
+                                            where = "safe";
+                                            return safeRegions[0];
+                                        }
+                                        else
+                                        {
+                                            m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, Grid does not have any available regions.", startLocation);
+                                            return null;
+                                        }
+                                    }
                                 }
                             }
                             return regions[0];
@@ -875,20 +911,38 @@
                     }
                     else
                     {
-                        List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID);
-                        if (defaults != null && defaults.Count > 0)
-                        {
-                            where = "safe";
-                            return defaults[0];
+                        List<GridRegion> defaults = m_GridService.GetDefaultRegions(scopeID);
+                        if (defaults != null && defaults.Count > 0)
+                        {
+                            where = "safe";
+                            return defaults[0];
+                        }
+                        else
+                        {
+                            List<GridRegion> fallbacks = m_GridService.GetFallbackRegions(account.ScopeID, 0, 0);
+                            if (fallbacks != null && fallbacks.Count > 0)
+                            {
+                                where = "safe";
+                                return fallbacks[0];
+                            }
+                            else
+                            {
+                                //Try to find any safe region
+                                List<GridRegion> safeRegions = m_GridService.GetSafeRegions(account.ScopeID, 0, 0);
+                                if (safeRegions != null && safeRegions.Count > 0)
+                                {
+                                    where = "safe";
+                                    return safeRegions[0];
+                                }
+                                else
+                                {
+                                    m_log.InfoFormat("[LLLOGIN SERVICE]: Got Custom Login URI {0}, Grid does not have any available regions.", startLocation);
+                                    return null;
+                                }
+                            }
                         }
-                        else
-                            return null;
-                    }
-                }
-                //response.LookAt = "[r0,r1,r0]";
-                //// can be: last, home, safe, url
-                //response.StartLocation = "url";
-
+                    }
+                }
             }
         }

@@ -1053,7 +1107,6 @@
             MainConsole.Instance.Commands.AddCommand("loginservice", false, "login text",
                     "login text <text>",
                     "Set the text users will see on login", HandleLoginCommand);
-
         }

         protected void HandleLoginCommand(string module, string[] cmd)


Simplified UnitsNamesConstants

Simplified UnitsNamesConstants

--- PRGReaderLibrary/Constants/UnitsNamesConstants.cs
+++ PRGReaderLibrary/Constants/UnitsNamesConstants.cs
@@ -47,70 +47,70 @@
                     return new UnitsNames("DigitalUnused", bool.FalseString, bool.TrueString);

                 case Units.OffOn:
-                    return new UnitsNames("Off/On", "Off", "On");
+                    return new UnitsNames("Off/On", "/");

                 case Units.ClosedOpen:
-                    return new UnitsNames("Closed/Open", "Closed", "Open");
+                    return new UnitsNames("Closed/Open", "/");

                 case Units.StopStart:
-                    return new UnitsNames("Stop/Start", "Stop", "Start");
+                    return new UnitsNames("Stop/Start", "/");

                 case Units.DisabledEnabled:
-                    return new UnitsNames("Disabled/Enabled", "Disabled", "Enabled");
+                    return new UnitsNames("Disabled/Enabled", "/");

                 case Units.NormalAlarm:
-                    return new UnitsNames("Normal/Alarm", "Normal", "Alarm");
+                    return new UnitsNames("Normal/Alarm", "/");

                 case Units.NormalHigh:
-                    return new UnitsNames("Normal/High", "Normal", "High");
+                    return new UnitsNames("Normal/High", "/");

                 case Units.NormalLow:
-                    return new UnitsNames("Normal/Low", "Normal", "Low");
+                    return new UnitsNames("Normal/Low", "/");

                 case Units.NoYes:
-                    return new UnitsNames("No/Yes", "No", "Yes");
+                    return new UnitsNames("No/Yes", "/");

                 case Units.CoolHeat:
-                    return new UnitsNames("Cool/Heat", "Cool", "Heat");
+                    return new UnitsNames("Cool/Heat", "/");

                 case Units.UnoccupiedOccupied:
-                    return new UnitsNames("Unoccupied/Occupied", "Unoccupied", "Occupied");
+                    return new UnitsNames("Unoccupied/Occupied", "/");

                 case Units.OnOff:
-                    return new UnitsNames("On/Off", "On", "Off");
+                    return new UnitsNames("On/Off", "/");

                 case Units.OpenClosed:
-                    return new UnitsNames("Open/Closed", "Open", "Closed");
+                    return new UnitsNames("Open/Closed", "/");

                 case Units.StartStop:
-                    return new UnitsNames("Start/Stop", "Start", "Stop");
+                    return new UnitsNames("Start/Stop", "/");

                 case Units.EnabledDisabled:
-                    return new UnitsNames("Enabled/Disabled", "Enabled", "Disabled");
+                    return new UnitsNames("Enabled/Disabled", "/");

                 case Units.AlarmNormal:
-                    return new UnitsNames("Alarm/Normal", "Alarm", "Normal");
+                    return new UnitsNames("Alarm/Normal", "/");

                 case Units.HighNormal:
-                    return new UnitsNames("High/Normal", "High", "Normal");
+                    return new UnitsNames("High/Normal", "/");

                 case Units.LowHigh:
-                    return new UnitsNames("Low/High", "Low", "High");
+                    return new UnitsNames("Low/High", "/");

                 case Units.LowNormal:
-                    return new UnitsNames("Low/Normal", "Low", "Normal");
+                    return new UnitsNames("Low/Normal", "/");

                 case Units.YesNo:
-                    return new UnitsNames("Yes/No", "Yes", "No");
+                    return new UnitsNames("Yes/No", "/");

                 case Units.HeatCool:
-                    return new UnitsNames("Heat/Cool", "Heat", "Cool");
+                    return new UnitsNames("Heat/Cool", "/");

                 case Units.OccupiedUnoccupied:
-                    return new UnitsNames("Occupied/Unoccupied", "Occupied", "Unoccupied");
+                    return new UnitsNames("Occupied/Unoccupied", "/");

                 case Units.HighLow:
-                    return new UnitsNames("High/Low", "High", "Low");
+                    return new UnitsNames("High/Low", "/");

                 case Units.CustomDigital1:
                 case Units.CustomDigital2:


Use Control.ApplyTemplate to apply template.

--- Perspex.Controls.UnitTests/ContentControlTests.cs
+++ Perspex.Controls.UnitTests/ContentControlTests.cs
@@ -58,7 +58,7 @@
                 target.Template = this.GetTemplate();
                 root.Content = target;

-                this.ApplyTemplate(target);
+                target.ApplyTemplate();

                 styler.Verify(x => x.ApplyStyles(It.IsAny<ContentControl>()), Times.Once());
                 styler.Verify(x => x.ApplyStyles(It.IsAny<Border>()), Times.Once());
@@ -75,7 +75,7 @@

             target.Template = this.GetTemplate();
             target.Content = child;
-            this.ApplyTemplate(target);
+            target.ApplyTemplate();

             var contentPresenter = child.GetVisualParent<ContentPresenter>();
             Assert.AreEqual(target, contentPresenter.TemplatedParent);
@@ -89,7 +89,7 @@

             target.Template = this.GetTemplate();
             target.Content = child;
-            this.ApplyTemplate(target);
+            target.ApplyTemplate();

             Assert.IsNull(child.TemplatedParent);
         }
@@ -189,7 +189,7 @@

             contentControl.Template = this.GetTemplate();
             contentControl.Content = child;
-            ApplyTemplate(contentControl);
+            contentControl.ApplyTemplate();

             ((ILogical)contentControl).LogicalChildren.CollectionChanged += (s, e) =>
                 called = e.Action == NotifyCollectionChangedAction.Remove;
@@ -225,11 +225,6 @@
             presenter.ApplyTemplate();

             Assert.IsTrue(called);
-        }
-
-        private void ApplyTemplate(ILayoutable control)
-        {
-            control.Measure(new Size(100, 100));
         }

         private ControlTemplate GetTemplate()


close search menu when player hits ESC

close search menu when player hits ESC

--- LookupAnything/Components/SearchMenu.cs
+++ LookupAnything/Components/SearchMenu.cs
@@ -90,6 +90,8 @@
         public override void receiveKeyPress(Keys key)
         {
             // deliberately avoid calling base, which may let another key close the menu
+            if(key.Equals(Keys.Escape))
+                this.exitThisMenu();
         }

         /// <summary>The method invoked when the player scrolls the mouse wheel on the lookup UI.</summary>


Added DelayChanged event

Added DelayChanged event

--- MahApps.Metro/Controls/NumericUpDown.cs
+++ MahApps.Metro/Controls/NumericUpDown.cs
@@ -24,6 +24,7 @@
     {
         public static readonly RoutedEvent IncrementValueEvent = EventManager.RegisterRoutedEvent("IncrementValue", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NumericUpDown));
         public static readonly RoutedEvent DecrementValueEvent = EventManager.RegisterRoutedEvent("DecrementValue", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NumericUpDown));
+        public static readonly RoutedEvent DelayChangedEvent = EventManager.RegisterRoutedEvent("DelayChanged", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(NumericUpDown));

         /// <summary>
         ///     Event for "To value has been reached"
@@ -131,6 +132,12 @@
             remove { RemoveHandler(DecrementValueEvent, value); }
         }

+        public event RoutedEventHandler DelayChanged
+        {
+            add { AddHandler(DelayChangedEvent, value); }
+            remove { RemoveHandler(DelayChangedEvent, value); }
+        }
+
         /// <summary>
         ///     Gets or sets the amount of time, in milliseconds, the NumericUpDown waits while the up/down button is pressed before it starts increasing/decreasing the
         ///     <see cref="RangeBase.Value" /> for the specified <see cref="RangeBase.SmallChange" /> . The value must be non-negative.
@@ -400,6 +407,7 @@
         {
             NumericUpDown ctrl = (NumericUpDown)d;

+            ctrl.RaiseChangeDelay();
             ctrl.OnDelayChanged((int)e.OldValue, (int)e.NewValue);
         }

@@ -423,6 +431,11 @@
         private static bool ValidateDelay(object value)
         {
             return Convert.ToInt32(value) >= 0;
+        }
+
+        private void RaiseChangeDelay()
+        {
+            RaiseEvent(new RoutedEventArgs(DelayChangedEvent));
         }

         private void ChangeValue(bool toPositive)


Fixed ExpressionHelper

Fixed ExpressionHelper

--- Main/src/Reflection/ExpressionHelper.cs
+++ Main/src/Reflection/ExpressionHelper.cs
@@ -67,7 +67,7 @@
 		/// </returns>
 		[NotNull, Pure]
 		public static ConstructorInfo GetConstructor([NotNull] LambdaExpression expression) =>
-			((NewExpression)expression.Body).Constructor;
+			(ConstructorInfo)GetMemberInfo(expression);

 		/// <summary>
 		/// Returns the method.


[de] Ereignisse funktionieren nun auch für Komponenten, die keinen direkten Verweis auf Zyan.Communication haben.
[en] New events are working also for components without a direct reference to Zyan.Communication.

git-tfs-id: [https://tfs.codeplex.com:443/tfs/TFS15]$/cyan;C9326

--- source/Zyan.Communication/DynamicWireFactory.cs
+++ source/Zyan.Communication/DynamicWireFactory.cs
@@ -4,6 +4,7 @@
 using System.Text;
 using System.Reflection;
 using Zyan.Communication.Scripting;
+using System.IO;

 namespace Zyan.Communication
 {
@@ -155,6 +156,31 @@
         }

         /// <summary>
+        /// Gibt alle Verweise eines bestimmten Komponententyp zurück.
+        /// </summary>
+        /// <param name="componentType">Komponententyp</param>
+        /// <returns>Array mit Pfadangaben zu abhängigen Assemblies</returns>
+        private string[] GetComponentReferences(Type componentType)
+        {
+            // Verweise der Komponenten-Assembly übernehmen
+            List<string> componentReferences = (from assy in componentType.Assembly.GetReferencedAssemblies()
+                                                select Assembly.Load(assy).Location).ToList();
+
+            // Nach Zyan.Communication.dll in Komponentenverweisen suchen
+            int foundZyan = (from reference in componentReferences
+                             where Path.GetFileName(reference).Equals("Zyan.Communication.dll", StringComparison.InvariantCultureIgnoreCase)
+                             select reference).Count();
+
+            // Wenn Zyan.Communication.dll nicht in den Verweisen enthalten ist ...
+            if (foundZyan == 0)
+                // Verweis auf Zyan zufügen
+                componentReferences.Add(Assembly.GetExecutingAssembly().Location);
+
+            // Array mit Verweisen erstellen und zurückgeben
+            return componentReferences.ToArray();
+        }
+
+        /// <summary>
         /// Erzeugt den Typen für einen dynamischen Draht für ein bestimmtes Ereignis einer Komponente.
         /// </summary>
         /// <param name="componentType">Typ der Komponente</param>
@@ -162,10 +188,9 @@
         /// <param name="clientInterceptor">Client-Abfangvorrichtung</param>
         /// <returns>Typ des dynamischen Drahts</returns>
         private Type BuildDynamicWireType(Type componentType, Type delegateType, DelegateInterceptor clientInterceptor)
-        {
-            // Verweise der Komponenten-Assembly übernehmen
-            string[] references = (from assy in componentType.Assembly.GetReferencedAssemblies()
-                                   select Assembly.Load(assy).Location).ToArray();
+        {
+            // Array mit Verweisen erstellen
+            string[] references = GetComponentReferences(componentType);

             // Variable für Quellcode
             string sourceCode = string.Empty;
@@ -192,10 +217,9 @@
         /// <returns>Typ des dynamischen Drahts</returns>
         private Type BuildDynamicWireType(Type componentType,string eventMemberName, bool isEvent)
         {
-            // Verweise der Komponenten-Assembly übernehmen
-            string[] references = (from assy in componentType.Assembly.GetReferencedAssemblies()
-                                   select Assembly.Load(assy).Location).ToArray();
-
+            // Array mit Verweisen erstellen
+            string[] references = GetComponentReferences(componentType);
+
             // Variable für Quellcode
             string sourceCode = string.Empty;


Updated the search repo not to prepend searches with N'

--- Purchasing.Core/Repositories/ISearchRepository.cs
+++ Purchasing.Core/Repositories/ISearchRepository.cs
@@ -53,7 +53,7 @@
         private IList<T> PerformQuery<T>(string user, string query, string queryType)
         {
             var q = Session.CreateSQLQuery(
-                string.Format("SELECT * FROM [PrePurchasing].[dbo].[udf_Get{0}Results] (N'{1}',N'{2}')", queryType, user,
+                string.Format("SELECT * FROM [PrePurchasing].[dbo].[udf_Get{0}Results] ('{1}','{2}')", queryType, user,
                               query))
                 .SetResultTransformer(Transformers.AliasToBean<T>());


--- RdlEngine/Render/HtmlConverter/RenderHtmlTable.cs
+++ RdlEngine/Render/HtmlConverter/RenderHtmlTable.cs
@@ -65,7 +65,9 @@
 			// final file
 			_styles = new Hashtable();
 		}
-		~RenderHtmlTable()
+        //Replaced from forum, User: Aulofee http://www.fyireporting.com/forum/viewtopic.php?t=793
+		//~RenderHtmlTable()
+        public void Dispose()
 		{
 			// These should already be cleaned up; but in case of an unexpected error
 			//   these still need to be disposed of


added ExpId to SiliStats

added ExpId to SiliStats

--- ReachingTypeAnalysis/Statistics/AnalysisClient.cs
+++ ReachingTypeAnalysis/Statistics/AnalysisClient.cs
@@ -235,6 +235,7 @@
 		{
 			var siloStat = new SiloRuntimeStats()
 			{
+                ExpID = this.ExpID,
 				Address = siloAddr.ToString(),
 				CPU = siloMetric.CpuUsage,
 				MemoryUsage = siloMetric.MemoryUsage,


Change default template selection to a RadioButton list and add links to Document Type and Template

--- umbraco/presentation/umbraco/editContent.aspx.cs
+++ umbraco/presentation/umbraco/editContent.aspx.cs
@@ -36,7 +36,8 @@

         controls.ContentControl cControl;

-        DropDownList ddlDefaultTemplate = new DropDownList();
+        RadioButtonList rblDefaultTemplate = new RadioButtonList();
+        HtmlGenericControl rblDefaultTemplateScrollingPanel = new HtmlGenericControl("div");

         uicontrols.Pane publishProps = new uicontrols.Pane();
         uicontrols.Pane linkProps = new uicontrols.Pane();
@@ -131,7 +132,7 @@
             // Template
             PlaceHolder template = new PlaceHolder();
             cms.businesslogic.web.DocumentType DocumentType = new cms.businesslogic.web.DocumentType(_document.ContentType.Id);
-            cControl.PropertiesPane.addProperty(ui.Text("documentType"), new LiteralControl(DocumentType.Text));
+            cControl.PropertiesPane.addProperty(ui.Text("documentType"), new LiteralControl(string.Format("{0} {1}", DocumentType.Text, umbraco.cms.helpers.DeepLink.GetAnchor(DeepLinkType.DocumentType, _document.ContentType.Id.ToString(), true))));

@@ -153,15 +154,7 @@
             }
             else
             {
-                ddlDefaultTemplate.Items.Add(new ListItem(ui.Text("choose") + "...", ""));
-                foreach (cms.businesslogic.template.Template t in DocumentType.allowedTemplates)
-                {
-                    ListItem tTemp = new ListItem(t.Text, t.Id.ToString());
-                    if (t.Id == defaultTemplate)
-                        tTemp.Selected = true;
-                    ddlDefaultTemplate.Items.Add(tTemp);
-                }
-                template.Controls.Add(ddlDefaultTemplate);
+                AddDefaultTemplateControl(defaultTemplate, ref template, ref  DocumentType);
             }

@@ -210,8 +203,8 @@
                 return;

             // clear preview cookie
-			// zb-00004 #29956 : refactor cookies names & handling
-			StateHelper.Cookies.Preview.Clear();
+            // zb-00004 #29956 : refactor cookies names & handling
+            StateHelper.Cookies.Preview.Clear();

             if (!IsPostBack)
             {
@@ -267,9 +260,9 @@
                 _document.ExpireDate = new DateTime(1, 1, 1, 0, 0, 0);

             // Update default template
-            if (ddlDefaultTemplate.SelectedIndex > 0)
-            {
-                _document.Template = int.Parse(ddlDefaultTemplate.SelectedValue);
+            if (rblDefaultTemplate.SelectedIndex > 0)
+            {
+                _document.Template = int.Parse(rblDefaultTemplate.SelectedValue);
             }
             else
             {
@@ -450,23 +443,24 @@
         /// <param name="defaultTemplate"></param>
         /// <param name="template"></param>
         /// <param name="DocumentType"></param>
-        private void AddTemplateDropDown(int defaultTemplate, ref PlaceHolder template, ref cms.businesslogic.web.DocumentType DocumentType)
+        private void AddDefaultTemplateControl(int defaultTemplate, ref PlaceHolder template, ref cms.businesslogic.web.DocumentType documentType)
         {
             string permissions = this.getUser().GetPermissions(_document.Path);

             if (permissions.IndexOf(ActionUpdate.Instance.Letter) >= 0)
             {
-                ddlDefaultTemplate.Items.Add(new ListItem(ui.Text("choose") + "...", ""));
-                foreach (cms.businesslogic.template.Template t in DocumentType.allowedTemplates)
-                {
-                    ListItem tTemp = new ListItem(t.Text, t.Id.ToString());
-                    if (t.Id == defaultTemplate)
-                        tTemp.Selected = true;
-                    ddlDefaultTemplate.Items.Add(tTemp);
-                }
-
-
-                template.Controls.Add(ddlDefaultTemplate);
+                rblDefaultTemplateScrollingPanel = new HtmlGenericControl("div");
+                rblDefaultTemplateScrollingPanel.Style.Add(HtmlTextWriterStyle.Overflow, "auto");
+                rblDefaultTemplateScrollingPanel.Style.Add("min-height", "15px");
+                rblDefaultTemplateScrollingPanel.Style.Add("max-height", "50px");
+                rblDefaultTemplateScrollingPanel.Style.Add("width", "300px");
+                rblDefaultTemplateScrollingPanel.Style.Add("display", "inline-block");
+                rblDefaultTemplate.RepeatDirection = RepeatDirection.Horizontal;
+                rblDefaultTemplate.RepeatColumns = 3;
+                rblDefaultTemplateScrollingPanel.Controls.Add(rblDefaultTemplate);
+                template.Controls.Add(rblDefaultTemplateScrollingPanel);
+
+                BindTemplateControl(defaultTemplate, ref documentType);
             }
             else
             {
@@ -477,7 +471,25 @@
             }
         }

-
+        private void BindTemplateControl(int defaultTemplate, ref cms.businesslogic.web.DocumentType documentType)
+        {
+            rblDefaultTemplate.Items.Add(new ListItem("None", ""));
+            bool selected = false;
+            foreach (cms.businesslogic.template.Template t in documentType.allowedTemplates)
+            {
+                ListItem tTemp = new ListItem(string.Format("{0} {1}", t.Text, umbraco.cms.helpers.DeepLink.GetAnchor(DeepLinkType.Template, t.Id.ToString(), true), t.Id.ToString()));
+                if (t.Id == defaultTemplate)
+                {
+                    tTemp.Selected = true;
+                    selected = true;
+                }
+                rblDefaultTemplate.Items.Add(tTemp);
+            }
+            if (!selected)
+            {
+                rblDefaultTemplate.SelectedIndex = 0;
+            }
+        }
         private void addPreviewButton(uicontrols.ScrollingMenu menu, int id)
         {
             menu.InsertSplitter(2);


Remove redundant StringProvider

Remove redundant StringProvider

--- src/15below.Deployment.Update/NDjangoWrapper.cs
+++ src/15below.Deployment.Update/NDjangoWrapper.cs
@@ -11,7 +11,6 @@
     {
         private const string ErrorGuid = "{668B7536-C32B-4D86-B065-70C143EB4AD9}";
         private const string ErrorText = "[ERROR OCCURRED HERE]";
-        private const string StringProvider = "string://";

         private static readonly Lazy<ITemplateManager> TemplateManager = new Lazy<ITemplateManager>(() => GetTemplateManager(false));
         private static readonly Lazy<ITemplateManager> XmlTemplateManager = new Lazy<ITemplateManager>(() => GetTemplateManager(true));
@@ -41,7 +40,7 @@

         private static string Render(string template, IDictionary<string, object> values, ITemplateManager templateManager)
         {
-            var replacementValue = templateManager.RenderTemplate(StringProvider + template, values).ReadToEnd();
+            var replacementValue = templateManager.RenderTemplate(template, values).ReadToEnd();

             if (replacementValue.Contains(ErrorGuid))
             {
@@ -56,12 +55,8 @@
         {
             public TextReader GetTemplate(string path)
             {
-                if (path.StartsWith(StringProvider))
-                {
-                    var mem = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(path.Substring(StringProvider.Length)));
-                    return new StreamReader(mem);
-                }
-                return new StreamReader(path);
+                var mem = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(path));
+                return new StreamReader(mem);
             }

             public bool IsUpdated(string path, DateTime timestamp)


added LINQ distinct support

added LINQ distinct support

--- src/ArangoDB.Client/Query/ArangoModelVisitor.cs
+++ src/ArangoDB.Client/Query/ArangoModelVisitor.cs
@@ -38,6 +38,8 @@

         public bool DontReturn { get; set; }

+        public bool DistinctResult { get; set; }
+
         public bool IgnoreFromClause { get; set; }

         public string DefaultAssociatedIdentifier { get; set; }
@@ -86,6 +88,10 @@
             if (queryModel.ResultOperators.Count(x => x is FirstResultOperator) != 0)
                 queryModel.BodyClauses.Add(new SkipTakeClause(Expression.Constant(0), Expression.Constant(1)));

+            if (queryModel.ResultOperators.Count(x => x is DistinctResultOperator) != 0)
+                DistinctResult = true;
+
+            // do not need to apply distinct since it has a single result
             if (string.IsNullOrEmpty(aggregateFunction) == false)
                 QueryText.AppendFormat(" return {0} (( ", aggregateFunction);

@@ -193,7 +199,7 @@

         public override void VisitSelectClause(SelectClause selectClause, QueryModel queryModel)
         {
-            QueryText.Append(" return ");
+            QueryText.AppendFormat(" return {0} ", DistinctResult ? "distinct" : string.Empty);
             GetAqlExpression(selectClause.Selector, queryModel);
         }


more docs

more docs

--- src/BE.FluentGuard/ModelValidationExtensions.cs
+++ src/BE.FluentGuard/ModelValidationExtensions.cs
@@ -9,8 +9,19 @@

 namespace BE.FluentGuard
 {
+    /// <summary>
+    /// Contains methods for validation models annotated with Attribute from <c>System.ComponentModel.Annotations</c>
+    /// </summary>
     public static class ModelValidationExtensions
     {
+
+        /// <summary>
+        /// Validates wether the given model fulfills all of this annotated definitions
+        /// </summary>
+        /// <typeparam name="T">Type of the model that should be validated</typeparam>
+        /// <param name="rule">The rule on which it should be validated</param>
+        /// <returns>A ValidationRule on which assertions can be made.</returns>
+        /// <exception cref="ValidationException">If the model doesn't fullfill its annotations</exception>
         public static ValidationRule<T> ValidModel<T>(this ValidationRule<T> rule) where T : class
         {
             var context = new ValidationContext(rule.Value);


Fix test errors

Fix test errors

--- core/TrackableData-MongoDB.Tests/TrackableDictionaryTest.cs
+++ core/TrackableData-MongoDB.Tests/TrackableDictionaryTest.cs
@@ -67,10 +67,11 @@
         {
             var collection = _db.Test.GetCollection<BsonDocument>("Trackable");

+            var id = ObjectId.GenerateNewId();
             var dict = CreateTestInventory(true);
-            await ItemDataMapper.SaveAsync(collection, dict.Tracker, 1);
+            await ItemDataMapper.SaveAsync(collection, dict.Tracker, id);

-            var dict2 = await ItemDataMapper.LoadAsync(collection, 1);
+            var dict2 = await ItemDataMapper.LoadAsync(collection, id);
             Assert.Equal(dict.Count, dict2.Count);
             foreach (var item in dict)
             {
@@ -85,14 +86,15 @@
         {
             var collection = _db.Test.GetCollection<BsonDocument>("Trackable");

+            var id = ObjectId.GenerateNewId();
             var dict = CreateTestInventory(true);
-            await ItemDataMapper.SaveAsync(collection, dict.Tracker, 1);
+            await ItemDataMapper.SaveAsync(collection, dict.Tracker, id);
             dict.Tracker.Clear();

             ModifyTestInventory(dict, ModificationWayType.SetNew);
-            await ItemDataMapper.SaveAsync(collection, dict.Tracker, 1);
+            await ItemDataMapper.SaveAsync(collection, dict.Tracker, id);

-            var dict2 = await ItemDataMapper.LoadAsync(collection, 1);
+            var dict2 = await ItemDataMapper.LoadAsync(collection, id);
             Assert.Equal(dict.Count, dict2.Count);
             foreach (var item in dict)
             {


Added note to TermValueList to see about getting the raw term list value without casting to object.

--- src/BoboBrowse.Net/Facets/Data/TermValueList.cs
+++ src/BoboBrowse.Net/Facets/Data/TermValueList.cs
@@ -35,7 +35,7 @@
         int Count { get; }
         string Get(int index);
         IComparable GetComparableValue(int index);
-        object GetRawValue(int index);
+        object GetRawValue(int index); // TODO: see if we can use the actual type here by either making this method generic, or removing it here and putting it into the generic class.
         string Format(object o);
         int IndexOf(object o);
         void Add(string o);


[mono][tests] Disable evaluation profiling tests on mono as they depend

.. on out-of-proc nodes which are not supported on mono/unix yet.

"Fixes":

      Microsoft.Build.Engine.UnitTests.EvaluationProfiler_Tests.VerifyProfiledGlobData [FAIL]
      Microsoft.Build.Engine.UnitTests.EvaluationProfiler_Tests.VerifySimpleProfiledData(elementName: "Target", body: "<Target Name='test'/>") [FAIL]
      Microsoft.Build.Engine.UnitTests.EvaluationProfiler_Tests.VerifySimpleProfiledData(elementName: "Message", body: "<Target Name='echo'>\n    <Message text='echo!'/>\n<"...) [FAIL]
      Microsoft.Build.Engine.UnitTests.EvaluationProfiler_Tests.VerifySimpleProfiledData(elementName: "appname", body: "<Target Name='test'/>\n<PropertyGroup>\n    <appname"...) [FAIL]
      Microsoft.Build.Engine.UnitTests.EvaluationProfiler_Tests.VerifySimpleProfiledData(elementName: "CSFile", body: "<Target Name='test'/>\n<ItemGroup>\n    <CSFile Incl"...) [FAIL]
      Microsoft.Build.Engine.UnitTests.EvaluationProfiler_Tests.VerifyProfiledData [FAIL]

--- src/Build.UnitTests/EvaluationProfiler_Tests.cs
+++ src/Build.UnitTests/EvaluationProfiler_Tests.cs
@@ -62,7 +62,11 @@
 <ItemGroup>
     <CSFile Include='file.cs'/>
 </ItemGroup>")]
+#if MONO
+        [Theory(Skip = "https://github.com/Microsoft/msbuild/issues/1240")]
+#else
         [Theory]
+#endif
         public void VerifySimpleProfiledData(string elementName, string body)
         {
             string contents = $@"
@@ -76,7 +80,11 @@
             Assert.True(profiledElements.Any(location => location.ElementName == elementName));
         }

+#if MONO
+        [Fact(Skip = "https://github.com/Microsoft/msbuild/issues/1240")]
+#else
         [Fact]
+#endif
         public void VerifyProfiledData()
         {
             string contents = @"
@@ -134,7 +142,11 @@
             Assert.Equal(1, profiledElements.Count(location => location.ElementName == "Target"));
         }

+#if MONO
+        [Fact(Skip = "https://github.com/Microsoft/msbuild/issues/1240")]
+#else
         [Fact]
+#endif
         public void VerifyProfiledGlobData()
         {
             string contents = @"


Update src/Build.UnitTests/FileUtilitiesRegex_Tests.cs

Co-Authored-By: BenVillalobos <e79efc49b113df965b007ed3ffd9a45b8819d62b@gmail.com>

--- src/Build.UnitTests/FileUtilitiesRegex_Tests.cs
+++ src/Build.UnitTests/FileUtilitiesRegex_Tests.cs
@@ -120,7 +120,7 @@
         }

         /// <summary>
-        /// Tests DrivePattern regex using varopis invalid drive patterns.
+        /// Tests DrivePattern regex using various invalid drive patterns.
         /// </summary>
         [Fact]
         public void DoesStartWithDrivePatternInvalidFormat()


Share more code.

Share more code.

--- src/Compilers/Core/Portable/Syntax/GreenNode.cs
+++ src/Compilers/Core/Portable/Syntax/GreenNode.cs
@@ -450,14 +450,13 @@
             if (hasDiagnostics || hasAnnotations)
             {
                 kindBits |= ExtendedSerializationInfoMask;
-            }
-
-            writer.WriteUInt16(kindBits);
-
-            if (hasDiagnostics || hasAnnotations)
-            {
+                writer.WriteUInt16(kindBits);
                 writer.WriteValue(hasDiagnostics ? this.GetDiagnostics() : null);
                 writer.WriteValue(hasAnnotations ? this.GetAnnotations() : null);
+            }
+            else
+            {
+                writer.WriteUInt16(kindBits);
             }
         }


Update API

Update API

--- vehicle-control/simulation/Assets/Scripts/API.cs
+++ vehicle-control/simulation/Assets/Scripts/API.cs
@@ -29,6 +29,10 @@
 			return _inputData [name];
 		}
 		return null;
+	}
+
+	public float LastSyncTime() {
+		return _lastSyncTime;
 	}

 	void ClearOutput() {


Handle ObjectDisposedException if the cancellation source is disposed just before RecordEventsFromQueue() tries to take a token

--- src/EventRecorder/Recorders/QueueingRecorder.cs
+++ src/EventRecorder/Recorders/QueueingRecorder.cs
@@ -141,16 +141,26 @@
             {
                 while (IsRunning || m_eventWriteQueue.Count > 0)
                 {
-//                    Console.WriteLine("Sleeping");
-//                    Thread.Sleep(15000);
-                    IEvent ev = m_eventWriteQueue.Take(m_cancelSource.Token);
-//                    Console.WriteLine("Finished Sleeping");
-
-                    RecordEventFromQueue(ev);
+                    try
+                    {
+                        IEvent ev = m_eventWriteQueue.Take(m_cancelSource.Token);
+
+                        RecordEventFromQueue(ev);
+                    }
+                    catch (ObjectDisposedException e)
+                    {
+                        // If we see this whilst not running then it may be due to a race where this thread checks
+                        // IsRunning after the stopping thread sets it to false and disposes of the cancellation source.
+                        if (IsRunning)
+                            throw e;
+                        else
+                            break;
+                    }
                 }
             }
             catch (OperationCanceledException)
             {
+                // We expect this if when cancellation is invoked during Stop()
             }

             m_finishedWritingAfterStop.Set();