diff --git a/QuickFiler.Test/Controllers/QfcDatamodelTests.cs b/QuickFiler.Test/Controllers/QfcDatamodelTests.cs index eac26b5f0..a4b3beeef 100644 --- a/QuickFiler.Test/Controllers/QfcDatamodelTests.cs +++ b/QuickFiler.Test/Controllers/QfcDatamodelTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; @@ -313,5 +313,79 @@ public async Task WaitForQueue_WhenWorkerBusyAndQueueShort_AwaitsInjectedTwoHund } #endregion Issue #222 — Injectable time/delay seam + + #region Issue #446 — Top-folder propagation from the master-queue admission scorer + + /// + /// Issue #446. ScoreRemainingQueueMailItemAsync must surface BOTH halves of the + /// scorer result. The scoring service already returns a (Score, TopFolder) pair, but + /// the datamodel discards the folder, so a later consumer has to re-score the same item. + /// Scoring is driven through the ScoringServiceFactory seam added by [P1-T5] so no + /// live Outlook COM is touched, as .claude/rules/general-unit-test.md UT4 requires. + /// + [TestMethod] + public async Task ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder() + { + // Arrange + var model = CreateUninitializedDatamodel(); + var mailItem = new Mock().Object; + var globals = new Mock(MockBehavior.Strict); + + const long ExpectedScore = 875L; + const string ExpectedTopFolder = @"Inbox\Projects\Alpha"; + + var scoringService = new Mock(MockBehavior.Strict); + scoringService + .Setup(x => + x.ScoreAsync( + mailItem, + It.IsAny(), + It.IsAny() + ) + ) + .ReturnsAsync((ExpectedScore, ExpectedTopFolder)); + + SetPrivateField(model, "_globals", globals.Object); + model.ScoringServiceFactory = () => scoringService.Object; + + // Act + (long Score, string TopFolder) result = await InvokeScoreRemainingQueueMailItemAsync( + model, + mailItem + ); + + // Assert + result + .Score.Should() + .Be(ExpectedScore, "the score half of the scorer result is already propagated"); + result + .TopFolder.Should() + .Be( + ExpectedTopFolder, + "the top-ranked folder the scorer already computed must reach the caller " + + "instead of being discarded and re-derived downstream" + ); + } + + private static Task<(long Score, string TopFolder)> InvokeScoreRemainingQueueMailItemAsync( + QfcDatamodel model, + MailItem mailItem + ) + { + var method = typeof(QfcDatamodel).GetMethod( + "ScoreRemainingQueueMailItemAsync", + NonPublicInstance + ); + method + .Should() + .NotBeNull( + "ScoreRemainingQueueMailItemAsync should exist on QfcDatamodel as a private " + + "instance method" + ); + return (Task<(long Score, string TopFolder)>) + method.Invoke(model, new object[] { mailItem, CancellationToken.None }); + } + + #endregion Issue #446 — Top-folder propagation from the master-queue admission scorer } } diff --git a/QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs b/QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs index c72356005..90ab0f4ed 100644 --- a/QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs +++ b/QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs @@ -1,10 +1,14 @@ -using System; +using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; +using System.Linq; +using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using FluentAssertions; +using Microsoft.Extensions.Time.Testing; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using QuickFiler.Controllers; @@ -34,53 +38,27 @@ public class QfcFormControllerSeamTests private CancellationToken _token; private QfcFormController _controller; - private T GetPrivateField(object obj, string fieldName) - { - var field = obj.GetType() - .GetField( - fieldName, - System.Reflection.BindingFlags.NonPublic - | System.Reflection.BindingFlags.Instance - ); - return (T)field.GetValue(obj); - } + private const BindingFlags PrivateInstance = BindingFlags.NonPublic | BindingFlags.Instance; - private void SetPrivateField(object obj, string fieldName, T value) - { - var field = obj.GetType() - .GetField( - fieldName, - System.Reflection.BindingFlags.NonPublic - | System.Reflection.BindingFlags.Instance - ); - field.SetValue(obj, value); - } + private T GetPrivateField(object obj, string fieldName) => + (T)obj.GetType().GetField(fieldName, PrivateInstance).GetValue(obj); - private static string ReadControllerSource(string fileName) - { - return File.ReadAllText(ResolveRepositoryPath("QuickFiler", "Controllers", fileName)); - } + private void SetPrivateField(object obj, string fieldName, T value) => + obj.GetType().GetField(fieldName, PrivateInstance).SetValue(obj, value); + + private static string ReadControllerSource(string fileName) => + File.ReadAllText(ResolveRepositoryPath("QuickFiler", "Controllers", fileName)); private static string ResolveRepositoryPath(params string[] pathParts) { - var directory = new DirectoryInfo(AppContext.BaseDirectory); - while ( - directory != null - && !Directory.Exists(Path.Combine(directory.FullName, "QuickFiler")) - ) + var dir = new DirectoryInfo(AppContext.BaseDirectory); + while (dir != null && !Directory.Exists(Path.Combine(dir.FullName, "QuickFiler"))) { - directory = directory.Parent; + dir = dir.Parent; } - directory.Should().NotBeNull("source-inspection tests must run under the repository"); - - var resolvedPath = directory.FullName; - foreach (var pathPart in pathParts) - { - resolvedPath = Path.Combine(resolvedPath, pathPart); - } - - return resolvedPath; + dir.Should().NotBeNull("source-inspection tests must run under the repository"); + return pathParts.Aggregate(dir.FullName, Path.Combine); } private QfcFormController CreateQfcFormController() @@ -374,5 +352,145 @@ public void LoadItemsAsync_MailItemPath_DoesNotApplyPostDisplayHighConfidenceRem } #endregion Seam D — CaptureItemSettings via CaptureTlpCellStates + + #region Issue #448 — undo-consumer termination and idle timer + + /// A that counts the delays it is asked for. + private sealed class CountingTimeProvider : FakeTimeProvider + { + public int DelayRequests { get; private set; } + + public override ITimer CreateTimer(TimerCallback cb, object s, TimeSpan due, TimeSpan p) + { + DelayRequests++; + return base.CreateTimer(cb, s, due, p); + } + } + + /// + /// Runs the undo consumer inline against , with a processor seam so + /// no live COM or dispatcher call is made (UT4, D-Plan-3), and optional pre-queued items. + /// + private QfcFormController ArrangeUndoConsumer( + TimeProvider clock, + Func processor = null, + int queuedItems = 0 + ) + { + QfcFormController c = CreateQfcFormController(); + c.TimeProvider = clock; + c.UndoConsumerStarter = body => body(); + c.UndoItemProcessor = processor ?? (_ => Task.CompletedTask); + var q = GetPrivateField>(c, "_undoQueue"); + while (queuedItems-- > 0) + { + q.Add(new Mock().Object); + } + return c; + } + + /// + /// Issue #448. Idle iterations must wait through the injected clock, or the threshold cannot + /// be driven. The task is deliberately not awaited: the pre-fix loop never ends (D5). + /// + [TestMethod] + public void UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay() + { + // Arrange + var clock = new CountingTimeProvider(); + QfcFormController controller = ArrangeUndoConsumer(clock); + // Act — runs inline until the first idle wait, then returns. + _ = controller.UndoConsumerStarter(controller.UndoConsumer); + // Assert + clock.DelayRequests.Should().BeGreaterThanOrEqualTo(1, "idle waits use the seam"); + } + + /// + /// Issue #448. An idle consumer past the threshold must terminate; before the rewrite the + /// exit flag fed a disjunction that kept the loop alive for the session. + /// + [TestMethod] + [Timeout(10000)] + public async Task UndoConsumer_IdleBeyondThreshold_Completes() + { + // Arrange + var clock = new FakeTimeProvider(); + QfcFormController controller = ArrangeUndoConsumer(clock); + // Act + Task consumer = controller.UndoConsumerStarter(controller.UndoConsumer); + clock.Advance(TimeSpan.FromSeconds(11)); + await consumer.ConfigureAwait(false); + // Assert + consumer.Status.Should().Be(TaskStatus.RanToCompletion, "an idle consumer must exit"); + } + + /// + /// Issue #448. The threshold measures time since the last take, not since start. Three takes + /// advance the clock six seconds each (eighteen in aggregate, past the ten-second threshold) + /// while every idle gap stays at zero, so the consumer drains and then waits; a session timer + /// exits instead, which the completion flag and the delay count detect. + /// + [TestMethod] + [Timeout(10000)] + public async Task UndoConsumer_SuccessfulTake_ResetsIdleTimer() + { + // Arrange — the fake processor keeps live COM and the dispatcher out (UT4). + var clock = new CountingTimeProvider(); + var processed = new List(); + QfcFormController controller = ArrangeUndoConsumer( + clock, + item => + { + processed.Add(item); + clock.Advance(TimeSpan.FromSeconds(6)); + return Task.CompletedTask; + }, + queuedItems: 3 + ); + // Act — drains all three takes inline, then parks on its first idle wait. + Task consumer = controller.UndoConsumerStarter(controller.UndoConsumer); + // Assert + processed.Should().HaveCount(3, "18 s of takes must not end the consumer"); + consumer.IsCompleted.Should().BeFalse("the consumer parked instead of exiting"); + clock.DelayRequests.Should().Be(1, "it took the idle branch, not the exit branch"); + // Idle past the threshold measured from the last take does end it. + clock.Advance(TimeSpan.FromSeconds(11)); + await consumer.ConfigureAwait(false); + consumer.Status.Should().Be(TaskStatus.RanToCompletion); + } + + /// + /// Issue #448. Every exit path must clear _undoConsumerTask so a later + /// UndoDialog() starts a fresh consumer. A sentinel is planted first, so a path that + /// fails to clear the field leaves the sentinel behind and the assertion fails. + /// + [TestMethod] + [Timeout(10000)] + public async Task UndoConsumer_OnExit_ResetsUndoConsumerTask() + { + // Arrange — one consumer per exit path; the throwing processor stands in for the + // exception disposing _undoQueue mid-take produces. The sentinel makes the assertion + // real: without it the field starts null and every path would pass vacuously. + var idleClock = new FakeTimeProvider(); + QfcFormController idle = ArrangeUndoConsumer(idleClock); + QfcFormController bad = ArrangeUndoConsumer( + new FakeTimeProvider(), + _ => throw new InvalidOperationException("undo failed"), + queuedItems: 1 + ); + SetPrivateField(idle, "_undoConsumerTask", Task.CompletedTask); + SetPrivateField(bad, "_undoConsumerTask", Task.CompletedTask); + // Act — the idle exit, then the exception exit. + Task idleConsumer = idle.UndoConsumerStarter(idle.UndoConsumer); + idleClock.Advance(TimeSpan.FromSeconds(11)); + await idleConsumer.ConfigureAwait(false); + Func act = () => bad.UndoConsumerStarter(bad.UndoConsumer); + await act.Should().ThrowAsync().ConfigureAwait(false); + // Assert — both exit paths cleared the planted sentinel. + GetPrivateField(idle, "_undoConsumerTask").Should().BeNull("idle path clears"); + GetPrivateField(bad, "_undoConsumerTask").Should().BeNull("throw path clears"); + } + + #endregion Issue #448 — undo-consumer termination and idle timer } } diff --git a/QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs b/QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs index f39627020..5d532f645 100644 --- a/QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs +++ b/QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs @@ -1,10 +1,12 @@ -using System; +using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Linq; +using System.Linq.Expressions; +using System.Reflection; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; @@ -74,20 +76,59 @@ private void SetupQfSettings(bool highConfidenceEnabled, double threshold) this._mockApplicationGlobals.SetupGet(x => x.QfSettings).Returns(qfSettings.Object); } - [TestMethod] - public async Task IterateQueueAsync_DataModelComplete() + /// Matcher accepting any value; the default for ArrangeIterate. + private static Expression> AnyValue => x => true; + + /// + /// Shared arrangement for the queue-iteration tests; returns the mocks it wires into + /// _controller. The dequeue matchers are expressions, not values, so a pinned call + /// site stays pinned (q => q == 8) instead of widening to It.IsAny; + /// outcome replaces the dequeue result and is how the exception tests throw. + /// + private ( + Mock DataModel, + Mock Queue, + Mock FormController, + Mock Groups + ) ArrangeIterate( + Expression> quantity = null, + Expression> timeOut = null, + bool complete = false, + IList dequeued = null, + int itemsPerIteration = 8, + QfcDequeueStop stop = QfcDequeueStop.QuantitySatisfied, + Func> outcome = null + ) { - // Arrange - var mockDataModel = new Mock(); - mockDataModel.Setup(m => m.Complete).Returns(true); - mockDataModel - .Setup(m => m.DequeueNextItemGroupAsync(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult((IList)new List())); - var mockQfcQueue = new Mock(); - mockQfcQueue + IList batch = dequeued ?? new List(); + quantity = quantity ?? AnyValue; + timeOut = timeOut ?? AnyValue; + if (outcome == null) + { + outcome = () => Task.FromResult(new QfcDequeueBatch(batch, null, stop)); + } + + var dataModel = new Mock(); + dataModel.Setup(m => m.Complete).Returns(complete); + dataModel + .Setup(m => m.DequeueNextItemGroupAsync(It.Is(quantity), It.Is(timeOut))) + .Returns(Task.FromResult(batch)); + dataModel + .Setup(m => + m.DequeueNextItemGroupWithOutcomeAsync( + It.Is(quantity), + It.Is(timeOut), + It.IsAny(), + It.IsAny>() + ) + ) + .Returns(outcome); + + var queue = new Mock(); + queue .Setup(m => m.CompleteAddingAsync(It.IsAny(), It.IsAny())) .Returns(Task.CompletedTask); - mockQfcQueue + queue .Setup(m => m.EnqueueAsync( It.IsAny>(), @@ -95,90 +136,98 @@ public async Task IterateQueueAsync_DataModelComplete() ) ) .Returns(Task.CompletedTask); - _controller.DataModel = mockDataModel.Object; - _controller.QfcQueue = mockQfcQueue.Object; - // Act - await _controller.IterateQueueAsync(); + var groups = new Mock(); + var formController = new Mock(); + formController.SetupGet(m => m.ItemsPerIteration).Returns(itemsPerIteration); + formController.Setup(m => m.Groups).Returns(groups.Object); - // Assert - mockDataModel.Verify( - m => m.DequeueNextItemGroupAsync(It.IsAny(), It.IsAny()), - Times.Never - ); - mockQfcQueue.Verify( + _controller.DataModel = dataModel.Object; + _controller.QfcQueue = queue.Object; + SetPrivateField("_formController", formController.Object); + + return (dataModel, queue, formController, groups); + } + + /// Assigns a private instance field on the controller under test. + private void SetPrivateField(string name, object value) => + _controller + .GetType() + .GetField(name, BindingFlags.NonPublic | BindingFlags.Instance) + .SetValue(_controller, value); + + /// Verifies the complete-adding invocation count on the queue mock. + private static void VerifyCompleteAdding( + Mock queue, + Func times, + string because = null + ) => + queue.Verify( m => m.CompleteAddingAsync(It.IsAny(), It.IsAny()), - Times.Never + times, + because ); - mockQfcQueue.Verify( + + /// Verifies the unconstrained enqueue invocation count on the queue mock. + private static void VerifyEnqueue(Mock queue, Func times) => + queue.Verify( m => m.EnqueueAsync( It.IsAny>(), It.IsAny() ), - Times.Never + times ); - } [TestMethod] - public async Task IterateQueueAsync_QueueEmpty() + public async Task IterateQueueAsync_DataModelComplete() { // Arrange - var mockDataModel = new Mock(); - mockDataModel.Setup(m => m.Complete).Returns(false); - mockDataModel - .Setup(m => m.DequeueNextItemGroupAsync(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult((IList)new List())); - _controller.DataModel = mockDataModel.Object; - - var mockQfcQueue = new Mock(); - mockQfcQueue - .Setup(m => m.CompleteAddingAsync(It.IsAny(), It.IsAny())) - .Returns(Task.CompletedTask); - mockQfcQueue - .Setup(m => - m.EnqueueAsync( - It.IsAny>(), - It.IsAny() - ) - ) - .Returns(Task.CompletedTask); - _controller.QfcQueue = mockQfcQueue.Object; - - // Mock the QfcFormController - var mockFormController = new Mock(); - mockFormController.Setup(m => m.ItemsPerIteration).Returns(8); - var mockQfcCollectionController = new Mock(); - mockFormController.Setup(m => m.Groups).Returns(mockQfcCollectionController.Object); - _controller - .GetType() - .GetField( - "_formController", - System.Reflection.BindingFlags.NonPublic - | System.Reflection.BindingFlags.Instance - ) - .SetValue(_controller, mockFormController.Object); + var (mockDataModel, mockQfcQueue, _, _) = ArrangeIterate(complete: true); // Act await _controller.IterateQueueAsync(); // Assert mockDataModel.Verify( - m => m.DequeueNextItemGroupAsync(It.IsAny(), It.IsAny()), - Times.Once + m => + m.DequeueNextItemGroupWithOutcomeAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>() + ), + Times.Never ); - mockQfcQueue.Verify( - m => m.CompleteAddingAsync(It.IsAny(), It.IsAny()), - Times.Once + VerifyCompleteAdding(mockQfcQueue, Times.Never); + VerifyEnqueue(mockQfcQueue, Times.Never); + } + + [TestMethod] + public async Task IterateQueueAsync_QueueEmpty() + { + // Arrange — issue #446 made an empty batch insufficient on its own to close the queue, + // so the drained-source stop is now stated explicitly. The assertions are unchanged. + var (mockDataModel, mockQfcQueue, _, _) = ArrangeIterate( + stop: QfcDequeueStop.SourceExhausted ); - mockQfcQueue.Verify( + + // Act + await _controller.IterateQueueAsync(); + + // Assert + mockDataModel.Verify( m => - m.EnqueueAsync( - It.IsAny>(), - It.IsAny() + m.DequeueNextItemGroupWithOutcomeAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>() ), - Times.Never + Times.Once ); + VerifyCompleteAdding(mockQfcQueue, Times.Once); + VerifyEnqueue(mockQfcQueue, Times.Never); } [TestMethod] @@ -186,10 +235,6 @@ public async Task IterateQueueAsync_Queue2() { // Arrange - // Mock DataModel - var mockDataModel = new Mock(); - mockDataModel.Setup(m => m.Complete).Returns(false); - // Setup DequeueNextItemGroupAsync to return 2 mail items var mockMailItem = new Mock(); IList mailItems = new List @@ -197,101 +242,38 @@ public async Task IterateQueueAsync_Queue2() mockMailItem.Object, mockMailItem.Object, }; - mockDataModel - .Setup(m => m.DequeueNextItemGroupAsync(It.IsAny(), It.IsAny())) - .Returns(Task.FromResult(mailItems)); - - // Set the DataModel in the controller to the mock - _controller.DataModel = mockDataModel.Object; - - // Mock the QfcQueue - var mockQfcQueue = new Mock(); - mockQfcQueue - .Setup(m => m.CompleteAddingAsync(It.IsAny(), It.IsAny())) - .Returns(Task.CompletedTask); - mockQfcQueue - .Setup(m => - m.EnqueueAsync( - It.IsAny>(), - It.IsAny() - ) - ) - .Returns(Task.CompletedTask); - _controller.QfcQueue = mockQfcQueue.Object; - - // Mock the QfcFormController - var mockFormController = new Mock(); - mockFormController.Setup(m => m.ItemsPerIteration).Returns(8); - var mockQfcCollectionController = new Mock(); - mockFormController.Setup(m => m.Groups).Returns(mockQfcCollectionController.Object); - _controller - .GetType() - .GetField( - "_formController", - System.Reflection.BindingFlags.NonPublic - | System.Reflection.BindingFlags.Instance - ) - .SetValue(_controller, mockFormController.Object); + var (mockDataModel, mockQfcQueue, _, _) = ArrangeIterate(dequeued: mailItems); // Act await _controller.IterateQueueAsync(); // Assert mockDataModel.Verify( - m => m.DequeueNextItemGroupAsync(It.IsAny(), It.IsAny()), - Times.Once - ); - mockQfcQueue.Verify( - m => m.CompleteAddingAsync(It.IsAny(), It.IsAny()), - Times.Never - ); - mockQfcQueue.Verify( m => - m.EnqueueAsync( - It.IsAny>(), - It.IsAny() + m.DequeueNextItemGroupWithOutcomeAsync( + It.IsAny(), + It.IsAny(), + It.IsAny(), + It.IsAny>() ), Times.Once ); + VerifyCompleteAdding(mockQfcQueue, Times.Never); + VerifyEnqueue(mockQfcQueue, Times.Once); } [TestMethod] public async Task IterateQueueAsync_WhenDequeueReturnsFullQualifiedPage_EnqueuesAllItems() { - var mockDataModel = new Mock(); - mockDataModel.Setup(m => m.Complete).Returns(false); var mailItems = Enumerable .Range(0, 8) .Select(_ => new Mock().Object) .ToList(); - mockDataModel - .Setup(m => m.DequeueNextItemGroupAsync(8, 2000)) - .Returns(Task.FromResult((IList)mailItems)); - _controller.DataModel = mockDataModel.Object; - - var mockQfcQueue = new Mock(); - mockQfcQueue - .Setup(m => - m.EnqueueAsync( - It.Is>(items => items.SequenceEqual(mailItems)), - It.IsAny() - ) - ) - .Returns(Task.CompletedTask); - _controller.QfcQueue = mockQfcQueue.Object; - - var mockFormController = new Mock(); - mockFormController.Setup(m => m.ItemsPerIteration).Returns(8); - var mockQfcCollectionController = new Mock(); - mockFormController.Setup(m => m.Groups).Returns(mockQfcCollectionController.Object); - _controller - .GetType() - .GetField( - "_formController", - System.Reflection.BindingFlags.NonPublic - | System.Reflection.BindingFlags.Instance - ) - .SetValue(_controller, mockFormController.Object); + var (_, mockQfcQueue, _, mockQfcCollectionController) = ArrangeIterate( + q => q == 8, + t => t == 2000, + dequeued: mailItems + ); await _controller.IterateQueueAsync(); @@ -303,10 +285,7 @@ public async Task IterateQueueAsync_WhenDequeueReturnsFullQualifiedPage_Enqueues ), Times.Once ); - mockQfcQueue.Verify( - m => m.CompleteAddingAsync(It.IsAny(), It.IsAny()), - Times.Never - ); + VerifyCompleteAdding(mockQfcQueue, Times.Never); } [TestMethod] @@ -327,14 +306,7 @@ public void Iterate_ExecutesCorrectly() SetupQfSettings(highConfidenceEnabled: false, threshold: 0.90); var mockFormController = new Mock(); - _controller - .GetType() - .GetField( - "_formController", - System.Reflection.BindingFlags.NonPublic - | System.Reflection.BindingFlags.Instance - ) - .SetValue(_controller, mockFormController.Object); + SetPrivateField("_formController", mockFormController.Object); // Act _controller.Iterate(); @@ -366,24 +338,12 @@ public void Iterate_HighConfidenceEnabled_DoesNotLoadDirectSynchronousBatch() SetupQfSettings(highConfidenceEnabled: true, threshold: 0.90); - var mockDataModel = new Mock(); + var (mockDataModel, _, mockFormController, _) = ArrangeIterate( + q => q == itemsPerIteration, + itemsPerIteration: itemsPerIteration + ); mockDataModel.Setup(m => m.DequeueNextItemGroup(It.IsAny())).Returns(directBatch); - mockDataModel - .Setup(m => m.DequeueNextItemGroupAsync(itemsPerIteration, It.IsAny())) - .ReturnsAsync(new List()); - _controller.DataModel = mockDataModel.Object; - - var mockFormController = new Mock(); - mockFormController.SetupGet(m => m.ItemsPerIteration).Returns(itemsPerIteration); mockFormController.Setup(m => m.LoadItems(It.IsAny>())); - _controller - .GetType() - .GetField( - "_formController", - System.Reflection.BindingFlags.NonPublic - | System.Reflection.BindingFlags.Instance - ) - .SetValue(_controller, mockFormController.Object); // Act _controller.Iterate(); @@ -410,14 +370,7 @@ public void Iterate2_ExecutesCorrectly() var mockQfcQueue = new Mock(); var mockFormController = new Mock(); _controller.QfcQueue = mockQfcQueue.Object; - _controller - .GetType() - .GetField( - "_formController", - System.Reflection.BindingFlags.NonPublic - | System.Reflection.BindingFlags.Instance - ) - .SetValue(_controller, mockFormController.Object); + SetPrivateField("_formController", mockFormController.Object); _controller.DataModel = mockDataModel.Object; // Act @@ -436,14 +389,7 @@ public void SwapStopWatch_ExecutesCorrectly() { // Arrange var stopWatch = new Stopwatch(); - _controller - .GetType() - .GetField( - "_stopWatch", - System.Reflection.BindingFlags.NonPublic - | System.Reflection.BindingFlags.Instance - ) - .SetValue(_controller, stopWatch); + SetPrivateField("_stopWatch", stopWatch); // Act _controller.SwapStopWatch(); @@ -460,5 +406,92 @@ public void SwapStopWatch_ExecutesCorrectly() .GetValue(_controller) as Stopwatch; Assert.AreEqual(stopWatch, actual); } + + /// + /// Issue #446. A deadline-expired empty batch is not source exhaustion — the master queue + /// may still hold unscanned items — so it must not irreversibly close the UI queue. + /// + [TestMethod] + public async Task IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding() + { + var (_, queue, _, _) = ArrangeIterate(stop: QfcDequeueStop.DeadlineExpired); + + await _controller.IterateQueueAsync(); + + VerifyCompleteAdding( + queue, + Times.Never, + "a deadline-bounded empty batch must not close the queue" + ); + } + + /// + /// Issue #446 negative control for AC2: a genuinely drained source SHOULD close the queue, + /// so a fix that merely stopped calling CompleteAddingAsync would break this test. + /// + [TestMethod] + public async Task IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce() + { + var (_, queue, _, _) = ArrangeIterate(stop: QfcDequeueStop.SourceExhausted); + + await _controller.IterateQueueAsync(); + + VerifyCompleteAdding( + queue, + Times.Once, + "a drained source is the one empty-batch case that may close the queue" + ); + } + + /// + /// Issue #446 coverage: an OperationCanceledException from the dequeue is swallowed. + /// + [TestMethod] + public async Task IterateQueueAsync_DequeueThrowsOperationCanceled_SwallowsAndReturns() + { + ArrangeIterate(outcome: () => throw new OperationCanceledException()); + + Func act = () => _controller.IterateQueueAsync(); + + await act.Should().NotThrowAsync("a cancelled dequeue must not surface to the caller"); + } + + /// + /// Issue #446 coverage: a fault raised while cancellation is pending is swallowed. The + /// token is cancelled from INSIDE the dequeue callback because the entry-guard + /// Token.ThrowIfCancellationRequested() sits outside the try block, so a token + /// already cancelled at entry escapes uncaught and never reaches this branch. + /// + [TestMethod] + public async Task IterateQueueAsync_DequeueThrowsWhenTokenCancelled_SwallowsAndReturns() + { + var source = new CancellationTokenSource(); + SetPrivateField("_token", source.Token); + ArrangeIterate(outcome: () => + { + source.Cancel(); + throw new InvalidOperationException("dequeue failed"); + }); + + Func act = () => _controller.IterateQueueAsync(); + + await act.Should().NotThrowAsync("a fault raised after cancellation is a cancellation"); + } + + /// + /// Issue #446 coverage: a fault with no cancellation pending is rethrown, not swallowed. + /// + [TestMethod] + public async Task IterateQueueAsync_DequeueThrowsWhenTokenNotCancelled_Rethrows() + { + var fault = new InvalidOperationException("dequeue failed"); + ArrangeIterate(outcome: () => throw fault); + + Func act = () => _controller.IterateQueueAsync(); + + (await act.Should().ThrowAsync()) + .Which.Should() + .BeSameAs(fault); + } } } diff --git a/QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs b/QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs index 1d808ce83..97e145f18 100644 --- a/QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs +++ b/QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; @@ -6,6 +6,7 @@ using System.Threading; using System.Threading.Tasks; using FluentAssertions; +using Microsoft.Extensions.Time.Testing; using Microsoft.Office.Interop.Outlook; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; @@ -132,5 +133,130 @@ public async Task DequeueNextItemGroupAsync_HighConfidenceDisabled_PreservesDire moveMonitor.Verify(x => x.UnhookItem(first), Times.Once); moveMonitor.Verify(x => x.UnhookItem(second), Times.Once); } + + /// + /// Issue #426. A candidate the high-confidence dequeue gate discards has already been + /// removed from the master queue and never reaches UnhookDequeuedNodes, so its + /// EmailMoveMonitor hook and its live COM reference are retained for the session. + /// The datamodel must release the hook through its OWN monitor instance exactly once. + /// Scoring is driven through the ScoringServiceFactory seam so no live Outlook COM + /// is touched. + /// + [TestMethod] + public async Task DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor() + { + // Arrange + var model = CreateUninitializedDatamodel(); + var rejectedItem = new Mock().Object; + var masterQueue = new LockingLinkedList(); + masterQueue.AddLast(rejectedItem); + + var settings = new Mock(MockBehavior.Strict); + settings.SetupGet(x => x.HighConfidenceModeEnabled).Returns(true); + settings.SetupGet(x => x.HighConfidenceThreshold).Returns(0.90); + var globals = new Mock(MockBehavior.Strict); + globals.SetupGet(x => x.QfSettings).Returns(settings.Object); + + var scoringService = new Mock(MockBehavior.Strict); + scoringService + .Setup(x => + x.ScoreAsync( + rejectedItem, + It.IsAny(), + It.IsAny() + ) + ) + .ReturnsAsync((100L, string.Empty)); + + var moveMonitor = new Mock(MockBehavior.Strict); + moveMonitor.Setup(x => x.UnhookItem(rejectedItem)); + + SetPrivateField(model, "_globals", globals.Object); + SetPrivateField(model, "_masterQueue", masterQueue); + SetPrivateField(model, "_moveMonitor", moveMonitor.Object); + SetPrivateField(model, "_worker", new BackgroundWorker()); + model.ScoringServiceFactory = () => scoringService.Object; + + // Act + IList result = await model.DequeueNextItemGroupAsync(1, 0); + + // Assert + result.Should().BeEmpty("the drop-on-reject contract is unchanged"); + masterQueue.Count.Should().Be(0, "the rejected candidate is still removed from source"); + moveMonitor.Verify( + x => x.UnhookItem(rejectedItem), + Times.Once, + "the datamodel must release the rejected candidate's monitor hook exactly once" + ); + } + + /// + /// Issue #446. A gate result produced by first-batch deadline expiry must be projected + /// through the datamodel as QfcDequeueStop.DeadlineExpired rather than folded into + /// the generic quantity-satisfied outcome, otherwise the caller cannot tell a + /// deadline-bounded empty batch from genuine exhaustion. Driven by + /// : every score consumes one second of a three-second budget + /// and nothing qualifies, so the deadline exit is the one the gate takes. + /// + [TestMethod] + public async Task DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop() + { + // Arrange + var model = CreateUninitializedDatamodel(); + var fake = new FakeTimeProvider(); + model.TimeProvider = fake; + + var masterQueue = new LockingLinkedList(); + for (int i = 0; i < 10; i++) + { + masterQueue.AddLast(new Mock().Object); + } + + var settings = new Mock(MockBehavior.Strict); + settings.SetupGet(x => x.HighConfidenceModeEnabled).Returns(true); + settings.SetupGet(x => x.HighConfidenceThreshold).Returns(0.90); + var globals = new Mock(MockBehavior.Strict); + globals.SetupGet(x => x.QfSettings).Returns(settings.Object); + + var scoringService = new Mock(MockBehavior.Strict); + scoringService + .Setup(x => + x.ScoreAsync( + It.IsAny(), + It.IsAny(), + It.IsAny() + ) + ) + .Returns(() => + { + fake.Advance(TimeSpan.FromSeconds(1)); + return Task.FromResult((100L, string.Empty)); + }); + + var moveMonitor = new Mock(MockBehavior.Strict); + SetPrivateField(model, "_globals", globals.Object); + SetPrivateField(model, "_masterQueue", masterQueue); + SetPrivateField(model, "_moveMonitor", moveMonitor.Object); + SetPrivateField(model, "_worker", new BackgroundWorker()); + SetPrivateField(model, "_remainingLoadActive", true); + model.ScoringServiceFactory = () => scoringService.Object; + + // Act + QfcDequeueBatch batch = await model.DequeueNextItemGroupWithOutcomeAsync( + 1, + 0, + TimeSpan.FromSeconds(3), + null + ); + + // Assert + batch.Items.Should().BeEmpty("no candidate qualified before the deadline"); + batch + .Stop.Should() + .Be( + QfcDequeueStop.DeadlineExpired, + "a deadline-bounded empty batch must not be reported as quantity satisfaction" + ); + } } } diff --git a/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs b/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs index 69c772b4b..296a5d951 100644 --- a/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs +++ b/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs @@ -59,7 +59,7 @@ out Func takeCounter (mail, token) => { fakeTime.Advance(TimeSpan.FromSeconds(1)); - return Task.FromResult(100L); + return Task.FromResult((100L, "")); }, threshold: 0.90, timeProvider: fakeTime, @@ -104,7 +104,7 @@ public async Task DequeueAsync_LowYieldStream_StopsScanningAtDefaultFirstBatchDe // Each score costs a full second of the first-batch budget. fakeTime.Advance(TimeSpan.FromSeconds(1)); - return Task.FromResult(score); + return Task.FromResult((score, "")); }, threshold: 0.90, timeProvider: fakeTime, @@ -153,7 +153,7 @@ public async Task DequeueAsync_DeadlineExpiresDuringInFlightScore_IncludesFinalA MailItem never = CreateMailItem("never-scanned", "entry-never-scanned"); var source = new Queue(new[] { inFlight, never }); var fakeTime = new FakeTimeProvider(); - var scoreGate = new TaskCompletionSource(); + var scoreGate = new TaskCompletionSource<(long Score, string TopFolder)>(); var takeCount = 0; object gate = CreateGate( @@ -163,7 +163,7 @@ public async Task DequeueAsync_DeadlineExpiresDuringInFlightScore_IncludesFinalA return source.Count == 0 ? null : source.Dequeue(); }, (mail, token) => - ReferenceEquals(mail, inFlight) ? scoreGate.Task : Task.FromResult(950L), + ReferenceEquals(mail, inFlight) ? scoreGate.Task : Task.FromResult((950L, "")), threshold: 0.90, timeProvider: fakeTime, sourceActive: () => false, @@ -177,7 +177,7 @@ public async Task DequeueAsync_DeadlineExpiresDuringInFlightScore_IncludesFinalA fakeTime.Advance(TimeSpan.FromSeconds(6)); pending.IsCompleted.Should().BeFalse("expiry must not abandon the in-flight score"); - scoreGate.SetResult(950L); + scoreGate.SetResult((950L, "")); IList result = await pending; // Assert @@ -242,7 +242,7 @@ public async Task DequeueAsync_QuantitySatisfiedBeforeExpiry_ReturnsUnchangedBat takeCount++; return source.Count == 0 ? null : source.Dequeue(); }, - (mail, token) => Task.FromResult(950L), + (mail, token) => Task.FromResult((950L, "")), threshold: 0.90, timeProvider: fakeTime, sourceActive: () => false @@ -286,7 +286,7 @@ public async Task DequeueAsync_DisabledSentinel_ReproducesUnboundedPreChangeBeha (mail, token) => { fakeTime.Advance(TimeSpan.FromSeconds(1)); - return Task.FromResult(ReferenceEquals(mail, qualifying) ? 950L : 100L); + return Task.FromResult((ReferenceEquals(mail, qualifying) ? 950L : 100L, "")); }, threshold: 0.90, timeProvider: fakeTime, @@ -321,7 +321,7 @@ public void Constructor_NonPositiveNonSentinelDeadline_IsRejectedByGuardClause() System.Action act = () => CreateGate( () => null, - (mail, token) => Task.FromResult(0L), + (mail, token) => Task.FromResult((0L, "")), threshold: 0.90, firstBatchDeadline: invalid ); @@ -353,7 +353,7 @@ public async Task DequeueAsync_DeadlineExpiry_EmitsOneExpiryLineAndKeepsPerCandi (mail, token) => { fakeTime.Advance(TimeSpan.FromSeconds(1)); - return Task.FromResult(100L); + return Task.FromResult((100L, "")); }, threshold: 0.90, timeProvider: fakeTime, @@ -393,7 +393,7 @@ public async Task DequeueAsync_CancelledDuringEmptyQueueWait_ThrowsOperationCanc var fakeTime = new FakeTimeProvider(); object gate = CreateGate( () => null, - (mail, token) => Task.FromResult(950L), + (mail, token) => Task.FromResult((950L, "")), threshold: 0.90, timeProvider: fakeTime, sourceActive: () => true, @@ -439,7 +439,7 @@ public async Task DequeueAsync_CancelledDuringScoring_ThrowsOperationCanceled() { // The score completes, but was cancelled while in flight. cts.Cancel(); - return Task.FromResult(950L); + return Task.FromResult((950L, "")); }, threshold: 0.90, timeProvider: fakeTime, diff --git a/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs b/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs index aa38afca1..0d66b7477 100644 --- a/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs +++ b/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -7,6 +7,7 @@ using Microsoft.Extensions.Time.Testing; using Microsoft.Office.Interop.Outlook; using Microsoft.VisualStudio.TestTools.UnitTesting; +using QuickFiler.Interfaces; namespace QuickFiler.Controllers.Tests { @@ -40,9 +41,13 @@ public async Task DequeueAsync_ProgressCallback_FiresOncePerScannedCandidateMono () => source.Count == 0 ? null : source.Dequeue(), (mail, token) => Task.FromResult( - ReferenceEquals(mail, candidates[1]) || ReferenceEquals(mail, candidates[3]) - ? 950L - : 100L + ( + ReferenceEquals(mail, candidates[1]) + || ReferenceEquals(mail, candidates[3]) + ? 950L + : 100L, + "" + ) ), threshold: 0.90, timeProvider: new FakeTimeProvider(), @@ -89,7 +94,7 @@ public async Task DequeueAsync_ProgressCallback_StopsReportingOnceTheMethodRetur (mail, token) => { fakeTime.Advance(TimeSpan.FromSeconds(1)); - return Task.FromResult(100L); + return Task.FromResult((100L, "")); }, threshold: 0.90, timeProvider: fakeTime, @@ -129,7 +134,7 @@ public async Task DequeueAsync_ThrowingProgressCallback_PropagatesAndLeavesSourc object gate = CreateGate( () => source.Count == 0 ? null : source.Dequeue(), - (mail, token) => Task.FromResult(950L), + (mail, token) => Task.FromResult((950L, "")), threshold: 0.90, timeProvider: new FakeTimeProvider(), sourceActive: () => false, @@ -148,5 +153,118 @@ public async Task DequeueAsync_ThrowingProgressCallback_PropagatesAndLeavesSourc .HaveCount(5, "only the first candidate was taken before the sink threw"); source.Dequeue().Should().BeSameAs(candidates[1], "the remainder stays takeable"); } + + /// + /// Issue #446. A deadline-bounded empty result must be distinguishable from genuine source + /// exhaustion, otherwise the caller closes the UI queue for the rest of the session while + /// the master queue still holds unscanned items. Driven by FakeTimeProvider: each + /// score consumes one second of a three-second budget and nothing qualifies, so the + /// deadline exit is the one taken. + /// + [TestMethod] + public async Task DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop() + { + // Arrange + var fakeTime = new FakeTimeProvider(); + var source = new Queue( + Enumerable + .Range(1, 10) + .Select(i => CreateMailItem($"reject-{i}", $"entry-reject-{i}")) + ); + object gate = CreateGate( + () => source.Count == 0 ? null : source.Dequeue(), + (mail, token) => + { + fakeTime.Advance(TimeSpan.FromSeconds(1)); + return Task.FromResult((100L, "")); + }, + threshold: 0.90, + timeProvider: fakeTime, + sourceActive: () => true, + firstBatchDeadline: TimeSpan.FromSeconds(3) + ); + + // Act + QfcGateBatch batch = await DequeueBatchAsync(gate, 1, 0, CancellationToken.None); + + // Assert + batch + .Stop.Should() + .Be( + QfcDequeueStop.DeadlineExpired, + "an empty batch caused by the first-batch deadline is not source exhaustion" + ); + batch.Accepted.Should().BeEmpty("no candidate qualified before the deadline"); + } + + /// + /// Issue #446. The complementary exit: when the take delegate returns null and the producer + /// reports it is no longer loading, the source really is drained and the caller may close + /// the queue. + /// + [TestMethod] + public async Task DequeueAsync_SourceDrained_ReportsSourceExhaustedStop() + { + // Arrange + object gate = CreateGate( + () => null, + (mail, token) => Task.FromResult((950L, "")), + threshold: 0.90, + timeProvider: new FakeTimeProvider(), + sourceActive: () => false + ); + + // Act + QfcGateBatch batch = await DequeueBatchAsync(gate, 1, 0, CancellationToken.None); + + // Assert + batch + .Stop.Should() + .Be( + QfcDequeueStop.SourceExhausted, + "a drained source with no active producer is genuine exhaustion" + ); + batch.Accepted.Should().BeEmpty("there was nothing to take"); + } + + /// + /// Issue #446 and Scope 427-A. The gate already computes the top-ranked folder for every + /// candidate it scores. Discarding that folder for accepted candidates forces the consuming + /// UI layer to re-score the same item against the same classifier, so the accepted carrier + /// must expose the folder the gate scored it against. + /// + [TestMethod] + public async Task DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult() + { + // Arrange + const string ExpectedFolder = @"Inbox\Projects\Alpha"; + var candidate = CreateMailItem("accepted", "entry-accepted"); + var source = new Queue(new[] { candidate }); + + object gate = CreateGate( + () => source.Count == 0 ? null : source.Dequeue(), + (mail, token) => Task.FromResult((950L, ExpectedFolder)), + threshold: 0.90, + timeProvider: new FakeTimeProvider(), + sourceActive: () => false + ); + + // Act + QfcGateBatch batch = await DequeueBatchAsync(gate, 1, 0, CancellationToken.None); + + // Assert + QfcPreScoredItem accepted = batch + .Accepted.Should() + .ContainSingle("the single high-scoring candidate qualifies") + .Which; + accepted.MailItem.Should().BeSameAs(candidate); + accepted + .PredeterminedFolder.Should() + .Be( + ExpectedFolder, + "the folder the score loader already returned must travel with the accepted " + + "candidate instead of being discarded and re-derived downstream" + ); + } } } diff --git a/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs b/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs index 08555d7ec..944ad08f3 100644 --- a/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs +++ b/QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs @@ -25,13 +25,14 @@ private static MailItem CreateMailItem(string subject, string entryId) private static object CreateGate( Func tryTakeNext, - Func> scoreLoader, + Func> scoreLoader, double threshold, TimeProvider timeProvider = null, Action debugLog = null, Func sourceActive = null, TimeSpan? firstBatchDeadline = null, - Action progressCallback = null + Action progressCallback = null, + Action onRejected = null ) { Type gateType = typeof(QfcDatamodel).Assembly.GetType( @@ -39,119 +40,45 @@ private static object CreateGate( ); gateType.Should().NotBeNull("the dequeue-layer confidence gate must exist"); - // Issue #424: the gate gained an optional first-batch deadline and an optional progress - // callback. Prefer the widest constructor; fall back to the older shapes so this helper - // keeps compiling against a pre-#424 gate. - ConstructorInfo constructorWithProgress = gateType.GetConstructor( + // Issue #446: one exact lookup for the widest declared constructor, guarded so the + // helper fails CLOSED. The former four-step descending fallback chain failed OPEN: + // when the wider lookups missed it silently succeeded on the five-type shape and + // constructed a gate with sourceActive null, the default deadline and no progress + // callback, across every consuming test method in this class. + ConstructorInfo constructor = gateType.GetConstructor( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, binder: null, types: new[] { typeof(Func), - typeof(Func>), + typeof(Func>), typeof(double), typeof(TimeProvider), typeof(Action), typeof(Func), typeof(TimeSpan?), typeof(Action), + typeof(Action), }, modifiers: null ); - if (constructorWithProgress != null) - { - return constructorWithProgress.Invoke( - new object[] - { - tryTakeNext, - scoreLoader, - threshold, - timeProvider, - debugLog, - sourceActive, - firstBatchDeadline, - progressCallback, - } - ); - } - - ConstructorInfo constructorWithDeadline = gateType.GetConstructor( - BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, - binder: null, - types: new[] - { - typeof(Func), - typeof(Func>), - typeof(double), - typeof(TimeProvider), - typeof(Action), - typeof(Func), - typeof(TimeSpan?), - }, - modifiers: null - ); - if (constructorWithDeadline != null) - { - return constructorWithDeadline.Invoke( - new object[] - { - tryTakeNext, - scoreLoader, - threshold, - timeProvider, - debugLog, - sourceActive, - firstBatchDeadline, - } - ); - } - - ConstructorInfo constructorWithSourceState = gateType.GetConstructor( - BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, - binder: null, - types: new[] - { - typeof(Func), - typeof(Func>), - typeof(double), - typeof(TimeProvider), - typeof(Action), - typeof(Func), - }, - modifiers: null - ); - if (constructorWithSourceState != null) - { - return constructorWithSourceState.Invoke( - new object[] - { - tryTakeNext, - scoreLoader, - threshold, - timeProvider, - debugLog, - sourceActive, - } - ); - } - - ConstructorInfo constructor = gateType.GetConstructor( - BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, - binder: null, - types: new[] - { - typeof(Func), - typeof(Func>), - typeof(double), - typeof(TimeProvider), - typeof(Action), - }, - modifiers: null - ); - constructor.Should().NotBeNull("the gate must expose the planned testable seam"); + constructor + .Should() + .NotBeNull("the gate must expose the nine-parameter testable constructor seam"); return constructor.Invoke( - new object[] { tryTakeNext, scoreLoader, threshold, timeProvider, debugLog } + new object[] + { + tryTakeNext, + scoreLoader, + threshold, + timeProvider, + debugLog, + sourceActive, + firstBatchDeadline, + progressCallback, + onRejected, + } ); } @@ -163,7 +90,8 @@ private static object CreateGate( Action debugLog = null, Func sourceActive = null, TimeSpan? firstBatchDeadline = null, - Action progressCallback = null + Action progressCallback = null, + Action onRejected = null ) { return CreateGate( @@ -171,14 +99,15 @@ private static object CreateGate( (mail, token) => { token.ThrowIfCancellationRequested(); - return Task.FromResult(scores[mail]); + return Task.FromResult((scores[mail], "")); }, threshold, timeProvider, debugLog, sourceActive, firstBatchDeadline, - progressCallback + progressCallback, + onRejected ); } @@ -188,6 +117,21 @@ private static async Task> DequeueAsync( int timeOut, CancellationToken token ) + { + // Issue #446: the gate now returns a QfcGateBatch. Project Accepted back to + // IList so the pre-existing gate tests keep their current shape; the + // stop-reason and folder-carrying assertions use DequeueBatchAsync instead. + QfcGateBatch batch = await DequeueBatchAsync(gate, quantity, timeOut, token) + .ConfigureAwait(false); + return batch.Accepted.Select(x => x.MailItem).ToList(); + } + + private static async Task DequeueBatchAsync( + object gate, + int quantity, + int timeOut, + CancellationToken token + ) { MethodInfo method = gate.GetType() .GetMethod( @@ -200,8 +144,7 @@ CancellationToken token method.Should().NotBeNull("the gate must expose the planned dequeue operation"); var task = - (Task>) - method.Invoke(gate, new object[] { quantity, timeOut, token }); + (Task)method.Invoke(gate, new object[] { quantity, timeOut, token }); return await task.ConfigureAwait(false); } @@ -282,7 +225,7 @@ public async Task DequeueAsync_PropagatesCancellationBeforeTakingSourceItem() { object gate = CreateGate( () => throw new AssertFailedException("source must not be read after cancellation"), - (mail, token) => Task.FromResult(1000L), + (mail, token) => Task.FromResult((1000L, "")), threshold: 0.90 ); using (var cts = new CancellationTokenSource()) @@ -321,7 +264,7 @@ public async Task DequeueAsync_WhenSourceInitiallyEmpty_WaitsWithTimeProviderBef takeCount++; return takeCount == 1 ? null : item; }, - (mail, token) => Task.FromResult(950L), + (mail, token) => Task.FromResult((950L, "")), threshold: 0.90, timeProvider: fakeTime ); @@ -347,7 +290,7 @@ public async Task DequeueAsync_SourceActiveAfterRepeatedEmptyReads_ContinuesPoll takeCount++; return takeCount < 3 ? null : item; }, - (mail, token) => Task.FromResult(950L), + (mail, token) => Task.FromResult((950L, "")), threshold: 0.90, timeProvider: fakeTime, sourceActive: () => takeCount < 3 @@ -392,6 +335,107 @@ public async Task DequeueAsync_SubsequentScreenNonEmptyAcceptedPrefixPastDeadlin .Equal(Enumerable.Range(1, 8).Select(i => $"high-{i}")); } + /// + /// Issue #426. A candidate the gate discards has already been removed from the source + /// queue and never reaches the accepted-path unhook, so the gate must report it exactly + /// once through the rejection sink. Asserting the invocation count is what makes this a + /// real gate: a test that only asserted the item was discarded would pass vacuously. + /// + [TestMethod] + public async Task DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce() + { + // Arrange + var item = CreateMailItem("reject", "entry-reject"); + var rejected = new List(); + object gate = CreateGate( + new Queue(new[] { item }), + new Dictionary { [item] = 899 }, + onRejected: rejected.Add + ); + + // Act + IList result = await DequeueAsync(gate, 1, 0, CancellationToken.None); + + // Assert + result.Should().BeEmpty("the drop-on-reject contract is unchanged"); + rejected + .Should() + .ContainSingle("the gate must report each discarded candidate exactly once") + .Which.Should() + .BeSameAs(item); + } + + /// + /// Issue #426. A failing move monitor must not abort the dequeue scan. Drives one + /// below-cutoff candidate whose rejection sink throws, followed by an above-cutoff + /// candidate, and asserts both that the sink was invoked exactly once and that the scan + /// went on to accept the second candidate. Asserting the invocation count is what makes + /// this a real gate; a test that only asserted the scan continued would pass vacuously + /// while no sink exists. + /// + [TestMethod] + public async Task DequeueAsync_OnRejectedThrows_ScanContinues() + { + // Arrange + var low = CreateMailItem("low", "entry-low"); + var high = CreateMailItem("high", "entry-high"); + var invocations = new List(); + object gate = CreateGate( + new Queue(new[] { low, high }), + new Dictionary { [low] = 899, [high] = 950 }, + onRejected: mail => + { + invocations.Add(mail); + throw new InvalidOperationException("monitor unavailable"); + } + ); + + // Act + IList result = await DequeueAsync(gate, 1, 0, CancellationToken.None); + + // Assert + invocations + .Should() + .ContainSingle("the throwing sink must still be invoked once for the rejected item") + .Which.Should() + .BeSameAs(low); + result + .Should() + .ContainSingle("a sink failure must not abort the scan") + .Which.Should() + .BeSameAs(high); + } + + /// + /// Issue #426 negative control (AC13). An accepted candidate is unhooked on the accepted + /// path by UnhookDequeuedNodes, so the rejection sink must not fire for it; a + /// second release would be a double unhook. Green in both the pre-fix and post-fix states + /// by construction, so it is not tagged expect-fail. + /// + [TestMethod] + public async Task DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected() + { + // Arrange + var item = CreateMailItem("accept", "entry-accept"); + var rejected = new List(); + object gate = CreateGate( + new Queue(new[] { item }), + new Dictionary { [item] = 950 }, + onRejected: rejected.Add + ); + + // Act + IList result = await DequeueAsync(gate, 1, 0, CancellationToken.None); + + // Assert + result.Should().ContainSingle().Which.Should().BeSameAs(item); + rejected + .Should() + .BeEmpty( + "an accepted candidate is released on the accepted path, not the rejection path" + ); + } + private static async Task> DequeuePastDeadlineQualifiersAsync(int quantity) { var qualifiers = Enumerable @@ -410,7 +454,7 @@ private static async Task> DequeuePastDeadlineQualifiersAsync(in (mail, token) => { fakeTime.Advance(TimeSpan.FromSeconds(1)); - return Task.FromResult(qualifiers.Contains(mail) ? 950L : 100L); + return Task.FromResult((qualifiers.Contains(mail) ? 950L : 100L, "")); }, threshold: 0.90, timeProvider: fakeTime, diff --git a/QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs b/QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs index 836ca3999..b58e583eb 100644 --- a/QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs +++ b/QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs @@ -1,9 +1,10 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.Office.Interop.Outlook; +using QuickFiler.Interfaces; namespace QuickFiler.Controllers { @@ -98,6 +99,43 @@ Action progress return await DequeueDirectAsync(quantity); } + /// + /// Issue #446. Outcome-bearing dequeue. In high-confidence mode the gate's own stop reason + /// and accepted carriers are propagated verbatim. In normal mode nothing is scored, so + /// is empty and a short batch is reported as + /// : the direct path takes whatever the master + /// queue holds after , so fewer items than requested means the + /// source could not supply them. + /// + public async Task DequeueNextItemGroupWithOutcomeAsync( + int quantity, + int timeOut, + TimeSpan firstBatchDeadline, + Action progress + ) + { + _token.ThrowIfCancellationRequested(); + + if (_globals?.QfSettings?.HighConfidenceModeEnabled == true) + { + return await DequeueWithHighConfidenceGateWithOutcomeAsync( + quantity, + timeOut, + firstBatchDeadline, + progress + ); + } + + IList items = await DequeueDirectAsync(quantity); + return new QfcDequeueBatch( + items, + new List(), + (items?.Count ?? 0) < quantity + ? QfcDequeueStop.SourceExhausted + : QfcDequeueStop.QuantitySatisfied + ); + } + private async Task> DequeueDirectAsync(int quantity) { if (_masterQueue.Count < quantity) @@ -113,6 +151,28 @@ private async Task> DequeueWithHighConfidenceGateAsync( TimeSpan? firstBatchDeadline = null, Action progress = null ) + { + QfcDequeueBatch batch = await DequeueWithHighConfidenceGateWithOutcomeAsync( + quantity, + timeOut, + firstBatchDeadline, + progress + ); + return batch.Items; + } + + /// + /// Issue #446 and Scope 427-A. The high-confidence dequeue with the gate's outcome intact. + /// is taken from the same accepted set as + /// , after has run + /// over it, so the two collections describe one dequeue rather than two. + /// + private async Task DequeueWithHighConfidenceGateWithOutcomeAsync( + int quantity, + int timeOut, + TimeSpan? firstBatchDeadline = null, + Action progress = null + ) { var gate = new QfcStreamingDequeueConfidenceGate( () => _masterQueue.TryTakeFirst(), @@ -122,11 +182,36 @@ private async Task> DequeueWithHighConfidenceGateAsync( null, () => _remainingLoadActive, firstBatchDeadline, - progress + progress, + onRejected: TryReleaseRejectedHook ); - var nodes = (await gate.DequeueAsync(quantity, timeOut, _token)).ToList(); - return UnhookDequeuedNodes(nodes); + QfcGateBatch batch = await gate.DequeueAsync(quantity, timeOut, _token); + IList accepted = batch.Accepted; + var nodes = accepted.Select(x => x.MailItem).ToList(); + return new QfcDequeueBatch(UnhookDequeuedNodes(nodes), accepted, batch.Stop); + } + + /// + /// Issue #426. Releases the EmailMoveMonitor hook of a candidate the high-confidence + /// gate discarded. The rejected candidate is already out of the master queue and never + /// reaches , so without this its hook and its live COM + /// reference are retained for the session. Exactly one UnhookItem call per rejected + /// item preserves the one-marshal-hop-per-operation contract. A monitor failure is logged + /// and swallowed: the candidate is discarded either way and aborting the scan would strand + /// the rest of the batch. + /// + private void TryReleaseRejectedHook(MailItem item) + { + try + { + _moveMonitor.UnhookItem(item); + } + catch (System.Exception e) + { + logger.Error("Error unhooking rejected item from move monitor", e); + return; + } } public IList DequeueNextItemGroup(int quantity) @@ -165,6 +250,32 @@ private IList UnhookDequeuedNodes(List nodes) return nodes; } + /// + /// Injectable factory for the master-queue admission scorer. Defaults to a fresh + /// so production behaviour is unchanged; tests assign a + /// factory returning a mock so can be driven + /// without a live Outlook session, which + /// .claude/rules/general-unit-test.md UT4 requires. + /// + internal Func ScoringServiceFactory { get; set; } = + () => new FolderScoringService(); + + private async Task<(long Score, string TopFolder)> ScoreRemainingQueueMailItemAsync( + MailItem mailItem, + CancellationToken cancel + ) + { + var scoringService = ScoringServiceFactory(); + var score = await scoringService + .ScoreAsync(mailItem, _globals, cancel) + .ConfigureAwait(false); + logger.Debug( + $"Probability debug [QfcDatamodel.ScoreRemainingQueueMailItemAsync (master-queue admission)] " + + $"Subject='{mailItem.Subject}' EntryID='{mailItem.EntryID}' Score={score.Score}" + ); + return (score.Score, score.TopFolder); + } + internal async Task WaitForQueue(int quantity, CancellationToken token) { while (_remainingLoadActive && (_masterQueue?.Count < quantity)) diff --git a/QuickFiler/Controllers/QfcDatamodel.cs b/QuickFiler/Controllers/QfcDatamodel.cs index 6e830e09b..48b338405 100644 --- a/QuickFiler/Controllers/QfcDatamodel.cs +++ b/QuickFiler/Controllers/QfcDatamodel.cs @@ -352,7 +352,7 @@ CancellationToken cancel { var admission = new QfcRemainingQueueAdmission( _globals, - ScoreRemainingQueueMailItemAsync, + async (m, t) => (await ScoreRemainingQueueMailItemAsync(m, t)).Score, _masterQueue.AddLast, _moveMonitor.HookItem, x => _masterQueue.Remove(x) @@ -360,22 +360,6 @@ CancellationToken cancel return await admission.TryQueueAsync(mailItem, cancel).ConfigureAwait(false); } - private async Task ScoreRemainingQueueMailItemAsync( - MailItem mailItem, - CancellationToken cancel - ) - { - var scoringService = new FolderScoringService(); - var score = await scoringService - .ScoreAsync(mailItem, _globals, cancel) - .ConfigureAwait(false); - logger.Debug( - $"Probability debug [QfcDatamodel.ScoreRemainingQueueMailItemAsync (master-queue admission)] " - + $"Subject='{mailItem.Subject}' EntryID='{mailItem.EntryID}' Score={score.Score}" - ); - return score.Score; - } - private bool LoadRemainingEmailsToQueue(BackgroundWorker bw, CancellationToken token) { if ((_frame is null) || (_frame.RowCount == 0)) diff --git a/QuickFiler/Controllers/QfcFormController.Actions.cs b/QuickFiler/Controllers/QfcFormController.Actions.cs index a38604113..7d57f3965 100644 --- a/QuickFiler/Controllers/QfcFormController.Actions.cs +++ b/QuickFiler/Controllers/QfcFormController.Actions.cs @@ -201,6 +201,62 @@ public void MinimizeFormViewer() ); } + /// + /// Issue #448. Clock seam for . Defaults to + /// so production behaviour is unchanged; tests + /// assign a FakeTimeProvider so the ten-second idle threshold can be driven without + /// a real wall-clock wait, which `.claude/rules/general-unit-test.md` requires. + /// + internal TimeProvider TimeProvider { get; set; } = TimeProvider.System; + + /// + /// Issue #448. Start seam for the undo consumer. Defaults to Task.Run so production + /// behaviour is unchanged; tests assign body => body() to run the consumer inline + /// and observe its completion deterministically. + /// + internal Func, Task> UndoConsumerStarter { get; set; } = body => Task.Run(body); + + private Func _undoItemProcessor; + + /// + /// Issue #448. Per-item seam for the undo consumer's successful-take branch. Defaults to + /// , which holds that branch verbatim, so production + /// behaviour is byte-for-byte unchanged. The default is resolved lazily rather than in a + /// property initializer because an instance initializer cannot reference an instance method + /// (CS0236). Tests assign a fake so no live Outlook COM call and no WinForms dispatcher + /// call is made, which `.claude/rules/general-unit-test.md` UT4 prohibits in unit tests. + /// + internal Func UndoItemProcessor + { + get => _undoItemProcessor ??= ProcessUndoItemAsync; + set => _undoItemProcessor = value; + } + + /// + /// The undo consumer's successful-take branch, extracted verbatim so it can be replaced + /// wholesale by a test double. Untrains the folder classifier on the moved item, moves the + /// mail back, and re-adds it to the on-screen group on the UI thread. + /// + private async Task ProcessUndoItemAsync(IMovedMailInfo item) + { + var helper = await MailItemHelper.FromMailItemAsync( + item.MailItem, + _globals, + default, + true + ); + (await _globals.AF.Manager["Folder"]).UnTrain( + helper.FolderInfo.RelativePath, + helper.Tokens, + 1 + ); + var mail = item.UndoMove(); + await UiThread.Dispatcher.InvokeAsync( + () => _groups.AddItemGroup(mail), + System.Windows.Threading.DispatcherPriority.ContextIdle + ); + } + internal void UndoDialog() { if (_movedItems is null || _globals?.Ol?.App is null) @@ -208,7 +264,7 @@ internal void UndoDialog() return; } - _undoConsumerTask ??= Task.Run(UndoConsumer); + _undoConsumerTask ??= UndoConsumerStarter(UndoConsumer); var olApp = _globals.Ol.App; DialogResult repeatResponse = DialogResult.Yes; var i = 0; @@ -250,43 +306,45 @@ internal void UndoDialog() _movedItems.Serialize(); } + /// + /// Issue #448. How long the undo consumer stays alive with nothing to take before it exits. + /// Preserves the previous ten-second threshold; the change is that it now measures idle time + /// rather than total session time. + /// + private static readonly TimeSpan UndoConsumerIdleTimeout = TimeSpan.FromSeconds(10); + internal async Task UndoConsumer() { - var sw = new Stopwatch(); - sw.Start(); - bool exit = false; - while (!_undoQueue.IsCompleted || exit) + long start = TimeProvider.GetTimestamp(); + try { - if (_undoQueue.TryTake(out var item)) - { - var helper = await MailItemHelper.FromMailItemAsync( - item.MailItem, - _globals, - default, - true - ); - (await _globals.AF.Manager["Folder"]).UnTrain( - helper.FolderInfo.RelativePath, - helper.Tokens, - 1 - ); - var mail = item.UndoMove(); - await UiThread.Dispatcher.InvokeAsync( - () => _groups.AddItemGroup(mail), - System.Windows.Threading.DispatcherPriority.ContextIdle - ); - } - else if (sw.ElapsedMilliseconds > 10000) + while (!_undoQueue.IsCompleted) { - exit = true; - } - else - { - await Task.Delay(200); + if (_undoQueue.TryTake(out var item)) + { + await UndoItemProcessor(item).ConfigureAwait(false); + + // Reset on every successful take so the threshold measures idle time. The + // previous code started one stopwatch for the whole session, so a consumer + // busy for ten seconds exited while items were still arriving. + start = TimeProvider.GetTimestamp(); + } + else if (TimeProvider.GetElapsedTime(start) > UndoConsumerIdleTimeout) + { + break; + } + else + { + await TimeProvider + .Delay(TimeSpan.FromMilliseconds(200)) + .ConfigureAwait(false); + } } } - if (exit) + finally { + // Unconditional so a later UndoDialog() starts a fresh consumer even when this one + // exited by exception, which disposing _undoQueue mid-take can produce. _undoConsumerTask = null; } } diff --git a/QuickFiler/Controllers/QfcHomeController.Iteration.cs b/QuickFiler/Controllers/QfcHomeController.Iteration.cs index a6564d194..ed34f111e 100644 --- a/QuickFiler/Controllers/QfcHomeController.Iteration.cs +++ b/QuickFiler/Controllers/QfcHomeController.Iteration.cs @@ -1,8 +1,9 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading.Tasks; using Microsoft.Office.Interop.Outlook; +using QuickFiler.Interfaces; namespace QuickFiler.Controllers { @@ -18,10 +19,13 @@ public async Task IterateQueueAsync() } try { - var listObjects = await _datamodel.DequeueNextItemGroupAsync( + QfcDequeueBatch batch = await _datamodel.DequeueNextItemGroupWithOutcomeAsync( _formController.ItemsPerIteration, - 2000 + 2000, + QfcStreamingDequeueConfidenceGate.DefaultFirstBatchDeadline, + null ); + IList listObjects = batch.Items; if (listObjects.Count > 0) { //await UiThread.Dispatcher.InvokeAsync(async () => await QfcQueue.EnqueueAsync(listObjects, _formController.Groups)); @@ -29,8 +33,13 @@ await QfcQueue .EnqueueAsync(listObjects, _formController.Groups) .ConfigureAwait(false); } - else + else if (batch.Stop == QfcDequeueStop.SourceExhausted) { + // Issue #446. Only genuine source exhaustion may close the queue: + // CompleteAddingAsync reaches BlockingCollection.CompleteAdding(), which is + // irreversible. An empty batch whose stop reason is DeadlineExpired or + // QuantitySatisfied leaves the queue open so a later iteration can drain the + // items the master queue still holds. //logger.Debug($"{nameof(IterateQueueAsync)} completed"); await QfcQueue.CompleteAddingAsync(Token, 10000); } diff --git a/QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs b/QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs index 1d27d0e1c..bd41ca2d1 100644 --- a/QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs +++ b/QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs @@ -3,9 +3,42 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Office.Interop.Outlook; +using QuickFiler.Interfaces; namespace QuickFiler.Controllers { + /// + /// Issue #446 and Scope 427-A. The gate's own result: the accepted candidates with the folder + /// each was already scored against, the reason the scan stopped, and how many candidates were + /// scanned. Declared as a readonly struct with get-only properties because + /// net481 has no IsExternalInit and therefore no record, + /// record struct or init accessor. + /// + internal readonly struct QfcGateBatch + { + private readonly IList _accepted; + + /// + /// Creates a gate result. A null accepted collection surfaces as an empty list so a + /// defaulted struct is inert rather than a null-reference trap. + /// + public QfcGateBatch(IList accepted, QfcDequeueStop stop, int scanned) + { + _accepted = accepted; + Stop = stop; + Scanned = scanned; + } + + /// The accepted candidates, each carrying its predetermined folder. + public IList Accepted => _accepted ?? new List(); + + /// Why the scan stopped. + public QfcDequeueStop Stop { get; } + + /// How many candidates were scored during the scan. + public int Scanned { get; } + } + internal sealed class QfcStreamingDequeueConfidenceGate { private static readonly log4net.ILog logger = log4net.LogManager.GetLogger( @@ -22,17 +55,22 @@ internal sealed class QfcStreamingDequeueConfidenceGate internal static readonly TimeSpan DefaultFirstBatchDeadline = TimeSpan.FromSeconds(12); private readonly Func _tryTakeNext; - private readonly Func> _scoreLoader; + private readonly Func< + MailItem, + CancellationToken, + Task<(long Score, string TopFolder)> + > _scoreLoader; private readonly long _cutoff; private readonly TimeProvider _timeProvider; private readonly Action _debugLog; private readonly Func _sourceActive; private readonly TimeSpan _firstBatchDeadline; private readonly Action _progressCallback; + private readonly Action _onRejected; internal QfcStreamingDequeueConfidenceGate( Func tryTakeNext, - Func> scoreLoader, + Func> scoreLoader, double threshold, TimeProvider timeProvider = null, Action debugLog = null @@ -54,15 +92,24 @@ internal QfcStreamingDequeueConfidenceGate( /// callback must not touch UI directly — callers route reports through ProgressTracker, /// which marshals to the UI thread. /// + /// + /// Issue #426. Optional sink invoked once for every candidate the gate discards because its + /// score is below the cutoff. A rejected candidate has already been removed from the source + /// queue and never reaches the accepted-path unhook, so without this sink its + /// EmailMoveMonitor hook and its live COM reference are retained for the session. + /// disables the sink. The drop-on-reject contract is unchanged: the + /// candidate is still discarded and is still absent from the result. + /// internal QfcStreamingDequeueConfidenceGate( Func tryTakeNext, - Func> scoreLoader, + Func> scoreLoader, double threshold, TimeProvider timeProvider, Action debugLog, Func sourceActive, TimeSpan? firstBatchDeadline = null, - Action progressCallback = null + Action progressCallback = null, + Action onRejected = null ) { _tryTakeNext = tryTakeNext ?? throw new ArgumentNullException(nameof(tryTakeNext)); @@ -72,6 +119,7 @@ internal QfcStreamingDequeueConfidenceGate( _debugLog = debugLog; _sourceActive = sourceActive; _progressCallback = progressCallback; + _onRejected = onRejected; TimeSpan deadline = firstBatchDeadline ?? DefaultFirstBatchDeadline; if (deadline != Timeout.InfiniteTimeSpan && deadline <= TimeSpan.Zero) @@ -86,7 +134,7 @@ internal QfcStreamingDequeueConfidenceGate( _firstBatchDeadline = deadline; } - internal async Task> DequeueAsync( + internal async Task DequeueAsync( int quantity, int timeOut, CancellationToken token @@ -94,15 +142,15 @@ CancellationToken token { token.ThrowIfCancellationRequested(); - var accepted = new List(); + var accepted = new List(); + int scanned = 0; if (quantity <= 0) { - return accepted; + return new QfcGateBatch(accepted, QfcDequeueStop.QuantitySatisfied, scanned); } bool deadlineEnabled = _firstBatchDeadline != Timeout.InfiniteTimeSpan; long start = _timeProvider.GetTimestamp(); - int scanned = 0; bool alreadyWaitedForEmptySource = false; while (accepted.Count < quantity) @@ -116,7 +164,7 @@ CancellationToken token ) { LogDeadlineExpiry(accepted.Count, scanned); - return accepted; + return new QfcGateBatch(accepted, QfcDequeueStop.DeadlineExpired, scanned); } MailItem mailItem = _tryTakeNext(); @@ -125,7 +173,7 @@ CancellationToken token bool sourceCanStillProduce = _sourceActive?.Invoke() == true; if (timeOut <= 0 || (alreadyWaitedForEmptySource && !sourceCanStillProduce)) { - return accepted; + return new QfcGateBatch(accepted, QfcDequeueStop.SourceExhausted, scanned); } alreadyWaitedForEmptySource = true; @@ -136,14 +184,34 @@ await _timeProvider } alreadyWaitedForEmptySource = false; - long score = await _scoreLoader(mailItem, token).ConfigureAwait(false); + (long score, string topFolder) = await _scoreLoader(mailItem, token) + .ConfigureAwait(false); token.ThrowIfCancellationRequested(); scanned++; LogScore(mailItem, score); if (score >= _cutoff) { - accepted.Add(mailItem); + accepted.Add(new QfcPreScoredItem(mailItem, topFolder)); + } + else + { + // Issue #426. The discarded candidate is already out of the source queue and + // never reaches the accepted-path unhook, so it is reported here. A monitor + // failure must not abort the scan, hence the catch: the candidate is still + // dropped either way, and aborting would strand the rest of the batch. + try + { + _onRejected?.Invoke(mailItem); + } + catch (System.Exception e) + { + logger.Error( + "Rejection sink threw [QfcStreamingDequeueConfidenceGate.DequeueAsync]; " + + "the candidate is still discarded and the scan continues.", + e + ); + } } // Report after the accept decision so `accepted` reflects this candidate. Exceptions @@ -151,7 +219,7 @@ await _timeProvider _progressCallback?.Invoke(scanned, accepted.Count, quantity); } - return accepted; + return new QfcGateBatch(accepted, QfcDequeueStop.QuantitySatisfied, scanned); } private void LogDeadlineExpiry(int acceptedCount, int scannedCount) diff --git a/QuickFiler/Interfaces/IQfcDatamodel.cs b/QuickFiler/Interfaces/IQfcDatamodel.cs index be5b8bc47..216bbcf62 100644 --- a/QuickFiler/Interfaces/IQfcDatamodel.cs +++ b/QuickFiler/Interfaces/IQfcDatamodel.cs @@ -1,9 +1,10 @@ -using System; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Threading; using System.Threading.Tasks; using Microsoft.Office.Interop.Outlook; +using QuickFiler.Controllers; using UtilitiesCS; using UtilitiesCS.ReusableTypeClasses.SerializableNew.Concurrent.Observable; @@ -21,6 +22,64 @@ public enum SortOptionsEnum ConversationUniqueOnly = 32, } + /// + /// Issue #446. Why the dequeue stopped. A caller cannot otherwise distinguish a + /// deadline-bounded empty batch from genuine exhaustion of the mail source, and treating the + /// former as the latter irreversibly closes the UI queue for the rest of the session. + /// + public enum QfcDequeueStop + { + /// The requested quantity was assembled, or the request was degenerate. + QuantitySatisfied, + + /// The mail source is drained and no producer is still loading. + SourceExhausted, + + /// The first-batch deadline expired before any candidate qualified. + DeadlineExpired, + } + + /// + /// Issue #446 and Scope 427-A. The dequeue result at the datamodel boundary: the batch, the + /// pre-scored carriers that survived the high-confidence gate, and the reason the dequeue + /// stopped. Declared as a readonly struct with get-only properties because + /// net481 has no IsExternalInit and therefore no record, + /// record struct or init accessor. + /// + public readonly struct QfcDequeueBatch + { + private readonly IList _items; + private readonly IList _preScored; + + /// + /// Creates a dequeue result. Null collections are tolerated and surface as empty lists, so + /// a defaulted struct returned by an unconfigured loose Moq setup is inert rather than a + /// null-reference trap. + /// + public QfcDequeueBatch( + IList items, + IList preScored, + QfcDequeueStop stop + ) + { + _items = items; + _preScored = preScored; + Stop = stop; + } + + /// The dequeued mail items. Never null; empty when nothing was dequeued. + public IList Items => _items ?? new List(); + + /// + /// The pre-scored carriers for the accepted items, each pairing a mail item with the folder + /// the gate already computed for it. Never null; empty outside high-confidence mode. + /// + public IList PreScored => _preScored ?? new List(); + + /// Why the dequeue stopped. + public QfcDequeueStop Stop { get; } + } + public interface IQfcDatamodel { Task> DequeueNextItemGroupAsync(int quantity, int timeOut); @@ -43,6 +102,21 @@ Task> DequeueNextItemGroupAsync( TimeSpan firstBatchDeadline, Action progress ); + + /// + /// Issue #446. Outcome-bearing dequeue: the same batch the four-argument + /// + /// overload produces, plus the reason the dequeue stopped. Without the stop reason a caller + /// cannot tell a deadline-bounded empty batch from genuine source exhaustion, and treating + /// the former as the latter irreversibly closes the UI queue for the rest of the session. + /// + Task DequeueNextItemGroupWithOutcomeAsync( + int quantity, + int timeOut, + TimeSpan firstBatchDeadline, + Action progress + ); + IList DequeueNextItemGroup(int quantity); void UndoMove(); SloStack MovedItems { get; } diff --git a/docs/features/active/quickfiler-bug-family-446/code-review.2026-08-26T11-29.md b/docs/features/active/quickfiler-bug-family-446/code-review.2026-08-26T11-29.md new file mode 100644 index 000000000..41fd24d47 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/code-review.2026-08-26T11-29.md @@ -0,0 +1,43 @@ +# Code Review — quickfiler-bug-family-446 + +- Reviewer: feature-review agent +- Timestamp: 2026-08-26T11-29 +- Scope: full branch diff `61edc19b...fd746f55` (13 C# files; production changes in `QfcStreamingDequeueConfidenceGate.cs`, `QfcDatamodel.QueueProcessing.cs`, `QfcDatamodel.cs`, `QfcFormController.Actions.cs`, `QfcHomeController.Iteration.cs`, `IQfcDatamodel.cs`) + +## Findings + +| ID | Severity | File | Finding | +| --- | --- | --- | --- | +| CR-1 | Minor (non-blocking) | `QuickFiler/Controllers/QfcFormController.Actions.cs` | The coverage carve-out for this file is accepted, but its untestable regions (`UndoDialog` with three raw `MessageBox.Show` calls, `ProcessUndoItemAsync` COM/dispatcher body, `LoadItems*` overloads at lines 29–160) have no routed follow-up. None of the four promoted potential documents added by this branch covers a `MessageBox`/dialog seam or loader-seam uplift for this file. Recommendation: route a seam-introduction follow-up (dialog-service seam plus loader seams) through the promotion lifecycle at epic close, so the carve-out debt does not survive as prose only. | +| CR-2 | Info | `QfcStreamingDequeueConfidenceGate.cs` + `QfcDatamodel.QueueProcessing.cs` | Rejected-hook release is double-guarded: the gate wraps `_onRejected` invocation in try/catch, and the sink `TryReleaseRejectedHook` wraps `UnhookItem` in its own try/catch. Both log via log4net. The redundancy is harmless and each guard is justified in place (the gate defends against arbitrary sinks; the sink defends its own COM call), but only one layer will ever observe a given failure. No change requested. | +| CR-3 | Minor (non-blocking) | `QuickFiler/Controllers/QfcFormController.Actions.cs:4` | Dead `using System.Diagnostics;` — sole consumer (`Stopwatch`) was removed by the `UndoConsumer` rewrite. Analyzer gate passes because IDE0005 is not error-severity here. Remove on the next authorized touch of the file. Leaving it was correct executor discipline (no plan task authorized the removal). | +| CR-4 | Minor (non-blocking) | `docs/features/active/quickfiler-bug-family-446/issue.md:5` | `- Also closes: #426, #427, #448` contradicts AC17 and decision D1 (#427 must remain open; only 427-A is delivered). The line pre-dates the merge base, so it is not a defect of this change set, and evidence `evidence/issue-updates/p4-t17-pr-closing-keyword-constraint.2026-08-26T10-41.md` already instructs the PR author not to transcribe it. Residual risk: the pr-author skill reads `issue.md`. Recommendation: correct the line to `- Also closes: #426, #448 (advances #427, which remains open)` before or during PR authoring, and verify the PR body against the P4-T17 constraint note. | +| CR-5 | Info | `QfcStreamingDequeueConfidenceGate.cs` | File branch rate moved 92.50% to 90.91% — not a covered-branch loss (covered branches rose 37 to 40) but a denominator effect from four new branches of which one is uncovered (the defensive null-accepted arm in `QfcGateBatch.Accepted` or a rejection-guard arm). Above every floor; recorded for baseline continuity in later epic reviews. | +| CR-6 | Info | `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` | [P3-T7] compaction removed the blank line before `// Act` / `// Assert` markers in the four new tests. AAA structure and markers retained; noted only so later reviewers do not mistake the tightened layout for missing structure. | + +## Design and correctness assessment + +**#446 (queue closed on deadline expiry).** The fix is structurally sound. `QfcGateBatch`/`QfcDequeueBatch` are net481-safe readonly structs whose null-tolerant accessors make a defaulted Moq return inert — a deliberate, documented choice that prevents NRE traps in loosely-mocked tests. The gate maps all four exits to explicit stop reasons (`quantity<=0` and loop-completion to `QuantitySatisfied`, deadline to `DeadlineExpired`, drained source to `SourceExhausted`), and `IterateQueueAsync` now guards `CompleteAddingAsync` behind `Stop == QfcDequeueStop.SourceExhausted` with a why-comment naming the irreversibility of `BlockingCollection.CompleteAdding`. The non-gate path's inference (short direct batch implies source exhausted) is correct given `WaitForQueue`'s loop condition (`_remainingLoadActive && count < quantity`): a short result after the wait implies the producer is no longer active. + +**#448 (non-terminating `UndoConsumer`).** The old defect is real and the fix is minimal: the base loop's `while (!_undoQueue.IsCompleted || exit)` disjunction kept spinning forever once `exit` was set, and the conditional `if (exit)` reset meant `_undoConsumerTask` was effectively never cleared. The rewrite measures idle time (reset on every successful take), waits through the injected `TimeProvider`, breaks on threshold, and clears `_undoConsumerTask` in `finally` — covering the exception exit that disposal mid-take can produce. All three seams (`TimeProvider`, `UndoConsumerStarter`, `UndoItemProcessor`) default to production behavior; `ProcessUndoItemAsync` is a verbatim extraction of the take branch. Production behavior change is exactly the intended fix, nothing more. + +**#426 (rejected-hook retention).** `onRejected` is an optional constructor parameter defaulting to null, so no existing call site changes behavior; the datamodel supplies `TryReleaseRejectedHook`, giving exactly one `UnhookItem` per rejected candidate, preserving the drop-on-reject contract (`DequeueAsync_BelowThresholdItemsAreDiscarded` byte-unchanged) and the STA marshal contract (`EmailMoveMonitor.cs` untouched). + +**#427-A (producer side).** `ScoreRemainingQueueMailItemAsync` now returns `(long Score, string TopFolder)` and moved to `QfcDatamodel.QueueProcessing.cs` with an injectable `ScoringServiceFactory`; the admission call site adapts with a lambda projecting `.Score`, so `QfcRemainingQueueAdmission`'s signature is untouched. Accepted candidates carry `TopFolder` to the boundary as `QfcDequeueBatch.PreScored`. The consumer side is deliberately not delivered; #427 remains open. + +**Test quality.** New tests are deterministic (FakeTimeProvider/CountingTimeProvider; zero banned APIs), well-documented, and assert through FluentAssertions with reasons. The fail-closed `CreateGate` rewrite (single exact nine-type constructor lookup guarded by `Should().NotBeNull`) removes a real fail-open hazard the old descending fallback chain carried. Reflection-based access to private members (`GetPrivateField`/`SetPrivateField`, `InvokeScoreRemainingQueueMailItemAsync`) is pre-existing project style for this COM-bound surface; acceptable here. + +## [P3-T7] compaction — independent re-derivation (caller-referred) + +The reduction from 576 to 496 lines used four in-file changes beyond the named `ArrangeUndoConsumer` extraction. Verified against the base file text: + +1. `GetPrivateField`/`SetPrivateField` collapsed to expression bodies over `private const BindingFlags PrivateInstance = BindingFlags.NonPublic | BindingFlags.Instance` — identical flag set to the base inline expressions; semantics unchanged (including the same NRE failure mode on a missing field). +2. `ReadControllerSource` expression-bodied (byte-equivalent call chain) and `ResolveRepositoryPath`'s manual `foreach` accumulator replaced with `pathParts.Aggregate(dir.FullName, Path.Combine)` — a left fold seeded with the repo root, which is exactly what the removed loop computed; the `Should().NotBeNull` repo-root guard is retained. +3. `UndoConsumer_OnExit_ResetsUndoConsumerTask` restructured to arrange both exit paths once — this test was authored by this same branch ([P3-T6]), so no pre-existing behavior existed to preserve; the restructured form still plants sentinels on both controllers and asserts both exit paths clear `_undoConsumerTask`. +4. Doc-comment tightening and blank-line removal — cosmetic. + +No assertion was removed or weakened by any of the four; the scoped post-reduction run (`p3-t7.trx`) records 16/16 passed (12 pre-existing seam tests plus the 4 new ones). **Verdict: behavior-preserving, confirmed.** The deviation-beyond-named-task was forced by arithmetic (532 after the named extraction against a 500 cap) under D4's no-new-file constraint, and is documented with unusual thoroughness in `evidence/other/p3-t7-line-counts.2026-08-26T10-50.md`. + +## Blocking findings + +**0.** CR-1 through CR-6 are Minor or Info; none blocks merge to the integration branch. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml new file mode 100644 index 000000000..d40f4fe39 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml @@ -0,0 +1,190560 @@ + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t1-instructions-read.2026-08-26T08-26.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t1-instructions-read.2026-08-26T08-26.md new file mode 100644 index 000000000..2d28783ae --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t1-instructions-read.2026-08-26T08-26.md @@ -0,0 +1,58 @@ +# [P0-T1] Policy and Instruction Reads + +Timestamp: 2026-08-26T08-26 + +Task: [P0-T1] +Feature: docs/features/active/quickfiler-bug-family-446 +Work Mode: full-bug + +## Policy Order + +The ten files below were read in the exact order listed, which is the order stated by +`[P0-T1]` and is consistent with `.claude/skills/policy-compliance-order/SKILL.md` +(CLAUDE.md first, then the cross-language rules, then the language-specific rules, +then the supporting skills). + +## Files Read (10) + +1. `CLAUDE.md` +2. `.claude/rules/general-code-change.md` +3. `.claude/rules/general-unit-test.md` +4. `.claude/rules/csharp.md` +5. `.claude/rules/quality-tiers.md` +6. `.claude/rules/plan-acceptance-gates.md` +7. `.claude/skills/policy-compliance-order/SKILL.md` +8. `.claude/skills/atomic-plan-contract/SKILL.md` +9. `.claude/skills/evidence-and-timestamp-conventions/SKILL.md` +10. `.claude/skills/acceptance-criteria-tracking/SKILL.md` + +All ten paths are relative to the workspace root and all ten exist in this worktree. + +## Output Summary + +All ten files read. Key constraints extracted and in force for this execution: + +- C# toolchain order is format -> analyze -> type-check -> test; restart from step 1 on any + failure or file rewrite (`CLAUDE.md`, `.claude/rules/csharp.md`). +- Format with `dotnet tool run csharpier format .` and verify with `dotnet tool run csharpier check .`; + never `dotnet format` (`.claude/rules/csharp.md` Toolchain 1). +- Analyzer and nullable gates use `/t:Rebuild`, never `/t:Build`, and never `/p:Nullable=enable` + (`.claude/rules/csharp.md` Toolchain 2 and 3). +- Tests use MSTest + Moq + FluentAssertions; no external services; no temporary files + (`.claude/rules/general-unit-test.md`, `.claude/rules/csharp.md` Testing Standards). +- Determinism infrastructure requires `TimeProvider` / `FakeTimeProvider` and bans `Thread.Sleep`, + `Task.Delay` and wall-clock reads in test code (`.claude/rules/general-unit-test.md`). +- 500-line cap on every production, test and reusable script file; Markdown documentation is exempt + (`.claude/rules/general-code-change.md` File Size Limit). +- Evidence is written only under `/evidence//`; `artifacts/...` evidence paths are + forbidden and non-overridable (`.claude/skills/evidence-and-timestamp-conventions/SKILL.md`). +- Acceptance criteria for work mode `full-bug` are tracked in `spec.md` only; check off one at a time + after verification, never batch, never add criteria + (`.claude/skills/acceptance-criteria-tracking/SKILL.md`). +- Acceptance conditions must be falsifiable; gate rules G1 through G6 read + (`.claude/rules/plan-acceptance-gates.md`). + +Note on read provenance: `.claude/rules/general-code-change.md`, `.claude/rules/general-unit-test.md`, +`.claude/rules/quality-tiers.md` and the four `SKILL.md` files were verified byte-identical +(modulo line endings) to the copies loaded into this session; `CLAUDE.md`, `.claude/rules/csharp.md` +and `.claude/rules/plan-acceptance-gates.md` were read directly from this worktree. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t10-analyzer-build.2026-08-26T08-48.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t10-analyzer-build.2026-08-26T08-48.md new file mode 100644 index 000000000..41c6e966e --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t10-analyzer-build.2026-08-26T08-48.md @@ -0,0 +1,32 @@ +# [P0-T10] Baseline Analyzer Gate + +Timestamp: 2026-08-26T08-48 + +Task: [P0-T10] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true` + +Executed through `pwsh -NoProfile`. `$msbuild` was resolved at run time with the plan's vswhere +prelude to the Visual Studio 18 Community full-framework MSBuild under +`\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe`. +The command uses `/t:Rebuild`, not `/t:Build`, and adds no `Nullable` property. + +EXIT_CODE: 0 + +## MSBuild Summary Counts + +- Error count: `0` +- Warning count: `5` + +## Output Summary + +Baseline analyzer build succeeded ("Build succeeded." with `5 Warning(s)` and `0 Error(s)`, +elapsed 00:00:23.66). The five warnings are all the same pre-existing diagnostic emitted by +`System.Reactive.7.0.0\build\System.Reactive.PackagesConfigCheck.targets(31,5)`: "The project +contains a packages.config file, which is not supported by System.Reactive v7.0 or later." +It is emitted once per affected project (`TaskMaster.csproj` and `UtilitiesCS.Test.csproj` +among them). No analyzer rule diagnostic and no `CS` diagnostic was reported. + +This establishes that the analyzer gate is green at the merge base, so any error introduced by +`[P5-T3]` would be attributable to this change set. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t11-nullable-build.2026-08-26T08-50.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t11-nullable-build.2026-08-26T08-50.md new file mode 100644 index 000000000..9ff46f7ab --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t11-nullable-build.2026-08-26T08-50.md @@ -0,0 +1,38 @@ +# [P0-T11] Baseline Nullable / Type-Check Gate + +Timestamp: 2026-08-26T08-50 + +Task: [P0-T11] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true` + +Executed through `pwsh -NoProfile`. `$msbuild` was resolved at run time with the plan's vswhere +prelude to the Visual Studio 18 Community full-framework MSBuild. + +EXIT_CODE: 0 + +## Command-Shape Assertions + +The recorded command text above contains neither `Nullable=enable` nor `/t:Build`: + +- No `/p:Nullable=enable`. Per D-Plan-6 and `.claude/rules/csharp.md`, no project in this + repository carries a `` element and there is no `Directory.Build.props`, so the + property is a solution-wide opt-in that CI deliberately omits. +- `/t:Rebuild` is used, not `/t:Build`. MSBuild's up-to-date check does not invalidate on a + command-line `/p:` change, so a warm `/t:Build` would return exit 0 with `CoreCompile` skipped + and the gate could not fail. + +## MSBuild Summary Counts + +- Error count: `0` +- Warning count: `5` + +## Output Summary + +Baseline nullable / type-check build succeeded with `5 Warning(s)` and `0 Error(s)`, elapsed +00:00:15.77. The five warnings are the same pre-existing +`System.Reactive.PackagesConfigCheck.targets(31,5)` packages.config diagnostic recorded by +`[P0-T10]`; because it is emitted with a bare `warning` category rather than a `CS`/analyzer +code, `/p:TreatWarningsAsErrors=true` did not promote it and the build stayed green. +No `CS86xx` nullable diagnostic was reported. The gate is green at the merge base. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t12-test-and-coverage.2026-08-26T08-58.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t12-test-and-coverage.2026-08-26T08-58.md new file mode 100644 index 000000000..8dd44eeb8 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t12-test-and-coverage.2026-08-26T08-58.md @@ -0,0 +1,77 @@ +# [P0-T12] Baseline Full-Suite Tests with Cobertura Coverage + +Timestamp: 2026-08-26T08-58 + +Task: [P0-T12] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `pwsh -NoProfile -File scripts\vscode\Invoke-MSTestWithCoverage.ps1 -SearchRoot . -Configuration Debug -CoverageOutput "docs\features\active\quickfiler-bug-family-446\evidence\baseline\coverage-baseline.cobertura.xml"` +EXIT_CODE: 0 + +Execution note: the invocation was launched as a detached `pwsh` process writing to a log, because +a full-suite run exceeds the foreground command timeout available to this executor. The command +string, its arguments and its exit code are unchanged by that launch mechanism. + +## Test Counts + +- Total: `6482` +- Passed: `6482` +- Failed: `0` +- Skipped: `0` + +Summary line reproduced from the run: `Test Run Successful.` / `Total tests: 6482` / +`Passed: 6482` / `Total time: 42.1878 Seconds`. The runner prints no `Failed:` or `Skipped:` +row when those counts are zero, so both are recorded as `0`. + +## Failed-Test Set (reconciliation reference for `[P5-T5]`) + +(empty — the failed count is zero, so no fully qualified test name is recorded) + +Explicit statement required by this task's acceptance condition: **no recorded failure belongs to +`QuickFiler.Test.dll`**, because there is no recorded failure at all. + +## Discovered Assemblies + +The script printed only a count: `Discovered 9 test assemblies.` + +The executor reproduced the list with the Command-conventions discovery prelude +(`Get-ChildItem -Path . -Recurse -Filter *.Test.dll -File`, filtered to `\bin\Debug\`, projected +through `Resolve-Path -Relative`, then filtered with `-notmatch "\.claude"`). The prelude +reported `COUNT=9`, matching the script, and produced these nine workspace-root-relative paths: + +1. `.\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll` +2. `.\SVGControl.Test\bin\Debug\SVGControl.Test.dll` +3. `.\Tags.Test\bin\Debug\Tags.Test.dll` +4. `.\TaskMaster.Test\bin\Debug\TaskMaster.Test.dll` +5. `.\TaskTree.Test\bin\Debug\TaskTree.Test.dll` +6. `.\TaskVisualization.Test\bin\Debug\TaskVisualization.Test.dll` +7. `.\ToDoModel.Test\bin\Debug\ToDoModel.Test.dll` +8. `.\UtilitiesCS.Test\bin\Debug\UtilitiesCS.Test.dll` +9. `.\VBFunctions.Test\bin\Debug\VBFunctions.Test.dll` + +None of the nine recorded paths contains a `.claude` segment when expressed relative to the +workspace root. (The workspace root itself lies beneath a `.claude` directory, which is why the +exclusion is applied to the relative path and not the absolute one; an absolute-path test would +have excluded every assembly and produced a vacuously green run.) + +## Repository-Wide Coverage (Cobertura root `` element) + +- `line-rate`: `0.847782` (84.7782%) +- `branch-rate`: `0.786876` (78.6876%) +- `lines-covered`: `53768` +- `lines-valid`: `63422` +- `branches-covered`: `12675` +- `branches-valid`: `16108` + +## Artifact + +`docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml` +exists (10,602,263 bytes). The script post-processed the XML for Koverage compatibility, as it +reports at the end of the run. + +## Output Summary + +Baseline full-suite run is green: 6482 tests, 6482 passed, 0 failed, 0 skipped, exit code 0 across +9 discovered test assemblies. Repository-wide baseline line-rate `0.847782` and branch-rate +`0.786876`. No pre-existing failure exists, so `[P5-T5]` and `[P5-T6]` have no reconciliation set +and must themselves report a failed count of `0`. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t13-coverage-scope.2026-08-26T09-00.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t13-coverage-scope.2026-08-26T09-00.md new file mode 100644 index 000000000..db5eb6c86 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t13-coverage-scope.2026-08-26T09-00.md @@ -0,0 +1,80 @@ +# [P0-T13] Baseline Coverage Scope Extraction + +Timestamp: 2026-08-26T09-00 + +Task: [P0-T13] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Command + +``` +pwsh -NoProfile -Command '$x=[xml](Get-Content -Raw "docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml"); $all=$x.SelectNodes("//class"); foreach ($n in @("QfcStreamingDequeueConfidenceGate.cs","QfcFormController.Actions.cs","QfcHomeController.Iteration.cs","QfcStreamingDequeueConfidenceGate","QfcFormController","QfcHomeController")) { $s=@($all | Where-Object { $_.filename -like ("*" + $n + "*") }); $ln=@($s.lines.line); $h=@($ln | Where-Object { [int]$_.hits -gt 0 }); "{0} lines={1} covered={2} rate={3:N2}" -f $n,$ln.Count,$h.Count,(100*$h.Count/[math]::Max(1,$ln.Count)) }' +``` + +Execution note: the payload above is the plan's aggregation command verbatim. It was executed +through `pwsh -NoProfile` from a scratchpad script file rather than as a `-Command` string, +because the intermediate shell collapses the doubled backslashes the payload's regular +expressions rely on. The script body is byte-equivalent to the payload; no scratchpad script is +retained under the `evidence/` tree. + +EXIT_CODE: 0 + +## Six Recorded Rows + +### Changed-file scope (blocking `>= 90.00` condition of AC28 per D-Plan-7) + +| Needle | lines | covered | rate | +| --- | --- | --- | --- | +| `QfcStreamingDequeueConfidenceGate.cs` | 93 | 90 | 96.77 | +| `QfcFormController.Actions.cs` | 204 | 73 | 35.78 | +| `QfcHomeController.Iteration.cs` | 56 | 45 | 80.36 | + +### Whole-type scope (no-regression condition) + +| Needle | lines | covered | rate | +| --- | --- | --- | --- | +| `QfcStreamingDequeueConfidenceGate` | 93 | 90 | 96.77 | +| `QfcFormController` | 699 | 363 | 51.93 | +| `QfcHomeController` | 445 | 304 | 68.31 | + +Every row's `lines=` value is a positive integer, so no needle matched zero `` elements +and no row is a measurement failure. + +## Raw Output + +``` +QfcStreamingDequeueConfidenceGate.cs lines=93 covered=90 rate=96.77 +QfcFormController.Actions.cs lines=204 covered=73 rate=35.78 +QfcHomeController.Iteration.cs lines=56 covered=45 rate=80.36 +QfcStreamingDequeueConfidenceGate lines=93 covered=90 rate=96.77 +QfcFormController lines=699 covered=363 rate=51.93 +QfcHomeController lines=445 covered=304 rate=68.31 +``` + +## Observations Recorded for Later Phases + +1. **Divergence from the figures quoted in D-Plan-7.** D-Plan-7 quotes + `QfcStreamingDequeueConfidenceGate.cs` at `lines=136 covered=132 rate=97.06` and + `QfcHomeController.Iteration.cs` at `lines=80 covered=69 rate=86.25`, measured before this plan + was cleared against "the most recent QuickFiler Cobertura artifact on `main`". The baseline + measured here is taken from this worktree's own run against the epic integration tree + (`61edc19b`) with the repository's `coverage.config` instrumentation excludes, so the + denominators differ. Per the plan, every later `` coverage comparison reads the value + recorded by **this** task, not a value pinned in the plan document. +2. **`QfcHomeController.Iteration.cs` uncovered set.** 56 measured lines, 45 covered, so 11 are + uncovered — exactly the eleven occurrences D-Plan-7 attributes to the two `catch` blocks at + `QuickFiler/Controllers/QfcHomeController.Iteration.cs:38-52`. `[P1-T19]` drives those + branches and is what makes the `[P5-T7]` `>= 90.00` gate on this file reachable. +3. **`QfcFormController.Actions.cs` at 35.78.** This is the file the `[P5-T7]` carve-out covers: + its changed-file gate is satisfied either by reaching `>= 90.00` or by being at or above this + `35.78` baseline with the verbatim `REMEDIATION-REQUIRED` line recorded. +4. **AC28 whole-type reading.** Two of the three whole-type rows (`QfcFormController` 51.93 and + `QfcHomeController` 68.31) are below `90.00` at baseline. Per D-Plan-7 and `[P5-T17]`, the + AC28 checkbox is checked only when every whole-type figure reaches `90.00`; otherwise the box + stays unchecked and the AC28/AC18 conflict is recorded rather than silently resolved. + +## Output Summary + +Six coverage rows extracted from the Phase 0 Cobertura baseline, each with a positive integer +`lines=`, an integer `covered=` and a two-decimal `rate=`. Changed-file scope: 96.77 / 35.78 / +80.36. Whole-type scope: 96.77 / 51.93 / 68.31. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t14-line-counts.2026-08-26T09-02.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t14-line-counts.2026-08-26T09-02.md new file mode 100644 index 000000000..7b2b0a35a --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t14-line-counts.2026-08-26T09-02.md @@ -0,0 +1,63 @@ +# [P0-T14] Baseline Line Counts + +Timestamp: 2026-08-26T09-02 + +Task: [P0-T14] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `wc -l` over the thirteen paths this plan may touch, run from the workspace root at +merge-base HEAD `61edc19befcf6c4e95b5acd32542f2dcdab41b78`. + +EXIT_CODE: 0 + +## Thirteen Recorded Paths + +### Production (6) + +| Path | Lines | +| --- | --- | +| `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | 177 | +| `QuickFiler/Controllers/QfcDatamodel.cs` | **496** | +| `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` | 177 | +| `QuickFiler/Controllers/QfcFormController.Actions.cs` | 302 | +| `QuickFiler/Controllers/QfcHomeController.Iteration.cs` | 86 | +| `QuickFiler/Interfaces/IQfcDatamodel.cs` | 59 | + +### Test (7) + +| Path | Lines | +| --- | --- | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` | 424 | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` | 460 | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` | 152 | +| `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` | **464** | +| `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` | 378 | +| `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` | 136 | +| `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` | 317 | + +Thirteen paths, each with a numeric line count. The recorded count for +`QuickFiler/Controllers/QfcDatamodel.cs` is **496**, satisfying this task's acceptance condition. + +## Budget Notes Carried Forward + +- `QfcDatamodel.cs` at 496 of 500 leaves **4 lines** of headroom. Per D3, `[P1-T5]` relocates + `ScoreRemainingQueueMailItemAsync` out of this file before any widening, and `[P1-T5]`'s + acceptance requires the post-change count to be strictly less than 496. +- `QfcHomeControllerIterationTests.cs` at 464 of 500 leaves 36 lines. Per D4, `[P1-T14]` + deduplicates it into an `ArrangeIterate` helper before it absorbs the #446 caller tests, and + `[P1-T14]`'s acceptance requires the post-change count to be strictly less than 464. +- `QfcStreamingDequeueConfidenceGateTests.Part2.cs` at 460 must not grow: `[P1-T11]`'s acceptance + requires its post-change count to equal **460** exactly. +- `QfcStreamingDequeueConfidenceGateTests.cs` at 424 has 76 lines of headroom for the four gate + tests `[P1-T1]` through `[P1-T4]` add, after `[P1-T1]` removes the four-step `GetConstructor` + fallback chain. + +Note: the research document (§8) records `QfcStreamingDequeueConfidenceGateTests.cs` at 373 and +`...Part2.cs` at 455; both files grew when PR #610 landed (D-Plan-9). The counts above are the +current tree's and supersede the research figures. + +## Output Summary + +Thirteen baseline line counts recorded. `QuickFiler/Controllers/QfcDatamodel.cs` is at 496 as the +acceptance condition requires. Three files sit close to the 500-line cap (496, 464, 460) and +carry explicit budget tasks in Phase 1. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t15-pinned-surface.2026-08-26T09-05.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t15-pinned-surface.2026-08-26T09-05.md new file mode 100644 index 000000000..1ad777c1d --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t15-pinned-surface.2026-08-26T09-05.md @@ -0,0 +1,74 @@ +# [P0-T15] Baseline Pinned-Surface Inventory + +Timestamp: 2026-08-26T09-05 + +Task: [P0-T15] +Feature: docs/features/active/quickfiler-bug-family-446 + +## 1. `[TestMethod]` Count Across the Three Gate Test Partials + +Command: `grep -c "\[TestMethod\]" "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs" "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs" "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs"` +EXIT_CODE: 0 + +| File | `[TestMethod]` count | +| --- | --- | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` | 10 | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` | 10 | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` | 3 | +| **Total** | **23** | + +The observed total is **23**, which equals the value the plan expects on the tree that carries +PR #610 and is at least the `23` floor the acceptance condition states. No gate test has been +deleted. + +## 2. `GetConstructor` Count + +Command: `grep -c "GetConstructor" "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` +EXIT_CODE: 0 +Output: `4` + +The literal counted is `GetConstructor`. The count of **4** corresponds to the four-step +descending fallback chain at `:26-156` (8-type, 7-type, 6-type, 5-type). `[P1-T1]` replaces that +chain with a single exact lookup, and `[P4-T20]` asserts the post-change count is `1`; recording +`4` here is what makes that post-change `1` a real change rather than a vacuous match. + +## 3. SHA-256 of the `DequeueAsync_BelowThresholdItemsAreDiscarded` Body Text + +Extraction rule (stated here so `[P4-T14]` can recompute it identically): the body text is the +line carrying `public async Task DequeueAsync_BelowThresholdItemsAreDiscarded()` through the +first following line whose content is exactly eight spaces plus a closing brace, inclusive, with +the selected lines joined by a single LF and hashed as UTF-8 bytes. A byte comparison over this +extraction is used rather than a line-range diff because `[P1-T1]`'s helper rewrite shifts the +method's line numbers. + +- Start line at baseline: `299` +- End line at baseline: `310` +- Line count: `12` +- **SHA256:** `4cd6c2650d106d987d493b1fcb42c5a0313d4a419a3fe8f3b2369fff5c661700` + +The digest is 64 hexadecimal characters. + +Baseline body text, reproduced for the record: + +```csharp + public async Task DequeueAsync_BelowThresholdItemsAreDiscarded() + { + var item = CreateMailItem("discard", "entry-discard"); + object gate = CreateGate( + new Queue(new[] { item }), + new Dictionary { [item] = 899 } + ); + + IList result = await DequeueAsync(gate, 1, 0, CancellationToken.None); + + result.Should().BeEmpty(); + } +``` + +## Output Summary + +`[TestMethod]` total across the three gate test partials: **23** (10 + 10 + 3). +`GetConstructor` count in `QfcStreamingDequeueConfidenceGateTests.cs`: **4**. +SHA-256 of the `DequeueAsync_BelowThresholdItemsAreDiscarded` body text: +`4cd6c2650d106d987d493b1fcb42c5a0313d4a419a3fe8f3b2369fff5c661700` (64 hex characters). +All three acceptance conditions satisfied. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t16-commit.2026-08-26T09-08.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t16-commit.2026-08-26T09-08.md new file mode 100644 index 000000000..d238c1801 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t16-commit.2026-08-26T09-08.md @@ -0,0 +1,62 @@ +# [P0-T16] Phase 0 Evidence Commit + +Timestamp: 2026-08-26T09-08 + +Task: [P0-T16] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Commands + +Command: `git add "docs/features/active/quickfiler-bug-family-446"` +EXIT_CODE: 0 +Output Summary: staged 18 paths. Git emitted LF-to-CRLF normalisation notices for the fifteen new +Markdown artifacts; those are informational and not errors. + +Command: `git commit -m "chore(446): capture phase 0 policy reads, bootstrap and baselines"` +EXIT_CODE: 0 +Output Summary: `[bug/quickfiler-bug-family-446 3d4e8e9d] chore(446): capture phase 0 policy reads, bootstrap and baselines` / +`18 files changed, 191323 insertions(+), 17 deletions(-)`. The large insertion count is the +10.6 MB `coverage-baseline.cobertura.xml` artifact. + +Command: `git status --porcelain -- "QuickFiler" "QuickFiler.Test" "*.csproj" "*.sln"` +EXIT_CODE: 0 +Output: (zero output lines) + +## Resulting HEAD + +`3d4e8e9df890500ef34ebe246978797ad5740d11` + +Merge base (``, from `[P0-T3]`): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +HEAD has now advanced past the merge base, so `...HEAD` diff gates in later phases are no +longer vacuous. + +## Committed Paths (18) + +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t1-instructions-read.2026-08-26T08-26.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t2-feature-inputs-read.2026-08-26T08-32.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t3-merge-base.2026-08-26T08-33.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t4-dotnet-sdk.2026-08-26T08-36.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t5-nuget-restore.2026-08-26T08-38.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t6-analyzer-backfill.2026-08-26T08-41.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t7-tool-restore.2026-08-26T08-43.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t8-dotnet-coverage.2026-08-26T08-44.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t9-csharpier-check.2026-08-26T08-45.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t10-analyzer-build.2026-08-26T08-48.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t11-nullable-build.2026-08-26T08-50.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t12-test-and-coverage.2026-08-26T08-58.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t13-coverage-scope.2026-08-26T09-00.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t14-line-counts.2026-08-26T09-02.md` +- `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t15-pinned-surface.2026-08-26T09-05.md` +- `docs/features/active/quickfiler-bug-family-446/plan.2026-08-24T09-37.md` (Phase 0 check-offs) +- `docs/features/active/quickfiler-bug-family-446/spec.md` (`[P0-T2]` document-pointer correction) + +No `.cs`, `.csproj`, `.props`, `.targets`, `.sln` or `packages.config` path is in the commit. +The provisioned `.dotnet-sdk/` and `packages/` trees are gitignored and were not staged. + +## Output Summary + +Phase 0 evidence committed as `3d4e8e9df890500ef34ebe246978797ad5740d11` with exit code 0. +The scoped clean-tree gate `git status --porcelain -- "QuickFiler" "QuickFiler.Test" "*.csproj" "*.sln"` +produces zero output lines. Phase 0 is complete: 16 of 16 tasks. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t2-feature-inputs-read.2026-08-26T08-32.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t2-feature-inputs-read.2026-08-26T08-32.md new file mode 100644 index 000000000..7a8bb4db9 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t2-feature-inputs-read.2026-08-26T08-32.md @@ -0,0 +1,65 @@ +# [P0-T2] Feature Inputs Read and Stale Pointer Correction + +Timestamp: 2026-08-26T08-32 + +Task: [P0-T2] +Feature: docs/features/active/quickfiler-bug-family-446 +Work Mode: full-bug + +## Files Read + +1. `docs/features/active/quickfiler-bug-family-446/spec.md` (976 lines) +2. `docs/features/active/quickfiler-bug-family-446/issue.md` (88 lines) +3. `docs/features/active/quickfiler-bug-family-446/research/2026-08-24T09-50-quickfiler-queue-datamodel-defects-research.md` (999 lines) + +## Acceptance-Criteria Identifiers (28) + +The acceptance-criteria source for work mode `full-bug` is `spec.md` only. The 28 criterion +identifiers, in the order they appear at `spec.md:875-911`, are: + +AC1, AC2, AC3, AC4, AC5, AC6, AC7, AC8, AC9, AC10, AC11, AC12, AC13, AC14, AC15, AC16, AC17, +AC18, AC19, AC20, AC21, AC22, AC23, AC24, AC25, AC26, AC27, AC28. + +Count: 28. All 28 are unchecked (`- [ ]`) at the time of this read. + +Grouping in `spec.md`: + +- Failing-first regression tests: AC1 through AC5 (`spec.md:875-879`) +- Behavioural correctness: AC6 through AC16 (`spec.md:883-893`) +- Scope containment: AC17 through AC22 (`spec.md:897-902`) +- Test-quality and toolchain: AC23 through AC28 (`spec.md:906-911`) + +## Owned Production Paths (8) + +Listed in the spec's Scope and Non-Goals section, "In scope — files this feature owns" +(`spec.md:213-229`), and matching the "Files This Feature Owns" list in `issue.md:59-68`: + +1. `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` (177 lines at base) +2. `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` (177 lines at base) +3. `QuickFiler/Controllers/QfcDatamodel.cs` (496 lines at base) +4. `QuickFiler/Controllers/QfcFormController.Actions.cs` (302 lines at base) +5. `QuickFiler/Controllers/QfcHomeController.Iteration.cs` (86 lines at base) +6. `QuickFiler/Interfaces/IQfcDatamodel.cs` (59 lines at base) +7. `QuickFiler/Controllers/QfcItemController.FolderHandling.cs` (235 lines at base; expected untouched under Scope 427-A) +8. `QuickFiler/Helper Classes/EmailMoveMonitor.cs` (262 lines at base; expected untouched — the #426 defect is in the caller) + +Count: 8. Of these, this plan writes six (items 1 through 6); items 7 and 8 are owned but expected +to remain unmodified. + +## Document Pointer Correction + +`spec.md:970-971` named the non-existent folder `docs/features/active/quickfiler-queue-datamodel-defects-446/`. +Both lines were corrected to the real folder `docs/features/active/quickfiler-bug-family-446/`. +Only the two document-pointer lines in the Links section were edited; no acceptance-criteria text +was modified. + +Command: `git grep -c "quickfiler-queue-datamodel-defects-446" -- "docs/features/active/quickfiler-bug-family-446/spec.md"` +EXIT_CODE: 1 +Output: (no output — no match) + +## Output Summary + +All three feature inputs read. 28 acceptance-criteria identifiers enumerated (AC1 through AC28). +8 owned production paths enumerated. The two stale document pointers at `spec.md:970-971` were +corrected and `git grep -c` now reports no match for the stale folder name in `spec.md` +(exit code 1, which is `git grep`'s no-match exit). diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t3-merge-base.2026-08-26T08-33.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t3-merge-base.2026-08-26T08-33.md new file mode 100644 index 000000000..4208688d0 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t3-merge-base.2026-08-26T08-33.md @@ -0,0 +1,45 @@ +# [P0-T3] Merge-Base Resolution + +Timestamp: 2026-08-26T08-33 + +Task: [P0-T3] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Resolution + +Command: `git rev-parse --verify --quiet "epic/quickfiler-bug-family-integration"` +EXIT_CODE: 0 +Output: `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +The first candidate ref succeeded, so the fallbacks `origin/main` and `main` were not used. + +Command: `git merge-base HEAD epic/quickfiler-bug-family-integration` +EXIT_CODE: 0 +Output: `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +Command: `git rev-parse HEAD` +EXIT_CODE: 0 +Output: `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +Command: `git rev-parse --abbrev-ref HEAD` +EXIT_CODE: 0 +Output: `bug/quickfiler-bug-family-446` + +## Recorded Values + +- Resolved ref name: `epic/quickfiler-bug-family-integration` +- Merge-base sha (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` +- HEAD sha at Phase 0: `61edc19befcf6c4e95b5acd32542f2dcdab41b78` +- Current branch: `bug/quickfiler-bug-family-446` + +Every later `` diff gate in this plan uses `61edc19befcf6c4e95b5acd32542f2dcdab41b78`. + +## Output Summary + +Merge base resolved against `epic/quickfiler-bug-family-integration` to the 40-character sha +`61edc19befcf6c4e95b5acd32542f2dcdab41b78`. HEAD equals the merge base at Phase 0, so every +`...HEAD` diff gate yields an empty result by construction until the first phase commit +lands; that is expected and is the reason this plan carries an explicit commit task at the end +of every phase. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t4-dotnet-sdk.2026-08-26T08-36.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t4-dotnet-sdk.2026-08-26T08-36.md new file mode 100644 index 000000000..a750bd314 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t4-dotnet-sdk.2026-08-26T08-36.md @@ -0,0 +1,38 @@ +# [P0-T4] Repo-Local .NET SDK Provisioning + +Timestamp: 2026-08-26T08-36 + +Task: [P0-T4] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Precondition Observed + +`global.json` at the workspace root pins `sdk.version` `8.0.205` with `rollForward: latestFeature` +and `paths` of `.dotnet-sdk` and `$host$`. The directory `.dotnet-sdk` did not exist in this +worktree before this task ran (`ls -d .dotnet-sdk` reported "No such file or directory"). + +## Invocation 1 — before provisioning + +Command: `pwsh -NoProfile -Command 'dotnet --version'` +EXIT_CODE: 1 +Output Summary: the SDK host printed the `global.json` `errorMessage` instead of a version: +"The repo-local .NET SDK is missing. Run ./scripts/vscode/Install-RepoDotNetSdk.ps1 from the +repository root, then retry dotnet format TaskMaster.sln." + +## Provisioning Step + +Command: `pwsh -NoProfile -File scripts/vscode/Install-RepoDotNetSdk.ps1` +EXIT_CODE: 0 +Output Summary: downloaded .NET SDK 8.0.205 from the Microsoft builds CDN and installed it to +`/.dotnet-sdk`. + +## Invocation 2 — after provisioning + +Command: `pwsh -NoProfile -Command 'dotnet --version; exit $LASTEXITCODE'` +EXIT_CODE: 0 +Output: `8.0.205` + +## Output Summary + +The repo-local SDK is provisioned. The final `dotnet --version` exits 0 and prints `8.0.205`, +which begins with `8.0.` as the acceptance condition requires. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t5-nuget-restore.2026-08-26T08-38.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t5-nuget-restore.2026-08-26T08-38.md new file mode 100644 index 000000000..eb07ab07a --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t5-nuget-restore.2026-08-26T08-38.md @@ -0,0 +1,35 @@ +# [P0-T5] NuGet Restore + +Timestamp: 2026-08-26T08-38 + +Task: [P0-T5] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Precondition Observed + +`ls -d packages` reported "No such file or directory" before this task ran. Every first-party +project declares an `EnsureNuGetPackageBuildImports` target whose `` fires before +compilation when the tree is missing, and every `Reference` `HintPath` under `..\packages\` +would be unresolvable. + +## Command + +Command: `pwsh -NoProfile -File scripts/vscode/Invoke-Restore.ps1 -SolutionPath TaskMaster.sln -Configuration Debug -Platform "Any CPU"` +EXIT_CODE: 0 + +## Output Summary + +MSBuild drove `/t:Restore /p:RestorePackagesConfig=true`, which covers both the `packages.config` +projects and the `PackageReference` projects. The restore reported: + +``` +Installed: + 172 package(s) to packages.config projects +Build succeeded. + 0 Warning(s) + 0 Error(s) +Time Elapsed 00:00:02.43 +``` + +Post-condition verified: `packages/` now contains 172 entries and the directory +`packages/Meziantou.Analyzer.3.0.174` exists, satisfying the task's acceptance condition. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t6-analyzer-backfill.2026-08-26T08-41.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t6-analyzer-backfill.2026-08-26T08-41.md new file mode 100644 index 000000000..8e42d6a23 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t6-analyzer-backfill.2026-08-26T08-41.md @@ -0,0 +1,56 @@ +# [P0-T6] Analyzer Package Back-Fill + +Timestamp: 2026-08-26T08-41 + +Task: [P0-T6] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Precondition Observed + +After `[P0-T5]` restore, the version skew described by the task was confirmed: + +- `packages/Meziantou.Analyzer.3.0.156` — absent +- `packages/Roslynator.Analyzers.4.16.0` — absent +- `packages/Meziantou.Analyzer.3.0.174` — present (restored from `packages.config`) +- `packages/Roslynator.Analyzers.4.16.1` — present (restored from `packages.config`) + +All 16 first-party `.csproj` files carry unconditional `` items naming the +`3.0.156` and `4.16.0` directories, and a missing `Analyzer` path is `error CS0006`, which fails +the compile rather than emitting a warning. + +## Route Taken + +`nuget.exe` was available on this machine, so the first of the two routes named by the task was +used. The parent-checkout copy route was not needed. + +Command: `pwsh -NoProfile -Command 'Get-Command nuget -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source'` +EXIT_CODE: 0 +Output Summary: `nuget.exe` resolved from the local WinGet package store. + +Command: `pwsh -NoProfile -Command 'nuget install Meziantou.Analyzer -Version 3.0.156 -OutputDirectory packages; exit $LASTEXITCODE'` +EXIT_CODE: 0 +Output Summary: "Successfully installed 'Meziantou.Analyzer 3.0.156'" into the worktree `packages` +folder, retrieved from the local NuGet global-packages feed. + +Command: `pwsh -NoProfile -Command 'nuget install Roslynator.Analyzers -Version 4.16.0 -OutputDirectory packages; exit $LASTEXITCODE'` +EXIT_CODE: 0 +Output Summary: "Successfully installed 'Roslynator.Analyzers 4.16.0'" into the worktree `packages` +folder, retrieved from the local NuGet global-packages feed. + +## Post-Condition Verification + +`packages/Meziantou.Analyzer.3.0.156/analyzers/dotnet/` contains analyzer DLLs under +`roslyn4.14/cs`, `roslyn4.8/cs`, `roslyn5.0/cs` and `roslyn5.6/cs`, including +`Meziantou.Analyzer.dll` and `Meziantou.Analyzer.CodeFixers.dll`. + +`packages/Roslynator.Analyzers.4.16.0/analyzers/dotnet/` contains analyzer DLLs under +`roslyn3.8/cs` and `roslyn4.7/cs`, including `Roslynator.CSharp.Analyzers.dll`. + +Both required directories exist and each contains at least one `.dll` under `analyzers/dotnet/`. + +## Output Summary + +Both skewed analyzer package versions back-filled via `nuget install` (exit 0 for each). +Acceptance condition satisfied: `packages/Meziantou.Analyzer.3.0.156` and +`packages/Roslynator.Analyzers.4.16.0` both exist and each carries analyzer DLLs under +`analyzers/dotnet/`. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t7-tool-restore.2026-08-26T08-43.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t7-tool-restore.2026-08-26T08-43.md new file mode 100644 index 000000000..98a181bfc --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t7-tool-restore.2026-08-26T08-43.md @@ -0,0 +1,37 @@ +# [P0-T7] Pinned Local Tool Restore + +Timestamp: 2026-08-26T08-43 + +Task: [P0-T7] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Manifest Observed + +`dotnet-tools.json` sits at the repository root (not under `.config/`) and pins: + +``` +"csharpier": { "version": "1.2.6", "commands": [ "csharpier" ], "rollForward": false } +``` + +CSharpier v1 requires a subcommand (`format`, `check`, `pipe-files`, `server`); the bare +`csharpier .` form of v0 does not run. + +## Invocation 1 — restore + +Command: `pwsh -NoProfile -Command 'dotnet tool restore'` +EXIT_CODE: 0 +Output Summary: "Tool 'csharpier' (version '1.2.6') was restored. Available commands: csharpier" +followed by "Restore was successful." + +## Invocation 2 — version check + +Command: `pwsh -NoProfile -Command 'dotnet tool run csharpier --version; exit $LASTEXITCODE'` +EXIT_CODE: 0 +Output: `1.2.6` + +## Output Summary + +The manifest-pinned CSharpier 1.2.6 is restored and reachable through `dotnet tool run`. +The recorded version output is exactly `1.2.6` with exit code 0, satisfying the acceptance +condition. All formatting steps in this plan invoke CSharpier through `dotnet tool run` so the +manifest-pinned version is used, never a global install. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t8-dotnet-coverage.2026-08-26T08-44.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t8-dotnet-coverage.2026-08-26T08-44.md new file mode 100644 index 000000000..01028f4aa --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t8-dotnet-coverage.2026-08-26T08-44.md @@ -0,0 +1,25 @@ +# [P0-T8] Cobertura Collector Availability + +Timestamp: 2026-08-26T08-44 + +Task: [P0-T8] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Invocation 1 — availability probe + +Command: `pwsh -NoProfile -Command 'dotnet-coverage --version; exit $LASTEXITCODE'` +EXIT_CODE: 0 +Output: `18.5.2+6e39b75eaf98f2691cf62dbf259669cc13851fd3` + +## Invocation 2 — install + +Not required. The first invocation resolved the tool and exited 0, so the conditional +`dotnet tool install --global dotnet-coverage` branch of this task was not taken and no +second invocation was made. + +## Output Summary + +`dotnet-coverage` is already installed and on `PATH` for this session, reporting version +`18.5.2+6e39b75eaf98f2691cf62dbf259669cc13851fd3` with exit code 0. +`scripts/vscode/Invoke-MSTestWithCoverage.ps1`, used by `[P0-T12]` and `[P5-T6]`, requires this +tool and its requirement is satisfied. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t9-csharpier-check.2026-08-26T08-45.md b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t9-csharpier-check.2026-08-26T08-45.md new file mode 100644 index 000000000..a519ce077 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t9-csharpier-check.2026-08-26T08-45.md @@ -0,0 +1,23 @@ +# [P0-T9] Baseline Formatting Gate + +Timestamp: 2026-08-26T08-45 + +Task: [P0-T9] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `pwsh -NoProfile -Command 'dotnet tool run csharpier check .'` +EXIT_CODE: 0 + +Output Summary: `Checked 1520 files in 5604ms.` CSharpier 1.2.6 reported no unformatted file. +The exit code is zero, so the unformatted path set is empty and this task's conditional +"list every path CSharpier reports as unformatted" branch does not apply. + +## Consequence for `[P5-T2]` + +Because the baseline exit code is `0`, there is no pre-existing formatting blocker in this +worktree. `[P5-T2]`'s pre-existing-baseline reconciliation branch is therefore not available: +the final read-only repository-wide `dotnet tool run csharpier check .` gate must itself exit `0`. + +## Baseline Unformatted Path Set + +(empty) diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/cr1-actions-testability-seams.2026-08-26T11-35.md b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/cr1-actions-testability-seams.2026-08-26T11-35.md new file mode 100644 index 000000000..825ff9e81 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/cr1-actions-testability-seams.2026-08-26T11-35.md @@ -0,0 +1,63 @@ +# CR-1 Follow-up Issue Mirror - QfcFormController.Actions.cs Testability Seams + +Timestamp: 2026-08-26T11-35 + +Origin: feature review finding CR-1 / feature-audit residual item 3, not a plan task. +Feature: docs/features/active/quickfiler-bug-family-446 +Promotion type: refactor +Work mode: minor-audit + +## Why this was filed + +The `2026-08-26T11-29` feature review accepted the `QfcFormController.Actions.cs` coverage carve-out +as legitimate, but recorded one gap: no promoted document routed the resulting testability-seam +debt. A finding that lives only as prose inside an active feature folder is lost when that folder is +archived at epic close, so the debt was promoted to a real issue. + +## MCP Calls + +Tool: mcp__drm-copilot__new_potential_entry +Result: ok=true +Potential-entry path returned: `docs/features/potential/2026-08-26-qfcformcontroller-actions-testability-seams.md` + +Tool: mcp__drm-copilot__potential_to_issue +Result: ok=true +Arguments: promotion_type=refactor, work_mode=minor-audit +Promoted record retained at: `docs/features/potential/promoted/2026-08-26-qfcformcontroller-actions-testability-seams.md` + +## GitHub Issue + +- Issue number: 624 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/624 +- Source of the number and URL: the `artifacts` field of the promotion result payload. + +Both payloads embedded the absolute worktree path in `workspace_root`, `artifacts` and +`destination_path`. Those paths are omitted here rather than reproduced, because the repository +artifact-hygiene rule forbids absolute host paths in any committed artifact. Every other field is as +returned. + +## Substance Recorded on the Issue + +The uncovered set in `QuickFiler/Controllers/QfcFormController.Actions.cs` is three blocks: + +| Lines | Block | Why untestable today | +| --- | --- | --- | +| 29-160 | `LoadItems` / `LoadItemsAsync` overloads | bound to `TableLayoutPanel` and Outlook COM with no seam | +| 241-258 | `ProcessUndoItemAsync` | COM-and-dispatcher take branch | +| 267-306 | `UndoDialog` | three modal `MessageBox.Show` calls at :225, :238, :248 | + +The issue carries one correction to the original #446 carve-out rationale, established by the +review's independent re-derivation of the uncovered-line map: the carve-out named only the +`MessageBox.Show` calls, which understates the problem. A dialog seam alone would lift the file to +roughly 67%, not past 90%, because the COM-bound loader overloads at 29-160 dominate. A future plan +that seams only the dialog will miss the target. Recording that correction is the main reason this +mirror exists. + +The issue also records that `[ExcludeFromCodeCoverage]` is not an acceptable route here, since the +repository's policy direction disfavors coverage exemptions where the real answer is a seam. + +EXIT_CODE: 0 + +Output Summary: The CR-1 testability-seam debt was promoted to refactor issue #624 in minor-audit +mode, with the promoted record retained. The issue carries the corrected uncovered-line analysis +showing that a dialog-only seam reaches roughly 67% and is insufficient. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t17-pr-closing-keyword-constraint.2026-08-26T10-41.md b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t17-pr-closing-keyword-constraint.2026-08-26T10-41.md new file mode 100644 index 000000000..976c857c4 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t17-pr-closing-keyword-constraint.2026-08-26T10-41.md @@ -0,0 +1,55 @@ +# Pull-Request Closing-Keyword Constraint (Issue 446 Family) + +Timestamp: 2026-08-26T10-41 + +Task: [P4-T17] +Feature: docs/features/active/quickfiler-bug-family-446 +Audience: the pull-request author for the branch `bug/quickfiler-bug-family-446` +PostedAs: unknown — this is a local constraint note for the pull-request author, not an issue +update. It has not been posted to GitHub. + +## Constraint + +The pull-request body for this change set carries GitHub closing keywords for **exactly three** +issue numbers: + +- **#446** +- **#448** +- **#426** + +No other issue number may be preceded by a closing keyword anywhere in the pull-request body. + +## Issue #427 must remain open + +`docs/features/active/quickfiler-bug-family-446/issue.md:5` reads: + +``` +- Also closes: #426, #427, #448 +``` + +That line is **superseded by decision D1** and **must not be transcribed** into the pull-request +body. This change set delivers only the #427-A producer side — the scorer returns +`(long Score, string TopFolder)` and the accepted candidate's folder reaches the datamodel +boundary as `QfcDequeueBatch.PreScored`. The consumer side of #427 is not delivered here, so #427 +must remain open after this pull request merges. + +#427 may be referenced in the pull-request body as context (for example "advances #427" or +"partially addresses #427"), but never with `close`, `closes`, `closed`, `fix`, `fixes`, `fixed`, +`resolve`, `resolves` or `resolved` — with or without a trailing colon — immediately preceding it. + +## Verification already performed + +`[P4-T17]` scanned every path returned by +`git diff --name-only 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD` (105 paths) and the output +of `git log 61edc19befcf6c4e95b5acd32542f2dcdab41b78..HEAD --format=%B` (6 commits) for the +case-insensitive pattern `(close[sd]?|fix(es|ed)?|resolve[sd]?):? +#427`. Both scans returned +**zero matches**. See `evidence/qa-gates/p4-t17-ac17.*.md`. + +The pull-request body is authored after this plan completes and is therefore outside the scope of +that scan. This note is the record of the constraint it must satisfy. + +## Output Summary + +Closing keywords in the pull-request body are limited to three issue numbers: #446, #448 and #426. +The `Also closes: #426, #427, #448` line in `issue.md` is superseded by decision D1 and is not +transcribed. Issue #427 remains open. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t22-monitor-consolidation.2026-08-26T10-49.md b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t22-monitor-consolidation.2026-08-26T10-49.md new file mode 100644 index 000000000..74ca25035 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t22-monitor-consolidation.2026-08-26T10-49.md @@ -0,0 +1,64 @@ +# [P4-T22] Follow-up Issue Mirror - Three independent EmailMoveMonitor instances + +Timestamp: 2026-08-26T10-49 + +Task: [P4-T22] +Feature: docs/features/active/quickfiler-bug-family-446 +Promotion type: bug +Work mode: minor-audit + +## MCP Calls + +Tool: mcp__drm-copilot__new_potential_bug_entry +Result: ok=true +Raw payload: + +```json +{"ok":true,"tool":"mcp__drm-copilot__new_potential_bug_entry","workspace_root":"REDACTED-REPO-ROOT","summary":"Created a new potential bug entry for 'quickfiler-emailmovemonitor-instances-not-shared'.","artifacts":["REDACTED-REPO-ROOT/docs/features/potential/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md"]} +``` + +Potential-entry path returned by the potential-entry tool: +`docs/features/potential/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md` + +Tool: mcp__drm-copilot__potential_to_issue +Result: ok=true +Raw payload: + +```json +{"ok":true,"tool":"potential_to_issue","workspace_root":"REDACTED-REPO-ROOT","summary":"Promoted 'REDACTED-REPO-ROOT/docs/features/potential/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md' as a bug workflow in minor-audit mode.","artifacts":["https://github.com/drmoisan/TaskMaster/issues/620"],"destination_path":"REDACTED-REPO-ROOT/docs/features/potential/promoted/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md","target_repository":"drmoisan/TaskMaster"} +``` + +## GitHub Issue + +- Issue number: 620 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/620 +- Source of the number and URL: taken directly from the `artifacts` field of the + `mcp__drm-copilot__potential_to_issue` result payload quoted above. It was not inferred from a + generated issue file and not read back from any other source. +- Promoted record retained at: `docs/features/potential/promoted/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md` + +## Issue Body Summary + +UnhookItem routed through QfcQueue cannot release a hook registered by QfcDatamodel, because QfcDatamodel.cs:103, QfcQueue.cs:40 and QfcCollectionController.cs:78 each construct a separate monitor. + +## Dropped-Section Restoration + +The promotion tool mapped `Summary`, `Environment`, `Steps to Reproduce`, `Expected Behavior`, `Actual Behavior`, `Logs / Screenshots` and `Impact / Severity` into the issue body, but dropped `Suspected Cause / Notes` and `Proposed Fix / Validation Ideas`. Those two sections carry the #446 provenance and the remediation ideas, so they were restored as an issue comment rather than left lost. + +- Comment URL: https://github.com/drmoisan/TaskMaster/issues/620#issuecomment-5427083304 + +## Path Redaction Note + +The two payloads above are reproduced verbatim except that the absolute workspace path was replaced +with `REDACTED-REPO-ROOT`. The repository artifact-hygiene rule forbids absolute host paths, account +names and machine names in any committed artifact, and the raw payloads embed the absolute worktree +path in `workspace_root`, `artifacts` and `destination_path`. No other character was altered; the +`ok`, `tool`, `summary`, `artifacts`, `destination_path` and `target_repository` fields are otherwise +as returned. + +EXIT_CODE: 0 + +Output Summary: Both MCP calls returned ok=true. The potential entry was created at +`docs/features/potential/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md`, promoted to bug issue #620 (https://github.com/drmoisan/TaskMaster/issues/620) in minor-audit mode, and the promoted record was +retained at `docs/features/potential/promoted/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md`. Verified on disk that the promoted record exists and the pre-promotion original +no longer remains under `docs/features/potential/`. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t23-disposal-ordering.2026-08-26T10-49.md b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t23-disposal-ordering.2026-08-26T10-49.md new file mode 100644 index 000000000..62beb5d77 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t23-disposal-ordering.2026-08-26T10-49.md @@ -0,0 +1,64 @@ +# [P4-T23] Follow-up Issue Mirror - QfcFormController.Cleanup() disposal ordering defect + +Timestamp: 2026-08-26T10-49 + +Task: [P4-T23] +Feature: docs/features/active/quickfiler-bug-family-446 +Promotion type: bug +Work mode: minor-audit + +## MCP Calls + +Tool: mcp__drm-copilot__new_potential_bug_entry +Result: ok=true +Raw payload: + +```json +{"ok":true,"tool":"mcp__drm-copilot__new_potential_bug_entry","workspace_root":"REDACTED-REPO-ROOT","summary":"Created a new potential bug entry for 'qfcformcontroller-cleanup-disposal-ordering'.","artifacts":["REDACTED-REPO-ROOT/docs/features/potential/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md"]} +``` + +Potential-entry path returned by the potential-entry tool: +`docs/features/potential/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md` + +Tool: mcp__drm-copilot__potential_to_issue +Result: ok=true +Raw payload: + +```json +{"ok":true,"tool":"potential_to_issue","workspace_root":"REDACTED-REPO-ROOT","summary":"Promoted 'REDACTED-REPO-ROOT/docs/features/potential/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md' as a bug workflow in minor-audit mode.","artifacts":["https://github.com/drmoisan/TaskMaster/issues/621"],"destination_path":"REDACTED-REPO-ROOT/docs/features/potential/promoted/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md","target_repository":"drmoisan/TaskMaster"} +``` + +## GitHub Issue + +- Issue number: 621 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/621 +- Source of the number and URL: taken directly from the `artifacts` field of the + `mcp__drm-copilot__potential_to_issue` result payload quoted above. It was not inferred from a + generated issue file and not read back from any other source. +- Promoted record retained at: `docs/features/potential/promoted/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md` + +## Issue Body Summary + +QfcFormController.SetupDisposal.cs:216-220 disposes _undoQueue and nulls _globals and _groups without cancelling or awaiting _undoConsumerTask, racing an in-flight consumer iteration during teardown. + +## Dropped-Section Restoration + +The promotion tool mapped `Summary`, `Environment`, `Steps to Reproduce`, `Expected Behavior`, `Actual Behavior`, `Logs / Screenshots` and `Impact / Severity` into the issue body, but dropped `Suspected Cause / Notes` and `Proposed Fix / Validation Ideas`. Those two sections carry the #446 provenance and the remediation ideas, so they were restored as an issue comment rather than left lost. + +- Comment URL: https://github.com/drmoisan/TaskMaster/issues/621#issuecomment-5427083465 + +## Path Redaction Note + +The two payloads above are reproduced verbatim except that the absolute workspace path was replaced +with `REDACTED-REPO-ROOT`. The repository artifact-hygiene rule forbids absolute host paths, account +names and machine names in any committed artifact, and the raw payloads embed the absolute worktree +path in `workspace_root`, `artifacts` and `destination_path`. No other character was altered; the +`ok`, `tool`, `summary`, `artifacts`, `destination_path` and `target_repository` fields are otherwise +as returned. + +EXIT_CODE: 0 + +Output Summary: Both MCP calls returned ok=true. The potential entry was created at +`docs/features/potential/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md`, promoted to bug issue #621 (https://github.com/drmoisan/TaskMaster/issues/621) in minor-audit mode, and the promoted record was +retained at `docs/features/potential/promoted/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md`. Verified on disk that the promoted record exists and the pre-promotion original +no longer remains under `docs/features/potential/`. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t24-dead-scoreloader.2026-08-26T10-49.md b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t24-dead-scoreloader.2026-08-26T10-49.md new file mode 100644 index 000000000..dfc41f262 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t24-dead-scoreloader.2026-08-26T10-49.md @@ -0,0 +1,64 @@ +# [P4-T24] Follow-up Issue Mirror - Dead scoreLoader parameter on QfcRemainingQueueAdmission + +Timestamp: 2026-08-26T10-49 + +Task: [P4-T24] +Feature: docs/features/active/quickfiler-bug-family-446 +Promotion type: bug +Work mode: minor-audit + +## MCP Calls + +Tool: mcp__drm-copilot__new_potential_bug_entry +Result: ok=true +Raw payload: + +```json +{"ok":true,"tool":"mcp__drm-copilot__new_potential_bug_entry","workspace_root":"REDACTED-REPO-ROOT","summary":"Created a new potential bug entry for 'qfcremainingqueueadmission-dead-scoreloader'.","artifacts":["REDACTED-REPO-ROOT/docs/features/potential/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md"]} +``` + +Potential-entry path returned by the potential-entry tool: +`docs/features/potential/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md` + +Tool: mcp__drm-copilot__potential_to_issue +Result: ok=true +Raw payload: + +```json +{"ok":true,"tool":"potential_to_issue","workspace_root":"REDACTED-REPO-ROOT","summary":"Promoted 'REDACTED-REPO-ROOT/docs/features/potential/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md' as a bug workflow in minor-audit mode.","artifacts":["https://github.com/drmoisan/TaskMaster/issues/622"],"destination_path":"REDACTED-REPO-ROOT/docs/features/potential/promoted/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md","target_repository":"drmoisan/TaskMaster"} +``` + +## GitHub Issue + +- Issue number: 622 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/622 +- Source of the number and URL: taken directly from the `artifacts` field of the + `mcp__drm-copilot__potential_to_issue` result payload quoted above. It was not inferred from a + generated issue file and not read back from any other source. +- Promoted record retained at: `docs/features/potential/promoted/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md` + +## Issue Body Summary + +QfcRemainingQueueAdmission.cs declares scoreLoader at :17 and null-checks it at :23-26, but never assigns or invokes it. + +## Dropped-Section Restoration + +The promotion tool mapped `Summary`, `Environment`, `Steps to Reproduce`, `Expected Behavior`, `Actual Behavior`, `Logs / Screenshots` and `Impact / Severity` into the issue body, but dropped `Suspected Cause / Notes` and `Proposed Fix / Validation Ideas`. Those two sections carry the #446 provenance and the remediation ideas, so they were restored as an issue comment rather than left lost. + +- Comment URL: https://github.com/drmoisan/TaskMaster/issues/622#issuecomment-5427083629 + +## Path Redaction Note + +The two payloads above are reproduced verbatim except that the absolute workspace path was replaced +with `REDACTED-REPO-ROOT`. The repository artifact-hygiene rule forbids absolute host paths, account +names and machine names in any committed artifact, and the raw payloads embed the absolute worktree +path in `workspace_root`, `artifacts` and `destination_path`. No other character was altered; the +`ok`, `tool`, `summary`, `artifacts`, `destination_path` and `target_repository` fields are otherwise +as returned. + +EXIT_CODE: 0 + +Output Summary: Both MCP calls returned ok=true. The potential entry was created at +`docs/features/potential/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md`, promoted to bug issue #622 (https://github.com/drmoisan/TaskMaster/issues/622) in minor-audit mode, and the promoted record was +retained at `docs/features/potential/promoted/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md`. Verified on disk that the promoted record exists and the pre-promotion original +no longer remains under `docs/features/potential/`. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t25-line-cap-violations.2026-08-26T10-49.md b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t25-line-cap-violations.2026-08-26T10-49.md new file mode 100644 index 000000000..183291367 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t25-line-cap-violations.2026-08-26T10-49.md @@ -0,0 +1,62 @@ +# [P4-T25] Follow-up Issue Mirror - Pre-existing 500-line cap violations in QuickFiler + +Timestamp: 2026-08-26T10-49 + +Task: [P4-T25] +Feature: docs/features/active/quickfiler-bug-family-446 +Promotion type: feature +Work mode: minor-audit + +## MCP Calls + +Tool: mcp__drm-copilot__new_potential_entry +Result: ok=true +Raw payload: + +```json +{"ok":true,"tool":"mcp__drm-copilot__new_potential_entry","workspace_root":"REDACTED-REPO-ROOT","summary":"Created a new potential entry for 'quickfiler-500-line-cap-violations'.","artifacts":["REDACTED-REPO-ROOT/docs/features/potential/2026-08-26-quickfiler-500-line-cap-violations.md"]} +``` + +Potential-entry path returned by the potential-entry tool: +`docs/features/potential/2026-08-26-quickfiler-500-line-cap-violations.md` + +Tool: mcp__drm-copilot__potential_to_issue +Result: ok=true +Raw payload: + +```json +{"ok":true,"tool":"potential_to_issue","workspace_root":"REDACTED-REPO-ROOT","summary":"Promoted 'REDACTED-REPO-ROOT/docs/features/potential/2026-08-26-quickfiler-500-line-cap-violations.md' as a feature workflow in minor-audit mode.","artifacts":["https://github.com/drmoisan/TaskMaster/issues/623"],"destination_path":"REDACTED-REPO-ROOT/docs/features/potential/promoted/2026-08-26-quickfiler-500-line-cap-violations.md","target_repository":"drmoisan/TaskMaster"} +``` + +## GitHub Issue + +- Issue number: 623 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/623 +- Source of the number and URL: taken directly from the `artifacts` field of the + `mcp__drm-copilot__potential_to_issue` result payload quoted above. It was not inferred from a + generated issue file and not read back from any other source. +- Promoted record retained at: `docs/features/potential/promoted/2026-08-26-quickfiler-500-line-cap-violations.md` + +## Issue Body Summary + +QfcCollectionController.cs (2349), QfcFormControllerTests.cs (827) and QfcQueue.cs (610) all exceed the repository 500-line cap. + +## Section Mapping + +The feature template mapped completely: `Problem / Why`, `Implementation Intent`, `Acceptance Criteria`, `Dependencies / Risks`, `Verification Steps` and `Evidence Checklist` all appear in the issue body. No section was dropped, so no restoration comment was needed. + +## Path Redaction Note + +The two payloads above are reproduced verbatim except that the absolute workspace path was replaced +with `REDACTED-REPO-ROOT`. The repository artifact-hygiene rule forbids absolute host paths, account +names and machine names in any committed artifact, and the raw payloads embed the absolute worktree +path in `workspace_root`, `artifacts` and `destination_path`. No other character was altered; the +`ok`, `tool`, `summary`, `artifacts`, `destination_path` and `target_repository` fields are otherwise +as returned. + +EXIT_CODE: 0 + +Output Summary: Both MCP calls returned ok=true. The potential entry was created at +`docs/features/potential/2026-08-26-quickfiler-500-line-cap-violations.md`, promoted to feature issue #623 (https://github.com/drmoisan/TaskMaster/issues/623) in minor-audit mode, and the promoted record was +retained at `docs/features/potential/promoted/2026-08-26-quickfiler-500-line-cap-violations.md`. Verified on disk that the promoted record exists and the pre-promotion original +no longer remains under `docs/features/potential/`. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/other/p2-t10-commit.2026-08-26T10-13.md b/docs/features/active/quickfiler-bug-family-446/evidence/other/p2-t10-commit.2026-08-26T10-13.md new file mode 100644 index 000000000..01d958a54 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/other/p2-t10-commit.2026-08-26T10-13.md @@ -0,0 +1,42 @@ +# [P2-T10] Phase 2 Commit + +Timestamp: 2026-08-26T10-13 + +Task: [P2-T10] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` +EXIT_CODE: 0 + +Command: `git commit -m "fix(446): report a dequeue stop reason, release rejected hooks, carry top folder to the datamodel boundary"` +EXIT_CODE: 0 + +Resulting HEAD sha: `032673b3a898999430fcc719e8e546628a342ba4` +Parent (Phase 1 commit): `e32eed707be7a07ee5689319553165f6efa1cc48` +Merge base (``, from `[P0-T3]`): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +Command: `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` +EXIT_CODE: 0 +Output line count: **0** + +## Committed change set + +Source (4 files): + +- `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` +- `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` +- `QuickFiler/Controllers/QfcHomeController.Iteration.cs` +- `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` + +Feature artifacts: the Phase 2 plan checklist state plus ten evidence artifacts and eight TRX files +under `evidence/regression-testing/` and `evidence/other/`. + +`.claude/state/` was deliberately not staged. The empty `Deploy_*` directories left by +`vstest /InIsolation` contain no files and were therefore not committed. + +## Output Summary + +Phase 2 committed at `032673b3a898999430fcc719e8e546628a342ba4`. `EXIT_CODE: 0` for both git +commands and the scoped `git status --porcelain` produces zero output lines, so the change set is +fully committed and the source pathspecs are clean. HEAD has advanced past the merge base, so the +`...HEAD` diff gates in later phases remain non-vacuous. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/other/p2-t9-line-counts.2026-08-26T10-11.md b/docs/features/active/quickfiler-bug-family-446/evidence/other/p2-t9-line-counts.2026-08-26T10-11.md new file mode 100644 index 000000000..4a405c4a8 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/other/p2-t9-line-counts.2026-08-26T10-11.md @@ -0,0 +1,45 @@ +# [P2-T9] Interim Line-Cap Audit (End of Phase 2) + +Timestamp: 2026-08-26T10-11 + +Task: [P2-T9] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `git diff --name-only 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD -- "QuickFiler" "QuickFiler.Test"` (plus the uncommitted Phase 2 working-tree changes) +EXIT_CODE: 0 + +Command: `wc -l ` +EXIT_CODE: 0 + +Merge base (``, from `[P0-T3]`): `61edc19befcf6c4e95b5acd32542f2dcdab41b78`. + +## Production files touched so far (5) + +| Lines | File | Cap | +|---|---|---| +| 245 | `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | 500 | +| 480 | `QuickFiler/Controllers/QfcDatamodel.cs` | 500 | +| 288 | `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` | 500 | +| 95 | `QuickFiler/Controllers/QfcHomeController.Iteration.cs` | 500 | +| 133 | `QuickFiler/Interfaces/IQfcDatamodel.cs` | 500 | + +## Test files touched so far (6) + +| Lines | File | Cap | +|---|---|---| +| 391 | `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` | 500 | +| 497 | `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` | 500 | +| 262 | `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` | 500 | +| 468 | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` | 500 | +| 460 | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` | 500 | +| 270 | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` | 500 | + +All counts are taken after `csharpier format`, so they are the counts a formatting gate will see. + +## Output Summary + +Every one of the eleven recorded counts is **at most 500**. The maximum is 497 +(`QfcHomeControllerIterationTests.cs`). The D3-constrained file +`QuickFiler/Controllers/QfcDatamodel.cs` is **480**, at most 500, with net growth from its 496-line +base held negative because `[P1-T5]` relocated `ScoreRemainingQueueMailItemAsync` out of it into +`QfcDatamodel.QueueProcessing.cs` before any widening. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t10-commit.2026-08-26T10-59.md b/docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t10-commit.2026-08-26T10-59.md new file mode 100644 index 000000000..628158f1c --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t10-commit.2026-08-26T10-59.md @@ -0,0 +1,59 @@ +# [P3-T10] Phase 3 Commit + +Timestamp: 2026-08-26T10-59 + +Task: [P3-T10] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` +EXIT_CODE: 0 + +Command: `git commit -m "fix(448): terminate the undo consumer, reset the idle timer on every take, reset the task in finally"` +EXIT_CODE: 0 + +Resulting HEAD sha: `7161c4a7f337ce488917b915459aab86613f9348` +Parent (Phase 2 commit): `032673b3a898999430fcc719e8e546628a342ba4` +Merge base (``, from `[P0-T3]`): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +Commit stat: 29 files changed, 8727 insertions(+), 97 deletions(-). The insertion figure is +dominated by the two whole-assembly TRX files (952 and 956 results). + +Command: `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` +EXIT_CODE: 0 +Output line count: **0** + +## Committed change set + +Source (2 files): + +- `QuickFiler/Controllers/QfcFormController.Actions.cs` +- `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` + +Feature artifacts: the Phase 3 plan checklist state, ten Phase 3 evidence artifacts and eight TRX +files, plus the `[P2-T10]` commit artifact and the hygiene correction described below, which were +written after the Phase 2 commit had already been made. + +## Hygiene correction folded into this commit + +The evidence artifacts written during Phase 2 and Phase 3 each carried a sentence asserting that no +account name or machine name remained under the feature folder — and that sentence quoted the two +tokens literally, which made the assertion self-defeating under a case-insensitive search. All +sixteen affected artifacts were rewritten to state the same fact without quoting the tokens. The +Phase 2 artifacts therefore appear in this commit as modifications. + +Post-correction verification: + +- Case-insensitive content search for the account name and the machine name across the feature + folder: **no match**. +- Case-insensitive filename search across the feature folder: **no match**, excluding the empty + `Deploy_*` scratch directories `vstest /InIsolation` creates. Those contain **0 files** and git + does not track empty directories, so nothing from them entered this commit. +- All 29 TRX files under `evidence/regression-testing/` re-parsed as XML: **0 malformed**. Each + reports its `` and its test outcomes intact. + +`.claude/state/` was deliberately not staged and remains untracked. + +## Output Summary + +Phase 3 committed at `7161c4a7f337ce488917b915459aab86613f9348`. `EXIT_CODE: 0` for both git +commands and the scoped `git status --porcelain` produces zero output lines. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t7-line-counts.2026-08-26T10-50.md b/docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t7-line-counts.2026-08-26T10-50.md new file mode 100644 index 000000000..6797b2113 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t7-line-counts.2026-08-26T10-50.md @@ -0,0 +1,70 @@ +# [P3-T7] Line-Cap Check for the Phase 3 Files + +Timestamp: 2026-08-26T10-50 + +Task: [P3-T7] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `wc -l QuickFiler/Controllers/QfcFormController.Actions.cs QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` +EXIT_CODE: 0 + +## Recorded counts (post-change, post-`csharpier format`) + +| Lines | File | Cap | +|---|---|---| +| 360 | `QuickFiler/Controllers/QfcFormController.Actions.cs` | 500 | +| 496 | `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` | 500 | + +Both recorded counts are **at most 500**. + +## What the test file needed to get there + +`QfcFormControllerSeamTests.cs` was 378 lines at the merge base and reached **576** once +`[P3-T2]` and `[P3-T4]` through `[P3-T6]` had added their four tests. The +`ArrangeUndoConsumer(...)` extraction this task prescribes was applied — it is the shared arrange +for all four tests and also seeds `_undoQueue` — but extraction alone was not sufficient: measured +after it, the file still stood at 532. No new test file was added and +`QuickFiler.Test/QuickFiler.Test.csproj` was not edited, per D4. All 118 `Compile Include` entries +in that project are explicit, with no wildcard, so a new file would have required a csproj edit. + +The remaining reduction came from four changes inside the same file, none of which removes or +weakens an assertion: + +1. `GetPrivateField` / `SetPrivateField` collapsed to expression bodies over a new + `private const BindingFlags PrivateInstance` (`using System.Reflection;` added). 21 lines to 8. +2. `ReadControllerSource` collapsed to an expression body, and `ResolveRepositoryPath`'s manual + `foreach` accumulator replaced with `pathParts.Aggregate(dir.FullName, Path.Combine)` + (`using System.Linq;` added). 25 lines to 14. +3. `UndoConsumer_OnExit_ResetsUndoConsumerTask` restructured to arrange both exit paths once + instead of running two arrange/act/assert cycles in sequence. +4. Doc comments on the members this plan authored were tightened, and the blank line preceding each + `// Act` / `// Assert` marker inside the four new tests was removed. The Arrange–Act–Assert + markers themselves are all retained, so the UT3 structure requirement still holds. + +Changes 1 and 2 are behaviour-preserving simplifications of pre-existing helpers, verified by the +run below; they are recorded here because they touch lines this plan's tasks did not name. + +## Verification after the reduction + +Command: `dotnet tool run csharpier check "QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~QfcFormControllerSeamTests" "/Logger:trx;LogFileName=p3-t7.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p3-t7"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t7/p3-t7.trx` + +Counters: total 16, executed 16, **passed 16**, failed 0, error 0, timeout 0, aborted 0. That is the +twelve pre-existing seam tests plus the four added by Phase 3, all green after the reduction. + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, all test names and all outcomes unchanged. A case-insensitive search +for the account name and the machine name across the feature folder returns no match. + +## Output Summary + +**Both recorded counts are at most 500**: 360 and 496. No new test file was created and the test +project file was not edited. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t9-formcontrollertests-untouched.2026-08-26T10-55.md b/docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t9-formcontrollertests-untouched.2026-08-26T10-55.md new file mode 100644 index 000000000..c31ffec06 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t9-formcontrollertests-untouched.2026-08-26T10-55.md @@ -0,0 +1,36 @@ +# [P3-T9] `QfcFormControllerTests.cs` Is Absent from the Change Set (D-Plan-2, AC24) + +Timestamp: 2026-08-26T10-55 + +Task: [P3-T9] +Feature: docs/features/active/quickfiler-bug-family-446 + +Merge base (``, from `[P0-T3]`): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +Command: `git diff --name-only 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD -- "QuickFiler.Test/Controllers/QfcFormControllerTests.cs"` +EXIT_CODE: 0 +Output line count: **0** + +Supplementary check, so the claim covers uncommitted state as well as committed state: + +Command: `git status --porcelain -- "QuickFiler.Test/Controllers/QfcFormControllerTests.cs"` +EXIT_CODE: 0 +Output line count: **0** + +## Why this matters + +`QuickFiler.Test/Controllers/QfcFormControllerTests.cs` is 827 lines, already over the 500-line +cap. D-Plan-2 decided not to touch it: `spec.md` marks replacing the tautological +`UndoConsumer_ShouldConsumeUndoQueue` placeholder at `:687-701` as **optional**, an optional outcome +is not an atomic task, and editing an 827-line file would engage AC24's single permitted exception +for no acceptance-criteria gain. Leaving the file unmodified makes that exception vacuously +satisfied. + +The four undo-consumer tests this phase added went to +`QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` instead, which `[P3-T7]` records at 496 +lines, within the cap. + +## Output Summary + +The command produces **zero output lines**: the file is absent from the change set both as committed +diff against the merge base and as working-tree status. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/other/p4-t26-commit.2026-08-26T10-52.md b/docs/features/active/quickfiler-bug-family-446/evidence/other/p4-t26-commit.2026-08-26T10-52.md new file mode 100644 index 000000000..76b4311e3 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/other/p4-t26-commit.2026-08-26T10-52.md @@ -0,0 +1,59 @@ +# [P4-T26] Phase 4 Commit + +Timestamp: 2026-08-26T10-52 + +Task: [P4-T26] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `git add "docs/features/active/quickfiler-bug-family-446" "docs/features/potential"` +EXIT_CODE: 0 + +Command: `git commit -m "docs(446): record acceptance-criteria verification for AC1 through AC17, AC20, AC21, AC23 and AC26"` +EXIT_CODE: 0 + +Command: `git status --porcelain -- "docs/features/active/quickfiler-bug-family-446" "docs/features/potential"` +EXIT_CODE: 0 + +## Resulting HEAD + +- Short sha: f455e2dd +- Full sha: f455e2dd4f418dcff319679c4bb0f8242ac1608f + +## Files Committed + +- 21 acceptance-criteria verification artifacts under `evidence/qa-gates/` (one per criterion, [P4-T1] through [P4-T21]) +- 5 mirrors under `evidence/issue-updates/`: the [P4-T17] closing-keyword constraint record plus the four follow-up issue mirrors from [P4-T22] through [P4-T25] +- `spec.md` with 21 acceptance criteria checked off +- `plan.2026-08-24T09-37.md` with [P4-T1] through [P4-T25] checked off +- 4 promoted records under `docs/features/potential/promoted/` + +## Promoted-File Presence + +[P4-T26] instructs that an absence of files under `docs/features/potential/` be recorded explicitly +rather than treated as a promotion failure. In this run the files were NOT absent. All four +promotions retained their promoted record: + +- `docs/features/potential/promoted/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md` +- `docs/features/potential/promoted/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md` +- `docs/features/potential/promoted/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md` +- `docs/features/potential/promoted/2026-08-26-quickfiler-500-line-cap-violations.md` + +Each pre-promotion original was MOVED out of `docs/features/potential/` into `promoted/`, which is +the documented behavior for a source resolved directly from `docs/features/potential/`. Verified: zero +`2026-08-26-*.md` files remain directly under `docs/features/potential/`, and all four promoted +records exist and are committed. + +## Follow-up Issues Filed + +| Task | Issue | Type | Title | +| --- | --- | --- | --- | +| [P4-T22] | #620 | bug | three independent EmailMoveMonitor instances | +| [P4-T23] | #621 | bug | QfcFormController.Cleanup() disposal ordering | +| [P4-T24] | #622 | bug | dead scoreLoader parameter | +| [P4-T25] | #623 | feature | pre-existing 500-line cap violations | + +Output Summary: Phase 4 committed as f455e2dd. The acceptance condition holds: +`git status --porcelain` over the two staged pathspecs produced zero output lines. 21 of 28 +acceptance criteria are checked off in spec.md; AC18, AC19, AC22, AC24, AC25, AC27 and AC28 remain +deferred to Phase 5 by plan design. Four follow-up issues (#620, #621, #622, #623) were filed through +the MCP promotion path. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/coverage-final.cobertura.xml b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/coverage-final.cobertura.xml new file mode 100644 index 000000000..9920ae091 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/coverage-final.cobertura.xml @@ -0,0 +1,190610 @@ + + + + . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t1-ac1.2026-08-26T10-30.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t1-ac1.2026-08-26T10-30.md new file mode 100644 index 000000000..1c429e380 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t1-ac1.2026-08-26T10-30.md @@ -0,0 +1,59 @@ +# [P4-T1] AC1 Verification — #446 Gate Stop-Reason Discrimination + +Timestamp: 2026-08-26T10-30 + +Task: [P4-T1] +Acceptance criterion: AC1 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC1 text (spec.md:875) + +> AC1 — #446 gate: `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` and +> `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` exist in +> `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, are driven by +> `FakeTimeProvider`, fail against the pre-fix gate and pass after. + +## 1. Presence in the named file + +Command: `grep -n "DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop\|DequeueAsync_SourceDrained_ReportsSourceExhaustedStop\|FakeTimeProvider" "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs"` +EXIT_CODE: 0 + +| Test method | Declaration site | `FakeTimeProvider` drive site | +| --- | --- | --- | +| `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs:165` | `:168` `var fakeTime = new FakeTimeProvider();`, passed as `timeProvider: fakeTime` at `:185` and advanced one second per score at `:178` | +| `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs:206` | `:213` `timeProvider: new FakeTimeProvider(),` | + +Both methods carry `[TestMethod]` (`:164` and `:205`). Neither uses a real clock, `Thread.Sleep` +or `Task.Delay`; time advances only through `fakeTime.Advance(TimeSpan.FromSeconds(1))`. + +## 2. Fail-before / pass-after pairing + +| Test | Pre-fix TRX (Failed) | Post-fix TRX (Passed) | +| --- | --- | --- | +| `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t9/p1-t9.trx` — outcome `Failed` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t1/p2-t1.trx` — outcome `Passed` | +| `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t10/p1-t10.trx` — outcome `Failed` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t1/p2-t1.trx` — outcome `Passed` | + +Recorded pre-fix failure messages (verbatim from the cited TRX `ErrorInfo/Message` nodes): + +- `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` (p1-t9.trx): + `Expected batch.Stop to be QfcDequeueStop.DeadlineExpired {value: 2} because an empty batch caused by the first-batch deadline is not source exhaustion, but found QfcDequeueStop.QuantitySatisfied {value: 0}.` +- `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` (p1-t10.trx): + `Expected batch.Stop to be QfcDequeueStop.SourceExhausted {value: 1} because a drained source with no active producer is genuine exhaustion, but found QfcDequeueStop.QuantitySatisfied {value: 0}.` + +Both pre-fix messages are FluentAssertions assertion failures. Neither is a timeout, a hang or a +compile error. + +Corroborating later runs (not required by the acceptance condition, recorded for completeness): +both tests are also `Passed` in `evidence/regression-testing/p2-t8/p2-t8.trx` and +`evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC1 holds. Both named tests exist in +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` at `:165` and +`:206`, are driven exclusively by `FakeTimeProvider`, each has a recorded pre-fix `Failed` +outcome (p1-t9.trx and p1-t10.trx respectively) with an assertion-failure message, and each has a +recorded post-fix `Passed` outcome in p2-t1.trx. The AC1 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t10-ac10.2026-08-26T10-36.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t10-ac10.2026-08-26T10-36.md new file mode 100644 index 000000000..f6d5ac8e4 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t10-ac10.2026-08-26T10-36.md @@ -0,0 +1,75 @@ +# [P4-T10] AC10 Verification — `_undoConsumerTask` Is Reset in a `finally` + +Timestamp: 2026-08-26T10-36 + +Task: [P4-T10] +Acceptance criterion: AC10 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC10 text (spec.md:887) + +> AC10 — `_undoConsumerTask` is reset to `null` on every exit path, including the exception path, +> so a subsequent `UndoDialog()` starts a fresh consumer. Verified by +> `UndoConsumer_OnExit_ResetsUndoConsumerTask` and by the reset sitting in a `finally` block in +> `QuickFiler/Controllers/QfcFormController.Actions.cs`. + +## 1. The `finally` block, post-change + +`QuickFiler/Controllers/QfcFormController.Actions.cs:344-349`, reproduced verbatim: + +```csharp + finally + { + // Unconditional so a later UndoDialog() starts a fresh consumer even when this one + // exited by exception, which disposing _undoQueue mid-take can produce. + _undoConsumerTask = null; + } +``` + +The block is the `finally` of the `try` opened at `:319-320`, whose body is the whole +`while (!_undoQueue.IsCompleted)` loop (`:321-342`). It contains exactly one statement, +`_undoConsumerTask = null;` at `:348`, and that statement is unconditional: there is no `if`, no +`switch` and no early `return` inside the block. Every exit path of `UndoConsumer` — normal loop +completion, the `break` at `:334`, and any propagating exception — therefore passes through it. + +## 2. Assignment census across the production project + +Command: `grep -rn "_undoConsumerTask" QuickFiler/` +EXIT_CODE: 0 + +| Path | Line | Text | Kind | +| --- | --- | --- | --- | +| `QuickFiler/Controllers/QfcFormController.cs` | `91` | `private Task _undoConsumerTask;` | field declaration | +| `QuickFiler/Controllers/QfcFormController.Actions.cs` | `267` | `_undoConsumerTask ??= UndoConsumerStarter(UndoConsumer);` | start site, outside `UndoConsumer` | +| `QuickFiler/Controllers/QfcFormController.Actions.cs` | `348` | `_undoConsumerTask = null;` | the reset, inside the `finally` | + +(The two additional `grep` hits are the compiled `QuickFiler/bin/Debug/QuickFiler.dll` and +`QuickFiler/obj/Debug/QuickFiler.dll` binaries, which are build output rather than source.) + +Within `UndoConsumer` (`:316-350`) there is exactly one `_undoConsumerTask` assignment, the one at +`:348` inside the `finally`, which satisfies the "exactly one assignment" condition of `[P4-T10]`. +The `??=` at `:267` is in `UndoDialog`'s start path, not in the consumer, and is the site that +consumes the reset: because `:348` nulls the handle, the `??=` at `:267` allocates a fresh +consumer on the next `UndoDialog()` call. + +## 3. Recorded outcome — the `[P3-T6]` run + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t6/p3-t6.trx` + +- Recorded outcome for `UndoConsumer_OnExit_ResetsUndoConsumerTask`: **Passed** +- ``: `total="1" executed="1" passed="1" failed="0" error="0" timeout="0" aborted="0"` + +Corroborating later runs: `Passed` in `evidence/regression-testing/p3-t7/p3-t7.trx` and +`evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC10 holds. The `finally` block at +`QuickFiler/Controllers/QfcFormController.Actions.cs:344-349` contains exactly one +`_undoConsumerTask` assignment, the unconditional `_undoConsumerTask = null;` at `:348`, and it is +the only assignment inside `UndoConsumer`. `UndoConsumer_OnExit_ResetsUndoConsumerTask` is +recorded **Passed** in `evidence/regression-testing/p3-t6/p3-t6.trx`. The AC10 checkbox in +`spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t11-ac11.2026-08-26T10-36.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t11-ac11.2026-08-26T10-36.md new file mode 100644 index 000000000..2cc567b7f --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t11-ac11.2026-08-26T10-36.md @@ -0,0 +1,104 @@ +# [P4-T11] AC11 Verification — Every Loop Branch Awaits or Breaks + +Timestamp: 2026-08-26T10-36 + +Task: [P4-T11] +Acceptance criterion: AC11 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC11 text (spec.md:888) + +> AC11 — the empty-queue path always yields; no loop branch reaches the loop head without an +> `await` or a `break`. Verified by AC3 and by reading the rewritten loop. + +## 1. The full rewritten loop + +`QuickFiler/Controllers/QfcFormController.Actions.cs:316-350`, reproduced verbatim: + +```csharp + internal async Task UndoConsumer() + { + long start = TimeProvider.GetTimestamp(); + try + { + while (!_undoQueue.IsCompleted) + { + if (_undoQueue.TryTake(out var item)) + { + await UndoItemProcessor(item).ConfigureAwait(false); + + // Reset on every successful take so the threshold measures idle time. The + // previous code started one stopwatch for the whole session, so a consumer + // busy for ten seconds exited while items were still arriving. + start = TimeProvider.GetTimestamp(); + } + else if (TimeProvider.GetElapsedTime(start) > UndoConsumerIdleTimeout) + { + break; + } + else + { + await TimeProvider + .Delay(TimeSpan.FromMilliseconds(200)) + .ConfigureAwait(false); + } + } + } + finally + { + // Unconditional so a later UndoDialog() starts a fresh consumer even when this one + // exited by exception, which disposing _undoQueue mid-take can produce. + _undoConsumerTask = null; + } + } +``` + +## 2. Per-branch table + +The loop head is `while (!_undoQueue.IsCompleted)` at `:321`. The loop body is a single +`if / else if / else` chain, so the three branches below are exhaustive: control entering the body +takes exactly one of them, and there is no fall-through path around the chain. + +| # | Branch | Guard (line) | Body span | Terminates in | Site | +| --- | --- | --- | --- | --- | --- | +| 1 | take branch | `if (_undoQueue.TryTake(out var item))` (`:323`) | `:324-331` | `await` | `await UndoItemProcessor(item).ConfigureAwait(false);` at `:325` | +| 2 | threshold branch | `else if (TimeProvider.GetElapsedTime(start) > UndoConsumerIdleTimeout)` (`:332`) | `:333-335` | `break` | `break;` at `:334` | +| 3 | idle branch | `else` (`:336`) | `:337-341` | `await` | `await TimeProvider.Delay(TimeSpan.FromMilliseconds(200)).ConfigureAwait(false);` at `:338-340` | + +Every branch therefore either yields the thread through an `await` or leaves the loop through +`break`. No branch reaches `:321` again without having done one of the two, so the loop cannot spin +without yielding. In particular branch 3 — the empty-queue path that AC11 names — is the `else` of +the chain and always executes the `TimeProvider.Delay` await; it contains no other statement. + +Two further observations that keep the table exhaustive: + +- Branch 1's trailing statement `start = TimeProvider.GetTimestamp();` at `:330` is a + non-yielding assignment, but it follows the `await` at `:325` in the same branch, so the branch + has still yielded before returning to the head. +- The loop contains no `continue`, no `goto` and no nested loop, so there is no fourth path back + to the head. The only non-branch exit is a propagating exception, which leaves the loop entirely + and runs the `finally` at `:344-349`. + +## 3. Behavioural corroboration — AC3 + +`UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` +(`QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs:397`) asserts that an idle iteration +records at least one delay request on the injected clock. Its pre-fix outcome in +`docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t2/p3-t2.trx` was +`Failed` with `Expected clock.DelayRequests to be greater than or equal to 1 ... but found 0`, +i.e. the pre-rewrite idle branch returned to the head without yielding. Its post-rewrite outcome +in `evidence/regression-testing/p3-t3/p3-t3.trx` is `Passed`, and it is `Passed` again in +`evidence/regression-testing/p3-t7/p3-t7.trx` and `evidence/regression-testing/p3-t8/p3-t8.trx`. +That is the runtime reading of branch 3 in the table above. + +## Output Summary + +AC11 holds. The rewritten loop in +`QuickFiler/Controllers/QfcFormController.Actions.cs:316-350` has exactly three body branches — +take (`:323`), threshold (`:332`) and idle (`:336`) — which are exhaustive because they form one +`if / else if / else` chain. Branch 1 terminates in an `await` at `:325`, branch 2 in a `break` at +`:334`, and branch 3 in an `await` at `:338-340`. AC3's fail-before/pass-after pair corroborates the +idle branch at runtime. The AC11 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t12-ac12.2026-08-26T10-37.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t12-ac12.2026-08-26T10-37.md new file mode 100644 index 000000000..b36f1f080 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t12-ac12.2026-08-26T10-37.md @@ -0,0 +1,82 @@ +# [P4-T12] AC12 Verification — Rejected Candidate Releases the Datamodel's Own Monitor Hook + +Timestamp: 2026-08-26T10-37 + +Task: [P4-T12] +Acceptance criterion: AC12 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC12 text (spec.md:889) + +> AC12 — a below-cutoff candidate causes the datamodel's own `_moveMonitor.UnhookItem` to be +> invoked exactly once for that item. Verified by +> `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` in +> `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs`. + +## 1. Presence and shape of the assertion + +Command: `grep -n "DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor" "QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs"` +EXIT_CODE: 0 +Output: `146: public async Task DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor()` + +| Element | Line | Text | +| --- | --- | --- | +| Monitor mock | `171` | `var moveMonitor = new Mock(MockBehavior.Strict);` | +| Injection into the datamodel's own field | `176` | `SetPrivateField(model, "_moveMonitor", moveMonitor.Object);` | +| Act | `181` | `IList result = await model.DequeueNextItemGroupAsync(1, 0);` | +| Verify | `186-190` | `moveMonitor.Verify(x => x.UnhookItem(rejectedItem), Times.Once, "the datamodel must release the rejected candidate's monitor hook exactly once");` | +| Cardinality | `188` | `Times.Once,` | + +Two properties AC12 requires are visible in that arrangement: + +- **Exactly one invocation for the rejected item.** The verify at `:186-190` uses `Times.Once` and + names `rejectedItem` specifically, not `It.IsAny()`. +- **Against the datamodel's own monitor instance.** The mock is written into the datamodel's + private `_moveMonitor` field at `:176` before the act, so a call routed through some other + monitor instance would not satisfy the verify. `MockBehavior.Strict` at `:171` additionally makes + any unconfigured call on that mock throw rather than pass silently. + +The test also re-asserts the drop-on-reject contract at `:184` (`result.Should().BeEmpty(...)`) +and source removal at `:185`, so the unhook is verified alongside the existing behaviour rather +than in place of it. + +## 2. Fail-before / pass-after pairing + +| State | TRX path | Outcome | +| --- | --- | --- | +| Pre-wiring (`[P1-T6]`, red step) | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t6/p1-t6.trx` | Failed | +| Post-wiring (`[P2-T5]`) | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t5/p2-t5.trx` | Passed | + +Recorded pre-wiring failure message, verbatim from `p1-t6.trx`: + +``` +Test method QuickFiler.Controllers.Tests.QfcQueuePurePathsTests.DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor threw exception: +Moq.MockException: the datamodel must release the rejected candidate's monitor hook exactly once +Expected invocation on the mock once, but was 0 times: x => x.UnhookItem(Mock.Object) + +Performed invocations: + + Mock (x): + No invocations performed. +``` + +The observed pre-wiring count is zero invocations, which is the defect AC12 targets: the rejected +candidate's hook was never released on the datamodel's own monitor. The message is a Moq +verification failure, not a compile error or a timeout. + +Corroborating later runs: `Passed` in `evidence/regression-testing/p2-t8/p2-t8.trx` and +`evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC12 holds. +`DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` +(`QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs:146`) asserts exactly one `UnhookItem` +invocation for the rejected item (`Times.Once` at `:188`) against the mock injected into the +datamodel's own `_moveMonitor` field at `:176`. It is recorded `Failed` pre-wiring in +`evidence/regression-testing/p1-t6/p1-t6.trx` with zero invocations observed, and `Passed` +post-wiring in `evidence/regression-testing/p2-t5/p2-t5.trx`. The AC12 checkbox in `spec.md` is +checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t13-ac13.2026-08-26T10-38.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t13-ac13.2026-08-26T10-38.md new file mode 100644 index 000000000..0c0990577 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t13-ac13.2026-08-26T10-38.md @@ -0,0 +1,63 @@ +# [P4-T13] AC13 Verification — A Throwing Rejection Callback Does Not Abort the Scan + +Timestamp: 2026-08-26T10-38 + +Task: [P4-T13] +Acceptance criterion: AC13 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC13 text (spec.md:890) + +> AC13 — a throwing rejection callback does not abort the scan. Verified by +> `DequeueAsync_OnRejectedThrows_ScanContinues`. + +## 1. Presence + +Command: `grep -rn "DequeueAsync_OnRejectedThrows_ScanContinues" QuickFiler.Test/` +EXIT_CODE: 0 +Source hit: `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:377` +(the remaining hits are the compiled `QuickFiler.Test/bin/Debug` and `QuickFiler.Test/obj/Debug` +assemblies and PDBs, which are build output rather than source). + +## 2. Recorded outcome — the `[P2-T2]` run + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t2/p2-t2.trx` + +- Recorded outcome for `DequeueAsync_OnRejectedThrows_ScanContinues`: **Passed** +- ``: `total="4" executed="4" passed="4" failed="0" error="0" timeout="0" aborted="0"` + +The four tests in that run, all Passed, are: + +| Test | Outcome | +| --- | --- | +| `DequeueAsync_OnRejectedThrows_ScanContinues` | Passed | +| `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` | Passed | +| `DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected` | Passed | +| `DequeueAsync_BelowThresholdItemsAreDiscarded` | Passed | + +The companion tests matter to the reading of AC13: the accepted-candidate negative control +(`DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected`) and the drop-on-reject regression +(`DequeueAsync_BelowThresholdItemsAreDiscarded`) pass in the same run, so the throwing-sink +tolerance was not obtained by suppressing the rejection path altogether. + +## 3. Fail-before (recorded for completeness) + +`docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t3/p1-t3.trx` — +outcome `Failed`, message verbatim: + +``` +Expected invocations to contain a single item because the throwing sink must still be invoked once for the rejected item, but the collection is empty. +``` + +Corroborating later runs: `Passed` in `evidence/regression-testing/p2-t8/p2-t8.trx` and +`evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC13 holds. `DequeueAsync_OnRejectedThrows_ScanContinues` +(`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:377`) is recorded +**Passed** in `evidence/regression-testing/p2-t2/p2-t2.trx`, a run of four tests with +`passed="4" failed="0" timeout="0" aborted="0"`. The AC13 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t14-ac14.2026-08-26T10-38.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t14-ac14.2026-08-26T10-38.md new file mode 100644 index 000000000..72850130d --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t14-ac14.2026-08-26T10-38.md @@ -0,0 +1,79 @@ +# [P4-T14] AC14 Verification — Drop-on-Reject Contract Is Byte-Unchanged + +Timestamp: 2026-08-26T10-38 + +Task: [P4-T14] +Acceptance criterion: AC14 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC14 text (spec.md:891) + +> AC14 — the drop-on-reject contract is intact: `DequeueAsync_BelowThresholdItemsAreDiscarded` at +> `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:298-310` still passes and +> its body is byte-unchanged. Verified by +> `git diff ...HEAD -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` +> showing no hunk inside that test method. + +## 1. Why a byte comparison rather than a line-range diff + +`[P1-T1]` replaced the descending `GetConstructor` fallback chain with a single exact lookup, which +removed lines above this method and shifted its line numbers. The method's baseline span was +`:299-310` and its span at HEAD is `:242-253`, a shift of 57 lines. A line-range diff would report +that shift as a change, so `[P0-T15]` and `[P4-T14]` compare the extracted body text by SHA-256 +instead. + +Extraction rule, identical to the one `[P0-T15]` recorded: the body text is the line carrying +`public async Task DequeueAsync_BelowThresholdItemsAreDiscarded()` through the first following +line whose content is exactly eight spaces plus a closing brace, inclusive, with the selected lines +joined by a single LF and hashed as UTF-8 bytes. + +## 2. Digest comparison + +| Tree state | Source | Span | Line count | SHA-256 | +| --- | --- | --- | --- | --- | +| Baseline (`[P0-T15]`, merge base) | `evidence/baseline/p0-t15-pinned-surface.2026-08-26T09-05.md` | `:299-310` | 12 | `4cd6c2650d106d987d493b1fcb42c5a0313d4a419a3fe8f3b2369fff5c661700` | +| HEAD | recomputed for this task | `:242-253` | 12 | `4cd6c2650d106d987d493b1fcb42c5a0313d4a419a3fe8f3b2369fff5c661700` | + +The two digests are **identical**. Both are 64 hexadecimal characters and both line counts are 12. + +Extracted body text at HEAD, reproduced for the record: + +```csharp + public async Task DequeueAsync_BelowThresholdItemsAreDiscarded() + { + var item = CreateMailItem("discard", "entry-discard"); + object gate = CreateGate( + new Queue(new[] { item }), + new Dictionary { [item] = 899 } + ); + + IList result = await DequeueAsync(gate, 1, 0, CancellationToken.None); + + result.Should().BeEmpty(); + } +``` + +This is character-for-character the text `[P0-T15]` reproduced from the merge-base tree. + +## 3. Recorded outcome — the `[P2-T2]` run + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t2/p2-t2.trx` + +- Recorded outcome for `DequeueAsync_BelowThresholdItemsAreDiscarded`: **Passed** +- ``: `total="4" executed="4" passed="4" failed="0" error="0" timeout="0" aborted="0"` + +That run is the one in which the `else`-branch rejection invocation landed, so the drop-on-reject +regression is confirmed green against the change that could most plausibly have broken it. +Corroborating later runs: `Passed` in `evidence/regression-testing/p2-t8/p2-t8.trx` and +`evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC14 holds. The SHA-256 of the `DequeueAsync_BelowThresholdItemsAreDiscarded` body at HEAD is +`4cd6c2650d106d987d493b1fcb42c5a0313d4a419a3fe8f3b2369fff5c661700`, identical to the digest +recorded by `[P0-T15]` at the merge base, so the body is byte-unchanged despite a 57-line +positional shift. The test is recorded **Passed** in +`evidence/regression-testing/p2-t2/p2-t2.trx`. The AC14 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t15-ac15.2026-08-26T10-39.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t15-ac15.2026-08-26T10-39.md new file mode 100644 index 000000000..f2aec265e --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t15-ac15.2026-08-26T10-39.md @@ -0,0 +1,65 @@ +# [P4-T15] AC15 Verification — STA Thread-Affinity Contract Is Preserved + +Timestamp: 2026-08-26T10-39 + +Task: [P4-T15] +Acceptance criterion: AC15 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC15 text (spec.md:892) + +> AC15 — the STA thread-affinity contract is preserved: `EmailMoveMonitorTests.cs` +> `AllComAccess_FlowsThroughInjectedMarshalDelegate` (`:176-198`) and the null-argument no-op test +> (`:134-145`) still pass unmodified, and `QuickFiler/Helper Classes/EmailMoveMonitor.cs` appears +> in no diff hunk. + +## 1. Diff gate + +Command: `git diff --name-only 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD -- "QuickFiler/Helper Classes/EmailMoveMonitor.cs" "QuickFiler.Test/Helper Classes/EmailMoveMonitorTests.cs"` +EXIT_CODE: 0 +Output line count: **0** + +The command produced zero output lines. Neither the production monitor nor its test file is +modified between the merge base and HEAD, so neither appears in any diff hunk. + +## 2. The two named tests + +Both are declared in `QuickFiler.Test/Helper Classes/EmailMoveMonitorTests.cs`: + +| Test | `[TestMethod]` | Declaration | +| --- | --- | --- | +| `AllComAccess_FlowsThroughInjectedMarshalDelegate` | `:176` | `:177` | +| `UnhookItem_Null_IsNoOp_NoComAccessNoMarshalInvocation` (the null-argument no-op test) | `:134` | `:135` | + +These positions match the spans AC15 quotes (`:176-198` and `:134-145`); the file is unmodified, +so the baseline and HEAD positions are necessarily the same. + +## 3. `[P3-T8]` outcomes + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8/p3-t8.trx` +(the `[P3-T8]` whole-assembly run, 956 results, all Passed). + +| Test | Outcome in `[P3-T8]` | +| --- | --- | +| `AllComAccess_FlowsThroughInjectedMarshalDelegate` | Passed | +| `UnhookItem_Null_IsNoOp_NoComAccessNoMarshalInvocation` | Passed | + +Both are also `Passed` in the earlier whole-assembly run +`evidence/regression-testing/p2-t8/p2-t8.trx`. + +Note on scope: AC12's new unhook wiring routes through the datamodel's own `_moveMonitor` +instance and is verified against a `Mock` rather than the concrete class, which +is why `EmailMoveMonitor.cs` itself required no edit and its thread-affinity tests still pass +unmodified. + +## Output Summary + +AC15 holds. The `git diff --name-only` gate over +`QuickFiler/Helper Classes/EmailMoveMonitor.cs` and +`QuickFiler.Test/Helper Classes/EmailMoveMonitorTests.cs` exits 0 with **zero output lines**, and +both `AllComAccess_FlowsThroughInjectedMarshalDelegate` (`:177`) and +`UnhookItem_Null_IsNoOp_NoComAccessNoMarshalInvocation` (`:135`) are recorded **Passed** in +`evidence/regression-testing/p3-t8/p3-t8.trx`. The AC15 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t16-ac16.2026-08-26T10-40.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t16-ac16.2026-08-26T10-40.md new file mode 100644 index 000000000..054704d32 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t16-ac16.2026-08-26T10-40.md @@ -0,0 +1,79 @@ +# [P4-T16] AC16 Verification — TopFolder Survives to the Datamodel Boundary + +Timestamp: 2026-08-26T10-40 + +Task: [P4-T16] +Acceptance criterion: AC16 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC16 text (spec.md:893) + +> AC16 — #427-A producer side: an accepted candidate's `TopFolder` survives to the datamodel +> boundary as `QfcDequeueBatch.PreScored`, and `ScoreRemainingQueueMailItemAsync` returns +> `(long Score, string TopFolder)`. Verified by AC5 and +> `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult`. + +## 1. Recorded outcomes + +| Test | TRX path | Outcome | +| --- | --- | --- | +| `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t3/p2-t3.trx` (`[P2-T3]`) | Passed | +| `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t4/p2-t4.trx` (`[P2-T4]`) | Passed | + +Both had a recorded red predecessor, so each pass is a state change rather than a vacuous green: + +- `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` — `Failed` in + `evidence/regression-testing/p1-t13/p1-t13.trx`. +- `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` — `Failed` in + `evidence/regression-testing/p1-t12/p1-t12.trx`, with the folder observed as the empty string + (see `evidence/qa-gates/p4-t5-ac5.*.md`). + +Both are `Passed` again in the whole-assembly runs +`evidence/regression-testing/p2-t8/p2-t8.trx` and `evidence/regression-testing/p3-t8/p3-t8.trx`. + +## 2. The `PreScored` projection site + +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs:189-192`, reproduced verbatim: + +```csharp + QfcGateBatch batch = await gate.DequeueAsync(quantity, timeOut, _token); + IList accepted = batch.Accepted; + var nodes = accepted.Select(x => x.MailItem).ToList(); + return new QfcDequeueBatch(UnhookDequeuedNodes(nodes), accepted, batch.Stop); +``` + +| Line | Role | +| --- | --- | +| `:189` | the gate call returns a `QfcGateBatch` | +| `:190` | the accepted carriers are lifted out of the gate batch, retaining `TopFolder` | +| `:191` | the bare `MailItem` list is derived for the legacy `Items` channel | +| `:192` | `accepted` is passed as the `preScored` argument of the `QfcDequeueBatch` constructor | + +That is the projection AC16 names: the same `IList` the gate accepted is handed +straight to `QfcDequeueBatch`, not re-derived, so the folder the gate computed reaches the +datamodel boundary. The receiving surface is +`QuickFiler/Interfaces/IQfcDatamodel.cs:52` (`private readonly IList _preScored;`), +`:61` (the constructor parameter) and `:77` +(`public IList PreScored => _preScored ?? new List();`). + +The carrier that holds the folder is the `QfcPreScoredItem` readonly struct at +`QuickFiler/Controllers/QfcHighConfidencePreFilter.cs:98`, constructed at +`:108`, and populated inside the gate at +`QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs:195` +(`accepted.Add(new QfcPreScoredItem(mailItem, topFolder));`). Documentation at +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs:105` and `:167` names +`QfcDequeueBatch.PreScored` explicitly as the channel. + +## Output Summary + +AC16 holds. `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` is recorded +**Passed** in `evidence/regression-testing/p2-t3/p2-t3.trx` and +`ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` **Passed** in +`evidence/regression-testing/p2-t4/p2-t4.trx`, each after a recorded red predecessor. The +`PreScored` projection site is +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs:189-192`, where the gate's accepted +`IList` is passed unchanged into the `QfcDequeueBatch` constructor. The AC16 +checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t17-ac17.2026-08-26T10-42.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t17-ac17.2026-08-26T10-42.md new file mode 100644 index 000000000..fc39e1fa8 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t17-ac17.2026-08-26T10-42.md @@ -0,0 +1,106 @@ +# [P4-T17] AC17 Verification — Issue 427 Remains Open + +Timestamp: 2026-08-26T10-42 + +Task: [P4-T17] +Acceptance criterion: AC17 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC17 text (spec.md:897) + +> AC17 — **Issue #427 remains open after this work merges.** No GitHub closing keyword immediately +> precedes a reference to that issue number in any commit message, in the pull-request body, or in +> any file in this change set. The keyword set to scan for is `close`, `closes`, `closed`, +> `fix`, `fixes`, `fixed`, `resolve`, `resolves`, `resolved`, each optionally followed by a +> colon. The pull-request body carries closing keywords for **#446, #448 and #426 only**. + +## 1. Scan pattern + +Case-insensitive extended regular expression, as specified by `[P4-T17]`: + +``` +(close[sd]?|fix(es|ed)?|resolve[sd]?):? +#427 +``` + +The alternation encodes the nine-keyword set (`close`, `closes`, `closed`, `fix`, `fixes`, +`fixed`, `resolve`, `resolves`, `resolved`), `:?` encodes the optional colon, and ` +` +encodes the immediately-precedes requirement. + +## 2. File scan over the change set + +Command: `git diff --name-only 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD` +EXIT_CODE: 0 +Paths returned: **105** + +Every returned path that exists in the working tree was scanned with +`grep -icE '(close[sd]?|fix(es|ed)?|resolve[sd]?):? +#427'`. + +- **FILE_MATCH_TOTAL: 0** + +The scan returned zero matches across all 105 paths. + +## 3. Commit-message scan + +Command: `git log 61edc19befcf6c4e95b5acd32542f2dcdab41b78..HEAD --format=%B` +EXIT_CODE: 0 +Commits in range: **6** + +Piped to `grep -icE '(close[sd]?|fix(es|ed)?|resolve[sd]?):? +#427'`. + +- **LOG_MATCH_TOTAL: 0** + +Commit subjects in the range, for the record: + +``` +ae1124e9 docs(446): record the phase 3 commit sha and the evidence hygiene correction +7161c4a7 fix(448): terminate the undo consumer, reset the idle timer on every take, reset the task in finally +032673b3 fix(446): report a dequeue stop reason, release rejected hooks, carry top folder to the datamodel boundary +e32eed70 chore(446): scrub host identifiers from TRX regression evidence +68d525a2 test(446): failing-first regression tests for 446, 426 and 427-A producer side +3d4e8e9d chore(446): capture phase 0 policy reads, bootstrap and baselines +``` + +None of the six subjects pairs a closing keyword with #427. `68d525a2` mentions `427-A` in prose, +which is a scope label rather than an issue reference and carries no keyword. + +## 4. Robustness check beyond the specified pattern + +The specified pattern requires at least one space between the keyword and `#427`, so a +no-space form such as `Fixes#427` would escape it. Both scans were therefore repeated with the +space quantifier relaxed to ` *`: + +``` +(close[sd]?|fix(es|ed)?|resolve[sd]?):? *#427 +``` + +Both relaxed scans also returned **zero matches**. The two files in the change set that mention +#427 at all are `docs/features/active/quickfiler-bug-family-446/plan.2026-08-24T09-37.md` (1 +occurrence) and `docs/features/active/quickfiler-bug-family-446/spec.md` (30 occurrences); none of +the 31 occurrences is preceded by a keyword in either form. + +## 5. Pull-request constraint note + +Path: `evidence/issue-updates/p4-t17-pr-closing-keyword-constraint.2026-08-26T10-41.md` + +The note exists at the stated path and states that the pull-request body carries closing keywords +for exactly three issue numbers — **#446, #448 and #426** — and that the +`- Also closes: #426, #427, #448` line at +`docs/features/active/quickfiler-bug-family-446/issue.md:5` is superseded by decision D1 and is +not transcribed. + +Reading of "names exactly three issue numbers": the closing-keyword set the note authorizes is +exactly `{#446, #448, #426}`. The note also mentions #427, necessarily so, because `[P4-T17]` +requires the note to address the `Also closes:` line; there #427 is named as the issue that must +**remain open**, explicitly outside the closing-keyword set. The note contains zero matches for +the AC17 scan pattern, verified by running `grep -icE` against it. + +## Output Summary + +AC17 holds. Both scans returned zero matches: the file scan across the 105 paths of +`git diff --name-only ...HEAD` (FILE_MATCH_TOTAL 0) and the commit-message scan across the 6 +commits of `git log ..HEAD --format=%B` (LOG_MATCH_TOTAL 0). Relaxed-pattern reruns also +returned zero. The pull-request constraint note exists at `evidence/issue-updates/p4-t17-pr-closing-keyword-constraint.2026-08-26T10-41.md` and authorizes closing keywords +for exactly three issue numbers, #446, #448 and #426. The AC17 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t18-ac20.2026-08-26T10-43.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t18-ac20.2026-08-26T10-43.md new file mode 100644 index 000000000..f1dc4b0fa --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t18-ac20.2026-08-26T10-43.md @@ -0,0 +1,82 @@ +# [P4-T18] AC20 Verification — Pre-Existing `IQfcDatamodel` Overloads Are Unchanged + +Timestamp: 2026-08-26T10-43 + +Task: [P4-T18] +Acceptance criterion: AC20 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC20 text (spec.md:900) + +> AC20 — the three pre-existing `IQfcDatamodel` overloads are unchanged. +> `git diff ...HEAD -- "QuickFiler/Interfaces/IQfcDatamodel.cs"` contains only additions; no +> line of the existing `DequeueNextItemGroupAsync` or `DequeueNextItemGroup` declarations is +> removed or altered. + +## 1. Command + +Command: `git diff 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD -- "QuickFiler/Interfaces/IQfcDatamodel.cs"` +EXIT_CODE: 0 +Diff length: 103 lines +Added lines (`^+`, including the `+++` header): 76 +Removed lines (`^-`, including the `---` header): 2 + +## 2. Full hunk list + +| Hunk header | Span | Content | +| --- | --- | --- | +| `@@ -1,9 +1,10 @@` | file header block | one removal and two additions, detailed in section 3 | +| `@@ -21,6 +22,64 @@ namespace QuickFiler.Interfaces` | after the `ConversationUniqueOnly = 32,` enum member | pure addition: the `QfcDequeueStop` enum and the `QfcDequeueBatch` readonly struct, 58 added lines, no removals | +| `@@ -43,6 +102,21 @@ namespace QuickFiler.Interfaces` | between the four-argument `DequeueNextItemGroupAsync` overload and `DequeueNextItemGroup` | pure addition: the XML doc comment and the `Task DequeueNextItemGroupWithOutcomeAsync(...)` declaration, 15 added lines, no removals | + +Hunks 2 and 3 contain no `-` line at all. + +## 3. The single removed line + +Excluding the `--- a/...` file header, the diff contains exactly one removed line: + +``` +-using System; ++using System; +``` + +That pair is the addition of a UTF-8 byte-order mark to line 1. The identifier text is unchanged; +only the leading BOM differs. Line 1 is a `using` directive, so it is **not** a line belonging to +either the `DequeueNextItemGroupAsync` or the `DequeueNextItemGroup` declarations. The other +addition in that hunk is `+using QuickFiler.Controllers;`, required because `QfcDequeueBatch` +references `QfcPreScoredItem`, which lives in that namespace. + +## 4. Byte comparison of the three pre-existing declarations + +The three declarations shifted position because hunks 2 and 3 inserted lines above and between +them, so a positional diff would misreport the shift. They were therefore compared block-by-block +against the merge-base file. + +| Declaration | Baseline line | HEAD line | +| --- | --- | --- | +| `Task> DequeueNextItemGroupAsync(int quantity, int timeOut);` | `26` | `85` | +| `Task> DequeueNextItemGroupAsync(` (four-argument overload) | `40` | `99` | +| `IList DequeueNextItemGroup(int quantity);` | `46` | `120` | + +Command: `diff <(git show :QuickFiler/Interfaces/IQfcDatamodel.cs | sed -n '26,45p') <(sed -n '85,104p' QuickFiler/Interfaces/IQfcDatamodel.cs)` +EXIT_CODE: 0 — **BLOCK_A_IDENTICAL**. Baseline lines 26-45 (both `DequeueNextItemGroupAsync` +overloads with their doc comments) are byte-identical to HEAD lines 85-104. + +Command: `diff <(git show :QuickFiler/Interfaces/IQfcDatamodel.cs | sed -n '46p') <(sed -n '120p' QuickFiler/Interfaces/IQfcDatamodel.cs)` +EXIT_CODE: 0 — **BLOCK_B_IDENTICAL**. Baseline line 46 (`DequeueNextItemGroup`) is byte-identical +to HEAD line 120. + +The new member is `Task DequeueNextItemGroupWithOutcomeAsync(` at +`QuickFiler/Interfaces/IQfcDatamodel.cs:113`, an addition that sits between the two blocks and +alters neither. + +## Output Summary + +AC20 holds. The diff of `QuickFiler/Interfaces/IQfcDatamodel.cs` over `...HEAD` has three +hunks; two are pure additions and the third contains exactly one removed line, the BOM-only rewrite +of the `using System;` directive at line 1. No removed or altered line belongs to the existing +`DequeueNextItemGroupAsync` or `DequeueNextItemGroup` declarations, confirmed by two byte-exact +block comparisons against the merge-base file. The AC20 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t19-ac21.2026-08-26T10-43.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t19-ac21.2026-08-26T10-43.md new file mode 100644 index 000000000..5c87c07ee --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t19-ac21.2026-08-26T10-43.md @@ -0,0 +1,49 @@ +# [P4-T19] AC21 Verification — Overload-Selection Pins Are Untouched + +Timestamp: 2026-08-26T10-43 + +Task: [P4-T19] +Acceptance criterion: AC21 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC21 text (spec.md:901) + +> AC21 — the overload-selection pins are untouched. `git diff --name-only ...HEAD` does not +> list `QuickFiler.Test/Controllers/QfcHomeControllerIssue218Tests.cs` or +> `QuickFiler.Test/Controllers/QfcHomeControllerRunAsyncHighConfidenceTests.cs`. + +## 1. Command and result + +Command: `git diff --name-only 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD -- "QuickFiler.Test/Controllers/QfcHomeControllerIssue218Tests.cs" "QuickFiler.Test/Controllers/QfcHomeControllerRunAsyncHighConfidenceTests.cs"` +EXIT_CODE: 0 +Output line count: **0** + +The command produced zero output lines. Neither pin file appears in the change set. + +## 2. Non-vacuity check + +A `--name-only` pathspec query returns nothing both when a tracked file is unmodified and when the +pathspec matches nothing at all, so the zero result was confirmed against the files' existence: + +| Path | Exists in the worktree | Declared test methods | +| --- | --- | --- | +| `QuickFiler.Test/Controllers/QfcHomeControllerIssue218Tests.cs` | yes | 3 | +| `QuickFiler.Test/Controllers/QfcHomeControllerRunAsyncHighConfidenceTests.cs` | yes | 6 | + +Both files are present and non-empty, so the zero-line diff means "unmodified", not "absent". +This matters because these two files pin which `DequeueNextItemGroupAsync` overload the home +controller selects; the new `DequeueNextItemGroupWithOutcomeAsync` member added by this change +(`QuickFiler/Interfaces/IQfcDatamodel.cs:113`, see `evidence/qa-gates/p4-t18-ac20.*.md`) is a +distinct name rather than a further overload, so the pins remained valid without amendment. + +## Output Summary + +AC21 holds. The `git diff --name-only ...HEAD` pathspec query over +`QuickFiler.Test/Controllers/QfcHomeControllerIssue218Tests.cs` and +`QuickFiler.Test/Controllers/QfcHomeControllerRunAsyncHighConfidenceTests.cs` exits 0 with **zero +output lines**, and both files exist in the worktree with 3 and 6 declared test methods +respectively, so the empty result reflects unmodified files rather than an unmatched pathspec. +The AC21 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t2-ac2.2026-08-26T10-31.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t2-ac2.2026-08-26T10-31.md new file mode 100644 index 000000000..6d0ca53ac --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t2-ac2.2026-08-26T10-31.md @@ -0,0 +1,72 @@ +# [P4-T2] AC2 Verification — #446 Caller-Side CompleteAdding Guard + +Timestamp: 2026-08-26T10-31 + +Task: [P4-T2] +Acceptance criterion: AC2 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC2 text (spec.md:876) + +> AC2 — #446 caller: `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` +> asserts `IQfcQueue.CompleteAddingAsync` was invoked `Times.Never`, and +> `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` asserts `Times.Once`. +> Both live in `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`. + +## 1. Both tests live in the named file, with the required `Times` expressions + +Command: `grep -n "IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding\|IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce\|CompleteAddingAsync\|Times\." "QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs"` +EXIT_CODE: 0 + +| Test method | Declaration site | `Times` expression | Site | +| --- | --- | --- | --- | +| `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` | `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs:415` | `Times.Never` | `:423` | +| `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` | `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs:433` | `Times.Once` | `:441` | + +Both `Times` values are passed to the shared helper `VerifyCompleteAdding` +(`QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs:160-170`), which forwards them +to `queue.Verify(m => m.CompleteAddingAsync(It.IsAny(), It.IsAny()), times, because)` +at `:165-169`. The verified member is therefore `IQfcQueue.CompleteAddingAsync` as AC2 requires +(the mock is typed `Mock` at `:162`). + +Recorded verbatim from the source: + +- `:423` — ` Times.Never,` in the deadline-expired test, with the reason string + `"a deadline-bounded empty batch must not close the queue"`. +- `:441` — ` Times.Once,` in the source-exhausted test, with the reason string + `"a drained source is the one empty-batch case that may close the queue"`. + +The two tests are driven by the same arrangement helper `ArrangeIterate` differing only in the +`stop:` argument (`QfcDequeueStop.DeadlineExpired` at `:417` versus +`QfcDequeueStop.SourceExhausted` at `:435`), so the pair is a discriminating gate rather than +two independent assertions. + +## 2. Post-fix outcomes + +| Test | Post-fix TRX | Outcome | +| --- | --- | --- | +| `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t7/p2-t7.trx` | Passed | +| `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t7/p2-t7.trx` | Passed | + +Fail-before pairing (recorded for completeness; AC2 itself asserts the `Times` expressions and +the post-fix pass): + +- `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` — `Failed` in + `evidence/regression-testing/p1-t16/p1-t16.trx` (the `[P1-T16]` red step) and again in + `evidence/regression-testing/p1-t19/p1-t19.trx`. +- `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` — `Passed` in + `evidence/regression-testing/p1-t17/p1-t17.trx`; it is the negative control added green by + `[P1-T17]` and was never expected to be red. + +Both are also `Passed` in the whole-assembly runs +`evidence/regression-testing/p2-t8/p2-t8.trx` and `evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC2 holds. Both tests live in `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` +(`:415` and `:433`), assert `Times.Never` (`:423`) and `Times.Once` (`:441`) respectively +against `IQfcQueue.CompleteAddingAsync`, and both are recorded `Passed` post-fix in +`evidence/regression-testing/p2-t7/p2-t7.trx`. The AC2 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t20-ac23.2026-08-26T10-44.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t20-ac23.2026-08-26T10-44.md new file mode 100644 index 000000000..22c15cb93 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t20-ac23.2026-08-26T10-44.md @@ -0,0 +1,115 @@ +# [P4-T20] AC23 Verification — The Reflective Gate Helper Is Fail-Closed + +Timestamp: 2026-08-26T10-44 + +Task: [P4-T20] +Acceptance criterion: AC23 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC23 text (spec.md:906) + +> AC23 — the reflective gate helper is **fail-closed**. The descending `GetConstructor` fallback +> chain at `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:26-156` is +> replaced by a single exact lookup guarded by a `Should().NotBeNull()` assertion. Verified by +> `git grep -c "GetConstructor" -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` +> reporting `1`, and by all 29 gate test methods passing (the 23 present on the tree that carries +> PR #610, plus the six added by `[P1-T2]`, `[P1-T3]`, `[P1-T4]`, `[P1-T9]`, `[P1-T10]` and +> `[P1-T13]`). + +## 1. `GetConstructor` count + +Command: `git grep -c "GetConstructor" -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` +EXIT_CODE: 0 +Output: `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:1` + +With an explicit pathspec, `git grep -c` prefixes the count with the path, so the output line ends +in `:1`, which is the count the acceptance condition requires. + +**Non-vacuity.** `[P0-T15]` recorded the pre-change count for the same literal in the same file as +**4**, corresponding to the four-step descending fallback chain (8-type, 7-type, 6-type, 5-type). +The post-change count of **1** is therefore a measured change from 4 to 1, not a literal that +happened to match once either way. + +## 2. The surviving lookup is exact and guarded + +The single remaining call is at +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:48`, inside the `CreateGate` +helper declared at `:26`: + +```csharp + ConstructorInfo constructor = gateType.GetConstructor( + BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, + binder: null, + types: new[] + { + typeof(Func), + typeof(Func>), + typeof(double), + typeof(TimeProvider), + typeof(Action), + typeof(Func), + typeof(TimeSpan?), + typeof(Action), + typeof(Action), + }, + modifiers: null + ); + constructor + .Should() + .NotBeNull("the gate must expose the nine-parameter testable constructor seam"); +``` + +| Property AC23 requires | Site | Evidence | +| --- | --- | --- | +| a single exact lookup | `:48-64` | one `GetConstructor` call naming all nine parameter types explicitly; no fallback branch | +| guarded by `Should().NotBeNull()` | `:65-67` | `constructor.Should().NotBeNull("the gate must expose the nine-parameter testable constructor seam");` | +| fail-closed | `:65-67` | a missed lookup now fails the test with a named reason instead of silently binding a narrower shape | + +The in-code comment at `:44-47` records why the chain was fail-open: when the wider lookups +missed, it silently succeeded on the five-type shape and constructed a gate with `sourceActive` +null, the default deadline and no progress callback, across every consuming test method in the +class. A type-check guard at `:41` (`gateType.Should().NotBeNull(...)`) protects the preceding +assembly lookup on the same principle. + +## 3. Gate test-method count and outcomes + +Expected total, per the acceptance condition: the `[P0-T15]`-recorded `[TestMethod]` total (**23**) +plus the six gate test methods added by `[P1-T2]`, `[P1-T3]`, `[P1-T4]`, `[P1-T9]`, `[P1-T10]` and +`[P1-T13]` = **29**. + +`[TestMethod]` census at HEAD across the three gate test partials: + +| File | `[TestMethod]` count | +| --- | --- | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` | 13 | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` | 10 | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` | 6 | +| **Total** | **29** | + +Baseline was 10 + 10 + 3 = 23, so the delta is +3 in the first partial and +3 in Part3, six added +methods in total, matching the six `[P1-*]` tasks named above. + +`[P3-T8]` outcomes, resolved by TRX `className` rather than by name matching: + +Source TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8/p3-t8.trx` +Class: `QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests` (the single class the +three partials declare) + +- GATE_TOTAL: **29** +- GATE_PASSED: **29** +- GATE_FAILED: **0** + +The recorded Passed gate-test-method count of 29 equals the expected total of 29, with 0 failed. + +## Output Summary + +AC23 holds. `git grep -c "GetConstructor"` reports `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:1`, +down from the `[P0-T15]` baseline of 4, and the one surviving call at `:48` is a single exact +nine-type lookup guarded by `Should().NotBeNull()` at `:65-67`. The three gate test partials +declare 29 `[TestMethod]` members at HEAD (23 baseline + 6 added), and +`evidence/regression-testing/p3-t8/p3-t8.trx` records 29 results for +`QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests`, all Passed, 0 failed. The +AC23 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t21-ac26.2026-08-26T10-45.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t21-ac26.2026-08-26T10-45.md new file mode 100644 index 000000000..bab3f6d3b --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t21-ac26.2026-08-26T10-45.md @@ -0,0 +1,83 @@ +# [P4-T21] AC26 Verification — Determinism of the Changed Test Files + +Timestamp: 2026-08-26T10-45 + +Task: [P4-T21] +Acceptance criterion: AC26 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC26 text (spec.md:909) + +> AC26 — determinism: no test file added or modified by this change set contains `Thread.Sleep`, +> `Task.Delay`, `DateTime.Now`, `DateTime.UtcNow`, `Path.GetTempPath` or `Path.GetTempFileName`. +> Verified by grepping the changed test paths from +> `git diff --name-only ...HEAD -- "QuickFiler.Test/**/*.cs"`. + +## 1. Scanned path set + +Command: `git diff --name-only 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD -- "QuickFiler.Test/**/*.cs"` +EXIT_CODE: 0 +Paths returned: **7** + +``` +QuickFiler.Test/Controllers/QfcDatamodelTests.cs +QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs +QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs +QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs +QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs +QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs +QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs +``` + +All seven paths were scanned; none was skipped. + +## 2. Scanned literals + +`Thread.Sleep`, `Task.Delay`, `DateTime.Now`, `DateTime.UtcNow`, `Path.GetTempPath`, +`Path.GetTempFileName`, as the extended regular expression +`Thread\.Sleep|Task\.Delay|DateTime\.Now|DateTime\.UtcNow|Path\.GetTempPath|Path\.GetTempFileName`. + +Exclusion rule, as specified by `[P4-T21]`: a line is excluded when its trimmed text begins with +`///` or `//`. + +## 3. Raw scan, before the comment exclusion + +The unexcluded scan returned exactly **one** hit across all seven paths: + +| Path | Line | Text | +| --- | --- | --- | +| `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` | `245` | ` /// injected seam, not wall-clock Task.Delay. With a` | + +That is the one known pre-existing occurrence the plan names. It is an XML documentation comment: +its trimmed text begins with `///`, so the exclusion rule removes it. Recording it explicitly here +is what makes the zero result in section 4 auditable rather than accidental — the scan did find +something, and the something it found is a documentation reference that names `Task.Delay` in +order to say the code does **not** use it ("injected `TimeProvider` seam, not wall-clock +`Task.Delay`"). It is not executable code and introduces no nondeterminism. + +## 4. Post-exclusion scan + +Applying the `///` and `//` exclusion to the same seven paths: + +- **POST_EXCLUSION_HITS: 0** + +Zero hits across all seven changed test paths. The single raw hit at +`QuickFiler.Test/Controllers/QfcDatamodelTests.cs:245` is the only line the exclusion removed, so +the zero is the result of excluding one documentation line and nothing else. + +Consistently with that result, the time-dependent tests added by this change set drive elapsed +time through injected clocks rather than wall-clock waiting: `FakeTimeProvider` in +`QfcStreamingDequeueConfidenceGateTests.Part3.cs` (`:168`, `:213`) and in +`QfcFormControllerSeamTests.cs` (`:417`), and `CountingTimeProvider` in +`QfcFormControllerSeamTests.cs` (`:400`, `:438`). + +## Output Summary + +AC26 holds. The seven changed test paths from +`git diff --name-only ...HEAD -- "QuickFiler.Test/**/*.cs"` were scanned for the six +nondeterminism literals. The raw scan returned exactly one hit, the XML documentation line +`QuickFiler.Test/Controllers/QfcDatamodelTests.cs:245`, which the `///` exclusion removes; the +post-exclusion scan returned **zero hits**. The AC26 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t3-ac3.2026-08-26T10-31.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t3-ac3.2026-08-26T10-31.md new file mode 100644 index 000000000..f2329be51 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t3-ac3.2026-08-26T10-31.md @@ -0,0 +1,67 @@ +# [P4-T3] AC3 Verification — #448 Pre-Fix Failure Is an Assertion Failure + +Timestamp: 2026-08-26T10-31 + +Task: [P4-T3] +Acceptance criterion: AC3 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC3 text (spec.md:877) + +> AC3 — #448: `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` is present in +> `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` and its pre-fix failure is an +> **assertion failure, not a hang or a test-host timeout**. Verified by running that single test +> against the pre-fix tree and recording the failure message. + +## 1. Presence + +Command: `grep -n "UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay" "QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs"` +EXIT_CODE: 0 +Output: `397: public void UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay()` + +The test is declared at `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs:397`. + +## 2. Recorded pre-fix failure message, verbatim + +Source TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t2/p3-t2.trx` +(the `[P3-T2]` red step, run before the `[P3-T3]` loop rewrite). +Outcome: `Failed`. Duration: `00:00:00.3423838`. + +``` +Expected clock.DelayRequests to be greater than or equal to 1 because an idle iteration must wait through the injected TimeProvider, not Task.Delay, but found 0 (difference of -1). +``` + +## 3. Classification of that message + +| Check | Result | +| --- | --- | +| Is a FluentAssertions assertion-failure message (`Expected ... but found ...` shape) | Yes | +| Contains the substring `timeout` (case-insensitive) | No | +| Contains the substring `timed out` (case-insensitive) | No | +| Contains the substring `cancel` (case-insensitive, covers `cancelled`, `canceled`, `OperationCanceledException`, `TaskCanceledException`) | No | +| Contains `Aborted` or a test-host crash signature | No | + +The `[P3-T2]` TRX `` node corroborates the classification: +`total="1" executed="1" passed="0" failed="1" timeout="0" aborted="0" passedButRunAborted="0"`. +The `timeout` and `aborted` counters are both zero, so the run terminated on an assertion, not on +a `[Timeout]` trip or a host abort. The recorded duration of 0.34 seconds is inconsistent with a +hang. + +## 4. Pass-after + +The same test is recorded `Passed` in +`docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t3/p3-t3.trx` +(immediately after the loop rewrite), and again in +`evidence/regression-testing/p3-t7/p3-t7.trx` and `evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC3 holds. `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` is present at +`QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs:397`. Its recorded pre-fix outcome in +`evidence/regression-testing/p3-t2/p3-t2.trx` is a FluentAssertions assertion failure +(`Expected clock.DelayRequests to be greater than or equal to 1 ... but found 0`) containing no +timeout or cancellation wording, with TRX counters `timeout="0" aborted="0"` and a 0.34-second +duration. The AC3 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t4-ac4.2026-08-26T10-32.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t4-ac4.2026-08-26T10-32.md new file mode 100644 index 000000000..4cea5305f --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t4-ac4.2026-08-26T10-32.md @@ -0,0 +1,71 @@ +# [P4-T4] AC4 Verification — #426 Gate Test Was Red Against a Compiling Tree + +Timestamp: 2026-08-26T10-32 + +Task: [P4-T4] +Acceptance criterion: AC4 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC4 text (spec.md:878) + +> AC4 — #426 gate: `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` is present in +> `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, and its pre-fix state +> is an **assertion failure against a compiling tree** (the seam and the test land in one task, the +> `else` invocation in the next), not a compile error. + +## 1. Presence + +Command: `grep -n "DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce" "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` +EXIT_CODE: 0 +Output: `345: public async Task DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce()` + +## 2. The tree that produced the Failed outcome compiled + +Both facts below are recorded in one artifact, +`docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t2-onrejected-seam-red.2026-08-26T09-20.md`, +and therefore describe one and the same tree state: the state left by `[P1-T2]`, in which the +`Action onRejected` constructor seam exists but is never invoked (the `else` +invocation is deferred to `[P2-T2]`). + +### 2a. Compile of that tree state + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +This is the `[P1-T2]` intra-phase compile. It is a compile check, not the analyzer or nullable +gate; those gates run in Phase 5 with `/t:Rebuild` and are not asserted here. + +### 2b. Scoped test run of the same tree state + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce" "/Logger:trx;LogFileName=p1-t2.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t2"` +EXIT_CODE: 1 (ExpectedExitCode: 1) + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t2/p1-t2.trx` +Recorded outcome for `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce`: **Failed**. + +Failure message, verbatim from that TRX: + +``` +Expected rejected to contain a single item because the gate must report each discarded candidate exactly once, but the collection is empty. +``` + +That message is a FluentAssertions assertion failure. It is not a compiler diagnostic (no `CS` +code, no file/line build error) and not an unhandled exception. + +## 3. Pass-after + +`docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t2/p2-t2.trx` — +outcome `Passed`, after `[P2-T2]` added the `else`-branch invocation. Also `Passed` in the +whole-assembly runs `evidence/regression-testing/p2-t8/p2-t8.trx` and +`evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC4 holds. The test is present at +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:345`. The `[P1-T2]` +artifact records a compile `EXIT_CODE: 0` for the same tree state that produced the `Failed` +outcome in `evidence/regression-testing/p1-t2/p1-t2.trx`, and the recorded failure text is an +assertion message rather than a compile error. The AC4 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t5-ac5.2026-08-26T10-32.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t5-ac5.2026-08-26T10-32.md new file mode 100644 index 000000000..cba3aad3b --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t5-ac5.2026-08-26T10-32.md @@ -0,0 +1,50 @@ +# [P4-T5] AC5 Verification — #427-A Datamodel Scorer Returns the Real Top Folder + +Timestamp: 2026-08-26T10-32 + +Task: [P4-T5] +Acceptance criterion: AC5 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC5 text (spec.md:879) + +> AC5 — #427-A: `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` is present in +> `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` and fails against the current +> `return score.Score;` at `QuickFiler/Controllers/QfcDatamodel.cs:376`. + +## 1. Presence + +Command: `grep -n "ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder" "QuickFiler.Test/Controllers/QfcDatamodelTests.cs"` +EXIT_CODE: 0 +Output: `327: public async Task ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder()` + +## 2. Fail-before / pass-after pairing + +| State | TRX path | Outcome | +| --- | --- | --- | +| Pre-fix (`[P1-T12]`, red step) | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t12/p1-t12.trx` | Failed | +| Post-fix (`[P2-T4]`) | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t4/p2-t4.trx` | Passed | + +Recorded pre-fix failure message, verbatim from `p1-t12.trx`: + +``` +Expected result.TopFolder to be "Inbox\Projects\Alpha" with a length of 20 because the top-ranked folder the scorer already computed must reach the caller instead of being discarded and re-derived downstream, but "" has a length of 0, differs near "" (index 0). +``` + +The pre-fix observed value is the empty string, which is exactly the symptom of the discarding +`return score.Score;` form AC5 names: the score reached the caller and the folder did not. The +message is a FluentAssertions assertion failure, not a compile error or a timeout. + +Corroborating later runs: `Passed` in `evidence/regression-testing/p2-t8/p2-t8.trx` and +`evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC5 holds. `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` is present at +`QuickFiler.Test/Controllers/QfcDatamodelTests.cs:327`, is recorded `Failed` pre-fix in +`evidence/regression-testing/p1-t12/p1-t12.trx` with the folder observed as the empty string, and +is recorded `Passed` post-fix in `evidence/regression-testing/p2-t4/p2-t4.trx`. The AC5 checkbox +in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t6-ac6.2026-08-26T10-33.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t6-ac6.2026-08-26T10-33.md new file mode 100644 index 000000000..cb97a1e16 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t6-ac6.2026-08-26T10-33.md @@ -0,0 +1,115 @@ +# [P4-T6] AC6 Verification — CompleteAddingAsync Is Guarded by SourceExhausted + +Timestamp: 2026-08-26T10-33 + +Task: [P4-T6] +Acceptance criterion: AC6 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC6 text (spec.md:883) + +> AC6 — `QuickFiler/Controllers/QfcHomeController.Iteration.cs` calls `CompleteAddingAsync` only +> inside a branch guarded by `Stop == QfcDequeueStop.SourceExhausted`. Verified by AC2 plus +> reading the diff of that file. + +## 1. Call-site census + +Command: `grep -n "CompleteAddingAsync\|SourceExhausted\|IterateQueueAsync" "QuickFiler/Controllers/QfcHomeController.Iteration.cs"` +EXIT_CODE: 0 + +| Line | Text | Kind | +| --- | --- | --- | +| `36` | `else if (batch.Stop == QfcDequeueStop.SourceExhausted)` | guard | +| `39` | `// CompleteAddingAsync reaches BlockingCollection.CompleteAdding(), which is` | comment, not a call | +| `44` | `await QfcQueue.CompleteAddingAsync(Token, 10000);` | the only invocation | + +The file contains exactly one `CompleteAddingAsync` invocation, at +`QuickFiler/Controllers/QfcHomeController.Iteration.cs:44`. The only other occurrence of the +identifier is the explanatory comment at `:39`, which is not a call site. The single guard +comparison is at `:36`. + +## 2. Post-change text of `IterateQueueAsync` + +`QuickFiler/Controllers/QfcHomeController.Iteration.cs:12-61`, reproduced verbatim: + +```csharp + public async Task IterateQueueAsync() + { + Token.ThrowIfCancellationRequested(); + + if (_datamodel.Complete) + { + return; + } + try + { + QfcDequeueBatch batch = await _datamodel.DequeueNextItemGroupWithOutcomeAsync( + _formController.ItemsPerIteration, + 2000, + QfcStreamingDequeueConfidenceGate.DefaultFirstBatchDeadline, + null + ); + IList listObjects = batch.Items; + if (listObjects.Count > 0) + { + //await UiThread.Dispatcher.InvokeAsync(async () => await QfcQueue.EnqueueAsync(listObjects, _formController.Groups)); + await QfcQueue + .EnqueueAsync(listObjects, _formController.Groups) + .ConfigureAwait(false); + } + else if (batch.Stop == QfcDequeueStop.SourceExhausted) + { + // Issue #446. Only genuine source exhaustion may close the queue: + // CompleteAddingAsync reaches BlockingCollection.CompleteAdding(), which is + // irreversible. An empty batch whose stop reason is DeadlineExpired or + // QuantitySatisfied leaves the queue open so a later iteration can drain the + // items the master queue still holds. + //logger.Debug($"{nameof(IterateQueueAsync)} completed"); + await QfcQueue.CompleteAddingAsync(Token, 10000); + } + } + catch (OperationCanceledException) + { + //logger.Debug($"{nameof(IterateQueueAsync)} cancelled"); + } + catch (System.Exception) + { + if (this.Token.IsCancellationRequested) + { + //logger.Debug($"{nameof(IterateQueueAsync)} cancelled"); + } + else + { + throw; + } + } + } +``` + +The invocation at `:44` is lexically inside the `else if (batch.Stop == QfcDequeueStop.SourceExhausted)` +block opened at `:36-37` and closed at `:45`. There is no other statement path to it: the block +has one entry condition and the method has no `goto`, no local function and no second +`CompleteAddingAsync` reference. + +## 3. Behavioural corroboration — the `[P2-T7]` TRX + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t7/p2-t7.trx` + +| Test | Outcome | +| --- | --- | +| `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` (asserts `Times.Never`) | Passed | +| `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` (asserts `Times.Once`) | Passed | + +The pair discriminates: the same empty-batch arrangement differing only in `Stop` produces zero +invocations under `DeadlineExpired` and exactly one under `SourceExhausted`, which is the runtime +reading of the static guard recorded in section 2. + +## Output Summary + +AC6 holds. `QuickFiler/Controllers/QfcHomeController.Iteration.cs` contains exactly one +`CompleteAddingAsync` call, at `:44`, and it sits inside the branch guarded by +`batch.Stop == QfcDequeueStop.SourceExhausted` at `:36`. The `[P2-T7]` TRX records both +discriminating iteration tests as Passed. The AC6 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t7-ac7.2026-08-26T10-33.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t7-ac7.2026-08-26T10-33.md new file mode 100644 index 000000000..20ef72c28 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t7-ac7.2026-08-26T10-33.md @@ -0,0 +1,61 @@ +# [P4-T7] AC7 Verification — All Four Gate Exits Return a Stop Reason + +Timestamp: 2026-08-26T10-33 + +Task: [P4-T7] +Acceptance criterion: AC7 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC7 text (spec.md:884) + +> AC7 — `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` returns a stop reason from +> all four exits, mapped `:100`/`:154` -> `QuantitySatisfied`, `:119` -> `DeadlineExpired`, +> `:128` -> `SourceExhausted`. Verified by AC1. + +The line numbers quoted in the AC text are the pre-change positions. The post-change positions are +recorded below; the mapping, which is what AC7 asserts, is unchanged. + +## 1. The four post-change return statements + +Command: `grep -n "return \|QfcDequeueStop\." "QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs"` +EXIT_CODE: 0 + +The command returns exactly four lines. Every `return` in the file is one of these four, so the +census is complete rather than a sample. + +| # | Post-change line | Return statement (verbatim) | Stop value | Exit condition | +| --- | --- | --- | --- | --- | +| 1 | `:149` | `return new QfcGateBatch(accepted, QfcDequeueStop.QuantitySatisfied, scanned);` | `QuantitySatisfied` | degenerate request, `quantity <= 0` guard at `:147` | +| 2 | `:167` | `return new QfcGateBatch(accepted, QfcDequeueStop.DeadlineExpired, scanned);` | `DeadlineExpired` | first-batch deadline elapsed with zero accepted, guard at `:160-164` | +| 3 | `:176` | `return new QfcGateBatch(accepted, QfcDequeueStop.SourceExhausted, scanned);` | `SourceExhausted` | take delegate returned null and the producer is no longer active, guard at `:173` | +| 4 | `:222` | `return new QfcGateBatch(accepted, QfcDequeueStop.QuantitySatisfied, scanned);` | `QuantitySatisfied` | normal loop exit, `while (accepted.Count < quantity)` at `:156` fell through | + +The mapping in document order is therefore `QuantitySatisfied`, `DeadlineExpired`, +`SourceExhausted`, `QuantitySatisfied`, exactly as AC7 and `[P4-T7]` state. Each of the four sites +carries an explicit `QfcDequeueStop` value in the constructor call; none defaults, and no exit +returns a bare collection. + +## 2. Behavioural corroboration — the `[P2-T1]` TRX + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t1/p2-t1.trx` + +| Test | Outcome | +| --- | --- | +| `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` | Passed | +| `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` | Passed | + +Total 2, passed 2, failed 0. These are the AC1 tests, which exercise return sites 2 and 3 and +discriminate them from the `QuantitySatisfied` default that the pre-fix gate reported for both +(see `evidence/qa-gates/p4-t1-ac1.*.md` for the pre-fix messages, both of which read +`but found QfcDequeueStop.QuantitySatisfied {value: 0}`). + +## Output Summary + +AC7 holds. `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` has exactly four return +statements, at `:149`, `:167`, `:176` and `:222`, each constructing a `QfcGateBatch` with an +explicit stop value in the order `QuantitySatisfied`, `DeadlineExpired`, `SourceExhausted`, +`QuantitySatisfied`. The `[P2-T1]` TRX records both discriminating stop-reason tests as Passed. +The AC7 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t8-ac8.2026-08-26T10-34.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t8-ac8.2026-08-26T10-34.md new file mode 100644 index 000000000..5495daab0 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t8-ac8.2026-08-26T10-34.md @@ -0,0 +1,72 @@ +# [P4-T8] AC8 Verification — UndoConsumer Terminates on the Idle Threshold + +Timestamp: 2026-08-26T10-34 + +Task: [P4-T8] +Acceptance criterion: AC8 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC8 text (spec.md:885) + +> AC8 — `UndoConsumer` terminates once the queue is drained and the idle threshold elapses. +> Verified by `UndoConsumer_IdleBeyondThreshold_Completes` completing without a `[Timeout]` trip +> on a `FakeTimeProvider`. + +## 1. The test and its clock + +Declaration: `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs:414`, carrying +`[TestMethod]` at `:412` and `[Timeout(10000)]` at `:413`. + +Body (`:414-425`), reproduced verbatim: + +```csharp + public async Task UndoConsumer_IdleBeyondThreshold_Completes() + { + // Arrange + var clock = new FakeTimeProvider(); + QfcFormController controller = ArrangeUndoConsumer(clock); + // Act + Task consumer = controller.UndoConsumerStarter(controller.UndoConsumer); + clock.Advance(TimeSpan.FromSeconds(11)); + await consumer.ConfigureAwait(false); + // Assert + consumer.Status.Should().Be(TaskStatus.RanToCompletion, "an idle consumer must exit"); + } +``` + +The eleven seconds that carry the consumer past the ten-second idle threshold are supplied by +`clock.Advance(...)` on a `FakeTimeProvider`, not by wall-clock waiting. + +## 2. Recorded outcome — the `[P3-T4]` run + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t4/p3-t4.trx` + +- Recorded outcome for `UndoConsumer_IdleBeyondThreshold_Completes`: **Passed** +- Recorded duration: `00:00:00.2891620` + +## 3. No `[Timeout]` trip + +TRX `` from the same file, verbatim: + +``` +total="1" executed="1" passed="1" failed="0" error="0" timeout="0" aborted="0" inconclusive="0" passedButRunAborted="0" notRunnable="0" notExecuted="0" disconnected="0" warning="0" completed="0" inProgress="0" pending="0" +``` + +`timeout="0"` and `aborted="0"`: the `[Timeout(10000)]` attribute did not fire. The observed +duration of 0.289 s is 0.0289 of the 10 s allowance, so the pass is not a marginal one. The +outcome is `Passed` rather than `Timeout`, which is the outcome MSTest records when the attribute +trips. + +Corroborating later runs: `Passed` in `evidence/regression-testing/p3-t7/p3-t7.trx` and +`evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC8 holds. `UndoConsumer_IdleBeyondThreshold_Completes` +(`QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs:414`) is recorded **Passed** in +`evidence/regression-testing/p3-t4/p3-t4.trx` in 0.289 s, driving all elapsed time through +`FakeTimeProvider.Advance`. That TRX reports `timeout="0"` and `aborted="0"`, so no `[Timeout]` +trip occurred. The AC8 checkbox in `spec.md` is checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t9-ac9.2026-08-26T10-35.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t9-ac9.2026-08-26T10-35.md new file mode 100644 index 000000000..a1c5f64d8 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p4-t9-ac9.2026-08-26T10-35.md @@ -0,0 +1,70 @@ +# [P4-T9] AC9 Verification — Idle Timer Resets After Every Successful Take + +Timestamp: 2026-08-26T10-35 + +Task: [P4-T9] +Acceptance criterion: AC9 +Feature: docs/features/active/quickfiler-bug-family-446 +Merge base (``): `61edc19befcf6c4e95b5acd32542f2dcdab41b78` + +## AC9 text (spec.md:886) + +> AC9 — the `UndoConsumer` idle timer is **reset after every successful take**. Verified by +> `UndoConsumer_SuccessfulTake_ResetsIdleTimer`, which advances the fake clock past the threshold +> in aggregate while keeping every idle gap below it and asserts the loop kept draining. + +## 1. The take branch, post-change + +`QuickFiler/Controllers/QfcFormController.Actions.cs:323-331`, reproduced verbatim: + +```csharp + if (_undoQueue.TryTake(out var item)) + { + await UndoItemProcessor(item).ConfigureAwait(false); + + // Reset on every successful take so the threshold measures idle time. The + // previous code started one stopwatch for the whole session, so a consumer + // busy for ten seconds exited while items were still arriving. + start = TimeProvider.GetTimestamp(); + } +``` + +| Element | Line | Note | +| --- | --- | --- | +| Take guard `if (_undoQueue.TryTake(out var item))` | `:323` | branch entered only on a successful take | +| Item processing `await UndoItemProcessor(item).ConfigureAwait(false);` | `:325` | the item is consumed here | +| Timestamp reassignment `start = TimeProvider.GetTimestamp();` | `:330` | **after** `:325`, so the reset follows processing | +| Idle comparison that reads `start` | `:332` | `else if (TimeProvider.GetElapsedTime(start) > UndoConsumerIdleTimeout)` | + +`start` is declared once at `:318` (`long start = TimeProvider.GetTimestamp();`) and reassigned at +exactly one site, `:330`, which lies inside the take branch. The threshold at `:332` therefore +measures time since the last successful take rather than time since the consumer started, which is +the behaviour AC9 requires. The idle bound itself is +`private static readonly TimeSpan UndoConsumerIdleTimeout = TimeSpan.FromSeconds(10);` at `:314`. + +## 2. Recorded outcome — the `[P3-T5]` run + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t5/p3-t5.trx` + +- Recorded outcome for `UndoConsumer_SuccessfulTake_ResetsIdleTimer`: **Passed** +- ``: `total="1" executed="1" passed="1" failed="0" error="0" timeout="0" aborted="0"` + +The test is declared at `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs:435`, carrying +`[TestMethod]` at `:433` and `[Timeout(10000)]` at `:434`. Its documented arrangement +(`:427-432`) is three takes that advance the clock six seconds each — eighteen seconds in +aggregate, past the ten-second threshold — while every idle gap stays at zero, so a session-wide +timer would have exited and a per-take reset does not. + +Corroborating later runs: `Passed` in `evidence/regression-testing/p3-t7/p3-t7.trx` and +`evidence/regression-testing/p3-t8/p3-t8.trx`. + +## Output Summary + +AC9 holds. The take branch at +`QuickFiler/Controllers/QfcFormController.Actions.cs:323-331` reassigns the idle timestamp at +`:330`, after the item is processed at `:325`, and that is the only reassignment of `start` in the +method. `UndoConsumer_SuccessfulTake_ResetsIdleTimer` is recorded **Passed** in +`evidence/regression-testing/p3-t5/p3-t5.trx` with `timeout="0"`. The AC9 checkbox in `spec.md` is +checked. + +EXIT_CODE: 0 diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t1-csharpier-format.2026-08-26T10-52.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t1-csharpier-format.2026-08-26T10-52.md new file mode 100644 index 000000000..f82b8be9c --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t1-csharpier-format.2026-08-26T10-52.md @@ -0,0 +1,72 @@ +# [P5-T1] Scoped Formatting Pass (change set only) + +Timestamp: 2026-08-26T10-52 + +Task: [P5-T1] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Scope derivation + +Path list produced by `git diff --name-only ...HEAD -- "*.cs"` where `` is the +merge-base sha `61edc19befcf6c4e95b5acd32542f2dcdab41b78` recorded by `[P0-T3]`. Thirteen paths +were returned. Per D-Plan-4 the mutating pass is scoped to exactly this list; a repo-wide +mutating pass would rewrite non-owned production files and `packages.config` files (which +`.csharpierignore` does not exempt) and would break AC18, AC19 and AC22. + +Command: `pwsh -NoProfile -Command 'dotnet tool run csharpier format QuickFiler.Test/Controllers/QfcDatamodelTests.cs QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs QuickFiler/Controllers/QfcDatamodel.cs QuickFiler/Controllers/QfcFormController.Actions.cs QuickFiler/Controllers/QfcHomeController.Iteration.cs QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs QuickFiler/Interfaces/IQfcDatamodel.cs'` +EXIT_CODE: 0 + +CSharpier printed `Formatted 13 files in 6083ms.` That line reports files **processed**, not files +**changed**, so the rewritten-file count below is derived from the SHA-256 digest comparison and +never from that line. + +## SHA-256 digests before the pass + +| path | sha256 | +| --- | --- | +| `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` | `a63bd471cdd274069ab0ae7a5b96c917db2f44e997897c22721e90907366edeb` | +| `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` | `676a1b53dc160bbe5bd999b9a4288d7c9d672e9b01d3ec93560549e2fc7e8bbc` | +| `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` | `501f713625d656b60d00f4b9ba621da7c1c4d3890c877594b472f470100a4f78` | +| `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` | `9dc6847a3653cad5380d21adcdca1e8f3a7ce7724905cee71e5d21b3e3b4e49b` | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` | `bf55b5fd0ce7a6fd1805145298d3850df7e38669cafe591e8b238f10e819ec86` | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` | `2112277eaf4e69712bfaea7936142aa259c81d6f77270a77c0172a279b01d6e6` | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` | `b2a15f879f9ef7e47d6a3aef352f0f3d5a6f4f444babacada7d4afde6c3225f1` | +| `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` | `4e0dcd2e991793dcba610c80855d80ed5bcbdf859409d346b39fd8245ea266a2` | +| `QuickFiler/Controllers/QfcDatamodel.cs` | `f912694600622b220991ae77ad398d61da810e15ddf456e13ec8373c278b6121` | +| `QuickFiler/Controllers/QfcFormController.Actions.cs` | `83ac1911d99a028b87387c41b0d75ff41c7abc2b3189d22628051d8f6b7369de` | +| `QuickFiler/Controllers/QfcHomeController.Iteration.cs` | `61f39f1cdf922bc3ad240bb70f0d91ede037d36adb70e14bbb1c7cd303348e78` | +| `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | `cc41852bb9cf0139ac64fdedb6eecb8029ef58a6826c7bb75ee5cb23222bd699` | +| `QuickFiler/Interfaces/IQfcDatamodel.cs` | `f2b4a4763082d21a0dd356ec0553fd5f48fbca9e8a0344e3e81c349b650bc1c1` | + +## SHA-256 digests after the pass + +| path | sha256 | +| --- | --- | +| `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` | `a63bd471cdd274069ab0ae7a5b96c917db2f44e997897c22721e90907366edeb` | +| `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` | `676a1b53dc160bbe5bd999b9a4288d7c9d672e9b01d3ec93560549e2fc7e8bbc` | +| `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` | `501f713625d656b60d00f4b9ba621da7c1c4d3890c877594b472f470100a4f78` | +| `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` | `9dc6847a3653cad5380d21adcdca1e8f3a7ce7724905cee71e5d21b3e3b4e49b` | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` | `bf55b5fd0ce7a6fd1805145298d3850df7e38669cafe591e8b238f10e819ec86` | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` | `2112277eaf4e69712bfaea7936142aa259c81d6f77270a77c0172a279b01d6e6` | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` | `b2a15f879f9ef7e47d6a3aef352f0f3d5a6f4f444babacada7d4afde6c3225f1` | +| `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` | `4e0dcd2e991793dcba610c80855d80ed5bcbdf859409d346b39fd8245ea266a2` | +| `QuickFiler/Controllers/QfcDatamodel.cs` | `f912694600622b220991ae77ad398d61da810e15ddf456e13ec8373c278b6121` | +| `QuickFiler/Controllers/QfcFormController.Actions.cs` | `83ac1911d99a028b87387c41b0d75ff41c7abc2b3189d22628051d8f6b7369de` | +| `QuickFiler/Controllers/QfcHomeController.Iteration.cs` | `61f39f1cdf922bc3ad240bb70f0d91ede037d36adb70e14bbb1c7cd303348e78` | +| `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | `cc41852bb9cf0139ac64fdedb6eecb8029ef58a6826c7bb75ee5cb23222bd699` | +| `QuickFiler/Interfaces/IQfcDatamodel.cs` | `f2b4a4763082d21a0dd356ec0553fd5f48fbca9e8a0344e3e81c349b650bc1c1` | + +## Derived rewritten-file count + +**0.** All thirteen digest pairs are byte-identical, so CSharpier rewrote no file. `git status +--porcelain` immediately after the pass reported only the untracked `.claude/state/` entry, which +is outside this change set and is never staged by any task in this plan. + +Because no file was rewritten and the exit code is `0`, the restart rule of Phase 5 is not +triggered by this task and the loop proceeds to `[P5-T2]`. + +## Output Summary + +Scoped mutating CSharpier pass over the 13 change-set `.cs` paths exited `0` and rewrote `0` +files, established by comparing SHA-256 digests taken before and after the pass rather than by +reading CSharpier's processed-file line. This is the pass the loop accepts. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t1-csharpier-format.2026-08-26T10-58.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t1-csharpier-format.2026-08-26T10-58.md new file mode 100644 index 000000000..d14fa3484 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t1-csharpier-format.2026-08-26T10-58.md @@ -0,0 +1,56 @@ +# [P5-T1] Scoped Formatting Pass (change set only) — ACCEPTED PASS + +Timestamp: 2026-08-26T10-58 + +Task: [P5-T1] +Feature: docs/features/active/quickfiler-bug-family-446 + +This is the second pass of the Phase 5 toolchain loop. The first pass was aborted at `[P5-T5]` +(see `p5-t5-vstest.2026-08-26T10-56.md`) and its artifacts are retained. + +## Scope derivation + +Path list produced by `git diff --name-only ...HEAD -- "*.cs"` where `` is the merge-base +sha `61edc19befcf6c4e95b5acd32542f2dcdab41b78` recorded by `[P0-T3]`. Thirteen paths were +returned, identical to the first pass. Per D-Plan-4 the mutating pass is scoped to exactly this +list; a repository-wide mutating pass would rewrite non-owned production files and +`packages.config` files (which `.csharpierignore` does not exempt) and would break AC18, AC19 and +AC22. + +Command: `pwsh -NoProfile -Command 'dotnet tool run csharpier format QuickFiler.Test/Controllers/QfcDatamodelTests.cs QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs QuickFiler/Controllers/QfcDatamodel.cs QuickFiler/Controllers/QfcFormController.Actions.cs QuickFiler/Controllers/QfcHomeController.Iteration.cs QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs QuickFiler/Interfaces/IQfcDatamodel.cs'` +EXIT_CODE: 0 + +CSharpier printed `Formatted 13 files in 6499ms.` That line reports files **processed**, not files +**changed**, so the rewritten-file count below is derived from the SHA-256 digest comparison and +never from that line. + +## SHA-256 digests, before and after the pass + +Both digest sets are byte-identical, and both are also identical to the digest sets recorded by +the aborted pass, which is expected: nothing between the two passes edited any `.cs` file. + +| path | sha256 (before == after) | +| --- | --- | +| `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` | `a63bd471cdd274069ab0ae7a5b96c917db2f44e997897c22721e90907366edeb` | +| `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` | `676a1b53dc160bbe5bd999b9a4288d7c9d672e9b01d3ec93560549e2fc7e8bbc` | +| `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` | `501f713625d656b60d00f4b9ba621da7c1c4d3890c877594b472f470100a4f78` | +| `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` | `9dc6847a3653cad5380d21adcdca1e8f3a7ce7724905cee71e5d21b3e3b4e49b` | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` | `bf55b5fd0ce7a6fd1805145298d3850df7e38669cafe591e8b238f10e819ec86` | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` | `2112277eaf4e69712bfaea7936142aa259c81d6f77270a77c0172a279b01d6e6` | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` | `b2a15f879f9ef7e47d6a3aef352f0f3d5a6f4f444babacada7d4afde6c3225f1` | +| `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` | `4e0dcd2e991793dcba610c80855d80ed5bcbdf859409d346b39fd8245ea266a2` | +| `QuickFiler/Controllers/QfcDatamodel.cs` | `f912694600622b220991ae77ad398d61da810e15ddf456e13ec8373c278b6121` | +| `QuickFiler/Controllers/QfcFormController.Actions.cs` | `83ac1911d99a028b87387c41b0d75ff41c7abc2b3189d22628051d8f6b7369de` | +| `QuickFiler/Controllers/QfcHomeController.Iteration.cs` | `61f39f1cdf922bc3ad240bb70f0d91ede037d36adb70e14bbb1c7cd303348e78` | +| `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | `cc41852bb9cf0139ac64fdedb6eecb8029ef58a6826c7bb75ee5cb23222bd699` | +| `QuickFiler/Interfaces/IQfcDatamodel.cs` | `f2b4a4763082d21a0dd356ec0553fd5f48fbca9e8a0344e3e81c349b650bc1c1` | + +## Derived rewritten-file count + +**0.** All thirteen digest pairs are byte-identical, so CSharpier rewrote no file. + +## Output Summary + +Scoped mutating CSharpier pass over the 13 change-set `.cs` paths exited `0` and rewrote `0` +files, established by SHA-256 digest comparison rather than by CSharpier's processed-file line. +This is the pass the loop accepts. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t10-commit.2026-08-26T11-12.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t10-commit.2026-08-26T11-12.md new file mode 100644 index 000000000..c406e152c --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t10-commit.2026-08-26T11-12.md @@ -0,0 +1,73 @@ +# [P5-T10] Commit the Final Change Set + +Timestamp: 2026-08-26T11-12 + +Task: [P5-T10] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` then `git commit -m "chore(446): record final QA gates and coverage comparison"` +EXIT_CODE: 0 + +## Resulting HEAD + +`2aef13c4c5ed2d283ce51c027c33dbe721d9263e` + +Previous HEAD was `a0f5ea2b90c408bbd80a216cc0c3b6346471acfd`, the terminal commit of Phase 4. + +Commit line reported by git: `[bug/quickfiler-bug-family-446 2aef13c4] chore(446): record final QA +gates and coverage comparison` / `17 files changed, 237297 insertions(+), 9 deletions(-)`. + +## Files committed + +Sixteen new evidence artifacts under `evidence/qa-gates/` plus the modified plan checklist: + +- `coverage-final.cobertura.xml` +- `p5-t1-csharpier-format.2026-08-26T10-52.md` (aborted pass) +- `p5-t1-csharpier-format.2026-08-26T10-58.md` (accepted pass) +- `p5-t2-csharpier-check.2026-08-26T10-54.md` (aborted pass) +- `p5-t2-csharpier-check.2026-08-26T10-59.md` (accepted pass) +- `p5-t3-analyzer-build.2026-08-26T10-55.md` (aborted pass) +- `p5-t3-analyzer-build.2026-08-26T10-59.md` (accepted pass) +- `p5-t4-nullable-build.2026-08-26T10-56.md` (aborted pass) +- `p5-t4-nullable-build.2026-08-26T11-00.md` (accepted pass) +- `p5-t5-vstest.2026-08-26T10-56.md` (aborted pass) +- `p5-t5-vstest.2026-08-26T11-01.md` (accepted pass) +- `p5-t5/p5-t5.trx` +- `p5-t6-coverage-run.2026-08-26T11-07.md` +- `p5-t7-coverage-comparison.2026-08-26T11-09.md` +- `p5-t8-line-cap-audit.2026-08-26T11-10.md` +- `p5-t9-clean-pass.2026-08-26T11-11.md` +- `plan.2026-08-24T09-37.md` (checklist state for `[P5-T1]` through `[P5-T9]`) + +No `.cs`, `.csproj`, `.props`, `.targets`, `.sln` or `packages.config` file was modified by this +commit; the production and test sources were already committed at the end of their own phases and +the Phase 5 formatting pass rewrote none of them. + +## Clean-tree acceptance condition + +`git status --porcelain -- "QuickFiler" "QuickFiler.Test"` after the commit produced **zero output +lines**. + +The only entry in an unscoped `git status --porcelain` is the untracked `.claude/state/` +directory. That path is outside this change set, is written by the executing agent, and is +deliberately never staged by any task in this plan, which is why every clean-tree gate here is +scoped by pathspec and never run unscoped. + +## Artifact hygiene + +Before this commit, a case-insensitive search of the entire feature folder for the account name +and the machine name returned **zero** hits in file contents. Thirty-six leftover +`Deploy_ .../In/` directories from Phase 1 to Phase 3 test runs remain on disk with +host identifiers in their directory names, but every one of them is empty (zero files), so git +does not track them, they are absent from `git status`, and no such path is committed or reachable +by a reviewer. + +The `p5-t5.trx` committed here was scrubbed of all host identifiers and re-parsed as XML before +staging; its counters and all 6501 test names are unchanged by the scrub. `coverage-final.cobertura.xml` +was checked for the same identifiers and contains none; its `` element is the relative +path `.`. + +## Output Summary + +Final change set committed as `2aef13c4c5ed2d283ce51c027c33dbe721d9263e` with `EXIT_CODE: 0`. +Scoped `git status --porcelain` over `QuickFiler` and `QuickFiler.Test` is empty. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t11-ac18.2026-08-26T11-13.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t11-ac18.2026-08-26T11-13.md new file mode 100644 index 000000000..da4b1a50d --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t11-ac18.2026-08-26T11-13.md @@ -0,0 +1,65 @@ +# [P5-T11] AC18 — No Non-Owned Production File Is Modified + +Timestamp: 2026-08-26T11-13 + +Task: [P5-T11] +Feature: docs/features/active/quickfiler-bug-family-446 +Acceptance criterion: AC18 (`spec.md:898`) + +Command: `git diff --name-only 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD -- "QuickFiler/**/*.cs"` +EXIT_CODE: 0 + +`` is the merge-base sha `61edc19befcf6c4e95b5acd32542f2dcdab41b78` recorded by `[P0-T3]`. +HEAD at the time of this check is `2aef13c4c5ed2d283ce51c027c33dbe721d9263e`, the commit produced +by `[P5-T10]`, so the diff gate is not vacuous: HEAD has advanced well past the merge base. + +## Returned path list (6 paths) + +| # | path | owned by this plan? | +| --- | --- | --- | +| 1 | `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` | yes | +| 2 | `QuickFiler/Controllers/QfcDatamodel.cs` | yes | +| 3 | `QuickFiler/Controllers/QfcFormController.Actions.cs` | yes | +| 4 | `QuickFiler/Controllers/QfcHomeController.Iteration.cs` | yes | +| 5 | `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | yes | +| 6 | `QuickFiler/Interfaces/IQfcDatamodel.cs` | yes | + +Every returned path is one of the six owned production paths this plan writes. The returned set +and the owned set are equal, so there is no non-owned production file in the change set and no +owned production file missing from it. + +## Explicit absence check for the twelve non-owned paths named by AC18 + +Each was searched for as a path suffix in the returned list. All twelve return a match count of +zero. + +| path | occurrences | +| --- | --- | +| `QfcHomeController.cs` | 0 | +| `QfcHomeController.Metrics.cs` | 0 | +| `QfcCollectionController.cs` | 0 | +| `QfcItemController.cs` | 0 | +| `QfcItemController.Initialization.cs` | 0 | +| `QfcHighConfidencePreFilter.cs` | 0 | +| `QfcItemGroup.cs` | 0 | +| `QfcQueue.cs` | 0 | +| `QfcRemainingQueueAdmission.cs` | 0 | +| `QfcFormController.cs` | 0 | +| `QfcFormController.EventHandlers.cs` | 0 | +| `QfcFormController.SetupDisposal.cs` | 0 | + +The `QfcHomeController.cs` and `QfcFormController.cs` checks match on the full file name, so the +owned partial files `QfcHomeController.Iteration.cs` and `QfcFormController.Actions.cs` are +correctly not counted as hits against them. + +This absence is what keeps decision D1 and risk R10 enforced: the consumer half of issue 427 would +require writing six sibling-owned files, and none of them appears here. + +## Verdict + +**AC18 PASS.** The AC18 checkbox at `spec.md:898` is checked. + +## Output Summary + +`git diff --name-only ...HEAD -- "QuickFiler/**/*.cs"` returns exactly the six owned production +paths and none other; all twelve non-owned paths named by AC18 are absent. AC18 checked off. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t12-ac19.2026-08-26T11-14.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t12-ac19.2026-08-26T11-14.md new file mode 100644 index 000000000..c4a0c66b0 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t12-ac19.2026-08-26T11-14.md @@ -0,0 +1,50 @@ +# [P5-T12] AC19 — No Project File Is Modified + +Timestamp: 2026-08-26T11-14 + +Task: [P5-T12] +Feature: docs/features/active/quickfiler-bug-family-446 +Acceptance criterion: AC19 (`spec.md:899`) + +Command: `git diff --name-only 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD -- "*.csproj" "*.props" "*.targets" "packages.config"` +EXIT_CODE: 0 + +`` is the merge-base sha `61edc19befcf6c4e95b5acd32542f2dcdab41b78` recorded by `[P0-T3]`. +HEAD is `2aef13c4c5ed2d283ce51c027c33dbe721d9263e`. + +## Result + +The command produced **zero output lines**. No `.csproj`, `.props`, `.targets` or `packages.config` +file anywhere in the repository differs between the merge base and HEAD. + +``` +(no output) +``` + +Line count of the command output: `0`. + +## Why this held + +Two plan decisions kept project files out of the change set: + +- **D2** — no new production file. `QuickFiler/QuickFiler.csproj` carries 125 explicit + `Compile Include` entries and is shared with sibling epic children, so every new type was placed + in an existing file that already has a `Compile Include` entry. +- **D4** — no new test file, and `QuickFiler.Test/QuickFiler.Test.csproj` is not edited. This is + also why risk R4 was mitigated by deduplicating `QfcHomeControllerIterationTests.cs` rather than + adding a `Part2` partial, which would have required a `.csproj` edit. + +The scoped formatting decision D-Plan-4 is the other half of this result: a repository-wide +mutating `csharpier format .` would have rewritten `packages.config` files, which +`.csharpierignore` does not exempt, and that alone would have failed this criterion. `[P5-T1]` ran +the mutating pass against the explicit change-set path list only, and `[P5-T2]` ran the repo-wide +gate read-only. + +## Verdict + +**AC19 PASS.** The AC19 checkbox at `spec.md:899` is checked. + +## Output Summary + +`git diff --name-only ...HEAD -- "*.csproj" "*.props" "*.targets" "packages.config"` returns an +empty result (0 lines). AC19 checked off. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t13-ac22.2026-08-26T11-14.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t13-ac22.2026-08-26T11-14.md new file mode 100644 index 000000000..214d9ea6d --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t13-ac22.2026-08-26T11-14.md @@ -0,0 +1,65 @@ +# [P5-T13] AC22 — No New File Under the Two Projects + +Timestamp: 2026-08-26T11-14 + +Task: [P5-T13] +Feature: docs/features/active/quickfiler-bug-family-446 +Acceptance criterion: AC22 (`spec.md:902`) + +Command: `git diff --name-status 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD -- "QuickFiler/" "QuickFiler.Test/"` +EXIT_CODE: 0 + +`` is the merge-base sha `61edc19befcf6c4e95b5acd32542f2dcdab41b78` recorded by `[P0-T3]`. +HEAD is `2aef13c4c5ed2d283ce51c027c33dbe721d9263e`. + +## Full command output (13 entries) + +``` +M QuickFiler.Test/Controllers/QfcDatamodelTests.cs +M QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs +M QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs +M QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs +M QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs +M QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs +M QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs +M QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs +M QuickFiler/Controllers/QfcDatamodel.cs +M QuickFiler/Controllers/QfcFormController.Actions.cs +M QuickFiler/Controllers/QfcHomeController.Iteration.cs +M QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs +M QuickFiler/Interfaces/IQfcDatamodel.cs +``` + +## Status-field analysis + +- Total entries: **13** +- Entries whose status field is `M` (modified): **13** +- Entries whose status field is `A` (added): **0** +- Entries with any other status (`D`, `R`, `C`, `T`): **0** + +The output contains no line whose status field is `A`, which is exactly the acceptance condition. + +## Why this held + +Decisions D2 and D4 forbade any new production or test file, because both `QuickFiler.csproj` and +`QuickFiler.Test.csproj` use explicit `Compile Include` entries: a new file would be invisible to +the compiler unless the project file were edited, which AC19 forbids. Every new type introduced by +this work was therefore placed in an existing file: + +- `QfcDequeueStop` and `QfcDequeueBatch` into `QuickFiler/Interfaces/IQfcDatamodel.cs` +- `QfcGateBatch` into `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` +- the `TimeProvider`, `UndoConsumerStarter` and `UndoItemProcessor` seams into + `QuickFiler/Controllers/QfcFormController.Actions.cs`, legal because `QfcFormController` is a + partial class + +Overflow from the `QfcDatamodel.cs` line budget went into the pre-existing +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` rather than into a new file, per D3. + +## Verdict + +**AC22 PASS.** The AC22 checkbox at `spec.md:902` is checked. + +## Output Summary + +`git diff --name-status ...HEAD -- "QuickFiler/" "QuickFiler.Test/"` reports 13 entries, every +one of status `M`, and zero entries of status `A`. AC22 checked off. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t14-ac24.2026-08-26T11-15.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t14-ac24.2026-08-26T11-15.md new file mode 100644 index 000000000..e23a7f266 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t14-ac24.2026-08-26T11-15.md @@ -0,0 +1,82 @@ +# [P5-T14] AC24 — The 500-Line Cap Holds on Every Touched File + +Timestamp: 2026-08-26T11-15 + +Task: [P5-T14] +Feature: docs/features/active/quickfiler-bug-family-446 +Acceptance criterion: AC24 (`spec.md:907`) + +Source of measurement: `[P5-T8]` +(`p5-t8-line-cap-audit.2026-08-26T11-10.md`), which counted every path returned by +`git diff --name-only 61edc19befcf6c4e95b5acd32542f2dcdab41b78...HEAD -- "*.cs"` **after** the +final formatting pass of `[P5-T1]`. Counting after formatting matters because a formatting pass +can change line counts; counting before it would measure a file the repository no longer has. + +EXIT_CODE: 0 + +## Every touched `.cs` file is at or below 500 lines + +| line count | path | +| --- | --- | +| 391 | `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` | +| 496 | `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` | +| 497 | `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` | +| 262 | `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` | +| 460 | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` | +| 270 | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` | +| 468 | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` | +| 288 | `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` | +| 480 | `QuickFiler/Controllers/QfcDatamodel.cs` | +| 360 | `QuickFiler/Controllers/QfcFormController.Actions.cs` | +| 95 | `QuickFiler/Controllers/QfcHomeController.Iteration.cs` | +| 245 | `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | +| 133 | `QuickFiler/Interfaces/IQfcDatamodel.cs` | + +Maximum recorded count: **497**. Every one of the 13 counts is at most 500. + +## QfcDatamodel.cs specifically + +AC24 names this file explicitly, since its pre-change count was 496 of the 500 cap. + +- Post-change count: **480** +- At most 500: **yes**, with 20 lines of headroom + +The file ends below its own pre-change count because `[P1-T5]` deliberately relocated +`ScoreRemainingQueueMailItemAsync` out of it into +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` to buy budget before any widening, which +is decision D3 and the mitigation recorded against risk R3. + +## The single permitted exception is vacuous + +AC24 permits exactly one exception: if +`QuickFiler.Test/Controllers/QfcFormControllerTests.cs` (pre-existing 827 lines) is touched at all, +its post-change count must be strictly less than 827. + +**That file is absent from the diff.** It does not appear in the +`git diff --name-only ...HEAD -- "*.cs"` path list audited by `[P5-T8]`, and it does not appear +in the `git diff --name-status ...HEAD -- "QuickFiler/" "QuickFiler.Test/"` output recorded by +`[P5-T13]`. Because the file is not touched, the exception's antecedent is false and the exception +is vacuously satisfied; no count needs to be compared against 827. + +This is the outcome decision D-Plan-2 committed to in advance: `spec.md` marks the replacement of +the tautological `UndoConsumer_ShouldConsumeUndoQueue` placeholder at `:687-701` as **optional**, +an optional outcome is not an atomic task, and touching an 827-line file would have risked the AC24 +exception clause for no acceptance-criteria gain. `[P3-T9]` asserted the same absence at the end of +Phase 3 and `[P5-T8]` re-confirmed it after the final formatting pass. Risk R5 records the same +constraint: that file is to be touched only to shrink it, and it was not touched. + +## Scope note + +Markdown documentation under the feature folder is exempt from the 500-line cap per +`.claude/rules/general-code-change.md` and is outside this audit, which covers exactly the `.cs` +paths in the change set. + +## Verdict + +**AC24 PASS.** The AC24 checkbox at `spec.md:907` is checked. + +## Output Summary + +All 13 touched `.cs` files are at or below the 500-line cap after formatting; the largest is 497. +`QuickFiler/Controllers/QfcDatamodel.cs` is 480. `QfcFormControllerTests.cs` is absent from the +change set, so AC24's single permitted exception is vacuously satisfied. AC24 checked off. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t15-ac25.2026-08-26T11-16.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t15-ac25.2026-08-26T11-16.md new file mode 100644 index 000000000..f262c6e68 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t15-ac25.2026-08-26T11-16.md @@ -0,0 +1,70 @@ +# [P5-T15] AC25 — The Source-Text Signature-Order Test Survives Formatting + +Timestamp: 2026-08-26T11-16 + +Task: [P5-T15] +Feature: docs/features/active/quickfiler-bug-family-446 +Acceptance criterion: AC25 (`spec.md:908`) + +Source of measurement: the `[P5-T5]` TRX at +`docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5/p5-t5.trx` +EXIT_CODE: 0 + +## The cited test outcome + +| field | value | +| --- | --- | +| test name | `LoadItemsAsync_MailItemPath_DoesNotApplyPostDisplayHighConfidenceRemoval` | +| class | `QuickFiler.Controllers.Tests.QfcFormControllerSeamTests` | +| declaring file | `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` (AC25 cites `:352-374`) | +| assembly | `QuickFiler.Test\bin\Debug\QuickFiler.Test.dll` | +| **outcome** | **`Passed`** | +| startTime | `2026-08-26T11:00:53.7917603-04:00` | +| endTime | `2026-08-26T11:00:53.7977683-04:00` | +| duration | `00:00:00.0057732` | + +The test appears exactly once in the TRX and its single result is `Passed`. + +## The formatting pass preceded the run + +AC25 is not merely "the test passes"; it is "the test passes **after** +`dotnet tool run csharpier format` has run, not before". The ordering evidence: + +| event | timestamp | +| --- | --- | +| `[P5-T1]` accepted-pass formatting artifact | `2026-08-26T10-58` | +| `[P5-T5]` test run start (TRX `Times/@start`) | `2026-08-26T11:00:43.0243019-04:00` | +| the cited test's own `startTime` | `2026-08-26T11:00:53.7917603-04:00` | +| `[P5-T5]` test run finish (TRX `Times/@finish`) | `2026-08-26T11:01:35.2468199-04:00` | + +The TRX-recorded execution time of the cited test is later than the `[P5-T1]` artifact timestamp by +roughly two and a half minutes, which is the acceptance condition. The whole test run also began +after the formatting pass, so no part of the run observed pre-format source text. + +The repository-wide read-only gate `[P5-T2]` (`dotnet tool run csharpier check .`) ran at +`2026-08-26T10-59`, also before the test run, and exited `0`, so the tree the test read from disk +was in CSharpier's canonical form at the moment the test executed. + +## Why the test could have failed and did not + +This test is a source-text assertion: per risk R2 it reads +`QuickFiler/Controllers/QfcFormController.Actions.cs` from disk and requires two exact single-line +signature literals to appear in order. CSharpier reflows a method signature across lines once it +exceeds the print width, which would split a required single-line literal and fail the assertion. +The mitigation held: no parameter was added to either `LoadItemsAsync` signature and the overloads +were not reordered, so both signatures remained within the print width. + +The `[P5-T1]` digest comparison independently confirms this: the SHA-256 of +`QuickFiler/Controllers/QfcFormController.Actions.cs` is +`83ac1911d99a028b87387c41b0d75ff41c7abc2b3189d22628051d8f6b7369de` both before and after the +formatting pass, so CSharpier made no change to the file the test reads. + +## Verdict + +**AC25 PASS.** The AC25 checkbox at `spec.md:908` is checked. + +## Output Summary + +`LoadItemsAsync_MailItemPath_DoesNotApplyPostDisplayHighConfidenceRemoval` is recorded `Passed` in +the `[P5-T5]` TRX at `2026-08-26T11:00:53`, later than the `[P5-T1]` formatting artifact timestamp +of `2026-08-26T10-58`, so the test passed after formatting and not before. AC25 checked off. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t16-ac27.2026-08-26T11-17.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t16-ac27.2026-08-26T11-17.md new file mode 100644 index 000000000..6be70a52b --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t16-ac27.2026-08-26T11-17.md @@ -0,0 +1,103 @@ +# [P5-T16] AC27 — Full Four-Step C# Toolchain Green in a Single Final Pass + +Timestamp: 2026-08-26T11-17 + +Task: [P5-T16] +Feature: docs/features/active/quickfiler-bug-family-446 +Acceptance criterion: AC27 (`spec.md:910`) + +Sources: `[P5-T2]`, `[P5-T3]`, `[P5-T4]`, `[P5-T5]` and the consolidated `[P5-T9]` record. +EXIT_CODE: 0 + +All four commands below belong to **one** toolchain pass, the pass recorded by +`p5-t9-clean-pass.2026-08-26T11-11.md`. They ran in the mandated order format, analyze, +type-check, test, between `2026-08-26T10-58` and `2026-08-26T11-01`, with no intervening file +edit. + +## The four exact command strings and their exit codes + +### 1. Formatting gate + +``` +pwsh -NoProfile -Command 'dotnet tool run csharpier check .' +``` + +EXIT_CODE: **0**. `Checked 1520 files in 6060ms.` Unformatted path set empty. +Evidence: `p5-t2-csharpier-check.2026-08-26T10-59.md` + +### 2. Analyzer gate + +``` +& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true +``` + +EXIT_CODE: **0**. `0 Error(s)`, `5 Warning(s)`. +Evidence: `p5-t3-analyzer-build.2026-08-26T10-59.md` + +### 3. Type-check gate + +``` +& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true +``` + +EXIT_CODE: **0**. `0 Error(s)`, `5 Warning(s)`, zero `CS86xx` diagnostics. +Evidence: `p5-t4-nullable-build.2026-08-26T11-00.md` + +### 4. Test gate + +``` +& $vstest $asm /InIsolation /EnableCodeCoverage "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\qa-gates\p5-t5" +``` + +EXIT_CODE: **0**. Total `6501`, passed `6501`, **failed `0`**, skipped `0`, across 9 assemblies. +Evidence: `p5-t5-vstest.2026-08-26T11-01.md` and `p5-t5/p5-t5.trx` + +## Command-shape assertions required by AC27 and by this task + +- Neither msbuild command string contains `/t:Build`. Both use `/t:Rebuild`. +- Neither msbuild command string contains `Nullable=enable`. + +Both properties are load-bearing rather than stylistic. A warm `/t:Build` returns exit 0 with +`CoreCompile` skipped on every project, because MSBuild's up-to-date check compares timestamps and +does not invalidate on a command-line `/p:` change; the gate then cannot fail. Non-vacuity was +therefore measured directly rather than assumed: the analyzer build log contains **0** occurrences +of `Skipping target "CoreCompile"` and the type-check build log contains **0** occurrences, with +`CoreCompile` target banners and 36 `csc.exe` lines present in each. Adding `/p:Nullable=enable` +would conscript every file that never adopted the `#nullable enable` pragma; CI omits it +deliberately and D-Plan-6 forbids it. + +## "Zero warnings-as-errors" + +Each msbuild run reports `5 Warning(s)` and `0 Error(s)`. No warning was promoted to an error, +which is what the criterion requires. All five are the same pre-existing diagnostic from +`packages\System.Reactive.7.0.0\build\System.Reactive.PackagesConfigCheck.targets(31,5)` about +`packages.config` not being supported by System.Reactive v7.0 or later, emitted once per affected +project. It carries a bare `warning` category rather than a `CS` or analyzer code, so +`/p:TreatWarningsAsErrors=true` does not promote it. The count is identical to the `[P0-T10]` and +`[P0-T11]` baselines, so this change set introduced no new warning. + +## Branch taken + +Neither `[P5-T2]` nor `[P5-T5]` completed on its pre-existing-baseline reconciliation branch. Both +completed on the primary branch with exit code `0`: + +- `[P0-T9]` recorded a baseline formatting exit code of `0` with an empty unformatted path set, so + no reconciliation set existed for `[P5-T2]` to fall back on. +- `[P0-T12]` recorded an empty failed-test set, so no reconciliation set existed for `[P5-T5]` to + fall back on. + +Consequently the conditional clause of this task does not apply, there is no pre-existing failure +or unformatted non-owned path to name, and **no `REMEDIATION-REQUIRED` line is written for AC27**. + +## Verdict + +All four exit codes are `0` and the recorded failed test count is `0`. + +**AC27 PASS.** The AC27 checkbox at `spec.md:910` is checked. + +## Output Summary + +Single final toolchain pass green: csharpier check `0`, analyzer rebuild `0` with 0 errors, +type-check rebuild `0` with 0 errors, vstest `0` with 0 failed of 6501. Neither msbuild command +contains `/t:Build` or `Nullable=enable`, and both builds were proven non-vacuous by zero +`Skipping target "CoreCompile"` occurrences. AC27 checked off. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t17-ac28.2026-08-26T11-18.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t17-ac28.2026-08-26T11-18.md new file mode 100644 index 000000000..ee2f96eb9 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t17-ac28.2026-08-26T11-18.md @@ -0,0 +1,129 @@ +# [P5-T17] AC28 — Coverage: No Regression, and the 90% Reading + +Timestamp: 2026-08-26T11-18 + +Task: [P5-T17] +Feature: docs/features/active/quickfiler-bug-family-446 +Acceptance criterion: AC28 (`spec.md:911`) + +Source of measurement: `[P5-T7]` (`p5-t7-coverage-comparison.2026-08-26T11-09.md`), which applied +the `[P0-T13]` aggregation command to +`docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/coverage-final.cobertura.xml`. +EXIT_CODE: 0 + +## The eight figures + +### Repository-wide (recorded and reported; explicitly NOT a blocking threshold per AC28) + +**Denominator:** the unfiltered repository-wide rate from the Cobertura root `` element, +covering every instrumented package including vendored code. This is not the filtered first-party +denominator; the two differ materially in this repository. + +| figure | value | +| --- | --- | +| repository-wide baseline line-rate | `0.847782` (84.7782%) | +| repository-wide post-change line-rate | `0.848402` (84.8402%) | + +### Changed-file scope (three rows) — the blocking scope under D-Plan-7 + +**Denominator:** distinct `` elements aggregated across every `` element whose +`filename` matches that one changed file. + +| changed file | baseline | post-change | at least 90.00? | +| --- | --- | --- | --- | +| `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | `96.77` (93/90) | `97.39` (115/112) | yes | +| `QuickFiler/Controllers/QfcFormController.Actions.cs` | `35.78` (204/73) | `47.89` (213/102) | no, on carve-out | +| `QuickFiler/Controllers/QfcHomeController.Iteration.cs` | `80.36` (56/45) | `100.00` (60/60) | yes | + +The two unconditional changed-file gates pass. `QfcFormController.Actions.cs` satisfies the +`[P5-T7]` condition on its alternative branch: `47.89` is greater than or equal to its `[P0-T13]` +baseline of `35.78`, an increase of 12.11 percentage points, and `[P5-T7]` carries the required +verbatim carve-out line. That carve-out exists because `UndoDialog` calls `MessageBox.Show` at +`:225`, `:238` and `:248` with no injectable seam, and UT4 of `.claude/rules/general-unit-test.md` +prohibits exercising it. + +### Whole-type scope (three rows) — the no-regression scope + +**Denominator:** distinct `` elements aggregated across every `` element whose +`filename` matches the type name, which for the two partial types spans partial files owned by +sibling epic children and not written by this change set. + +| type | baseline | post-change | at or above baseline? | at least 90.00? | +| --- | --- | --- | --- | --- | +| `QfcStreamingDequeueConfidenceGate` | `96.77` (93/90) | `97.39` (115/112) | yes (+0.62) | yes | +| `QfcFormController` | `51.93` (699/363) | `55.37` (708/392) | yes (+3.44) | **no** | +| `QfcHomeController` | `68.31` (445/304) | `71.05` (449/319) | yes (+2.74) | **no** | + +## No regression on the changed scope + +Every measured scope moved upward. All three whole-type rates are at or above their recorded +baselines, all three changed-file rates are above their baselines, and the repository-wide rate +rose from `0.847782` to `0.848402`. There is no regression on any scope this work touches. + +## The two excluded types + +Coverage credit cannot accrue to these two types because they carry `[ExcludeFromCodeCoverage]`: + +- **`QfcDatamodel`** — excluded at `QuickFiler/Controllers/QfcDatamodel.cs:25`. The attribute is + type-level on one partial declaration, so it also covers + `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`. Annotating both partial declarations + would be a duplicate-attribute build error, so one site is correct. +- **`FolderScoringService`** — excluded at `QuickFiler/Controllers/QfcHighConfidencePreFilter.cs:166`. + +AC28 itself names `QfcDatamodel` as excluded, which is part of why it makes the repository-wide +figure non-blocking. + +## Check-off outcome: AC28 is LEFT UNCHECKED + +AC28's checkbox states the **whole-type** reading: at least 90% line coverage on +`QfcStreamingDequeueConfidenceGate`, `QfcFormController` and `QfcHomeController`. Two of the three +whole-type rates are below `90.00` (`QfcFormController` at `55.37`, `QfcHomeController` at +`71.05`). Per `[P5-T17]`'s own instruction and the "Leave unmet items unchecked" rule of +`.claude/skills/acceptance-criteria-tracking/SKILL.md`, the box is therefore **not** checked and +the conflict is recorded rather than silently resolved. + +REMEDIATION-REQUIRED: AC28 whole-type reading conflicts with AC18 + +### Why the literal whole-type reading cannot be satisfied by this change set + +`QfcFormController` and `QfcHomeController` are partial types. Their other declarations — +`QuickFiler/Controllers/QfcFormController.cs`, +`QuickFiler/Controllers/QfcFormController.EventHandlers.cs`, +`QuickFiler/Controllers/QfcFormController.SetupDisposal.cs`, +`QuickFiler/Controllers/QfcHomeController.cs` and +`QuickFiler/Controllers/QfcHomeController.Metrics.cs` — are owned by sibling epic children and are +not written by this work. Raising a whole-type rate to 90% would require adding coverage to those +files, and AC18 explicitly forbids modifying them; `[P5-T11]` verified and checked AC18 on exactly +that basis. The two criteria cannot both be satisfied by this change set, which is why D-Plan-7 +applied the blocking `>= 90.00` gate to the changed-file scope and held the whole-type scope to +no-regression. + +Resolving this is a maintainer spec amendment, not an executor decision. No task in this plan edits +the acceptance-criteria text of `spec.md`, and none was edited. The blocking changed-file gate +remains `[P5-T7]`, which passed, and is unaffected by this check-off outcome. + +## Acceptance conditions of this task + +| condition | status | +| --- | --- | +| three changed-file line rates recorded | yes: `97.39`, `47.89`, `100.00` | +| `QfcStreamingDequeueConfidenceGate.cs` at least `90.00` | yes (`97.39`) | +| `QfcHomeController.Iteration.cs` at least `90.00` | yes (`100.00`) | +| `QfcFormController.Actions.cs` satisfies the `[P5-T7]` condition | yes, on the carve-out branch | +| three whole-type line rates each at or above baseline | yes (+0.62, +3.44, +2.74) | +| one repository-wide baseline figure recorded | yes (`0.847782`) | +| one repository-wide post-change figure recorded | yes (`0.848402`) | +| AC28 checkbox state | **unchecked**, with the `REMEDIATION-REQUIRED` line carried verbatim | + +## Verdict + +**AC28 NOT CHECKED.** The no-regression half and the changed-file `>= 90%` half both hold, but the +literal whole-type `>= 90%` reading stated in the checkbox does not, and it cannot be made to hold +without violating AC18. Recorded as a gap for maintainer adjudication. + +## Output Summary + +Eight coverage figures recorded. Changed-file scope `97.39` / `47.89` / `100.00`; whole-type scope +`97.39` / `55.37` / `71.05`; repository-wide `84.7782%` to `84.8402%`. No regression on any scope. +AC28 left unchecked because two whole-type rates are below `90.00`, with the AC28/AC18 conflict +recorded verbatim. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t18-final-commit.2026-08-26T11-19.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t18-final-commit.2026-08-26T11-19.md new file mode 100644 index 000000000..f6626fd18 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t18-final-commit.2026-08-26T11-19.md @@ -0,0 +1,120 @@ +# [P5-T18] Terminal Commit and Clean-Tree Gate + +Timestamp: 2026-08-26T11-19 + +Task: [P5-T18] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `git add "docs/features/active/quickfiler-bug-family-446"` +EXIT_CODE: 0 + +Command: `git commit -m "docs(446): record terminal acceptance criteria AC18, AC19, AC22, AC24, AC25, AC27 and AC28"` +EXIT_CODE: 0 + +Command: `git status --porcelain -- "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` +EXIT_CODE: 0 + +## Resulting HEAD + +- Short sha: `92b5c0cc` +- Full sha: `92b5c0cce60c2e14bc69dfc6035337a9029e20b7` + +Previous HEAD was `2aef13c4c5ed2d283ce51c027c33dbe721d9263e`, the `[P5-T10]` commit. + +Ten files changed, 651 insertions, 14 deletions: + +- `evidence/qa-gates/p5-t10-commit.2026-08-26T11-12.md` +- `evidence/qa-gates/p5-t11-ac18.2026-08-26T11-13.md` +- `evidence/qa-gates/p5-t12-ac19.2026-08-26T11-14.md` +- `evidence/qa-gates/p5-t13-ac22.2026-08-26T11-14.md` +- `evidence/qa-gates/p5-t14-ac24.2026-08-26T11-15.md` +- `evidence/qa-gates/p5-t15-ac25.2026-08-26T11-16.md` +- `evidence/qa-gates/p5-t16-ac27.2026-08-26T11-17.md` +- `evidence/qa-gates/p5-t17-ac28.2026-08-26T11-18.md` +- `plan.2026-08-24T09-37.md` (checklist state) +- `spec.md` (six terminal acceptance criteria checked off) + +This artifact and the `[P5-T18]` checklist entry are committed by an immediately following +sha-recording commit, which is the same two-step pattern this plan execution used for the Phase 3 +and Phase 4 terminal commits (`ae1124e9` after `7161c4a7`, and `a0f5ea2b` after `f455e2dd`). A +single commit cannot contain the sha it produces. + +## Clean-tree gate + +`git status --porcelain -- "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` +produced **zero output lines** after the commit above, and produces zero output lines again after +the sha-recording commit. + +The clean-tree requirement is scoped to the change-set and feature-folder pathspecs and is never +run unscoped, because `.claude/agent-memory/` is a tracked directory in this repository that the +executing agent writes and that lies outside this change set; it must not be staged by any task in +this plan, and it was not. The only entry in an unscoped `git status --porcelain` at the end of +this phase is the untracked `.claude/state/` directory, which is likewise outside this change set +and is deliberately never staged. + +## Acceptance-criteria checkbox audit + +All 28 criteria in `docs/features/active/quickfiler-bug-family-446/spec.md` were audited. Each is +either checked with a citing `evidence/qa-gates/` artifact, or explicitly left unchecked with a +recorded gap. + +- Total criteria: **28** +- Checked: **27** +- Unchecked with a recorded gap: **1** (AC28) + +| criteria | spec lines | verified by | citing artifact | +| --- | --- | --- | --- | +| AC1 - AC16 | 875-893 | `[P4-T1]` - `[P4-T16]` | `p4-t1-ac1` ... `p4-t16-ac16` | +| AC17 | 897 | `[P4-T17]` | `p4-t17-ac17` | +| AC18 | 898 | `[P5-T11]` | `p5-t11-ac18.2026-08-26T11-13.md` | +| AC19 | 899 | `[P5-T12]` | `p5-t12-ac19.2026-08-26T11-14.md` | +| AC20 | 900 | `[P4-T18]` | `p4-t18-ac20` | +| AC21 | 901 | `[P4-T19]` | `p4-t19-ac21` | +| AC22 | 902 | `[P5-T13]` | `p5-t13-ac22.2026-08-26T11-14.md` | +| AC23 | 906 | `[P4-T20]` | `p4-t20-ac23` | +| AC24 | 907 | `[P5-T14]` | `p5-t14-ac24.2026-08-26T11-15.md` | +| AC25 | 908 | `[P5-T15]` | `p5-t15-ac25.2026-08-26T11-16.md` | +| AC26 | 909 | `[P4-T21]` | `p4-t21-ac26` | +| AC27 | 910 | `[P5-T16]` | `p5-t16-ac27.2026-08-26T11-17.md` | +| AC28 | 911 | `[P5-T17]` | `p5-t17-ac28.2026-08-26T11-18.md` — **UNCHECKED, gap recorded** | + +### The one recorded gap + +AC28 is left unchecked. Its checkbox states a whole-type reading (at least 90% line coverage on +`QfcStreamingDequeueConfidenceGate`, `QfcFormController` and `QfcHomeController`), and two of the +three whole-type rates are below that threshold: `QfcFormController` at `55.37` and +`QfcHomeController` at `71.05`. Both are above their Phase 0 baselines (`51.93` and `68.31`), so +there is no regression; the shortfall is against the absolute 90% figure. + +Raising either whole-type rate would require adding coverage to partial files owned by sibling +epic children (`QfcFormController.cs`, `QfcFormController.EventHandlers.cs`, +`QfcFormController.SetupDisposal.cs`, `QfcHomeController.cs`, `QfcHomeController.Metrics.cs`), +which AC18 forbids modifying and which `[P5-T11]` verified were not modified. The two criteria +cannot both be satisfied by this change set. + +`p5-t17-ac28.2026-08-26T11-18.md` carries the required line verbatim: + +REMEDIATION-REQUIRED: AC28 whole-type reading conflicts with AC18 + +That artifact satisfies this task's recorded-gap condition for AC28. Adjudicating the conflict is a +maintainer spec amendment, not an executor decision; no task in this plan edits acceptance-criteria +text and none was edited. + +AC27 required no `REMEDIATION-REQUIRED` note: `[P5-T16]` recorded all four toolchain exit codes as +`0` with a failed test count of `0`, and neither `[P5-T2]` nor `[P5-T5]` completed on a +pre-existing-baseline branch, so that conditional clause never applied. + +## Artifact hygiene at the terminal commit + +A case-insensitive search of the entire feature folder for the account name and the machine name +returned **zero** hits in file contents immediately before this commit. Thirty-six leftover +`Deploy_ .../In/` directories from Phase 1 to Phase 3 test runs remain on disk with +host identifiers in their directory names; every one is empty (zero files), so git does not track +them, they never appear in `git status`, and none is committed. + +## Output Summary + +Terminal commit `92b5c0cce60c2e14bc69dfc6035337a9029e20b7` created with `EXIT_CODE: 0`. Scoped +`git status --porcelain` over `QuickFiler`, `QuickFiler.Test` and the feature folder is empty. All +28 acceptance criteria are accounted for: 27 checked with citing `evidence/qa-gates/` artifacts and +AC28 explicitly unchecked with its gap recorded verbatim. Phase 5 and the plan are complete. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t2-csharpier-check.2026-08-26T10-54.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t2-csharpier-check.2026-08-26T10-54.md new file mode 100644 index 000000000..6e9fc9a5b --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t2-csharpier-check.2026-08-26T10-54.md @@ -0,0 +1,40 @@ +# [P5-T2] Formatting Gate (read-only, repository-wide) + +Timestamp: 2026-08-26T10-54 + +Task: [P5-T2] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `pwsh -NoProfile -Command 'dotnet tool run csharpier check .'` +EXIT_CODE: 0 + +## Result + +CSharpier 1.2.6 (the version pinned by `dotnet-tools.json`, invoked through `dotnet tool run` so +the manifest-pinned version is used) reported: + +``` +Checked 1520 files in 6054ms. +``` + +The gate exits `0`, so **no unformatted path exists anywhere in the repository**. The +pre-existing-baseline reconciliation branch of this task is therefore not exercised and is not +needed: `[P0-T9]` recorded a baseline exit code of `0` with an empty unformatted path set, which +means that branch was unavailable in the first place. + +## Unformatted path set + +(empty) + +## Relationship to `[P5-T1]` + +`[P5-T1]` ran the mutating pass scoped to the 13 change-set `.cs` paths and rewrote none of them. +This read-only repository-wide gate then confirms that the change set left the rest of the tree +formatted as well. The file count checked here (1520) matches the `[P0-T9]` baseline count (1520), +so the change set added no file to and removed no file from CSharpier's scope, consistent with +AC22. + +## Output Summary + +Repository-wide read-only formatting gate passed: `EXIT_CODE: 0`, 1520 files checked, empty +unformatted path set. This is a clean pass, not a baseline-reconciled pass. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t2-csharpier-check.2026-08-26T10-59.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t2-csharpier-check.2026-08-26T10-59.md new file mode 100644 index 000000000..dfc57fa6b --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t2-csharpier-check.2026-08-26T10-59.md @@ -0,0 +1,42 @@ +# [P5-T2] Formatting Gate (read-only, repository-wide) — ACCEPTED PASS + +Timestamp: 2026-08-26T10-59 + +Task: [P5-T2] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `pwsh -NoProfile -Command 'dotnet tool run csharpier check .'` +EXIT_CODE: 0 + +## Result + +CSharpier 1.2.6, the version pinned by `dotnet-tools.json` and invoked through `dotnet tool run` +so the manifest-pinned version is used, reported: + +``` +Checked 1520 files in 6060ms. +``` + +The gate exits `0`, so **no unformatted path exists anywhere in the repository**. + +## Pre-existing-baseline branch: not taken + +`[P0-T9]` recorded a baseline exit code of `0` with an empty unformatted path set, so this task's +pre-existing-baseline reconciliation branch was never available. The gate had to exit `0` on its +own merit, and it did. This is a clean pass, not a reconciled pass. + +## Unformatted path set + +(empty) + +## Relationship to `[P5-T1]` + +`[P5-T1]` ran the mutating pass scoped to the 13 change-set `.cs` paths and rewrote none of them. +This read-only repository-wide gate confirms the rest of the tree is formatted as well. The file +count checked here (1520) equals the `[P0-T9]` baseline count (1520), so the change set added no +file to and removed no file from CSharpier's scope, which is consistent with AC22. + +## Output Summary + +Repository-wide read-only formatting gate passed: `EXIT_CODE: 0`, 1520 files checked, empty +unformatted path set, reconciliation branch not taken. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t3-analyzer-build.2026-08-26T10-55.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t3-analyzer-build.2026-08-26T10-55.md new file mode 100644 index 000000000..10c537c02 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t3-analyzer-build.2026-08-26T10-55.md @@ -0,0 +1,69 @@ +# [P5-T3] Analyzer Gate + +Timestamp: 2026-08-26T10-55 + +Task: [P5-T3] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true` + +Executed through `pwsh -NoProfile`. `$msbuild` was resolved at run time with the plan's vswhere +prelude to the Visual Studio 18 Community full-framework MSBuild under +`\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe` +(`MSBuild version 18.8.2+ce25c0108 for .NET Framework`). + +EXIT_CODE: 0 + +## Command-text assertions required by this task + +- The recorded command text contains `/t:Rebuild` and **does not contain** `/t:Build`. +- The recorded command text **does not contain** `Nullable=enable`. Per D-Plan-6 no project in + this repository carries a `` element and CI omits the property deliberately. + +## MSBuild Summary Counts + +- Error count: `0` +- Warning count: `5` +- `Build succeeded.`, Time Elapsed `00:00:20.87` + +## Non-vacuity of the gate + +`/t:Rebuild` is load-bearing: MSBuild's incremental up-to-date check compares timestamps and does +not invalidate on a command-line `/p:` change, so a warm `/t:Build` returns exit `0` with +`CoreCompile` skipped on every project and runs no analyzer at all. The following counts were +taken over the full 11,639-line build log to prove this run actually compiled: + +- Occurrences of `Skipping target "CoreCompile"`: **0** +- Lines mentioning `CoreCompile`: 73, including per-project `N>CoreCompile:` target banners and + the `Deleting file ...CoreCompileInputs.cache` lines that `/t:Rebuild` produces +- Lines mentioning `csc.exe`: 36 + +Zero skips with executed `CoreCompile` banners establishes that every project was compiled and +that the analyzers therefore ran. The gate could have failed. + +## Warning detail + +All five warnings are the same pre-existing diagnostic emitted by +`packages\System.Reactive.7.0.0\build\System.Reactive.PackagesConfigCheck.targets(31,5)`: +"The project contains a packages.config file, which is not supported by System.Reactive v7.0 or +later." It is emitted once per affected project (`ToDoModel.csproj`, `QuickFiler.csproj`, +`TaskMaster.csproj`, `UtilitiesCS.Test.csproj` among them). This is byte-for-byte the same +warning population as the `[P0-T10]` baseline, which also recorded `5 Warning(s)` / `0 Error(s)`. +The change set introduced no new warning. + +No analyzer rule diagnostic and no `CS` diagnostic was reported. In particular there are **0** +occurrences of `IDE0005` (unnecessary using directive), so the `using System.Diagnostics;` +directive in `QuickFiler/Controllers/QfcFormController.Actions.cs` — whose only consumer, +`Stopwatch`, was removed by a Phase 3 change — is **not** flagged by this gate. No task in this +plan authorizes removing it, and it was not removed. + +## Build-output lock check + +Occurrences of `being used by another process`, `MSB3021`, `MSB3026` and `MSB3027` in the build +log: **0**. No `obj/` or `bin/` output was locked and no build failure was caused by a lock. + +## Output Summary + +Analyzer gate passed: `EXIT_CODE: 0`, `0 Error(s)`, `5 Warning(s)` all pre-existing and identical +to the `[P0-T10]` baseline. Non-vacuity proven by zero `Skipping target "CoreCompile"` occurrences +across the whole log. No locked build output. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t3-analyzer-build.2026-08-26T10-59.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t3-analyzer-build.2026-08-26T10-59.md new file mode 100644 index 000000000..06f674d72 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t3-analyzer-build.2026-08-26T10-59.md @@ -0,0 +1,69 @@ +# [P5-T3] Analyzer Gate — ACCEPTED PASS + +Timestamp: 2026-08-26T10-59 + +Task: [P5-T3] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true` + +Executed through `pwsh -NoProfile`. `$msbuild` was resolved at run time with the plan's vswhere +prelude to the Visual Studio 18 Community full-framework MSBuild under +`\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe` +(`MSBuild version 18.8.2+ce25c0108 for .NET Framework`). + +EXIT_CODE: 0 + +## Command-text assertions required by this task + +- The recorded command text contains `/t:Rebuild` and **does not contain** `/t:Build`. +- The recorded command text **does not contain** `Nullable=enable`. Per D-Plan-6, no project in + this repository carries a `` element and CI omits the property deliberately. + +## MSBuild Summary Counts + +- Error count: `0` +- Warning count: `5` +- `Build succeeded.`, Time Elapsed `00:00:23.86` + +## Non-vacuity of the gate + +`/t:Rebuild` is load-bearing: MSBuild's incremental up-to-date check compares timestamps and does +not invalidate on a command-line `/p:` change, so a warm `/t:Build` returns exit `0` with +`CoreCompile` skipped on every project and runs no analyzer at all. Counts taken over the full +build log: + +- Occurrences of `Skipping target "CoreCompile"`: **0** +- Lines mentioning `CoreCompile`: 73 +- Lines mentioning `csc.exe`: 36 + +Zero skips together with executed `CoreCompile` target banners establishes that every project was +compiled and that the analyzers ran. The gate could have failed. + +## Warning detail + +All five warnings are the same pre-existing diagnostic emitted by +`packages\System.Reactive.7.0.0\build\System.Reactive.PackagesConfigCheck.targets(31,5)`: "The +project contains a packages.config file, which is not supported by System.Reactive v7.0 or later." +It is emitted once per affected project (`ToDoModel.csproj`, `QuickFiler.csproj`, +`TaskMaster.csproj`, `UtilitiesCS.Test.csproj` among them). This is the same warning population as +the `[P0-T10]` baseline, which also recorded `5 Warning(s)` / `0 Error(s)`. The change set +introduced no new warning. + +No analyzer rule diagnostic and no `CS` diagnostic was reported. In particular there are **0** +occurrences of `IDE0005` (unnecessary using directive), so the `using System.Diagnostics;` +directive in `QuickFiler/Controllers/QfcFormController.Actions.cs` — whose only consumer, +`Stopwatch`, was removed by a Phase 3 change — is **not** flagged by this gate. No task in this +plan authorizes removing that directive and it was not removed. + +## Build-output lock check + +Occurrences of `being used by another process`, `MSB3021`, `MSB3023`, `MSB3026` and `MSB3027` in +the build log: **0**. No `obj/` or `bin/` output was locked and no build failure was caused by a +lock. + +## Output Summary + +Analyzer gate passed: `EXIT_CODE: 0`, `0 Error(s)`, `5 Warning(s)` all pre-existing and equal in +number to the `[P0-T10]` baseline. Non-vacuity proven by zero `Skipping target "CoreCompile"` +occurrences across the whole log. No locked build output. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t4-nullable-build.2026-08-26T10-56.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t4-nullable-build.2026-08-26T10-56.md new file mode 100644 index 000000000..28f44053b --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t4-nullable-build.2026-08-26T10-56.md @@ -0,0 +1,65 @@ +# [P5-T4] Type-Check / Nullable Gate + +Timestamp: 2026-08-26T10-56 + +Task: [P5-T4] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true` + +Executed through `pwsh -NoProfile`. `$msbuild` was resolved at run time with the plan's vswhere +prelude to the Visual Studio 18 Community full-framework MSBuild under +`\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe`. + +EXIT_CODE: 0 + +## Command-text assertions required by this task + +- The recorded command text contains `/t:Rebuild` and **does not contain** `/t:Build`. +- The recorded command text **does not contain** `Nullable=enable`. This is character-for-character + the command in `.github/workflows/ci.yml` (step "Build with nullable warnings treated as errors"). + Per D-Plan-6, adding `/p:Nullable=enable` would conscript every file that never adopted the + `#nullable enable` pragma; none of the owned production files carries that pragma and none gains + it here. + +## MSBuild Summary Counts + +- Error count: `0` +- Warning count: `5` +- `Build succeeded.`, Time Elapsed `00:00:19.30` + +## Non-vacuity of the gate + +Counts taken over the full build log: + +- Occurrences of `Skipping target "CoreCompile"`: **0** +- Lines mentioning `CoreCompile`: 73 +- Lines mentioning `csc.exe`: 36 + +Every project was recompiled under `/p:TreatWarningsAsErrors=true`, so the gate was live and +could have failed. + +## Nullable diagnostics + +Occurrences of `CS86` in the build log: **0**. No nullable-flow diagnostic was produced by any +file, which matches the `[P0-T11]` baseline. + +## Warning detail + +The five warnings are the same pre-existing +`packages\System.Reactive.7.0.0\build\System.Reactive.PackagesConfigCheck.targets(31,5)` +packages.config diagnostic recorded by `[P0-T10]`, `[P0-T11]` and `[P5-T3]`. Because it is emitted +with a bare `warning` category rather than a `CS` or analyzer code, +`/p:TreatWarningsAsErrors=true` does not promote it and the build stays green. The warning count +is identical to the `[P0-T11]` baseline, so the change set introduced no new warning. + +## Build-output lock check + +Occurrences of `being used by another process`, `MSB3021`, `MSB3023`, `MSB3026` and `MSB3027`: +**0**. No `obj/` or `bin/` output was locked and no build failure was caused by a lock. + +## Output Summary + +Type-check gate passed: `EXIT_CODE: 0`, `0 Error(s)`, `5 Warning(s)` all pre-existing and equal in +number to the `[P0-T11]` baseline, zero `CS86xx` nullable diagnostics. Non-vacuity proven by zero +`Skipping target "CoreCompile"` occurrences. No locked build output. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t4-nullable-build.2026-08-26T11-00.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t4-nullable-build.2026-08-26T11-00.md new file mode 100644 index 000000000..2da0a8b80 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t4-nullable-build.2026-08-26T11-00.md @@ -0,0 +1,67 @@ +# [P5-T4] Type-Check / Nullable Gate — ACCEPTED PASS + +Timestamp: 2026-08-26T11-00 + +Task: [P5-T4] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true` + +Executed through `pwsh -NoProfile`. `$msbuild` was resolved at run time with the plan's vswhere +prelude to the Visual Studio 18 Community full-framework MSBuild under +`\Microsoft Visual Studio\18\Community\MSBuild\Current\Bin\MSBuild.exe`. + +EXIT_CODE: 0 + +## Command-text assertions required by this task + +- The recorded command text contains `/t:Rebuild` and **does not contain** `/t:Build`. +- The recorded command text **does not contain** `Nullable=enable`. This is character-for-character + the command in `.github/workflows/ci.yml` (step "Build with nullable warnings treated as + errors"). Per D-Plan-6, adding `/p:Nullable=enable` would conscript every file that never adopted + the `#nullable enable` pragma; none of the owned production files carries that pragma and none + gains it here. + +## MSBuild Summary Counts + +- Error count: `0` +- Warning count: `5` +- `Build succeeded.`, Time Elapsed `00:00:26.35` + +## Non-vacuity of the gate + +Counts taken over the full build log: + +- Occurrences of `Skipping target "CoreCompile"`: **0** +- Lines mentioning `CoreCompile`: 100 +- Lines mentioning `csc.exe`: 36 + +Every project was recompiled under `/p:TreatWarningsAsErrors=true`, so the gate was live and could +have failed. + +## Nullable diagnostics + +Occurrences of `CS86` in the build log: **0**. No nullable-flow diagnostic was produced by any +file, matching the `[P0-T11]` baseline. Nullable enforcement in this repository is per-file +opt-in via `#nullable enable`; `/p:TreatWarningsAsErrors=true` promotes `CS86xx` diagnostics in +opted-in files to errors, and none was emitted. + +## Warning detail + +The five warnings are the same pre-existing +`packages\System.Reactive.7.0.0\build\System.Reactive.PackagesConfigCheck.targets(31,5)` +packages.config diagnostic recorded by `[P0-T10]`, `[P0-T11]` and `[P5-T3]`. Because it is emitted +with a bare `warning` category rather than a `CS` or analyzer code, +`/p:TreatWarningsAsErrors=true` does not promote it and the build stays green. The count is +identical to the `[P0-T11]` baseline. + +## Build-output lock check + +Occurrences of `being used by another process`, `MSB3021`, `MSB3023`, `MSB3026` and `MSB3027`: +**0**. No `obj/` or `bin/` output was locked and no build failure was caused by a lock. + +## Output Summary + +Type-check gate passed: `EXIT_CODE: 0`, `0 Error(s)`, `5 Warning(s)` all pre-existing, zero +`CS86xx` nullable diagnostics. Non-vacuity proven by zero `Skipping target "CoreCompile"` +occurrences. No locked build output. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5-vstest.2026-08-26T10-56.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5-vstest.2026-08-26T10-56.md new file mode 100644 index 000000000..6a822f4b4 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5-vstest.2026-08-26T10-56.md @@ -0,0 +1,67 @@ +# [P5-T5] Test Gate — ABORTED PASS (retained per the Phase 5 restart rule) + +Timestamp: 2026-08-26T10-56 + +Task: [P5-T5] +Feature: docs/features/active/quickfiler-bug-family-446 + +**Status: FAILED. This artifact records the aborted first pass of the Phase 5 toolchain loop.** +It is retained alongside the artifacts of the pass the loop finally accepted, exactly as the +Phase 5 preamble requires ("every artifact from the aborted pass is retained alongside the +artifact from the pass that finally succeeded"). + +Command: `& $vstest $asm /InIsolation /EnableCodeCoverage "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\qa-gates\p5-t5"` +EXIT_CODE: 1 + +## What happened + +`vstest.console.exe` 18.8.0 printed: + +``` +No test source files were specified. +``` + +and exited `1`. The discovery prelude reported `ASM_COUNT=0`, so `$asm` was empty and the gate ran +against no assembly. No TRX was produced and no test was executed, so this attempt satisfies none +of the task's acceptance conditions (it records no total greater than zero). + +## Root cause — an executor-side transcription defect, not a repository defect + +The plan's discovery prelude filters on the regular expression `"\bin\Debug\\"`. The intermediate +shell this executor uses to author script files collapses doubled backslashes, so the byte sequence +that actually reached the script file was `"\bin\Debug\"`. Under .NET regular-expression semantics +`\b` is a word-boundary assertion and `\D` is a non-digit class, so the pattern no longer matched +any path. Verified by direct measurement: + +``` +RAW=18 (Get-ChildItem -Recurse -Filter *.Test.dll -File) +AFTER_BIN=0 (after the collapsed "\bin\Debug\" filter) +``` + +The eighteen raw hits are the nine `bin\Debug` assemblies and their nine `obj\Debug` counterparts; +all nine `bin\Debug` paths were present on disk and were confirmed by an independent listing. This +is the same backslash-collapsing hazard `[P0-T13]` recorded and worked around. + +The remedy applied for the accepted pass is to build the separator pattern without any doubled +backslash, using `[regex]::Escape('\bin\Debug\')`, which is semantically identical to the plan's +`"\bin\Debug\\"`. No plan text was changed. + +## Consequence for the loop + +Nothing in the working tree was created, rewritten or deleted by this failed invocation: +`git status --porcelain` scoped to `QuickFiler` and `QuickFiler.Test` produced zero output lines +immediately afterwards, and no results directory was written. The failure is nevertheless a failed +toolchain step, so per the Phase 5 preamble the loop restarted from `[P5-T1]`. The artifacts of the +aborted pass are: + +- `p5-t1-csharpier-format.2026-08-26T10-52.md` +- `p5-t2-csharpier-check.2026-08-26T10-54.md` +- `p5-t3-analyzer-build.2026-08-26T10-55.md` +- `p5-t4-nullable-build.2026-08-26T10-56.md` +- this artifact + +## Output Summary + +Aborted `[P5-T5]`: `EXIT_CODE: 1`, `No test source files were specified.`, zero tests executed, +zero assemblies discovered. Cause was a collapsed-backslash regular expression in the executor's +transcription of the plan's discovery prelude. The Phase 5 loop restarted from `[P5-T1]`. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5-vstest.2026-08-26T11-01.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5-vstest.2026-08-26T11-01.md new file mode 100644 index 000000000..3a16bb413 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5-vstest.2026-08-26T11-01.md @@ -0,0 +1,115 @@ +# [P5-T5] Test Gate — ACCEPTED PASS + +Timestamp: 2026-08-26T11-01 + +Task: [P5-T5] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `& $vstest $asm /InIsolation /EnableCodeCoverage "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\qa-gates\p5-t5"` +EXIT_CODE: 0 + +Executed through `pwsh -NoProfile`. `$vstest` was resolved at run time with the plan's vswhere +prelude to `\Microsoft Visual Studio\18\Community\Common7\IDE\Extensions\TestPlatform\vstest.console.exe` +(`VSTest version 18.8.0 (x64)`). + +This is the second pass of the Phase 5 loop. The first pass of this task failed and is recorded in +`p5-t5-vstest.2026-08-26T10-56.md`; the correction was confined to the executor's transcription of +the discovery prelude's regular expression and changed nothing in the repository. + +## Discovered assemblies + +The Command-conventions discovery prelude reported `ASM_COUNT=9` and produced these nine +workspace-root-relative paths: + +1. `.\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll` +2. `.\SVGControl.Test\bin\Debug\SVGControl.Test.dll` +3. `.\Tags.Test\bin\Debug\Tags.Test.dll` +4. `.\TaskMaster.Test\bin\Debug\TaskMaster.Test.dll` +5. `.\TaskTree.Test\bin\Debug\TaskTree.Test.dll` +6. `.\TaskVisualization.Test\bin\Debug\TaskVisualization.Test.dll` +7. `.\ToDoModel.Test\bin\Debug\ToDoModel.Test.dll` +8. `.\UtilitiesCS.Test\bin\Debug\UtilitiesCS.Test.dll` +9. `.\VBFunctions.Test\bin\Debug\VBFunctions.Test.dll` + +**None of the nine recorded paths contains a `.claude` segment when expressed relative to the +workspace root**, satisfying that acceptance condition. The exclusion is applied to the relative +path and not the absolute one because the workspace root itself lies beneath a `.claude` +directory; an absolute-path test would exclude every assembly and produce a vacuously green run. +The count matches the nine assemblies recorded by the `[P0-T12]` baseline exactly. + +## Test counts + +- Total: `6501` +- Passed: `6501` +- Failed: `0` +- Skipped: `0` + +Reproduced from the runner: `Test Run Successful.` / `Total tests: 6501` / `Passed: 6501` / +`Total time: 52.1997 Seconds`. The runner prints no `Failed:` or `Skipped:` row when those counts +are zero. The recorded total is greater than zero, satisfying that acceptance condition. + +The TRX `ResultSummary/Counters` element independently confirms the counts: +`total="6501" executed="6501" passed="6501" failed="0" error="0" timeout="0" aborted="0" +inconclusive="0" notExecuted="0"`. Every one of the 6501 `UnitTestResult` elements carries +`outcome="Passed"`; the TRX contains zero `RunInfo` elements, so no run-level error or warning was +recorded. + +## Failed-test set + +(empty) + +`EXIT_CODE: 0` with a recorded failed count of `0`, so this task completes on its **primary** +branch. The pre-existing-baseline reconciliation branch is not taken and is not needed: `[P0-T12]` +recorded an empty failed set, so there was no reconciliation set available in the first place. + +## Relationship to the `[P0-T12]` baseline total + +The baseline recorded 6482 tests; this run records 6501, a net increase of 19. The increase is the +regression tests this change set added across Phases 1 through 3 to +`QuickFiler.Test`. No test was removed and no test regressed: both runs report a failed count of +`0`. + +## Test host + +No `Test host process crashed` message appears in the run output, so no per-assembly +`/InIsolation` re-run was required. `/InIsolation` was passed on the single aggregate invocation +as the Command conventions require. + +## Artifacts + +- `docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5/p5-t5.trx` + +The TRX was produced by `vstest.console.exe` under its default name, which embeds the account and +machine identifiers. It was renamed to the task-ID form used throughout this feature folder and +its contents were scrubbed before it was committed: `` absolute prefixes were replaced +with `REDACTED-REPO-ROOT`, the user-profile prefix with `REDACTED-USER-PROFILE`, the combined +`_` token with `REDACTED-USER_REDACTED-HOST`, the bare machine name with +`REDACTED-HOST` and the bare account name with `REDACTED-USER`. Only plain tokens were used, since +`<` is not legal in an XML attribute value and is not an entity inside CDATA. Replacement counts: +13,020 repository-root prefixes, 1 bare machine name, 2 `_` tokens and 2 bare +account names. A case-insensitive search of the scrubbed TRX for the account and machine names +returns **zero** hits. + +The scrubbed TRX was re-parsed as XML and verified unchanged in substance: the `Counters` element +is byte-identical to its pre-scrub value, the `UnitTestResult` count is 6501 before and after, and +the SHA-256 of the ordered concatenation of all 6501 `testName` attributes is +`e3761b9485de9eea293020022be539e3973f3318381ae172978f264cfb5d962d` both before and after the +scrub. No counter and no test name was altered. + +### Binary `.coverage` byproducts relocated out of the repository + +`/EnableCodeCoverage` also emitted two 20 MB binary `.coverage` attachments, under a results +subdirectory and an attachment GUID directory whose names embedded the account and machine +identifiers. Those files contain 1,292 UTF-16LE occurrences of the account name in embedded +absolute paths. A binary coverage container cannot be text-scrubbed without corrupting its +internal offsets, so the two byproduct directories were moved out of the repository rather than +committed with host identifiers in them. Nothing is lost: they are tool byproducts that no task in +this plan cites, and the coverage figures this plan consumes come from the Cobertura XML that +`[P5-T6]` produces. The TRX retains its (now redacted) attachment reference. + +## Output Summary + +Full-suite gate passed: `EXIT_CODE: 0`, 9 assemblies discovered with no `.claude` segment in any +workspace-root-relative path, 6501 total, 6501 passed, 0 failed, 0 skipped. Primary branch, not +the reconciliation branch. TRX scrubbed of host identifiers, re-parsed, and verified to have +identical counters and test names. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5/p5-t5.trx b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5/p5-t5.trx new file mode 100644 index 000000000..55b8d1033 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t5/p5-t5.trx @@ -0,0 +1,45630 @@ + + + + + + + + + + + + Debug Trace: +Stack is empty +Stack is empty now +Stack is empty now + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Error in set user property: COM error +Call Stack: at Moq.Behaviors.ThrowException.Execute(Invocation invocation) in /_/src/Moq/Behaviors/ThrowException.cs:line 22 + at Moq.MethodCall.ExecuteCore(Invocation invocation) in /_/src/Moq/MethodCall.cs:line 109 + at Moq.Setup.Execute(Invocation invocation) in /_/src/Moq/Setup.cs:line 86 + at Moq.FindAndExecuteMatchingSetup.Handle(Invocation invocation, Mock mock) in /_/src/Moq/Interception/InterceptionAspects.cs:line 96 + at Moq.Mock.Moq.IInterceptor.Intercept(Invocation invocation) in /_/src/Moq/Interception/Mock.cs:line 15 + at Moq.CastleProxyFactory.Interceptor.Intercept(IInvocation underlying) in /_/src/Moq/Interception/CastleProxyFactory.cs:line 113 + at Castle.DynamicProxy.AbstractInvocation.Proceed() + at Castle.Proxies.UserPropertiesProxy.Find(String Name, Object Custom) + at UtilitiesCS.OutlookExtensions.UserDefinedFields.SetUdf(MeetingItem item, String udfName, Object value, OlUserPropertyType olUdfType) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\UtilitiesCS\OutlookObjects\Fields\UserDefinedFields.cs:line 671 + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: +============================ +| Source token probability | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared2 0.1429 | +| shared1 0.7143 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + +=================================== +| Probability List | +| Class Probability | +=================================== +| .00010dedicated80 0.9999 | +| .28571shared10 0.7143 | +| .28571shared11 0.7143 | +=================================== + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +2026-08-26 11:01:06,372 WARN TaskMaster.AppOlObjects - StoresWrapper config not found; rebuilding from live stores. + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + Debug Trace: + + panel1 + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Tests whether properly handles no entries + +======================= +| Source List of | +| Probabilities | +| Class Probability | +======================= +| Object is empty | +======================= + +Expected: 0.00 +Actual: 0.00 + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + +==================================== +| MATCH Token Frequency (expected | +| vs actual) | +| Token Expected Actual Diff | +==================================== +| token00 5 5 | +| token01 4 4 | +| token02 12 12 | +| token03 12 12 | +| token04 4 4 | +| token08 4 4 | +| token09 5 5 | +| token10 11 11 | +==================================== + + +==================================== +| TOTAL Token Frequency (expected | +| vs actual) | +| Token Expected Actual Diff | +==================================== +| token00 5 5 | +| token01 4 4 | +| token02 12 12 | +| token03 16 16 | +| token04 8 8 | +| token05 12 12 | +| token06 12 12 | +| token07 4 4 | +| token08 4 4 | +| token09 5 5 | +| token10 11 11 | +==================================== + + +Expected Match email count: 8 +Actual Match email count: 8 + +Expected Total token count: 17 +Actual Total token count: 17 + +==================================== +| Probabilities (expected vs | +| actual) | +| Token Expected Actual Diff | +==================================== +| token00 0.9587 0.9587 | +| token01 0.9494 0.9494 | +| token02 0.9819 0.9819 | +| token03 0.7640 0.7640 | +| token04 0.5279 0.5279 | +| token08 0.9494 0.9494 | +| token09 0.9587 0.9587 | +| token10 0.9804 0.9804 | +==================================== + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Error: 0 : SvgRenderer could not parse the SVG payload: System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1. + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:05,769 ERROR TaskMaster.AppEvents - OlToDoItems_ItemChange handler faulted; contained to prevent process termination. +System.ArgumentException: The parameter 'sectionGroupName' is invalid. + at TaskMaster.Test.AppGlobals.AppEventsTests.<>c__DisplayClass9_0.<HandleToDoItemChangeAsync_WhenCollaboratorThrows_LogsExceptionAndDoesNotRethrow>b__0(Object _) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster.Test\AppGlobals\AppEventsTests.cs:line 306 + at TaskMaster.AppEvents.<HandleToDoItemChangeAsync>d__39.MoveNext() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\AppEvents.ReadinessHookup.cs:line 121 + + + + + Debug Trace: +Argument value=not-a-number is of type System.String which is not assignable to olNumber which is of type System.Double.Stack Trace: UtilitiesCS.dll.ValidPropertyArgs -> UtilitiesCS.dll.SetUdf -> UserDefinedFieldsTests.SetUdf_AppointmentItem_WhenArgsAreInvalid_ShouldReturnFalse + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: +2026-08-26 11:01:04,930 DEBUG TaskMaster.StoreRehookCoordinator - [store-rehook] identity='Mailbox - Test' storeId='store-1' outcome=Success + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: +Argument value=not-a-number is of type System.String which is not assignable to olNumber which is of type System.Double.Stack Trace: UtilitiesCS.dll.ValidPropertyArgs -> UtilitiesCS.dll.TrySetUdf -> UserDefinedFieldsTests.TrySetUdf_WhenValueTypeIsWrongForOlUdfType_ShouldReturnFalse + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: + +Token count calculation + + + + + + + + Debug Trace: +Actual: System.Collections.Generic.List`1[System.ValueTuple`2[System.Double,System.Int32]] +Expected: System.ValueTuple`2[System.Double,System.Int32][] + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +Error in set user property: COM error +Call Stack: at Moq.Behaviors.ThrowException.Execute(Invocation invocation) in /_/src/Moq/Behaviors/ThrowException.cs:line 22 + at Moq.MethodCall.ExecuteCore(Invocation invocation) in /_/src/Moq/MethodCall.cs:line 109 + at Moq.Setup.Execute(Invocation invocation) in /_/src/Moq/Setup.cs:line 86 + at Moq.FindAndExecuteMatchingSetup.Handle(Invocation invocation, Mock mock) in /_/src/Moq/Interception/InterceptionAspects.cs:line 96 + at Moq.Mock.Moq.IInterceptor.Intercept(Invocation invocation) in /_/src/Moq/Interception/Mock.cs:line 15 + at Moq.CastleProxyFactory.Interceptor.Intercept(IInvocation underlying) in /_/src/Moq/Interception/CastleProxyFactory.cs:line 113 + at Castle.DynamicProxy.AbstractInvocation.Proceed() + at Castle.Proxies.UserPropertiesProxy.Find(String Name, Object Custom) + at UtilitiesCS.OutlookExtensions.UserDefinedFields.TrySetUdf(IOutlookItem item, String udfName, Object value, OlUserPropertyType olUdfType) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\UtilitiesCS\OutlookObjects\Fields\UserDefinedFields.cs:line 254 + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: +Argument value=not-a-number is of type System.String which is not assignable to olNumber which is of type System.Double.Stack Trace: UtilitiesCS.dll.ValidPropertyArgs -> UtilitiesCS.dll.SetUdf -> UserDefinedFieldsTests.SetUdMailItem_WhenArgsAreInvalid_ShouldReturnFalse + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + +Token count calculation + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:04,913 ERROR TaskMaster.StoreRehookCoordinator - [store-rehook] identity='Mailbox - Test' storeId='store-1' outcome=PermanentError; subsystem=store-hookup; hresult=0x8004010F +System.Runtime.InteropServices.COMException (0x8004010F): boom + at TaskMaster.Test.AppGlobals.StoreRehookCoordinatorTests.Harness.<Build>b__24_6(Store _) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster.Test\AppGlobals\StoreRehookCoordinatorTests.cs:line 71 + at TaskMaster.StoreRehookCoordinator.PerformOneStoreHookup(Store store, String storeId) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\StoreRehookCoordinator.cs:line 201 + at TaskMaster.StoreRehookCoordinator.<>c__DisplayClass15_0.<RehookStoreCoreAsync>b__0() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\StoreRehookCoordinator.cs:line 154 + at TaskMaster.HookReadinessCoordinator.Tick() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\HookReadinessCoordinator.cs:line 101 + at TaskMaster.StoreRehookCoordinator.<RehookStoreCoreAsync>d__15.MoveNext() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\StoreRehookCoordinator.cs:line 159 + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +2026-08-26 11:01:05,714 DEBUG TaskMaster.AppEvents - [Startup timing] LoadAsync start | startup-active status | threadId=50; syncContext=null; startup-active=True | deferred processing window pending +2026-08-26 11:01:05,716 DEBUG TaskMaster.AppEvents - [Startup timing] LoadAsync startup hook dispatch | startup hook | threadId=50; syncContext=null; startup-active=True +2026-08-26 11:01:05,719 DEBUG TaskMaster.AppEvents - [Startup timing] Hook start | startup hook | threadId=50; syncContext=null; startup-active=True +2026-08-26 11:01:05,725 DEBUG TaskMaster.AppEvents - [Startup timing] LoadAsync startup hook complete | startup hook | threadId=50; syncContext=null; startup-active=True +2026-08-26 11:01:05,727 DEBUG TaskMaster.AppEvents - [Startup timing] LoadAsync complete | startup-active status | threadId=50; syncContext=null; startup-active=False | elapsedMs=11 +2026-08-26 11:01:05,732 DEBUG TaskMaster.AppEvents - [readiness-hookup] step=ToDoFolder.Items start +2026-08-26 11:01:05,734 DEBUG TaskMaster.AppEvents - [readiness-hookup] step=ToDoFolder.Items end elapsedMs=1.07 +2026-08-26 11:01:05,736 DEBUG TaskMaster.AppEvents - [readiness-hookup] step=OlReminders start +2026-08-26 11:01:05,738 DEBUG TaskMaster.AppEvents - [readiness-hookup] step=OlReminders end elapsedMs=0.41 +2026-08-26 11:01:05,738 DEBUG TaskMaster.AppEvents - [readiness-hookup] step=Inboxes start +2026-08-26 11:01:05,741 DEBUG TaskMaster.AppEvents - [readiness-hookup] step=Inboxes end elapsedMs=1.82 +2026-08-26 11:01:05,742 DEBUG TaskMaster.AppEvents - [Startup timing] Hook complete | startup hook | threadId=50; syncContext=null; startup-active=True | elapsedMs=11; inboxSubscriptions=0; toDoItemsMs=1.07; remindersMs=0.41; inboxSubscribeMs=1.82 +2026-08-26 11:01:05,744 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync start | startup-active status | threadId=50; syncContext=null; startup-active=True +2026-08-26 11:01:05,745 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync complete | startup-active status | threadId=50; syncContext=null; startup-active=False | elapsedMs=1 + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:05,038 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync start | startup-active status | threadId=50; syncContext=null; startup-active=True +2026-08-26 11:01:05,042 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync startup inbox restriction start | inbox restriction | threadId=50; syncContext=null; startup-active=True | inboxIndex=1; filter=@SQL="http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/AutoProcessed" is null +2026-08-26 11:01:05,049 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync startup inbox restriction complete | inbox restriction | threadId=50; syncContext=null; startup-active=True | inboxIndex=1; restrictedCount=2; elapsedMs=6 +2026-08-26 11:01:05,092 DEBUG TaskMaster.AppEvents - Unprocessed queue has 2 items +2026-08-26 11:01:05,093 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync interactive checkpoint | startup-active status | threadId=50; syncContext=null; startup-active=True | interactive checkpoint; unprocessedCount=2 +2026-08-26 11:01:05,095 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync startup inbox batch start | batch processing | threadId=50; syncContext=null; startup-active=True | batch=1; remaining=2; batchSize=2 +2026-08-26 11:01:05,159 DEBUG TaskMaster.AppEvents - No engines available +2026-08-26 11:01:05,160 DEBUG TaskMaster.AppEvents - Error processing item 1 of 2 in the unprocessed Queue +2026-08-26 11:01:05,269 DEBUG TaskMaster.AppEvents - No engines available +2026-08-26 11:01:05,270 DEBUG TaskMaster.AppEvents - Error processing item 2 of 2 in the unprocessed Queue +2026-08-26 11:01:05,381 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync startup inbox batch complete | batch processing | threadId=42; syncContext=null; startup-active=True | batch=1; processed=0; remaining=0; success=0; errors=2; elapsedMs=286 +2026-08-26 11:01:05,383 DEBUG TaskMaster.AppEvents - Successfully processed 0 of 2 items in the unprocessed Queue with 2 errors +2026-08-26 11:01:05,386 DEBUG TaskMaster.AppEvents - Finished processing new inbox items +2026-08-26 11:01:05,387 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync complete | startup-active status | threadId=42; syncContext=null; startup-active=False | elapsedMs=349 + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +[Subject] = 'Roadmap' + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +=========================================== +| Memory Stats | +| Property Value | +=========================================== +| AvailablePhysicalMemory 76.26 GB | +| TotalPhysicalMemory 136.66 GB | +| AvailableVirtualMemory 140,730.77 GB | +| TotalVirtualMemory 140,737.49 GB | +=========================================== + + + + + + + + + + + Debug Trace: +Error dequeuing at line 0 in CtfIncidence.TryDequeueIncidence of the backup loader + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:04,919 ERROR TaskMaster.StoreRehookCoordinator - [store-rehook] identity='Mailbox - Test' storeId='store-1' outcome=PermanentError; subsystem=store-hookup; hresult=n/a +System.InvalidOperationException: boom + at TaskMaster.Test.AppGlobals.StoreRehookCoordinatorTests.Harness.<Build>b__24_6(Store _) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster.Test\AppGlobals\StoreRehookCoordinatorTests.cs:line 71 + at TaskMaster.StoreRehookCoordinator.PerformOneStoreHookup(Store store, String storeId) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\StoreRehookCoordinator.cs:line 201 + at TaskMaster.StoreRehookCoordinator.<>c__DisplayClass15_0.<RehookStoreCoreAsync>b__0() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\StoreRehookCoordinator.cs:line 154 + at TaskMaster.HookReadinessCoordinator.Tick() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\HookReadinessCoordinator.cs:line 101 + at TaskMaster.StoreRehookCoordinator.<RehookStoreCoreAsync>d__15.MoveNext() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\StoreRehookCoordinator.cs:line 159 + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + +Expected: +( 10z Week 38 Rollback CID.xlsx, https://sabradipping.sharepoint.com/:x:/s/Sales-LargeFormatTeam2/EVpXvJ8dfZ9DmaoSjGJ16uIBuc7kN7LG9esDj9pciuoriA) +( Snackers Week 37 Rollback CID.xlsx, https://sabradipping.sharepoint.com/:x:/s/Sales-LargeFormatTeam2/EZckiLtanGtMjumaLHLwsCsBwQsHSfAuMpzsMyfcIPUTdg?email=dmoisan%40sabra.com&e=YRrQJk) + +Actual: +( 10z Week 38 Rollback CID.xlsx, https://sabradipping.sharepoint.com/:x:/s/Sales-LargeFormatTeam2/EVpXvJ8dfZ9DmaoSjGJ16uIBuc7kN7LG9esDj9pciuoriA) +( Snackers Week 37 Rollback CID.xlsx, https://sabradipping.sharepoint.com/:x:/s/Sales-LargeFormatTeam2/EZckiLtanGtMjumaLHLwsCsBwQsHSfAuMpzsMyfcIPUTdg?email=dmoisan%40sabra.com&e=YRrQJk) + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Error: 0 : SvgRenderer could not parse the SVG payload: System.Xml.XmlException: Root element is missing. + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +2026-08-26 11:01:04,961 ERROR TaskMaster.AppAutoFileObjects - Recents config not found. + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +Error dequeuing at line 0 in CtfMapEntry.TryDequeueEntry of the backup loader + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +====================== +| Match Token | +| Frequency | +| Token Count | +====================== +| dedicated7 8 | +| shared2 1 | +| dedicated8 20 | +| shared1 5 | +| shared7 25 | +| shared8 20 | +====================== + +====================== +| Filtered Match | +| Token Frequency | +| Token Count | +====================== +| dedicated7 8 | +| shared2 1 | +| dedicated8 20 | +| shared1 5 | +| shared7 25 | +| shared8 20 | +====================== + +=================== +| Filtered Not | +| Match Token | +| Frequency | +| Token Count | +=================== +| shared2 3 | +| shared1 1 | +| shared7 25 | +| shared4 6 | +| shared5 4 | +| shared8 20 | +=================== + +Filtered Shared Match Count: 79 +Filtered Shared NotMatch Count: 79 +============================ +| Expected probability | +| tokens | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared1 0.7143 | +| shared2 0.1429 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +============================ +| Resulting probability | +| tokens | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared1 0.7143 | +| shared2 0.1429 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + +==================================== +| MATCH Token Frequency (expected | +| vs actual) | +| Token Expected Actual Diff | +==================================== +| token00 4 4 | +| token01 4 4 | +| token02 12 12 | +| token03 12 12 | +| token04 4 4 | +==================================== + + +==================================== +| TOTAL Token Frequency (expected | +| vs actual) | +| Token Expected Actual Diff | +==================================== +| token00 4 4 | +| token01 4 4 | +| token02 12 12 | +| token03 16 16 | +| token04 8 8 | +| token05 12 12 | +| token06 12 12 | +| token07 4 4 | +==================================== + + +Expected Match email count: 7 +Actual Match email count: 7 + +Expected Total token count: 16 +Actual Total token count: 16 + +==================================== +| Probabilities (expected vs | +| actual) | +| Token Expected Actual Diff | +==================================== +| token00 0.9494 0.9494 | +| token01 0.9494 0.9494 | +| token02 0.9819 0.9819 | +| token03 0.7861 0.7861 | +| token04 0.5592 0.5592 | +==================================== + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:05,038 ERROR TaskMaster.AppEvents - OlInboxItems_ItemAdd handler faulted; contained to prevent process termination. +System.InvalidOperationException: engines unavailable + at Moq.Behaviors.ThrowException.Execute(Invocation invocation) in /_/src/Moq/Behaviors/ThrowException.cs:line 22 + at Moq.MethodCall.ExecuteCore(Invocation invocation) in /_/src/Moq/MethodCall.cs:line 109 + at Moq.Setup.Execute(Invocation invocation) in /_/src/Moq/Setup.cs:line 86 + at Moq.FindAndExecuteMatchingSetup.Handle(Invocation invocation, Mock mock) in /_/src/Moq/Interception/InterceptionAspects.cs:line 96 + at Moq.Mock.Moq.IInterceptor.Intercept(Invocation invocation) in /_/src/Moq/Interception/Mock.cs:line 15 + at Moq.CastleProxyFactory.Interceptor.Intercept(IInvocation underlying) in /_/src/Moq/Interception/CastleProxyFactory.cs:line 113 + at Castle.DynamicProxy.AbstractInvocation.Proceed() + at Castle.Proxies.IApplicationGlobalsProxy.get_Engines() + at TaskMaster.AppEvents.<ProcessMailItemAsync>d__24.MoveNext() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\AppEvents.cs:line 266 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at System.Runtime.CompilerServices.TaskAwaiter.GetResult() + at TaskMaster.AppEvents.<HandleInboxItemAddAsync>d__38.MoveNext() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\AppEvents.ReadinessHookup.cs:line 101 + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +1 + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:04,571 DEBUG TaskMaster.AppEvents - [Startup timing] LoadAsync start | startup-active status | threadId=50; syncContext=null; startup-active=True | deferred processing window pending +2026-08-26 11:01:04,819 DEBUG TaskMaster.AppEvents - [Startup timing] LoadAsync startup hook skipped | startup hook | threadId=50; syncContext=null; startup-active=True | EventsHooked=false +2026-08-26 11:01:04,821 DEBUG TaskMaster.AppEvents - [Startup timing] LoadAsync entering deferred processing window before await ProcessNewInboxItemsAsync() | threadId=50; syncContext=null; startup-active=True | deferred processing window +2026-08-26 11:01:04,853 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync start | startup-active status | threadId=50; syncContext=null; startup-active=True +2026-08-26 11:01:04,858 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync complete | startup-active status | threadId=50; syncContext=null; startup-active=False | elapsedMs=7 +2026-08-26 11:01:04,860 DEBUG TaskMaster.AppEvents - [Startup timing] LoadAsync complete | startup-active status | threadId=50; syncContext=null; startup-active=False | elapsedMs=303 + + + + + + + + + + + + + + Debug Trace: +Tests null input +======================= +| Source token | +| probability | +| Class Probability | +======================= +| e 0.6400 | +| d 0.6300 | +| g 0.6600 | +| f 0.6500 | +| a 0.6000 | +| c 0.6200 | +| b 0.6100 | +| m 0.7200 | +| l 0.7100 | +| o 0.7400 | +| n 0.7300 | +| i 0.6800 | +| h 0.6700 | +| k 0.7000 | +| j 0.6900 | +| u 0.8000 | +| t 0.7900 | +| w 0.8200 | +| v 0.8100 | +| q 0.7600 | +| p 0.7500 | +| s 0.7800 | +| r 0.7700 | +| y 0.8400 | +| x 0.8300 | +| z 0.8500 | +======================= + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + +======================= +| Expected Output | +| Class Probability | +======================= +| Object is empty | +======================= + +======================= +| Actual Output | +| Class Probability | +======================= +| Object is empty | +======================= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 + + + + + + + + + + + + + + + Debug Trace: +Error converting to int at line 0 in CtfMapEntry.TryDequeueEntry of the backup loader + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,266 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] displayName=Primary Store exchangeStoreTypeMs=0.0 filePathMs=0.0 included=true rule=Included +2026-08-26 11:01:06,266 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [Startup timing] GetFilteredStores completed: 1 stores in 2 ms +2026-08-26 11:01:06,268 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' DisplayName: 0 ms +2026-08-26 11:01:06,269 ERROR UtilitiesCS.OutlookObjects.Store.StoreWrapper - Error reading StoreID for store 'Primary Store' get_StoreID +2026-08-26 11:01:06,269 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' GetRootFolder: 0 ms +2026-08-26 11:01:06,270 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' GetDefaultFolder(Inbox): 0 ms +2026-08-26 11:01:06,271 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' CurrentUser: 0 ms +2026-08-26 11:01:06,271 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' AddressEntry: 0 ms +2026-08-26 11:01:06,272 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' GetExchangeUser: 0 ms +2026-08-26 11:01:06,272 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' PrimarySmtpAddress: 0 ms (result=<null>) +2026-08-26 11:01:06,272 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' GetSmtpAddressFromStore: 1 ms +2026-08-26 11:01:06,272 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [store-wrapper-init] store=Primary Store totalMs=3.5 threadId=20 +2026-08-26 11:01:06,275 WARN UtilitiesCS.OutlookObjects.Folder.FolderMinimalWrapper - olRoot is null or RelativePath is empty. Unable to load folder from relative path. +2026-08-26 11:01:06,276 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Restore 'Primary Store' ArchiveRoot.RestoreFromRelativePath: 3 ms +2026-08-26 11:01:06,276 WARN UtilitiesCS.OutlookObjects.Folder.FolderMinimalWrapper - olRoot is null or RelativePath is empty. Unable to load folder from relative path. +2026-08-26 11:01:06,276 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Restore 'Primary Store' JunkPotential.RestoreFromRelativePath: 0 ms +2026-08-26 11:01:06,277 WARN UtilitiesCS.OutlookObjects.Folder.FolderMinimalWrapper - olRoot is null or RelativePath is empty. Unable to load folder from relative path. +2026-08-26 11:01:06,278 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Restore 'Primary Store' JunkCertain.RestoreFromRelativePath: 0 ms +2026-08-26 11:01:06,278 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [Startup timing] Store 'Primary Store' iteration completed in 10 ms (operation=Restore) +2026-08-26 11:01:06,278 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [Startup timing] RewireOlObjectsAsync total: 13 ms + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: +Tests null input + +SOURCE PROBABILITY TOKENS: +[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z] + +SHARED TOKENS: +[shared1,shared2,shared3,shared4,shared5,shared6,shared7,shared8] + +DEDICATED TOKENS: +[dedicated6,dedicated2,dedicated7,dedicated3,dedicated8,dedicated4,dedicated5,dedicated1] +======================= +| Expected Output | +| Class Probability | +======================= +| Object is empty | +======================= + +======================= +| Actual Output | +| Class Probability | +======================= +| Object is empty | +======================= + + + + + + + + + + + + + + + + + + + + Debug Trace: +Error converting to int at line 0 in CtfMapEntry.TryDequeueEntry of the backup loader + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +2026-08-26 11:01:05,475 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync start | startup-active status | threadId=50; syncContext=null; startup-active=True +2026-08-26 11:01:05,477 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync startup inbox restriction start | inbox restriction | threadId=50; syncContext=null; startup-active=True | inboxIndex=1; filter=@SQL="http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/AutoProcessed" is null +2026-08-26 11:01:05,484 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync startup inbox restriction complete | inbox restriction | threadId=50; syncContext=null; startup-active=True | inboxIndex=1; restrictedCount=11; elapsedMs=7 +2026-08-26 11:01:05,486 DEBUG TaskMaster.AppEvents - Unprocessed queue has 11 items +2026-08-26 11:01:05,487 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync interactive checkpoint | startup-active status | threadId=50; syncContext=null; startup-active=True | interactive checkpoint; unprocessedCount=11 +2026-08-26 11:01:05,489 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync startup inbox batch start | batch processing | threadId=50; syncContext=null; startup-active=True | batch=1; remaining=11; batchSize=10 +2026-08-26 11:01:05,498 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=50; syncContext=null +2026-08-26 11:01:05,514 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=50; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,548 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=50; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=49 +2026-08-26 11:01:05,549 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=50; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=50 +2026-08-26 11:01:05,621 DEBUG TaskMaster.AppEvents - Successfully processed item 1 of 11 in the unprocessed Queue +2026-08-26 11:01:05,623 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=28; syncContext=null +2026-08-26 11:01:05,623 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=28; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,625 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=28; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=2 +2026-08-26 11:01:05,626 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=28; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=2 +2026-08-26 11:01:05,627 DEBUG TaskMaster.AppEvents - Successfully processed item 2 of 11 in the unprocessed Queue +2026-08-26 11:01:05,629 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=30; syncContext=null +2026-08-26 11:01:05,630 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=30; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,630 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=30; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,631 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=30; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,633 DEBUG TaskMaster.AppEvents - Successfully processed item 3 of 11 in the unprocessed Queue +2026-08-26 11:01:05,634 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=30; syncContext=null +2026-08-26 11:01:05,635 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=30; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,635 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=30; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,636 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=30; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,638 DEBUG TaskMaster.AppEvents - Successfully processed item 4 of 11 in the unprocessed Queue +2026-08-26 11:01:05,639 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=32; syncContext=null +2026-08-26 11:01:05,639 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=32; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,641 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=32; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,641 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=32; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,643 DEBUG TaskMaster.AppEvents - Successfully processed item 5 of 11 in the unprocessed Queue +2026-08-26 11:01:05,645 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=32; syncContext=null +2026-08-26 11:01:05,646 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=32; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,656 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=32; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=11 +2026-08-26 11:01:05,657 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=32; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=11 +2026-08-26 11:01:05,659 DEBUG TaskMaster.AppEvents - Successfully processed item 6 of 11 in the unprocessed Queue +2026-08-26 11:01:05,660 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=48; syncContext=null +2026-08-26 11:01:05,660 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=48; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,661 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=48; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,662 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=48; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,664 DEBUG TaskMaster.AppEvents - Successfully processed item 7 of 11 in the unprocessed Queue +2026-08-26 11:01:05,666 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=48; syncContext=null +2026-08-26 11:01:05,666 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=48; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,666 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=48; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,667 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=48; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,669 DEBUG TaskMaster.AppEvents - Successfully processed item 8 of 11 in the unprocessed Queue +2026-08-26 11:01:05,669 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=28; syncContext=null +2026-08-26 11:01:05,671 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=28; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,671 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=28; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,672 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=28; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,674 DEBUG TaskMaster.AppEvents - Successfully processed item 9 of 11 in the unprocessed Queue +2026-08-26 11:01:05,675 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=28; syncContext=null +2026-08-26 11:01:05,675 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=28; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,676 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=28; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,677 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=28; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,678 DEBUG TaskMaster.AppEvents - Successfully processed item 10 of 11 in the unprocessed Queue +2026-08-26 11:01:05,680 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync startup inbox batch complete | batch processing | threadId=28; syncContext=null; startup-active=True | batch=1; processed=10; remaining=1; success=10; errors=0; elapsedMs=190 +2026-08-26 11:01:05,681 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync deferred continuation checkpoint | batch processing | threadId=28; syncContext=null; startup-active=True | batch=1; remaining=1 +2026-08-26 11:01:05,683 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync startup inbox batch start | batch processing | threadId=28; syncContext=null; startup-active=True | batch=2; remaining=1; batchSize=1 +2026-08-26 11:01:05,683 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization start | COM-backed materialization | threadId=28; syncContext=null +2026-08-26 11:01:05,683 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation start | tokenization dependency preparation | threadId=28; syncContext=null | subject=Subject; entryId=entry-1 +2026-08-26 11:01:05,685 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync tokenization dependency preparation complete | tokenization dependency preparation | threadId=28; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,685 DEBUG UtilitiesCS.MailItemHelper - [MailItem timing] FromMailItemAsync COM-backed materialization complete | COM-backed materialization | threadId=28; syncContext=null | subject=Subject; entryId=entry-1; elapsedMs=1 +2026-08-26 11:01:05,687 DEBUG TaskMaster.AppEvents - Successfully processed item 11 of 11 in the unprocessed Queue +2026-08-26 11:01:05,689 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync startup inbox batch complete | batch processing | threadId=28; syncContext=null; startup-active=True | batch=2; processed=1; remaining=0; success=11; errors=0; elapsedMs=5 +2026-08-26 11:01:05,690 DEBUG TaskMaster.AppEvents - Successfully processed 11 of 11 items in the unprocessed Queue with 0 errors +2026-08-26 11:01:05,691 DEBUG TaskMaster.AppEvents - Finished processing new inbox items +2026-08-26 11:01:05,691 DEBUG TaskMaster.AppEvents - [Startup timing] ProcessNewInboxItemsAsync complete | startup-active status | threadId=28; syncContext=null; startup-active=False | elapsedMs=216 + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +Tests empty input + +SOURCE PROBABILITY TOKENS: +[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z] + +SHARED TOKENS: +[shared1,shared2,shared3,shared4,shared5,shared6,shared7,shared8] + +DEDICATED TOKENS: +[dedicated6,dedicated2,dedicated7,dedicated3,dedicated8,dedicated4,dedicated5,dedicated1] +======================= +| Expected Output | +| Class Probability | +======================= +| Object is empty | +======================= + +======================= +| Actual Output | +| Class Probability | +======================= +| Object is empty | +======================= + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + +Token count calculation + +Token count calculation + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,339 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=IntelConfig waitMs=0.0 resumeThreadId=8 resumeSyncContext=null staIsIdle=False staCpuUsage=0.958 staGuiActivity=0.0 +2026-08-26 11:01:06,340 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=IntelConfig grossMs=0.0 storeWrapperInitMs=0.0 netMs=0.0 +2026-08-26 11:01:06,340 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=OlObjects waitMs=0.0 resumeThreadId=8 resumeSyncContext=null staIsIdle=False staCpuUsage=0.930 staGuiActivity=0.0 +2026-08-26 11:01:06,340 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=OlObjects grossMs=0.9 storeWrapperInitMs=0.0 netMs=0.9 +2026-08-26 11:01:06,341 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=ToDo waitMs=0.0 resumeThreadId=8 resumeSyncContext=null staIsIdle=False staCpuUsage=0.903 staGuiActivity=0.0 +2026-08-26 11:01:06,342 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=ToDo grossMs=0.9 storeWrapperInitMs=0.0 netMs=0.9 +2026-08-26 11:01:06,342 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=AutoFile waitMs=0.0 resumeThreadId=8 resumeSyncContext=null staIsIdle=False staCpuUsage=0.873 staGuiActivity=0.0 +2026-08-26 11:01:06,342 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=AutoFile grossMs=1.1 storeWrapperInitMs=0.0 netMs=1.1 +2026-08-26 11:01:06,342 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=Engines waitMs=0.0 resumeThreadId=16 resumeSyncContext=null staIsIdle=False staCpuUsage=0.873 staGuiActivity=0.0 +2026-08-26 11:01:06,344 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Engines grossMs=0.7 storeWrapperInitMs=0.0 netMs=0.7 +2026-08-26 11:01:06,344 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Events grossMs=0.6 storeWrapperInitMs=0.0 netMs=0.6 +2026-08-26 11:01:06,344 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=IntelConfig waitMs=0.0 resumeThreadId=16 resumeSyncContext=null staIsIdle=False staCpuUsage=0.838 staGuiActivity=0.0 +2026-08-26 11:01:06,345 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=IntelConfig grossMs=0.0 storeWrapperInitMs=0.0 netMs=0.0 +2026-08-26 11:01:06,345 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=OlObjects waitMs=0.0 resumeThreadId=16 resumeSyncContext=null staIsIdle=False staCpuUsage=0.816 staGuiActivity=0.0 +2026-08-26 11:01:06,345 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=OlObjects grossMs=0.9 storeWrapperInitMs=0.0 netMs=0.9 +2026-08-26 11:01:06,346 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=ToDo waitMs=0.0 resumeThreadId=16 resumeSyncContext=null staIsIdle=False staCpuUsage=0.795 staGuiActivity=0.0 +2026-08-26 11:01:06,346 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=ToDo grossMs=0.9 storeWrapperInitMs=0.0 netMs=0.9 +2026-08-26 11:01:06,346 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=AutoFile waitMs=0.0 resumeThreadId=16 resumeSyncContext=null staIsIdle=False staCpuUsage=0.795 staGuiActivity=0.0 +2026-08-26 11:01:06,346 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=AutoFile grossMs=0.7 storeWrapperInitMs=0.0 netMs=0.7 +2026-08-26 11:01:06,347 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=Engines waitMs=0.0 resumeThreadId=10 resumeSyncContext=null staIsIdle=False staCpuUsage=0.765 staGuiActivity=0.0 +2026-08-26 11:01:06,347 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Engines grossMs=0.7 storeWrapperInitMs=0.0 netMs=0.7 +2026-08-26 11:01:06,348 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Events grossMs=0.8 storeWrapperInitMs=0.0 netMs=0.8 +2026-08-26 11:01:06,348 INFO TaskMaster.ApplicationGlobals - [Startup timing] +========================== +| Duration Action | +========================== +| 0:00.00 LoadBasic | +| 0:00.00 IntelConfig | +| 0:00.00 OlObjects | +| 0:00.00 ToDo | +| 0:00.00 AutoFile | +| 0:00.00 Engines | +| 0:00.00 Events | +| 0:00.01 TOTAL | +========================== + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +Error converting to int at line 0 in CtfMapEntry.TryDequeueEntry of the backup loader + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,394 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] displayName=Mailbox exchangeStoreTypeMs=0.2 filePathMs=0.2 included=true rule=Included +2026-08-26 11:01:06,394 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] GetFilteredStores completed: 1 stores in 2 ms +2026-08-26 11:01:06,394 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Mailbox' DisplayName: 0 ms +2026-08-26 11:01:06,396 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Mailbox' GetRootFolder: 0 ms +2026-08-26 11:01:06,396 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Mailbox' GetDefaultFolder(Inbox): 0 ms +2026-08-26 11:01:06,396 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Mailbox' CurrentUser: 0 ms +2026-08-26 11:01:06,396 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Mailbox' AddressEntry: 0 ms +2026-08-26 11:01:06,397 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Mailbox' GetExchangeUser: 0 ms +2026-08-26 11:01:06,397 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Mailbox' PrimarySmtpAddress: 0 ms (result=user@example.com) +2026-08-26 11:01:06,397 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Mailbox' GetSmtpAddressFromStore: 1 ms +2026-08-26 11:01:06,398 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [store-wrapper-init] store=Mailbox totalMs=3.2 threadId=20 + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +Integration test of GetMatchProbability method which +calls GetProbabilityList and CombineProbabilities +============================ +| Source token probability | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared2 0.1429 | +| shared1 0.7143 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + +============================ +| Source probabilities | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared1 0.7143 | +| shared2 0.1429 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +Expected: 0.39182 +Actual: 0.39182 + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +Error in set user property: COM error +Call Stack: at Moq.Behaviors.ThrowException.Execute(Invocation invocation) in /_/src/Moq/Behaviors/ThrowException.cs:line 22 + at Moq.MethodCall.ExecuteCore(Invocation invocation) in /_/src/Moq/MethodCall.cs:line 109 + at Moq.Setup.Execute(Invocation invocation) in /_/src/Moq/Setup.cs:line 86 + at Moq.FindAndExecuteMatchingSetup.Handle(Invocation invocation, Mock mock) in /_/src/Moq/Interception/InterceptionAspects.cs:line 96 + at Moq.Mock.Moq.IInterceptor.Intercept(Invocation invocation) in /_/src/Moq/Interception/Mock.cs:line 15 + at Moq.CastleProxyFactory.Interceptor.Intercept(IInvocation underlying) in /_/src/Moq/Interception/CastleProxyFactory.cs:line 113 + at Castle.DynamicProxy.AbstractInvocation.Proceed() + at Castle.Proxies.UserPropertiesProxy.Find(String Name, Object Custom) + at UtilitiesCS.OutlookExtensions.UserDefinedFields.SetUdf(AppointmentItem item, String udfName, Object value, OlUserPropertyType olUdfType) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\UtilitiesCS\OutlookObjects\Fields\UserDefinedFields.cs:line 634 + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: +[Name | Date[ +[Name | Date[ + + + + + + Debug Trace: +2026-08-26 11:01:04,907 ERROR TaskMaster.StoreRehookCoordinator - [store-rehook] identity='Mailbox - Test' storeId='store-1' outcome=TransientTimeout; the store-scoped readiness gate never reported ready within 20 attempts. + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +Argument value=not-a-number is of type System.String which is not assignable to olNumber which is of type System.Double.Stack Trace: UtilitiesCS.dll.ValidPropertyArgs -> UtilitiesCS.dll.SetUdf -> <>c__DisplayClass45_0.<SetUdf_WhenValueTypeIsWrongForOlUdfType_ShouldThrowArgumentException>b__0 -> UserDefinedFieldsTests.SetUdf_WhenValueTypeIsWrongForOlUdfType_ShouldThrowArgumentException + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + +==================================== +| MATCH Token Frequency (expected | +| vs actual) | +| Token Expected Actual Diff | +==================================== +| token00 4 4 | +| token01 4 4 | +| token02 12 12 | +| token03 12 12 | +| token04 4 4 | +==================================== + + +==================================== +| TOTAL Token Frequency (expected | +| vs actual) | +| Token Expected Actual Diff | +==================================== +| token00 4 4 | +| token01 4 4 | +| token02 12 12 | +| token03 16 16 | +| token04 8 8 | +| token05 12 12 | +| token06 12 12 | +| token07 4 4 | +==================================== + + +Expected Match email count: 7 +Actual Match email count: 7 + +Expected Total token count: 16 +Actual Total token count: 16 + +==================================== +| Probabilities (expected vs | +| actual) | +| Token Expected Actual Diff | +==================================== +| token00 0.9494 0.9494 | +| token01 0.9494 0.9494 | +| token02 0.9819 0.9819 | +| token03 0.7861 0.7861 | +| token04 0.5592 0.5592 | +==================================== + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + +Token count calculation + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: +Fired HandleModelDropped + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Tests all new tokens + +SOURCE PROBABILITY TOKENS: +[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z] + +SHARED TOKENS: +[shared1,shared2,shared3,shared4,shared5,shared6,shared7,shared8] + +DEDICATED TOKENS: +[dedicated6,dedicated2,dedicated7,dedicated3,dedicated8,dedicated4,dedicated5,dedicated1] +======================= +| Expected Output | +| Class Probability | +======================= +| Object is empty | +======================= + +======================= +| Actual Output | +| Class Probability | +======================= +| Object is empty | +======================= + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +==================== +| Match Token | +| Frequency | +| Token Count | +==================== +| shared-1 6 | +==================== + +==================== +| Filtered Match | +| Token Frequency | +| Token Count | +==================== +| shared-1 6 | +==================== + +==================== +| Filtered Not | +| Match Token | +| Frequency | +| Token Count | +==================== +| shared-2 6 | +==================== + +Filtered Shared Match Count: 6 +Filtered Shared NotMatch Count: 16 + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + +Token count calculation + +Token count calculation + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Error converting to int at line 0 in CtfIncidence.TryDequeueIncidence of the backup loader + + + + + + + + Debug Trace: +Tests empty input +======================= +| Source token | +| probability | +| Class Probability | +======================= +| e 0.6400 | +| d 0.6300 | +| g 0.6600 | +| f 0.6500 | +| a 0.6000 | +| c 0.6200 | +| b 0.6100 | +| m 0.7200 | +| l 0.7100 | +| o 0.7400 | +| n 0.7300 | +| i 0.6800 | +| h 0.6700 | +| k 0.7000 | +| j 0.6900 | +| u 0.8000 | +| t 0.7900 | +| w 0.8200 | +| v 0.8100 | +| q 0.7600 | +| p 0.7500 | +| s 0.7800 | +| r 0.7700 | +| y 0.8400 | +| x 0.8300 | +| z 0.8500 | +======================= + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + +======================= +| Expected Output | +| Class Probability | +======================= +| Object is empty | +======================= + +======================= +| Actual Output | +| Class Probability | +======================= +| Object is empty | +======================= + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Argument value=not-a-number is of type System.String which is not assignable to olNumber which is of type System.Double.Stack Trace: UtilitiesCS.dll.ValidPropertyArgs -> UtilitiesCS.dll.SetUdf -> UserDefinedFieldsTests.SetUdf_TaskItem_WhenArgsAreInvalid_ShouldReturnFalse + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + +Token count calculation + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:04,594 DEBUG TaskMaster.AppFileSystemFolderPaths - Error in TryAddSpecialFolder for key name because pathParts has null elements at . AppFileSystemFolderPaths.TryAddSpecialFolder -> AppFileSystemFolderPaths.TryAddSpecialFolder -> AppFileSystemFolderPaths.LoadFolders -> AppFileSystemFolderPaths..ctor -> ApplicationGlobals.LoadBasicMethod -> ApplicationGlobals.<.ctor>b__4_0 -> ApplicationGlobals.ForceBasicLoad -> ApplicationGlobalsTests.Constructor_WithoutLoadBasic_DoesNotMaterializeCollaboratorsUntilForceBasicLoad + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Expected Object: +{"Categories":"Category1, Category2, Category3","Tokens":["Token1","Token2","Token3"],"FolderInfo":{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.IFolderWrapper, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"UtilitiesCS.IFolderWrapper, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},"ToRecipients":[{"__interceptors":[{}],"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"class","__delegateToBase":false,"__data":[null,null,null]},{"__interceptors":[{}],"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"class","__delegateToBase":false,"__data":[null,null,null]}],"CcRecipients":[{"__interceptors":[{}],"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"class","__delegateToBase":false,"__data":[null,null,null]},{"__interceptors":[{}],"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"class","__delegateToBase":false,"__data":[null,null,null]}],"Sender":{"__interceptors":[{}],"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"class","__delegateToBase":false,"__data":[null,null,null]},"ConversationId":"1A2B3C4DMockConversationId5E6F7G","EntryId":null,"StoreId":null,"Subject":null,"Actionable":null} +Actual Object: +{"Categories":"Category1, Category2, Category3","Tokens":["Token1","Token2","Token3"],"FolderInfo":{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.IFolderWrapper, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"UtilitiesCS.IFolderWrapper, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"},"ToRecipients":[{"__interceptors":[{}],"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"class","__delegateToBase":false,"__data":[null,null,null]},{"__interceptors":[{}],"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"class","__delegateToBase":false,"__data":[null,null,null]}],"CcRecipients":[{"__interceptors":[{}],"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"class","__delegateToBase":false,"__data":[null,null,null]},{"__interceptors":[{}],"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"class","__delegateToBase":false,"__data":[null,null,null]}],"Sender":{"__interceptors":[{}],"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"UtilitiesCS.RecipientInfo, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"class","__delegateToBase":false,"__data":[null,null,null]},"ConversationId":"1A2B3C4DMockConversationId5E6F7G","EntryId":null,"StoreId":null,"Subject":null,"Actionable":null} + + + + + + + + + + + + + + + + + + Debug Trace: +Add failed + at Moq.Behaviors.ThrowException.Execute(Invocation invocation) in /_/src/Moq/Behaviors/ThrowException.cs:line 22 + at Moq.MethodCall.ExecuteCore(Invocation invocation) in /_/src/Moq/MethodCall.cs:line 109 + at Moq.Setup.Execute(Invocation invocation) in /_/src/Moq/Setup.cs:line 86 + at Moq.FindAndExecuteMatchingSetup.Handle(Invocation invocation, Mock mock) in /_/src/Moq/Interception/InterceptionAspects.cs:line 96 + at Moq.Mock.Moq.IInterceptor.Intercept(Invocation invocation) in /_/src/Moq/Interception/Mock.cs:line 15 + at Moq.CastleProxyFactory.Interceptor.Intercept(IInvocation underlying) in /_/src/Moq/Interception/CastleProxyFactory.cs:line 113 + at Castle.DynamicProxy.AbstractInvocation.Proceed() + at Castle.Proxies.CategoriesProxy.Add(String Name, Object Color, Object ShortcutKey) + at UtilitiesCS.CreateCategoryModule.CreateCategory(NameSpace olNS, IPrefix prefix, String newCatName) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\UtilitiesCS\OutlookObjects\Category\CreateCategory.cs:line 68 + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Error: 0 : SvgRenderer could not parse the SVG payload: System.Xml.XmlException: Root element is missing. + + + + + + + + + + + + + + + Debug Trace: + + panel1 + button1 + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Actionable" LIKE '%Task%' AND ("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Triage" LIKE '%A%' OR "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Triage" = 'B')) +() + AND + "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Actionable" LIKE '%Task%' + () + OR + "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Triage" LIKE '%A%' + "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Triage" = 'B' +("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Actionable" LIKE '%Task%' AND ("http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Triage" LIKE '%A%' OR "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/Triage" = 'B')) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +Tests whether the cutoff for Knobs.InterestingWordCount is working + +Interesting Word Count: 20 + +======================================= +| Source List of Probabilities | +| Class Probability | +======================================= +| .00001highprobtoken0 1.0000 | +| .00001highprobtoken1 1.0000 | +| .00001highprobtoken10 1.0000 | +| .00001highprobtoken11 1.0000 | +| .00001highprobtoken12 1.0000 | +| .00001highprobtoken13 1.0000 | +| .00001highprobtoken14 1.0000 | +| .00001highprobtoken15 1.0000 | +| .00001highprobtoken16 1.0000 | +| .00001highprobtoken17 1.0000 | +| .00001highprobtoken18 1.0000 | +| .00001highprobtoken19 1.0000 | +| .00001highprobtoken2 1.0000 | +| .00001highprobtoken3 1.0000 | +| .00001highprobtoken4 1.0000 | +| .00001highprobtoken5 1.0000 | +| .00001highprobtoken6 1.0000 | +| .00001highprobtoken7 1.0000 | +| .00001highprobtoken8 1.0000 | +| .00001highprobtoken9 1.0000 | +| .40000averagetoken0 0.5000 | +| .40000averagetoken1 0.5000 | +| .40000averagetoken2 0.5000 | +| .40000averagetoken3 0.5000 | +| .40000averagetoken4 0.5000 | +======================================= + +Expected: 1.00 since all entries at 0.50 probability are cut off +Actual: 1.00 + + + + + + + + + + + + + + + Debug Trace: +Object reference not set to an instance of an object. + at ToDoModel.ProjectData.Programs_ByProjectNames(String projectNames) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\ToDoModel\Data Model\Project\ProjectData.cs:line 331 + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + Debug Trace: +============================ +| Source token probability | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared2 0.1429 | +| shared1 0.7143 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +testhost.exe Error: 0 : SvgRenderer could not parse the SVG payload: System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1. + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +[Triage] = 'A' + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:04,901 WARN TaskMaster.StoreRehookCoordinator - [store-rehook] identity='Mailbox - Test' outcome=StoreNotFound; no live store matched the identity. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +=============================================== +| Probability Integration Test | +| WordStream Actual Expected Difference | +=============================================== +| d 0.844828 0.844828 - | +| a 0.091837 0.091837 - | +| a and b 0.032525 0.032525 - | +| d, a and b 0.233942 0.233942 - | +=============================================== + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: +============================ +| Source token probability | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared2 0.1429 | +| shared1 0.7143 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + +Token count calculation + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +Error converting to int at line 0 in CtfIncidence.TryDequeueIncidence of the backup loader + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: +============================= +| Probability List | +| Class Probability | +============================= +| .20000high0 0.8000 | +| .20000low1 0.2000 | +============================= + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +2026-08-26 11:01:06,320 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=IntelConfig waitMs=0.0 resumeThreadId=25 resumeSyncContext=null staIsIdle=False staCpuUsage=1.191 staGuiActivity=0.0 +2026-08-26 11:01:06,320 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=IntelConfig grossMs=0.0 storeWrapperInitMs=0.0 netMs=0.0 +2026-08-26 11:01:06,321 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=OlObjects waitMs=0.0 resumeThreadId=25 resumeSyncContext=null staIsIdle=False staCpuUsage=1.068 staGuiActivity=0.0 +2026-08-26 11:01:06,321 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=OlObjects grossMs=0.9 storeWrapperInitMs=0.0 netMs=0.9 +2026-08-26 11:01:06,321 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=ToDo waitMs=0.0 resumeThreadId=25 resumeSyncContext=null staIsIdle=False staCpuUsage=1.068 staGuiActivity=0.0 +2026-08-26 11:01:06,322 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=ToDo grossMs=0.7 storeWrapperInitMs=0.0 netMs=0.7 +2026-08-26 11:01:06,322 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=AutoFile waitMs=0.0 resumeThreadId=25 resumeSyncContext=null staIsIdle=False staCpuUsage=1.000 staGuiActivity=0.0 +2026-08-26 11:01:06,322 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=AutoFile grossMs=0.6 storeWrapperInitMs=0.0 netMs=0.6 +2026-08-26 11:01:06,323 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=Engines waitMs=0.0 resumeThreadId=28 resumeSyncContext=null staIsIdle=False staCpuUsage=0.940 staGuiActivity=0.0 +2026-08-26 11:01:06,323 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Engines grossMs=0.8 storeWrapperInitMs=0.0 netMs=0.8 +2026-08-26 11:01:06,323 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Events grossMs=0.7 storeWrapperInitMs=0.0 netMs=0.7 +2026-08-26 11:01:06,324 INFO TaskMaster.ApplicationGlobals - [Startup timing] +========================== +| Duration Action | +========================== +| 0:00.00 LoadBasic | +| 0:00.00 IntelConfig | +| 0:00.00 OlObjects | +| 0:00.00 ToDo | +| 0:00.00 AutoFile | +| 0:00.00 Engines | +| 0:00.00 Events | +| 0:00.01 TOTAL | +========================== + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +{ + "$id": "1", + "CoDictionary": { + "$id": "2", + "key2": 2, + "key1": 1 + }, + "RemainingObject": { + "$id": "3", + "Config": { + "Disk": { + "FileName": "", + "RelativePath": "", + "SpecialFolderName": "Not Found" + }, + "LocalDisk": { + "FileName": "", + "RelativePath": "", + "SpecialFolderName": "Not Found" + }, + "NetDisk": { + "FileName": "", + "RelativePath": "", + "SpecialFolderName": "Not Found" + }, + "ClassifierActivated": false, + "ActiveDisk": 0 + }, + "AdditionalField1": "Test", + "AdditionalField3": "Test3", + "Globals": "default" + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +Tests whether properly handles few entries + +Interesting Word Count: 20 + +======================================= +| Source List of Probabilities | +| Class Probability | +======================================= +| .00001highprobtoken0 1.0000 | +| .00001highprobtoken1 1.0000 | +| .00001highprobtoken10 1.0000 | +| .00001highprobtoken11 1.0000 | +| .00001highprobtoken12 1.0000 | +| .00001highprobtoken13 1.0000 | +| .00001highprobtoken14 1.0000 | +| .00001highprobtoken15 1.0000 | +| .00001highprobtoken16 1.0000 | +| .00001highprobtoken17 1.0000 | +| .00001highprobtoken2 1.0000 | +| .00001highprobtoken3 1.0000 | +| .00001highprobtoken4 1.0000 | +| .00001highprobtoken5 1.0000 | +| .00001highprobtoken6 1.0000 | +| .00001highprobtoken7 1.0000 | +| .00001highprobtoken8 1.0000 | +| .00001highprobtoken9 1.0000 | +======================================= + +Expected: 1.00 +Actual: 1.00 + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + Debug Trace: +2026-08-26 11:01:06,232 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] displayName=Primary Store exchangeStoreTypeMs=0.0 filePathMs=0.0 included=true rule=Included +2026-08-26 11:01:06,232 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] displayName=Archive Store exchangeStoreTypeMs=0.0 filePathMs=0.0 included=true rule=Included +2026-08-26 11:01:06,233 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] GetFilteredStores completed: 2 stores in 1 ms +2026-08-26 11:01:06,235 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' DisplayName: 0 ms +2026-08-26 11:01:06,236 ERROR UtilitiesCS.OutlookObjects.Store.StoreWrapper - Error reading StoreID for store 'Primary Store' get_StoreID +2026-08-26 11:01:06,238 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' GetRootFolder: 0 ms +2026-08-26 11:01:06,239 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' GetDefaultFolder(Inbox): 0 ms +2026-08-26 11:01:06,240 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' CurrentUser: 0 ms +2026-08-26 11:01:06,240 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' AddressEntry: 0 ms +2026-08-26 11:01:06,240 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' GetExchangeUser: 0 ms +2026-08-26 11:01:06,241 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' PrimarySmtpAddress: 0 ms (result=<null>) +2026-08-26 11:01:06,242 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' GetSmtpAddressFromStore: 2 ms +2026-08-26 11:01:06,243 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [store-wrapper-init] store=Primary Store totalMs=6.1 threadId=20 +2026-08-26 11:01:06,243 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Archive Store' DisplayName: 0 ms +2026-08-26 11:01:06,243 ERROR UtilitiesCS.OutlookObjects.Store.StoreWrapper - Error reading StoreID for store 'Archive Store' get_StoreID +2026-08-26 11:01:06,244 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Archive Store' GetRootFolder: 0 ms +2026-08-26 11:01:06,244 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Archive Store' GetDefaultFolder(Inbox): 0 ms +2026-08-26 11:01:06,244 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Archive Store' CurrentUser: 0 ms +2026-08-26 11:01:06,245 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Archive Store' AddressEntry: 0 ms +2026-08-26 11:01:06,245 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Archive Store' GetExchangeUser: 0 ms +2026-08-26 11:01:06,245 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Archive Store' PrimarySmtpAddress: 0 ms (result=<null>) +2026-08-26 11:01:06,246 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Archive Store' GetSmtpAddressFromStore: 1 ms +2026-08-26 11:01:06,246 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [store-wrapper-init] store=Archive Store totalMs=3.1 threadId=20 + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,327 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=IntelConfig waitMs=0.0 resumeThreadId=50 resumeSyncContext=null staIsIdle=False staCpuUsage=0.757 staGuiActivity=0.0 +2026-08-26 11:01:06,329 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=IntelConfig grossMs=0.0 storeWrapperInitMs=0.0 netMs=0.0 +2026-08-26 11:01:06,329 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=OlObjects waitMs=0.0 resumeThreadId=50 resumeSyncContext=null staIsIdle=False staCpuUsage=0.706 staGuiActivity=0.0 +2026-08-26 11:01:06,330 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=OlObjects grossMs=1.7 storeWrapperInitMs=0.0 netMs=1.7 +2026-08-26 11:01:06,330 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=ToDo waitMs=0.0 resumeThreadId=50 resumeSyncContext=null staIsIdle=False staCpuUsage=0.675 staGuiActivity=0.0 +2026-08-26 11:01:06,331 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=ToDo grossMs=1.1 storeWrapperInitMs=0.0 netMs=1.1 +2026-08-26 11:01:06,331 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=AutoFile waitMs=0.0 resumeThreadId=50 resumeSyncContext=null staIsIdle=False staCpuUsage=0.634 staGuiActivity=0.0 +2026-08-26 11:01:06,332 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=AutoFile grossMs=1.6 storeWrapperInitMs=0.0 netMs=1.6 +2026-08-26 11:01:06,333 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=Engines waitMs=0.0 resumeThreadId=50 resumeSyncContext=null staIsIdle=False staCpuUsage=1.172 staGuiActivity=0.0 +2026-08-26 11:01:06,334 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Engines grossMs=1.4 storeWrapperInitMs=0.0 netMs=1.4 +2026-08-26 11:01:06,334 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Events grossMs=1.4 storeWrapperInitMs=0.0 netMs=1.4 +2026-08-26 11:01:06,335 INFO TaskMaster.ApplicationGlobals - [Startup timing] +========================== +| Duration Action | +========================== +| 0:00.00 LoadBasic | +| 0:00.00 IntelConfig | +| 0:00.00 OlObjects | +| 0:00.00 ToDo | +| 0:00.00 AutoFile | +| 0:00.00 Engines | +| 0:00.00 Events | +| 0:00.01 TOTAL | +========================== + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: + +Token count calculation + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'ToDoModel.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ToDoModel.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ToDoModel.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ToDoModel.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ToDoModel.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ToDoModel.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ToDoModel.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ToDoModel.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ToDoModel.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ToDoModel.Test.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + Debug Trace: + Store Subject + Store Subject + STORE-ID-009 Subject + + + + + + + + Debug Trace: +Expected: 32 Test of the ToJustifiedText meth +Actual: 32 Test of the ToJustifiedText meth + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Error: 0 : SvgRenderer could not parse the SVG payload: System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1. +testhost.exe Error: 0 : SvgRenderer(byte[], Size, Padding, AutoSize): System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1. + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: +Logger: Info +Message: Test Info Message +Exception: + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +Logger: Warn +Message: Test Warning Message +Exception: + + + + + + Debug Trace: +testhost.exe Error: 0 : SvgRenderer could not parse the SVG payload: System.Xml.XmlException: Root element is missing. +testhost.exe Error: 0 : SvgRenderer(byte[], Size, Padding, AutoSize): System.Xml.XmlException: Root element is missing. + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,220 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] displayName=Stalling Store exchangeStoreTypeMs=0.2 filePathMs=0.1 included=false rule=PublicFolder +2026-08-26 11:01:06,220 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] GetFilteredStores completed: 0 stores in 11 ms + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Error converting to int at line 0 in CtfIncidence.TryDequeueIncidence of the backup loader + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,307 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=IntelConfig waitMs=0.1 resumeThreadId=36 resumeSyncContext=null staIsIdle=False staCpuUsage=0.975 staGuiActivity=0.0 +2026-08-26 11:01:06,307 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=IntelConfig grossMs=0.3 storeWrapperInitMs=0.0 netMs=0.3 +2026-08-26 11:01:06,308 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=OlObjects waitMs=0.0 resumeThreadId=19 resumeSyncContext=null staIsIdle=False staCpuUsage=0.000 staGuiActivity=0.0 +2026-08-26 11:01:06,310 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=OlObjects grossMs=3.1 storeWrapperInitMs=0.0 netMs=3.1 +2026-08-26 11:01:06,311 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=ToDo waitMs=0.0 resumeThreadId=19 resumeSyncContext=null staIsIdle=False staCpuUsage=0.000 staGuiActivity=0.0 +2026-08-26 11:01:06,312 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=ToDo grossMs=2.4 storeWrapperInitMs=0.0 netMs=2.4 +2026-08-26 11:01:06,313 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=AutoFile waitMs=0.0 resumeThreadId=19 resumeSyncContext=null staIsIdle=False staCpuUsage=0.000 staGuiActivity=0.0 +2026-08-26 11:01:06,314 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=AutoFile grossMs=1.9 storeWrapperInitMs=0.0 netMs=1.9 +2026-08-26 11:01:06,315 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=Engines waitMs=0.0 resumeThreadId=19 resumeSyncContext=null staIsIdle=False staCpuUsage=0.000 staGuiActivity=0.0 +2026-08-26 11:01:06,316 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Engines grossMs=2.2 storeWrapperInitMs=0.0 netMs=2.2 +2026-08-26 11:01:06,316 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Events grossMs=1.7 storeWrapperInitMs=0.0 netMs=1.7 + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + Debug Trace: +Tests several conditions: +1) A subset of tokens are found in the probability list. +2) A subset of tokens are not found in the probability list but are found in either the shared token list or the dedicated token list, and +3) Some of the tokens found in those lists do not meet the minimum threshhold for inclusion and are excluded from the list. + When included, they should carry the minimum probability of a match to the current classifier because they are important to other classifiers +4) There is one new token, which should be excluded +5) There are two duplicated tokens which should have two entries + +SOURCE PROBABILITY TOKENS: +[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z] + +SHARED TOKENS: +[shared1,shared2,shared3,shared4,shared5,shared6,shared7,shared8] + +DEDICATED TOKENS: +[dedicated6,dedicated2,dedicated7,dedicated3,dedicated8,dedicated4,dedicated5,dedicated1] +Total Token Count: 163 + +Input Tokens: +[i, j, k, l, j, k, dedicated2, dedicated3, shared1, shared2, shared3, new1] + +Expected list should exclude: +dedicated3: does not meet minimum token count +shared3: does not meet minimum token count +new1: does not exist in any list + +=================================== +| Expected Probability List | +| Class Probability | +=================================== +| .01100dedicated26 0.0110 | +| .01100shared17 0.0110 | +| .01100shared28 0.0110 | +| .29000l3 0.7100 | +| .30000k2 0.7000 | +| .30000k5 0.7000 | +| .31000j1 0.6900 | +| .31000j4 0.6900 | +| .32000i0 0.6800 | +=================================== + +=================================== +| Actual Probability List | +| Class Probability | +=================================== +| .01100dedicated26 0.0110 | +| .01100shared17 0.0110 | +| .01100shared28 0.0110 | +| .29000l3 0.7100 | +| .30000k2 0.7000 | +| .30000k5 0.7000 | +| .31000j1 0.6900 | +| .31000j4 0.6900 | +| .32000i0 0.6800 | +=================================== + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: +============================ +| Source token probability | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared2 0.1429 | +| shared1 0.7143 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + label1 + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +2026-08-26 11:01:06,376 WARN TaskMaster.AppOlObjects - StoresWrapper config deserialized to null; rebuilding from live stores. + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +2 + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:05,750 DEBUG TaskMaster.AppEvents - [Startup timing] Hook start | startup hook | threadId=50; syncContext=null; startup-active=True | detail-segment + + + + + Debug Trace: +Error in set user property: COM error +Call Stack: at Moq.Behaviors.ThrowException.Execute(Invocation invocation) in /_/src/Moq/Behaviors/ThrowException.cs:line 22 + at Moq.MethodCall.ExecuteCore(Invocation invocation) in /_/src/Moq/MethodCall.cs:line 109 + at Moq.Setup.Execute(Invocation invocation) in /_/src/Moq/Setup.cs:line 86 + at Moq.FindAndExecuteMatchingSetup.Handle(Invocation invocation, Mock mock) in /_/src/Moq/Interception/InterceptionAspects.cs:line 96 + at Moq.Mock.Moq.IInterceptor.Intercept(Invocation invocation) in /_/src/Moq/Interception/Mock.cs:line 15 + at Moq.CastleProxyFactory.Interceptor.Intercept(IInvocation underlying) in /_/src/Moq/Interception/CastleProxyFactory.cs:line 113 + at Castle.DynamicProxy.AbstractInvocation.Proceed() + at Castle.Proxies.UserPropertiesProxy.Find(String Name, Object Custom) + at UtilitiesCS.OutlookExtensions.UserDefinedFields.SetUdf(TaskItem item, String udfName, Object value, OlUserPropertyType olUdfType) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\UtilitiesCS\OutlookObjects\Fields\UserDefinedFields.cs:line 708 + + + + + + + + + + + + + + + + + + + + Debug Trace: +Tests several conditions: +1) A subset of tokens are found in the probability list. +2) A subset of tokens are not found in the probability list but are found in either the shared token list or the dedicated token list, and +3) Some of the tokens found in those lists do not meet the minimum threshhold for inclusion and are excluded from the list. + When included, they should carry the minimum probability of a match to the current classifier because they are important to other classifiers +4) There is one new token, which should be excluded +5) There are two duplicated tokens which should have two entries +======================= +| Source token | +| probability | +| Class Probability | +======================= +| e 0.6400 | +| d 0.6300 | +| g 0.6600 | +| f 0.6500 | +| a 0.6000 | +| c 0.6200 | +| b 0.6100 | +| m 0.7200 | +| l 0.7100 | +| o 0.7400 | +| n 0.7300 | +| i 0.6800 | +| h 0.6700 | +| k 0.7000 | +| j 0.6900 | +| u 0.8000 | +| t 0.7900 | +| w 0.8200 | +| v 0.8100 | +| q 0.7600 | +| p 0.7500 | +| s 0.7800 | +| r 0.7700 | +| y 0.8400 | +| x 0.8300 | +| z 0.8500 | +======================= + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + + +Input Tokens: +[i, j, k, l, j, k, dedicated2, dedicated3, shared1, shared2, shared3, new1] + +====================== +| Input Token | +| Frequency | +| Token Count | +====================== +| i 1 | +| j 2 | +| k 2 | +| l 1 | +| dedicated2 1 | +| dedicated3 1 | +| shared1 1 | +| shared2 1 | +| shared3 1 | +| new1 1 | +====================== + +=================================== +| Expected Probability List | +| Class Probability | +=================================== +| .01100dedicated20 0.0110 | +| .01100shared10 0.0110 | +| .01100shared20 0.0110 | +| .29000l0 0.7100 | +| .30000k0 0.7000 | +| .30000k1 0.7000 | +| .31000j0 0.6900 | +| .31000j1 0.6900 | +| .32000i0 0.6800 | +| .50000new10 0.5000 | +=================================== + +=================================== +| Actual Probability List | +| Class Probability | +=================================== +| .01100dedicated20 0.0110 | +| .01100shared10 0.0110 | +| .01100shared20 0.0110 | +| .29000l0 0.7100 | +| .30000k0 0.7000 | +| .30000k1 0.7000 | +| .31000j0 0.6900 | +| .31000j1 0.6900 | +| .32000i0 0.6800 | +| .50000new10 0.5000 | +=================================== + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,355 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=IntelConfig grossMs=0.0 storeWrapperInitMs=0.0 netMs=0.0 +2026-08-26 11:01:06,356 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=OlObjects grossMs=0.4 storeWrapperInitMs=0.0 netMs=0.4 +2026-08-26 11:01:06,356 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=ToDo grossMs=0.3 storeWrapperInitMs=0.0 netMs=0.3 +2026-08-26 11:01:06,356 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=AutoFile grossMs=0.3 storeWrapperInitMs=0.0 netMs=0.3 +2026-08-26 11:01:06,356 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Engines grossMs=0.3 storeWrapperInitMs=0.0 netMs=0.3 +2026-08-26 11:01:06,356 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Events grossMs=0.3 storeWrapperInitMs=0.0 netMs=0.3 + + + + + + + Debug Trace: + +==================================== +| MATCH Token Frequency (expected | +| vs actual) | +| Token Expected Actual Diff | +==================================== +| token00 5 5 | +| token01 4 4 | +| token02 12 12 | +| token03 12 12 | +| token04 4 4 | +| token08 4 4 | +| token09 5 5 | +| token10 11 11 | +==================================== + + +==================================== +| TOTAL Token Frequency (expected | +| vs actual) | +| Token Expected Actual Diff | +==================================== +| token00 5 5 | +| token01 4 4 | +| token02 12 12 | +| token03 16 16 | +| token04 8 8 | +| token05 12 12 | +| token06 12 12 | +| token07 4 4 | +| token08 4 4 | +| token09 5 5 | +| token10 11 11 | +==================================== + + +Expected Match email count: 8 +Actual Match email count: 8 + +Expected Total token count: 17 +Actual Total token count: 17 + +==================================== +| Probabilities (expected vs | +| actual) | +| Token Expected Actual Diff | +==================================== +| token00 0.9587 0.9587 | +| token01 0.9494 0.9494 | +| token02 0.9819 0.9819 | +| token03 0.7640 0.7640 | +| token04 0.5279 0.5279 | +| token08 0.9494 0.9494 | +| token09 0.9587 0.9587 | +| token10 0.9804 0.9804 | +==================================== + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +Error converting to int at line 0 in CtfMapEntry.TryDequeueEntry of the backup loader + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + Debug Trace: +Error setting TotalWork to value 45 + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Error: 0 : SvgRenderer could not parse the SVG payload: System.InvalidTimeZoneException: sentinel parse failure + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + +Token count calculation + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + [LiveOutlook] readinessWaitMs=28; hookupLatencyMs=6; maxTickBlockMs=28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:04,937 DEBUG TaskMaster.StoreRehookCoordinator - [store-rehook] identity='Mailbox - Test' storeId='store-1' outcome=AlreadyHooked + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +============================ +| Source token probability | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared2 0.1429 | +| shared1 0.7143 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +[A | BB| CCC [ + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9 + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: +|X | + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +============================ +| Source token probability | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared2 0.1429 | +| shared1 0.7143 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + + + + + + + + + + + + + + + + + + + + Debug Trace: + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + +Token count calculation + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: +2026-08-26 11:01:05,760 ERROR TaskMaster.AppEvents - OlInboxItems_ItemAdd handler faulted; contained to prevent process termination. +System.ArgumentException: The parameter 'sectionGroupName' is invalid. + at TaskMaster.Test.AppGlobals.AppEventsTests.<>c__DisplayClass8_0.<HandleInboxItemAddAsync_WhenCollaboratorThrows_LogsExceptionAndDoesNotRethrow>b__0(Object _) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster.Test\AppGlobals\AppEventsTests.cs:line 273 + at TaskMaster.AppEvents.<HandleInboxItemAddAsync>d__38.MoveNext() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\AppEvents.ReadinessHookup.cs:line 101 + + + + + + + Debug Trace: +SubjectEncoded set to null +SubjectEncoded set to null + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +SubjectEncoded set to null + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'ObjectListView.resources': System.IO.FileNotFoundException: Could not load file or assembly 'ObjectListView.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +Integration test of GetMatchProbability method which +calls GetProbabilityList and CombineProbabilities + +SOURCE PROBABILITY TOKENS: +[dedicated7,dedicated8,shared2,shared1,shared7,shared8] + +SHARED TOKENS: +[shared1,shared2,shared3,shared4,shared5,shared6,shared7,shared8] + +DEDICATED TOKENS: +[dedicated6,dedicated2,dedicated7,dedicated3,dedicated8,dedicated4,dedicated5,dedicated1] +============================ +| Source probabilities | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared1 0.7143 | +| shared2 0.1429 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +=================================== +| Probability List | +| Class Probability | +=================================== +| .00010dedicated82 0.9999 | +| .01100shared43 0.0110 | +| .01100shared44 0.0110 | +| .14286shared25 0.1429 | +| .28571shared10 0.7143 | +| .28571shared11 0.7143 | +| .33333shared76 0.3333 | +=================================== + +Expected: 0.39182 +Actual: 0.39182 + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +Fail: Have non-null object that isnt a color wrapper stored in a color entry! +Did someone SetObject instead of SetColor? +Fail: Have non-null object that isnt a padding wrapper stored in a padding entry! +Did someone SetObject instead of SetPadding? +Fail: Have non-null object that isnt a Rectangle wrapper stored in a Rectangle entry! +Did someone SetObject instead of SetRectangle? +Fail: Have non-null object that isnt a padding wrapper stored in a padding entry! +Did someone SetObject instead of SetPadding? + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + +EXPECTED: +[ +{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[Microsoft.Office.Interop.Outlook.MailItem, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"Microsoft.Office.Interop.Outlook.MailItem, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"} +{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.IApplicationGlobals, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"UtilitiesCS.IApplicationGlobals, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"} +"EntryID" +{"Name":"SenderName","Address":"sendername@domain.com","Html":"SenderName &lt;<a href=\"mailto:sendername@domain.com\">sendername@domain.com</a>&gt;"} +"SenderName &lt;<a href=\"mailto:sendername@domain.com\">sendername@domain.com</a>&gt;" +"SenderName" +"Task" +"Body <EOM>" +"ConversationID" +"EmailPrefixToStrip" +"StoreID" +"FolderName" +{"Selected":false,"ItemCount":1,"FolderSize":0,"Name":"FolderName","RelativePath":"EmailRootPath//FolderName"} +"HTMLBody" +"HTMLBody" +false +[{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[Microsoft.Office.Interop.Outlook.Recipient, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"Microsoft.Office.Interop.Outlook.Recipient, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"},{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[Microsoft.Office.Interop.Outlook.Recipient, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"Microsoft.Office.Interop.Outlook.Recipient, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"}] +[{"Name":"Recipient2","Address":"recipient2@domain.com","Html":"Recipient2 &lt;<a href=\"mailto:recipient2@domain.com\">recipient2@domain.com</a>&gt;"}] +[{"Name":"Recipient1","Address":"recipient1@domain.com","Html":"Recipient1 &lt;<a href=\"mailto:recipient1@domain.com\">recipient1@domain.com</a>&gt;"}] +"Recipient1" +"Recipient1 &lt;<a href=\"mailto:recipient1@domain.com\">recipient1@domain.com</a>&gt;" +"2024-01-01T00:00:00" +"1/1/2024 12:00 AM" +"Subject" +["charset:utf-8","filename:fname:FileName","subject:Subject","from:name:sendername","from:addr:sendername","from:addr:domain.com","to:name:recipient1","to:addr:recipient1","to:addr:domain.com","cc:name:recipient2","cc:addr:recipient2","cc:addr:domain.com","to:2**0","to:2**0","body","<eom>"] +"Triage" +true +[{"AttachmentInfo":{"FileExtension":"","FilenameSeed":"20240101_FileName","IsImage":false,"AttachmentData":null,"BlockLevel":0,"Class":0,"ContentId":null,"DisplayName":null,"FileName":"FileName","Index":0,"PathName":"PathName//FileName","Position":0,"Size":65001,"Type":1},"Attachment":{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[Microsoft.Office.Interop.Outlook.Attachment, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"Microsoft.Office.Interop.Outlook.Attachment, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"},"DatePrefix":false,"ErrorMessages":[],"FilePathSave":"FolderName\\20240101_FileName","FilePathSaveAlt":"FolderName\\20240101_FileName_20260826110120","FilePathDelete":null,"FolderPathSave":"FolderName","FolderPathDelete":null}] +[{"FileExtension":"","FilenameSeed":"20240101_FileName","IsImage":false,"AttachmentData":null,"BlockLevel":0,"Class":0,"ContentId":null,"DisplayName":null,"FileName":"FileName","Index":0,"PathName":"PathName//FileName","Position":0,"Size":65001,"Type":1}] +65001 +] + +ACTUAL: +[ +{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[Microsoft.Office.Interop.Outlook.MailItem, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"Microsoft.Office.Interop.Outlook.MailItem, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"} +{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[UtilitiesCS.IApplicationGlobals, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"UtilitiesCS.IApplicationGlobals, UtilitiesCS, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"} +"EntryID" +{"Name":"SenderName","Address":"sendername@domain.com","Html":"SenderName &lt;<a href=\"mailto:sendername@domain.com\">sendername@domain.com</a>&gt;"} +"SenderName &lt;<a href=\"mailto:sendername@domain.com\">sendername@domain.com</a>&gt;" +"SenderName" +"Task" +"Body <EOM>" +"ConversationID" +"EmailPrefixToStrip" +"StoreID" +"FolderName" +{"Selected":false,"ItemCount":1,"FolderSize":0,"Name":"FolderName","RelativePath":"EmailRootPath//FolderName"} +"HTMLBody" +"HTMLBody" +false +[{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[Microsoft.Office.Interop.Outlook.Recipient, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"Microsoft.Office.Interop.Outlook.Recipient, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"},{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[Microsoft.Office.Interop.Outlook.Recipient, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"Microsoft.Office.Interop.Outlook.Recipient, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"}] +[{"Name":"Recipient2","Address":"recipient2@domain.com","Html":"Recipient2 &lt;<a href=\"mailto:recipient2@domain.com\">recipient2@domain.com</a>&gt;"}] +[{"Name":"Recipient1","Address":"recipient1@domain.com","Html":"Recipient1 &lt;<a href=\"mailto:recipient1@domain.com\">recipient1@domain.com</a>&gt;"}] +"Recipient1" +"Recipient1 &lt;<a href=\"mailto:recipient1@domain.com\">recipient1@domain.com</a>&gt;" +"2024-01-01T00:00:00" +"1/1/2024 12:00 AM" +"Subject" +["charset:utf-8","filename:fname:FileName","subject:Subject","from:name:sendername","from:addr:sendername","from:addr:domain.com","to:name:recipient1","to:addr:recipient1","to:addr:domain.com","cc:name:recipient2","cc:addr:recipient2","cc:addr:domain.com","to:2**0","to:2**0","body","<eom>"] +"Triage" +true +[{"AttachmentInfo":{"FileExtension":"","FilenameSeed":"20240101_FileName","IsImage":false,"AttachmentData":null,"BlockLevel":0,"Class":0,"ContentId":null,"DisplayName":null,"FileName":"FileName","Index":0,"PathName":"PathName//FileName","Position":0,"Size":65001,"Type":1},"Attachment":{"__interceptors":[{}],"__target":null,"__interfaces":["Moq.IMocked, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.IMocked`1[[Microsoft.Office.Interop.Outlook.Attachment, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c]], Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","Moq.Internals.IProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"],"__baseType":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920","__proxyGenerationOptions":{"hook":{},"selector":null,"mixins":null,"baseTypeForInterfaceProxy.AssemblyQualifiedName":"Moq.Internals.InterfaceProxy, Moq, Version=4.20.72.0, Culture=neutral, PublicKeyToken=69f491c39445e920"},"__proxyTypeId":"interface.without.target","__targetFieldType":"System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089","__theInterface":"Microsoft.Office.Interop.Outlook.Attachment, Microsoft.Office.Interop.Outlook, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"},"DatePrefix":false,"ErrorMessages":[],"FilePathSave":"FolderName\\20240101_FileName","FilePathSaveAlt":"FolderName\\20240101_FileName_20260826110120","FilePathDelete":null,"FolderPathSave":"FolderName","FolderPathDelete":null}] +[{"FileExtension":"","FilenameSeed":"20240101_FileName","IsImage":false,"AttachmentData":null,"BlockLevel":0,"Class":0,"ContentId":null,"DisplayName":null,"FileName":"FileName","Index":0,"PathName":"PathName//FileName","Position":0,"Size":65001,"Type":1}] +65001 +] + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + Debug Trace: +Error converting to int at line 0 in CtfMapEntry.TryDequeueEntry of the backup loader + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +Tests whether the cutoff for Knobs.InterestingWordCount is working + +Interesting Word Count: 20 + +======================================= +| Source List of Probabilities | +| Class Probability | +======================================= +| .00001highprobtoken0 1.0000 | +| .00001highprobtoken1 1.0000 | +| .00001highprobtoken10 1.0000 | +| .00001highprobtoken11 1.0000 | +| .00001highprobtoken12 1.0000 | +| .00001highprobtoken13 1.0000 | +| .00001highprobtoken14 1.0000 | +| .00001highprobtoken15 1.0000 | +| .00001highprobtoken16 1.0000 | +| .00001highprobtoken17 1.0000 | +| .00001highprobtoken18 1.0000 | +| .00001highprobtoken19 1.0000 | +| .00001highprobtoken2 1.0000 | +| .00001highprobtoken3 1.0000 | +| .00001highprobtoken4 1.0000 | +| .00001highprobtoken5 1.0000 | +| .00001highprobtoken6 1.0000 | +| .00001highprobtoken7 1.0000 | +| .00001highprobtoken8 1.0000 | +| .00001highprobtoken9 1.0000 | +| .40000averagetoken0 0.5000 | +| .40000averagetoken1 0.5000 | +| .40000averagetoken2 0.5000 | +| .40000averagetoken3 0.5000 | +| .40000averagetoken4 0.5000 | +======================================= + +Expected: 1.00 since all entries at 0.50 probability are cut off +Actual: 1.00 + + + + + + + + + + + + + Debug Trace: + +Token count calculation + +Token count calculation +=============================== +| Probability List | +| Class Probability | +=============================== +| .01100shared0 0.0110 | +| .01100shared1 0.0110 | +=============================== + +=============================== +| Probability List | +| Class Probability | +=============================== +| .00020shared0 0.9998 | +| .00020shared1 0.9998 | +=============================== + + + + + + + + + + Debug Trace: +2026-08-26 11:01:05,183 WARN TaskMaster.AppAutoFileObjects - AppData special folder not resolved; LCPPN predictor not loaded. Folder seam falls back to the flat classifier. + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +Argument value=123 is of type System.Int32 which is not assignable to olText which is of type System.String.Stack Trace: UtilitiesCS.dll.ValidPropertyArgs -> UserDefinedFieldsTests.ValidPropertyArgs_rejects_missing_required_inputs + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +[Triage] = 'A' + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,228 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] displayName=Stalling Store exchangeStoreTypeMs=0.0 filePathMs=0.0 included=false rule=PublicFolder +2026-08-26 11:01:06,229 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [Startup timing] GetFilteredStores completed: 0 stores in 0 ms +2026-08-26 11:01:06,229 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [Startup timing] RewireOlObjectsAsync total: 1 ms + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ +testhost.exe Error: 0 : SvgRenderer could not parse the SVG payload: System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1. +testhost.exe Error: 0 : SvgRenderer(byte[], Size, AutoSize): System.Xml.XmlException: Data at the root level is invalid. Line 1, position 1. + + + + + Debug Trace: +Target: Type: Microsoft.Office.Interop.Outlook.MailItem, Subject: TestSubjectString, Date: 12-25-2025 12:05 PM +Test: Type: Microsoft.Office.Interop.Outlook.MailItem, Subject: TestSubjectString, Date: 12-25-2025 12:05 PM + + + + + + Debug Trace: +Error dequeuing at line 0 in CtfIncidence.TryDequeueIncidence of the backup loader + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: +2026-08-26 11:01:05,154 WARN TaskMaster.AppAutoFileObjects - LCPPN predictor file 'LcppnFolder.json' not found or empty; Folder seam falls back to the flat classifier. + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Error: 0 : SvgRenderer could not parse the SVG payload: System.Xml.XmlException: Root element is missing. +testhost.exe Error: 0 : SvgRenderer(byte[], Size, AutoSize): System.Xml.XmlException: Root element is missing. + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +SubjectEncoded set to null +SubjectEncoded set to null + + + + + + Debug Trace: +{ + "$id": "1", + "CoDictionary": { + "$id": "2", + "key2": 2, + "key1": 1 + }, + "RemainingObject": { + "$id": "3", + "Config": { + "Disk": { + "FileName": "", + "RelativePath": "", + "SpecialFolderName": "Not Found" + }, + "LocalDisk": { + "FileName": "", + "RelativePath": "", + "SpecialFolderName": "Not Found" + }, + "NetDisk": { + "FileName": "", + "RelativePath": "", + "SpecialFolderName": "Not Found" + }, + "ClassifierActivated": false, + "ActiveDisk": 0 + }, + "AdditionalField1": "Test", + "AdditionalField3": "Test3", + "Globals": "default" + } +} + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +Argument value=not-a-number is of type System.String which is not assignable to olNumber which is of type System.Double.Stack Trace: UtilitiesCS.dll.ValidPropertyArgs -> UtilitiesCS.dll.SetUdf -> UserDefinedFieldsTests.SetUdf_MeetingItem_WhenArgsAreInvalid_ShouldReturnFalse + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,380 ERROR TaskMaster.AppOlObjects - Failed to load StoresWrapper; store settings will remain unavailable until this is resolved. Operation is not valid due to the current state of the object. +System.InvalidOperationException: Operation is not valid due to the current state of the object. + at Moq.Behaviors.ThrowException.Execute(Invocation invocation) in /_/src/Moq/Behaviors/ThrowException.cs:line 22 + at Moq.MethodCall.ExecuteCore(Invocation invocation) in /_/src/Moq/MethodCall.cs:line 109 + at Moq.Setup.Execute(Invocation invocation) in /_/src/Moq/Setup.cs:line 86 + at Moq.FindAndExecuteMatchingSetup.Handle(Invocation invocation, Mock mock) in /_/src/Moq/Interception/InterceptionAspects.cs:line 96 + at Moq.Mock.Moq.IInterceptor.Intercept(Invocation invocation) in /_/src/Moq/Interception/Mock.cs:line 15 + at Moq.CastleProxyFactory.Interceptor.Intercept(IInvocation underlying) in /_/src/Moq/Interception/CastleProxyFactory.cs:line 113 + at Castle.DynamicProxy.AbstractInvocation.Proceed() + at Castle.Proxies.ISmartSerializableNonTypedProxy.Deserialize[T,U](SmartSerializable`1 config) + at TaskMaster.AppOlObjects.<LoadStoresAsync>d__117.MoveNext() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\AppOlObjects.StoreLoading.cs:line 41 + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +Tests whether properly handles few entries + +Interesting Word Count: 20 + +======================================= +| Source List of Probabilities | +| Class Probability | +======================================= +| .00001highprobtoken0 1.0000 | +| .00001highprobtoken1 1.0000 | +| .00001highprobtoken10 1.0000 | +| .00001highprobtoken11 1.0000 | +| .00001highprobtoken12 1.0000 | +| .00001highprobtoken13 1.0000 | +| .00001highprobtoken14 1.0000 | +| .00001highprobtoken15 1.0000 | +| .00001highprobtoken16 1.0000 | +| .00001highprobtoken17 1.0000 | +| .00001highprobtoken2 1.0000 | +| .00001highprobtoken3 1.0000 | +| .00001highprobtoken4 1.0000 | +| .00001highprobtoken5 1.0000 | +| .00001highprobtoken6 1.0000 | +| .00001highprobtoken7 1.0000 | +| .00001highprobtoken8 1.0000 | +| .00001highprobtoken9 1.0000 | +======================================= + +Expected: 1.00 +Actual: 1.00 + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,351 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=IntelConfig grossMs=0.1 storeWrapperInitMs=0.0 netMs=0.1 +2026-08-26 11:01:06,352 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=OlObjects grossMs=0.5 storeWrapperInitMs=0.0 netMs=0.5 +2026-08-26 11:01:06,352 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=ToDo grossMs=0.3 storeWrapperInitMs=0.0 netMs=0.3 +2026-08-26 11:01:06,352 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=AutoFile grossMs=0.3 storeWrapperInitMs=0.0 netMs=0.3 +2026-08-26 11:01:06,353 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Engines grossMs=0.4 storeWrapperInitMs=0.0 netMs=0.4 +2026-08-26 11:01:06,353 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Events grossMs=0.6 storeWrapperInitMs=0.0 netMs=0.6 + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +[Triage] = 'A' + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +Expected: 80 T e s t o f t h e T o J u s t i f i e d T e x t m e t h o d . +Actual: 80 T e s t o f t h e T o J u s t i f i e d T e x t m e t h o d . + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: +2026-08-26 11:01:04,994 ERROR TaskMaster.AppAutoFileObjects - File not found C:\TaskMaster\missing-common-words.csv + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +Logger: Debug +Message: Test Verbose Message +Exception: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + +==================================== +| MATCH Token Frequency (expected | +| vs actual) | +| Token Expected Actual Diff | +==================================== +| token00 5 5 | +| token01 4 4 | +| token02 12 12 | +| token03 12 12 | +| token04 4 4 | +| token08 4 4 | +| token09 5 5 | +| token10 11 11 | +==================================== + + +==================================== +| TOTAL Token Frequency (expected | +| vs actual) | +| Token Expected Actual Diff | +==================================== +| token00 5 5 | +| token01 4 4 | +| token02 12 12 | +| token03 16 16 | +| token04 8 8 | +| token05 12 12 | +| token06 12 12 | +| token07 4 4 | +| token08 4 4 | +| token09 5 5 | +| token10 11 11 | +==================================== + + +Expected Match email count: 8 +Actual Match email count: 8 + +Expected Total token count: 17 +Actual Total token count: 17 + +==================================== +| Probabilities (expected vs | +| actual) | +| Token Expected Actual Diff | +==================================== +| token00 0.9587 0.9587 | +| token01 0.9494 0.9494 | +| token02 0.9819 0.9819 | +| token03 0.7640 0.7640 | +| token04 0.5279 0.5279 | +| token08 0.9494 0.9494 | +| token09 0.9587 0.9587 | +| token10 0.9804 0.9804 | +==================================== + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +writer + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:05,168 ERROR TaskMaster.AppAutoFileObjects - Failed to load LCPPN predictor file 'LcppnFolder.json'. Folder seam falls back to the flat classifier. +System.IO.IOException: simulated unreadable file + at TaskMaster.Test.AppGlobals.AppAutoFileObjectsFolderPredictorTests.<>c.<LoadFolderPredictorAsync_SettingOnButReadThrows_FailsSoftToNull>b__6_0(LcppnFolderPredictor _) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster.Test\AppGlobals\AppAutoFileObjectsFolderPredictorTests.cs:line 98 + at TaskMaster.AppAutoFileObjects.<LoadFolderPredictorAsync>d__105.MoveNext() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster\AppGlobals\AppAutoFileObjects.FolderPredictorLoad.cs:line 77 + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.Test.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.Test.resources' or one of its dependencies. The system cannot find the file specified. + +Expected: +( 10z Week 38 Rollback CID.xlsx, https://sabradipping.sharepoint.com/:x:/s/Sales-LargeFormatTeam2/EVpXvJ8dfZ9DmaoSjGJ16uIBuc7kN7LG9esDj9pciuoriA) +( Snackers Week 37 Rollback CID.xlsx, https://sabradipping.sharepoint.com/:x:/s/Sales-LargeFormatTeam2/EZckiLtanGtMjumaLHLwsCsBwQsHSfAuMpzsMyfcIPUTdg?email=dmoisan%40sabra.com&e=YRrQJk) +(trindels@sabra.com, mailto:chollingsworth@sabra.com) + +Actual: +( 10z Week 38 Rollback CID.xlsx, https://sabradipping.sharepoint.com/:x:/s/Sales-LargeFormatTeam2/EVpXvJ8dfZ9DmaoSjGJ16uIBuc7kN7LG9esDj9pciuoriA) +( Snackers Week 37 Rollback CID.xlsx, https://sabradipping.sharepoint.com/:x:/s/Sales-LargeFormatTeam2/EZckiLtanGtMjumaLHLwsCsBwQsHSfAuMpzsMyfcIPUTdg?email=dmoisan%40sabra.com&e=YRrQJk) +(trindels@sabra.com, mailto:chollingsworth@sabra.com) + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +2026-08-26 11:01:05,105 DEBUG TaskMaster.AppEvents - Skipping item of type olMailItem with Subject: + + + + + + + + + + + + + + + + + + + Debug Trace: +JSON Object +{ + "$id": "1", + "Name": "Test", + "Age": 47, + "AppGlobals": "default" +} + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Original Tree +\-a + |-b + | |-d + | |-e + | \-f + \-c + \-g + +Expected Results +b,d,e,f,c,g + +Results +b,d,e,f,c,g + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +Error in set user property: Member 'Object.UserProperties' not found. +Call Stack: at UtilitiesCS.OutlookItem.GetPropertyValue[T](String propertyName) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\UtilitiesCS\OutlookObjects\Item\OutlookItem.cs:line 394 + at UtilitiesCS.OutlookItem.get_UserProperties() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\UtilitiesCS\OutlookObjects\Item\OutlookItem.cs:line 270 + at UtilitiesCS.OutlookExtensions.UserDefinedFields.TrySetUdf(IOutlookItem item, String udfName, Object value, OlUserPropertyType olUdfType) in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\UtilitiesCS\OutlookObjects\Fields\UserDefinedFields.cs:line 254 + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + Debug Trace: +Match tokens: [token00,token01,token02,token03,token04,token02,token03,token02,token03,token00,token01,token02,token03,token04,token02,token03,token02,token03,token00,token01,token02,token03,token04,token02,token03,token02,token03,token00,token01,token02,token03,token04,token02,token03,token02,token03] +Not Match tokens: [token03,token04,token05,token06,token07,token05,token06,token05,token06,token03,token04,token05,token06,token07,token05,token06,token05,token06,token03,token04,token05,token06,token07,token05,token06,token05,token06,token03,token04,token05,token06,token07,token05,token06,token05,token06] + +Token count calculation +=================== +| Expected Match | +| token frequency | +| Token Count | +=================== +| token00 4 | +| token01 4 | +| token02 12 | +| token03 12 | +| token04 4 | +=================== + +Expected Match token count: 28 + +=================== +| Actual Match | +| token frequency | +| Token Count | +=================== +| token00 4 | +| token01 4 | +| token02 12 | +| token03 12 | +| token04 4 | +=================== + +Actual Match token count: 28 + +=================== +| Expected Not | +| Match token | +| frequency | +| Token Count | +=================== +| token03 4 | +| token04 4 | +| token05 12 | +| token06 12 | +| token07 4 | +=================== + +Expected Not Match token count: 36 + +=================== +| Actual Not | +| Match token | +| frequency | +| Token Count | +=================== +| token03 4 | +| token04 4 | +| token05 12 | +| token06 12 | +| token07 4 | +=================== + +Actual Not Match token count: 36 + +========================= +| Expected Probabilities| +| Class Probability | +========================= +| token02 0.9999 | +| token03 0.6585 | +| token04 0.3913 | +| token05 0.0110 | +| token06 0.0110 | +| token07 0.0110 | +========================= + +========================= +| Actual Probabilities | +| Class Probability | +========================= +| token04 0.3913 | +| token05 0.0110 | +| token06 0.0110 | +| token07 0.0110 | +| token02 0.9999 | +| token03 0.6585 | +========================= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:04,955 DEBUG UtilitiesCS.Threading.ApplicationIdleTimer - ApplicationIdle is subscribing to Idle event. +TRACE ApplicationIdleTimer..ctor -> StartTimer() +2026-08-26 11:01:04,977 DEBUG UtilitiesCS.Threading.IdleAsyncQueue - IdleAsyncQueue.AddEntry subscribed to ApplicationIdleTimer +2026-08-26 11:01:05,114 ERROR UtilitiesCS.ReusableTypeClasses.SmartSerializableLoader - Error in DeserializeAsync. globals cannot be null +Value cannot be null. +Parameter name: globals +System.ArgumentNullException: Value cannot be null. +Parameter name: globals + at UtilitiesCS.ReusableTypeClasses.SmartSerializableLoader.<DeserializeAsync>d__17.MoveNext() in REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\UtilitiesCS\ReusableTypeClasses\NewSmartSerializable\SmartSerializableLoader.cs:line 102 + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + +Token count calculation + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: +Size is {Width=640, Height=363} + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: +Error converting to int at line 0 in CtfMapEntry.TryDequeueEntry of the backup loader + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +2026-08-26 11:01:06,283 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] displayName=Primary Store exchangeStoreTypeMs=0.0 filePathMs=0.0 included=true rule=Included +2026-08-26 11:01:06,284 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [store-filter] displayName=Archive Store exchangeStoreTypeMs=0.0 filePathMs=0.0 included=true rule=Included +2026-08-26 11:01:06,284 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [Startup timing] GetFilteredStores completed: 2 stores in 1 ms +2026-08-26 11:01:06,284 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' DisplayName: 0 ms +2026-08-26 11:01:06,285 ERROR UtilitiesCS.OutlookObjects.Store.StoreWrapper - Error reading StoreID for store 'Primary Store' get_StoreID +2026-08-26 11:01:06,285 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' GetRootFolder: 0 ms +2026-08-26 11:01:06,286 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' GetDefaultFolder(Inbox): 0 ms +2026-08-26 11:01:06,286 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' CurrentUser: 0 ms +2026-08-26 11:01:06,286 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' AddressEntry: 0 ms +2026-08-26 11:01:06,286 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' GetExchangeUser: 0 ms +2026-08-26 11:01:06,287 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Primary Store' PrimarySmtpAddress: 0 ms (result=<null>) +2026-08-26 11:01:06,288 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Primary Store' GetSmtpAddressFromStore: 1 ms +2026-08-26 11:01:06,288 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [store-wrapper-init] store=Primary Store totalMs=3.0 threadId=20 +2026-08-26 11:01:06,288 WARN UtilitiesCS.OutlookObjects.Folder.FolderMinimalWrapper - olRoot is null or RelativePath is empty. Unable to load folder from relative path. +2026-08-26 11:01:06,289 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Restore 'Primary Store' ArchiveRoot.RestoreFromRelativePath: 0 ms +2026-08-26 11:01:06,289 WARN UtilitiesCS.OutlookObjects.Folder.FolderMinimalWrapper - olRoot is null or RelativePath is empty. Unable to load folder from relative path. +2026-08-26 11:01:06,289 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Restore 'Primary Store' JunkPotential.RestoreFromRelativePath: 0 ms +2026-08-26 11:01:06,290 WARN UtilitiesCS.OutlookObjects.Folder.FolderMinimalWrapper - olRoot is null or RelativePath is empty. Unable to load folder from relative path. +2026-08-26 11:01:06,290 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Restore 'Primary Store' JunkCertain.RestoreFromRelativePath: 0 ms +2026-08-26 11:01:06,291 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [Startup timing] Store 'Primary Store' iteration completed in 6 ms (operation=Restore) +2026-08-26 11:01:06,292 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Archive Store' DisplayName: 0 ms +2026-08-26 11:01:06,293 ERROR UtilitiesCS.OutlookObjects.Store.StoreWrapper - Error reading StoreID for store 'Archive Store' get_StoreID +2026-08-26 11:01:06,294 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Archive Store' GetRootFolder: 0 ms +2026-08-26 11:01:06,294 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Archive Store' GetDefaultFolder(Inbox): 0 ms +2026-08-26 11:01:06,295 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Archive Store' CurrentUser: 0 ms +2026-08-26 11:01:06,295 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Archive Store' AddressEntry: 0 ms +2026-08-26 11:01:06,295 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Archive Store' GetExchangeUser: 0 ms +2026-08-26 11:01:06,296 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] GetSmtpAddressFromStore 'Archive Store' PrimarySmtpAddress: 0 ms (result=<null>) +2026-08-26 11:01:06,296 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Init 'Archive Store' GetSmtpAddressFromStore: 1 ms +2026-08-26 11:01:06,296 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [store-wrapper-init] store=Archive Store totalMs=3.8 threadId=20 +2026-08-26 11:01:06,296 WARN UtilitiesCS.OutlookObjects.Folder.FolderMinimalWrapper - olRoot is null or RelativePath is empty. Unable to load folder from relative path. +2026-08-26 11:01:06,296 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Restore 'Archive Store' ArchiveRoot.RestoreFromRelativePath: 0 ms +2026-08-26 11:01:06,298 WARN UtilitiesCS.OutlookObjects.Folder.FolderMinimalWrapper - olRoot is null or RelativePath is empty. Unable to load folder from relative path. +2026-08-26 11:01:06,298 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Restore 'Archive Store' JunkPotential.RestoreFromRelativePath: 0 ms +2026-08-26 11:01:06,298 WARN UtilitiesCS.OutlookObjects.Folder.FolderMinimalWrapper - olRoot is null or RelativePath is empty. Unable to load folder from relative path. +2026-08-26 11:01:06,299 DEBUG UtilitiesCS.OutlookObjects.Store.StoreWrapper - [Startup timing] Restore 'Archive Store' JunkCertain.RestoreFromRelativePath: 0 ms +2026-08-26 11:01:06,299 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [Startup timing] Store 'Archive Store' iteration completed in 6 ms (operation=Restore) +2026-08-26 11:01:06,299 DEBUG UtilitiesCS.OutlookObjects.Store.StoresWrapper - [Startup timing] RewireOlObjectsAsync total: 16 ms + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + Debug Trace: +============================ +| Source token probability | +| Class Probability | +============================ +| dedicated7 0.9998 | +| dedicated8 0.9999 | +| shared2 0.1429 | +| shared1 0.7143 | +| shared7 0.3333 | +| shared8 0.3333 | +============================ + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +Logger: Error +Message: Test Error Message +Exception: System.Exception: Test Exception + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + Debug Trace: +Tests whether properly handles no entries + +======================= +| Source List of | +| Probabilities | +| Class Probability | +======================= +| Object is empty | +======================= + +Expected: 0.00 +Actual: 0.00 + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +2026-08-26 11:01:05,202 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=IntelConfig waitMs=0.2 resumeThreadId=10 resumeSyncContext=null staIsIdle=False staCpuUsage=208.173 staGuiActivity=0.0 +2026-08-26 11:01:05,203 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=IntelConfig grossMs=0.7 storeWrapperInitMs=0.0 netMs=0.7 +2026-08-26 11:01:05,205 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=OlObjects waitMs=0.0 resumeThreadId=41 resumeSyncContext=null staIsIdle=False staCpuUsage=198.676 staGuiActivity=0.0 +2026-08-26 11:01:05,205 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=OlObjects grossMs=19.8 storeWrapperInitMs=0.0 netMs=19.8 +2026-08-26 11:01:05,206 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=ToDo waitMs=0.0 resumeThreadId=41 resumeSyncContext=null staIsIdle=False staCpuUsage=0.000 staGuiActivity=0.0 +2026-08-26 11:01:05,206 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=ToDo grossMs=1.4 storeWrapperInitMs=0.0 netMs=1.4 +2026-08-26 11:01:05,207 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=AutoFile waitMs=0.0 resumeThreadId=41 resumeSyncContext=null staIsIdle=False staCpuUsage=12.446 staGuiActivity=0.0 +2026-08-26 11:01:05,208 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=AutoFile grossMs=1.7 storeWrapperInitMs=0.0 netMs=1.7 +2026-08-26 11:01:05,209 DEBUG TaskMaster.ApplicationGlobals - [continuation-resume] priorPhase=Engines waitMs=0.0 resumeThreadId=8 resumeSyncContext=null staIsIdle=False staCpuUsage=6.908 staGuiActivity=0.0 +2026-08-26 11:01:05,209 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Engines grossMs=1.6 storeWrapperInitMs=0.0 netMs=1.6 +2026-08-26 11:01:05,209 DEBUG TaskMaster.ApplicationGlobals - [phase-net] phase=Events grossMs=1.3 storeWrapperInitMs=0.0 netMs=1.3 + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Error: 0 : SvgRenderer could not parse the SVG payload: the payload contained no SVG elements. + + + + + + + Debug Trace: +Error converting to int at line 0 in CtfIncidence.TryDequeueIncidence of the backup loader + + + + + + + + + + Debug Trace: +{ + "$id": "1", + "CoDictionary": { + "$id": "2", + "key2": 2, + "key1": 1 + }, + "RemainingObject": { + "$id": "3", + "Config": { + "Disk": { + "FileName": "", + "RelativePath": "", + "SpecialFolderName": "Not Found" + }, + "LocalDisk": { + "FileName": "", + "RelativePath": "", + "SpecialFolderName": "Not Found" + }, + "NetDisk": { + "FileName": "", + "RelativePath": "", + "SpecialFolderName": "Not Found" + }, + "ClassifierActivated": false, + "ActiveDisk": 0 + }, + "AdditionalField3": "Test3" + } +} + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +Argument value=not-a-bool is of type System.String which is not assignable to olYesNo which is of type System.Boolean.Stack Trace: UtilitiesCS.dll.ValidPropertyArgs -> UserDefinedFieldsTests.ValidPropertyArgs_WhenWrongTypeForField_ShouldReturnFalse + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'SVGControl.resources': System.IO.FileNotFoundException: Could not load file or assembly 'SVGControl.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: +Tests all new tokens +======================= +| Source token | +| probability | +| Class Probability | +======================= +| e 0.6400 | +| d 0.6300 | +| g 0.6600 | +| f 0.6500 | +| a 0.6000 | +| c 0.6200 | +| b 0.6100 | +| m 0.7200 | +| l 0.7100 | +| o 0.7400 | +| n 0.7300 | +| i 0.6800 | +| h 0.6700 | +| k 0.7000 | +| j 0.6900 | +| u 0.8000 | +| t 0.7900 | +| w 0.8200 | +| v 0.8100 | +| q 0.7600 | +| p 0.7500 | +| s 0.7800 | +| r 0.7700 | +| y 0.8400 | +| x 0.8300 | +| z 0.8500 | +======================= + +====================== +| Shared tokens | +| Token Count | +====================== +| dedicated2 4 | +| dedicated7 8 | +| dedicated8 20 | +| dedicated5 4 | +| shared2 4 | +| shared3 2 | +| shared1 6 | +| shared6 1 | +| shared7 50 | +| shared4 6 | +| shared5 4 | +| shared8 40 | +| dedicated6 1 | +| dedicated3 1 | +| dedicated4 6 | +| dedicated1 6 | +====================== + +============================= +| Expected Output | +| Class Probability | +============================= +| .50000new10 0.5000 | +| .50000new20 0.5000 | +| .50000new30 0.5000 | +============================= + +============================= +| Actual Output | +| Class Probability | +============================= +| .50000new10 0.5000 | +| .50000new20 0.5000 | +| .50000new30 0.5000 | +============================= + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) +Test Parallelization enabled for REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\SVGControl.Test\bin\Debug\SVGControl.Test.dll (Workers: 24, Scope: ClassLevel) +Test Parallelization enabled for REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\Tags.Test\bin\Debug\Tags.Test.dll (Workers: 24, Scope: ClassLevel) +Test Parallelization enabled for REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskMaster.Test\bin\Debug\TaskMaster.Test.dll (Workers: 24, Scope: ClassLevel) +Test Parallelization enabled for REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskTree.Test\bin\Debug\TaskTree.Test.dll (Workers: 24, Scope: ClassLevel) +Test Parallelization enabled for REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\TaskVisualization.Test\bin\Debug\TaskVisualization.Test.dll (Workers: 24, Scope: ClassLevel) +Test Parallelization enabled for REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\ToDoModel.Test\bin\Debug\ToDoModel.Test.dll (Workers: 24, Scope: ClassLevel) +Test Parallelization enabled for REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\UtilitiesCS.Test\bin\Debug\UtilitiesCS.Test.dll (Workers: 24, Scope: ClassLevel) +Test Parallelization enabled for REDACTED-REPO-ROOT\.claude\worktrees\agent-ab67db189e5df1287\VBFunctions.Test\bin\Debug\VBFunctions.Test.dll (Workers: 24, Scope: ClassLevel) + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t6-coverage-run.2026-08-26T11-07.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t6-coverage-run.2026-08-26T11-07.md new file mode 100644 index 000000000..580065df6 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t6-coverage-run.2026-08-26T11-07.md @@ -0,0 +1,92 @@ +# [P5-T6] Post-Change Cobertura Capture + +Timestamp: 2026-08-26T11-07 + +Task: [P5-T6] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `pwsh -NoProfile -File scripts\vscode\Invoke-MSTestWithCoverage.ps1 -SearchRoot . -Configuration Debug -CoverageOutput "docs\features\active\quickfiler-bug-family-446\evidence\qa-gates\coverage-final.cobertura.xml"` +EXIT_CODE: 0 + +This is the same script, with the same switches, that `[P0-T12]` used to produce the baseline, so +the two artifacts are directly comparable. + +## Artifact + +`docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/coverage-final.cobertura.xml` +exists at the path this task names (10,604,471 bytes). The script post-processed the XML for +Koverage compatibility, as it reports at the end of the run. The baseline counterpart is +`docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml` +(10,602,263 bytes). + +The evidence path used is the canonical `/evidence/qa-gates/` location. No +`artifacts/csharp/coverage.xml` was produced by this task. + +## Repository-wide coverage (Cobertura root `` element) + +Both required numeric rates are recorded: + +- `line-rate`: `0.848402` (84.8402%) +- `branch-rate`: `0.787469` (78.7469%) + +Supporting counters from the same element: + +- `lines-covered`: `53843` +- `lines-valid`: `63464` +- `branches-covered`: `12694` +- `branches-valid`: `16120` +- `complexity`: `25042` + +Baseline comparison (`[P0-T12]` root element): `line-rate` `0.847782`, `branch-rate` `0.786876`. +Both post-change rates are above their baseline values. + +**Denominator statement.** These two figures are the **unfiltered repository-wide** rates read +directly from the Cobertura root element. They cover every package the run instrumented, including +vendored code, and they are not the filtered first-party denominator. They are recorded and +reported only; AC28 makes the repository-wide figure explicitly non-blocking. The blocking +threshold in this plan is applied by `[P5-T7]` to the changed-file scope, whose denominators are +derived by a different aggregation and are stated there. + +## Test counts + +- Total: `6500` +- Passed: `6500` +- Failed: `0` +- Skipped: `0` + +Reproduced from the run: `Test Run Successful.` / `Total tests: 6500` / `Passed: 6500` / +`Total time: 58.3510 Seconds`. The runner prints no `Failed:` or `Skipped:` row when those counts +are zero. + +The script printed `Discovered 9 test assemblies.`, matching the nine assemblies discovered by +`[P5-T5]` and by the `[P0-T12]` baseline. + +## Failed-test set + +(empty) + +The failed count is `0`, so this task completes on its **primary** branch. The +pre-existing-baseline reconciliation branch is not taken and is not needed: `[P0-T12]` recorded an +empty failed set, so no reconciliation set exists and no pre-existing failure needs naming. No +recorded failure belongs to `QuickFiler.Test` because there is no recorded failure at all. + +## Reconciliation of the total with `[P5-T5]` + +`[P5-T5]` recorded 6501 tests and this task records 6500. The one-test difference is fully +accounted for and is not a skipped or lost test: +`scripts/vscode/Invoke-MSTestWithCoverage.ps1` appends `/TestCaseFilter:TestCategory!=LiveOutlook` +to its inner `vstest.console.exe` invocation (visible at line 76 of that script), whereas the +`[P5-T5]` command specified by the plan passes no `/TestCaseFilter` and therefore runs the whole +suite. Exactly one test method in the repository carries that category: +`TaskMaster.Test/AppGlobals/LiveOutlookHookupIntegrationTests.cs:72`. `6501 - 1 = 6500`. + +The `[P0-T12]` baseline was produced by this same script and therefore applied the same filter, so +the like-for-like comparison is `6482 -> 6500`, a net increase of 18 tests, with a failed count of +`0` in both runs. + +## Output Summary + +Post-change coverage run is green: `EXIT_CODE: 0`, 6500 tests, 6500 passed, 0 failed, 0 skipped +across 9 discovered test assemblies. `coverage-final.cobertura.xml` written to the canonical +qa-gates evidence path. Unfiltered repository-wide `line-rate` `0.848402` and `branch-rate` +`0.787469`, both above the `[P0-T12]` baseline values of `0.847782` and `0.786876`. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t7-coverage-comparison.2026-08-26T11-09.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t7-coverage-comparison.2026-08-26T11-09.md new file mode 100644 index 000000000..7d47ec9d3 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t7-coverage-comparison.2026-08-26T11-09.md @@ -0,0 +1,125 @@ +# [P5-T7] Coverage Comparison Against the Phase 0 Baseline + +Timestamp: 2026-08-26T11-09 + +Task: [P5-T7] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Command + +The aggregation is byte-for-byte the command `[P0-T13]` used, retargeted only at the post-change +Cobertura artifact: + +``` +pwsh -NoProfile -Command '$x=[xml](Get-Content -Raw "docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/coverage-final.cobertura.xml"); $all=$x.SelectNodes("//class"); foreach ($n in @("QfcStreamingDequeueConfidenceGate.cs","QfcFormController.Actions.cs","QfcHomeController.Iteration.cs","QfcStreamingDequeueConfidenceGate","QfcFormController","QfcHomeController")) { $s=@($all | Where-Object { $_.filename -like ("*" + $n + "*") }); $ln=@($s.lines.line); $h=@($ln | Where-Object { [int]$_.hits -gt 0 }); "{0} lines={1} covered={2} rate={3:N2}" -f $n,$ln.Count,$h.Count,(100*$h.Count/[math]::Max(1,$ln.Count)) }' +``` + +EXIT_CODE: 0 + +Execution note: as in `[P0-T13]`, the payload was executed through `pwsh -NoProfile` from a +scratchpad script file outside the repository rather than as a `-Command` string, because the +intermediate shell collapses doubled backslashes. The script body is byte-equivalent to the +payload and no helper script is retained anywhere under the `evidence/` tree. + +Per D-Plan-7 the aggregation matches every `` element whose `filename` contains the needle, +never a single named ``, because an `async` method compiles into a nested state machine +that Cobertura emits as its own `` element. + +## Raw output + +``` +QfcStreamingDequeueConfidenceGate.cs lines=115 covered=112 rate=97.39 +QfcFormController.Actions.cs lines=213 covered=102 rate=47.89 +QfcHomeController.Iteration.cs lines=60 covered=60 rate=100.00 +QfcStreamingDequeueConfidenceGate lines=115 covered=112 rate=97.39 +QfcFormController lines=708 covered=392 rate=55.37 +QfcHomeController lines=449 covered=319 rate=71.05 +``` + +## Repository-wide line rate (recorded and reported; NOT a blocking threshold) + +| scope | baseline | post-change | +| --- | --- | --- | +| repository-wide `line-rate` | `0.847782` (84.7782%) | `0.848402` (84.8402%) | + +**Denominator statement.** Both figures are the **unfiltered repository-wide** rate read from the +Cobertura root `` element, covering every instrumented package including vendored code. +They are not the filtered first-party denominator, and the two differ materially in this +repository. AC28 makes this figure explicitly record-and-report; no threshold is applied to it +here. No merge-base baseline exists for this feature folder other than the `[P0-T12]` run recorded +in Phase 0, which is what the baseline column cites. + +## Changed-file scope (three rows) - carries the blocking 90.00 condition + +**Denominator statement.** Each row denominator is the count of distinct `` elements +aggregated across every `` element whose `filename` attribute matches that single changed +file. This is the changed-file scope of D-Plan-7, not the repository-wide denominator above and +not the whole-type denominator below. + +| changed file | baseline lines/covered/rate | post-change lines/covered/rate | at least 90.00? | +| --- | --- | --- | --- | +| `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | 93 / 90 / `96.77` | 115 / 112 / `97.39` | yes | +| `QuickFiler/Controllers/QfcFormController.Actions.cs` | 204 / 73 / `35.78` | 213 / 102 / `47.89` | no - carve-out below | +| `QuickFiler/Controllers/QfcHomeController.Iteration.cs` | 56 / 45 / `80.36` | 60 / 60 / `100.00` | yes | + +`QfcHomeController.Iteration.cs` moved from `80.36` to `100.00`. The eleven previously uncovered +occurrences were the two `catch` blocks at +`QuickFiler/Controllers/QfcHomeController.Iteration.cs:38-52`, which `[P1-T19]` was written to +drive; they are now covered. + +### QfcFormController.Actions.cs carve-out + +Its post-change rate `47.89` is below `90.00` but is greater than its `[P0-T13]` baseline value of +`35.78`, an increase of 12.11 percentage points, which is the alternative condition this task +permits. The required line follows verbatim. + +REMEDIATION-REQUIRED: QfcFormController.Actions.cs changed-file coverage is bounded by the un-seamed MessageBox.Show calls in UndoDialog at :225, :238 and :248, which UT4 prohibits exercising and which no task in this plan seams + +## Whole-type scope (three rows) - carries the no-regression condition + +**Denominator statement.** Each row denominator is the count of distinct `` elements +aggregated across every `` element whose `filename` matches the type name, which for the +two partial types spans partial files owned by sibling epic children and not written by this +change set. This scope is held to no-regression only, per D-Plan-7. + +| type | baseline lines/covered/rate | post-change lines/covered/rate | at or above baseline? | at least 90.00? | +| --- | --- | --- | --- | --- | +| `QfcStreamingDequeueConfidenceGate` | 93 / 90 / `96.77` | 115 / 112 / `97.39` | yes (+0.62) | yes | +| `QfcFormController` | 699 / 363 / `51.93` | 708 / 392 / `55.37` | yes (+3.44) | no | +| `QfcHomeController` | 445 / 304 / `68.31` | 449 / 319 / `71.05` | yes (+2.74) | no | + +All three whole-type rates are at or above their recorded baselines, so the no-regression +condition holds. Two of the three are below `90.00`, which is the outcome `[P5-T17]` evaluates +against the literal whole-type wording of AC28. + +## Acceptance conditions of this task + +- `QfcStreamingDequeueConfidenceGate.cs` changed-file rate `97.39` is at least `90.00`. Satisfied. +- `QfcHomeController.Iteration.cs` changed-file rate `100.00` is at least `90.00`. Satisfied. +- `QfcFormController.Actions.cs` changed-file rate `47.89` is greater than or equal to its + `[P0-T13]` baseline `35.78`, and this artifact carries the required line verbatim. Satisfied on + the alternative branch. +- Each of the three whole-type line rates is greater than or equal to its recorded baseline value. + Satisfied. +- All eight figures, being two repository-wide, three changed-file and three whole-type, are + numeric. Satisfied. +- Every aggregation row `lines=` value is a positive integer (115, 213, 60, 115, 708, 449), so no + needle matched zero `` elements and no row is a silent measurement failure. Satisfied. + +## Excluded types (recorded for completeness, per D-Plan-7) + +Coverage credit cannot accrue to two types in the neighbourhood of this change set because they +carry `[ExcludeFromCodeCoverage]`: + +- `QfcDatamodel`, excluded at `QuickFiler/Controllers/QfcDatamodel.cs:25`. The attribute is + type-level on one partial declaration, so it also covers + `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`. +- `FolderScoringService`, excluded at `QuickFiler/Controllers/QfcHighConfidencePreFilter.cs:166`. + +## Output Summary + +Eight numeric coverage figures recorded. Changed-file scope `97.39` / `47.89` / `100.00`; +whole-type scope `97.39` / `55.37` / `71.05`; repository-wide `84.7782%` baseline to `84.8402%` +post-change. Both unconditional changed-file gates pass; `QfcFormController.Actions.cs` completes +on its documented carve-out branch, rising from `35.78` to `47.89`. All three whole-type rates are +at or above baseline, so there is no regression on any measured scope. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t8-line-cap-audit.2026-08-26T11-10.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t8-line-cap-audit.2026-08-26T11-10.md new file mode 100644 index 000000000..f5a159252 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t8-line-cap-audit.2026-08-26T11-10.md @@ -0,0 +1,66 @@ +# [P5-T8] Post-Format File-Size Audit + +Timestamp: 2026-08-26T11-10 + +Task: [P5-T8] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `git diff --name-only ...HEAD -- "*.cs"` where `` is the merge-base sha +`61edc19befcf6c4e95b5acd32542f2dcdab41b78` recorded by `[P0-T3]`, followed by a newline count of +each returned path. +EXIT_CODE: 0 + +This audit runs **after** `[P5-T1]`, because a formatting pass can change line counts. The counts +below are therefore the post-format, post-change counts. Lines are counted as newline terminators +plus one for a final unterminated line, so blank lines are included; a count that omits blank +lines would understate every file against the 500-line cap. + +## Audited paths and post-change line counts + +| line count | path | at most 500? | +| --- | --- | --- | +| 391 | `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` | yes | +| 496 | `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` | yes | +| 497 | `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` | yes | +| 262 | `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` | yes | +| 460 | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` | yes | +| 270 | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` | yes | +| 468 | `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` | yes | +| 288 | `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` | yes | +| 480 | `QuickFiler/Controllers/QfcDatamodel.cs` | yes | +| 360 | `QuickFiler/Controllers/QfcFormController.Actions.cs` | yes | +| 95 | `QuickFiler/Controllers/QfcHomeController.Iteration.cs` | yes | +| 245 | `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | yes | +| 133 | `QuickFiler/Interfaces/IQfcDatamodel.cs` | yes | + +- Audited path count: **13** +- Maximum recorded count: **497** (`QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`) +- Every recorded count is at most 500: **yes** + +## QfcDatamodel.cs budget + +`QuickFiler/Controllers/QfcDatamodel.cs` records **480** lines, comfortably inside the cap. D-Plan-3 +recorded it at 496 of 500 at the base with net growth capped at 4 lines; `[P1-T5]` relocated +`ScoreRemainingQueueMailItemAsync` out of the file into +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` to buy budget before any widening, which +is why the post-change count is 16 lines below the base rather than at the cap. + +## QfcFormControllerTests.cs absence + +`QuickFiler.Test/Controllers/QfcFormControllerTests.cs` **does not appear** in the audited path +list, so it is untouched by this change set. This is the outcome D-Plan-2 committed to: the file +is 827 lines and the plan deliberately leaves it unmodified, which makes the single permitted +exception of AC24 vacuously satisfied. `[P3-T9]` asserted the same absence at the end of Phase 3 +and this audit confirms it still holds after the final formatting pass. + +## Scope note + +Markdown documentation under the feature folder is exempt from the 500-line cap per +`.claude/rules/general-code-change.md` and is not part of this audit. The audit covers exactly the +`.cs` paths in the change set. + +## Output Summary + +All 13 changed `.cs` files are at or below the 500-line cap after the final formatting pass; the +largest is 497 lines. `QfcDatamodel.cs` is 480. `QfcFormControllerTests.cs` is absent from the +change set. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t9-clean-pass.2026-08-26T11-11.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t9-clean-pass.2026-08-26T11-11.md new file mode 100644 index 000000000..0eb3d66fd --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t9-clean-pass.2026-08-26T11-11.md @@ -0,0 +1,103 @@ +# [P5-T9] The Single Clean Toolchain Pass + +Timestamp: 2026-08-26T11-11 + +Task: [P5-T9] +Feature: docs/features/active/quickfiler-bug-family-446 + +This artifact records the pass of the Phase 5 toolchain loop that the loop finally accepted. One +restart occurred; it is documented at the end. + +## The five command strings and their exit codes + +### [P5-T1] Formatting (mutating, scoped to the change set per D-Plan-4) + +Command: `pwsh -NoProfile -Command 'dotnet tool run csharpier format QuickFiler.Test/Controllers/QfcDatamodelTests.cs QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs QuickFiler/Controllers/QfcDatamodel.cs QuickFiler/Controllers/QfcFormController.Actions.cs QuickFiler/Controllers/QfcHomeController.Iteration.cs QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs QuickFiler/Interfaces/IQfcDatamodel.cs'` + +EXIT_CODE: 0 +Evidence: `p5-t1-csharpier-format.2026-08-26T10-58.md` + +### [P5-T2] Formatting gate (read-only, repository-wide) + +Command: `pwsh -NoProfile -Command 'dotnet tool run csharpier check .'` + +EXIT_CODE: 0 +Evidence: `p5-t2-csharpier-check.2026-08-26T10-59.md` + +### [P5-T3] Analyzer gate + +Command: `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true` + +EXIT_CODE: 0 +Evidence: `p5-t3-analyzer-build.2026-08-26T10-59.md` + +### [P5-T4] Type-check gate + +Command: `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true` + +EXIT_CODE: 0 +Evidence: `p5-t4-nullable-build.2026-08-26T11-00.md` + +### [P5-T5] Test gate + +Command: `& $vstest $asm /InIsolation /EnableCodeCoverage "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\qa-gates\p5-t5"` + +EXIT_CODE: 0 +Evidence: `p5-t5-vstest.2026-08-26T11-01.md` + +## Rewritten-file count from [P5-T1] + +**0.** Derived by comparing SHA-256 digests of all 13 change-set `.cs` paths taken before and +after the mutating pass. All 13 digest pairs are byte-identical. The count is not read from +CSharpier's `Formatted 13 files` line, which reports files processed rather than files changed. + +## Acceptance conditions of this task + +| condition | value | satisfied | +| --- | --- | --- | +| recorded rewritten-file count is `0` | `0` | yes | +| `[P5-T1]` exit code is `0` | `0` | yes | +| `[P5-T3]` exit code is `0` | `0` | yes | +| `[P5-T4]` exit code is `0` | `0` | yes | +| `[P5-T2]` exit code is `0` | `0` | yes - primary branch, no reconciliation needed | +| `[P5-T5]` exit code is `0` | `0` | yes - primary branch, no reconciliation needed | + +Neither `[P5-T2]` nor `[P5-T5]` completed on a pre-existing-baseline branch, so neither +reconciliation clause of this task applies. `[P0-T9]` recorded an empty unformatted path set and +`[P0-T12]` recorded an empty failed-test set, so no reconciliation set existed to fall back on in +the first place; both gates passed on their own merit. + +Test counts in the accepted pass: total `6501`, passed `6501`, failed `0`, skipped `0`, across the +nine discovered test assemblies. + +## Loop restarts + +**One restart occurred.** + +The first pass ran `[P5-T1]` through `[P5-T4]` green and then failed at `[P5-T5]` with +`EXIT_CODE: 1` and `No test source files were specified.` The cause was confined to the executor's +transcription of the plan's discovery prelude: the intermediate shell collapsed the doubled +backslashes in the regular expression `"\\bin\\Debug\\"`, which under .NET regular-expression +semantics turned `\b` into a word-boundary assertion, so the filter matched none of the nine +assemblies and `$asm` was empty. Nothing in the working tree was created, rewritten or deleted by +that failed invocation, but a failed toolchain step is a failed toolchain step, so per the Phase 5 +preamble the loop restarted from `[P5-T1]`. + +The artifacts of the aborted pass are retained alongside those of the accepted pass, as the +preamble requires: + +- `p5-t1-csharpier-format.2026-08-26T10-52.md` (aborted pass) +- `p5-t2-csharpier-check.2026-08-26T10-54.md` (aborted pass) +- `p5-t3-analyzer-build.2026-08-26T10-55.md` (aborted pass) +- `p5-t4-nullable-build.2026-08-26T10-56.md` (aborted pass) +- `p5-t5-vstest.2026-08-26T10-56.md` (aborted pass, records `EXIT_CODE: 1` and the root cause) + +No other restart occurred. No step of the accepted pass rewrote a file. + +## Output Summary + +Single accepted toolchain pass: format `0`, format-check `0`, analyzer `0`, type-check `0`, test +`0`, with a rewritten-file count of `0` and a failed-test count of `0`. Both conditional gates +completed on their primary branches. One loop restart occurred, caused by a collapsed-backslash +regular expression in the executor's transcription of the discovery prelude, and every artifact +from that aborted pass is retained. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/post-rebase-verification.2026-08-26T11-42.md b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/post-rebase-verification.2026-08-26T11-42.md new file mode 100644 index 000000000..651fa457d --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/post-rebase-verification.2026-08-26T11-42.md @@ -0,0 +1,79 @@ +# Post-Rebase Toolchain Verification + +Timestamp: 2026-08-26T11-42 + +Origin: orchestrator verification, not a plan task. +Feature: docs/features/active/quickfiler-bug-family-446 +Branch: `bug/quickfiler-bug-family-446` +Rebased onto: `epic/quickfiler-bug-family-integration` at `37709d22` + +## Why this run exists + +The Phase 5 toolchain evidence was captured against merge base `61edc19b`. Between that capture and +PR authoring, the integration branch advanced twice: first by a docs-only epic-status commit +(`4a8c1b60`), then by the merge of sibling epic child 484 (PR #619, `363bfcdd`), which changed nine +`.cs` files under `QfcItemController.*`. + +`.github/workflows/ci.yml` triggers `pull_request` only on `main` and `development`, so a pull +request based on the integration branch receives ZERO CI checks. Local verification is the only +gate, and evidence captured before a rebase does not describe the tree that will actually merge. +This run re-establishes the four gates against the rebased tree. + +## Collision pre-check + +- The 13 commits rebased cleanly onto `37709d22` with no conflicts. +- Sibling 484's nine changed files are all `QfcItemController.*`, disjoint from this change set's six + owned production files. +- All five sibling test files are MODIFICATIONS of files already registered in + `QuickFiler.Test/QuickFiler.Test.csproj`; no new `Compile Include` entry was required and none was + added. +- The three types this change set introduces (`QfcDequeueStop`, `QfcDequeueBatch`, `QfcGateBatch`) + do not exist anywhere on `37709d22`, so no `CS0101` or `CS0104` collision is possible. + +## Gates + +Command: `dotnet tool run csharpier check .` +EXIT_CODE: 0 +Output Summary: Checked 1520 files. No formatting difference. + +Command: `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true` +EXIT_CODE: 0 +Output Summary: 0 Error(s). `Skipping target "CoreCompile"` occurs 0 times in the build log, which +proves the analyzer gate actually compiled rather than passing on a warm incremental no-op. + +Command: `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true` +EXIT_CODE: 0 +Output Summary: 0 Error(s). `Skipping target "CoreCompile"` occurs 0 times in the build log. + +Command: `& $vstest $asm /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx` +EXIT_CODE: 0 +Output Summary: Total tests 6522, Passed 6522, Failed 0, across 9 discovered test assemblies. + +## Test-count reconciliation + +The Phase 5 run recorded 6501 passing tests against merge base `61edc19b`. This run records 6522. +The difference of 21 is accounted for by the tests sibling 484 added to the five +`QfcItemController.*` test files merged in PR #619. No test was lost and none regressed. + +## Assembly discovery note + +Discovery enumerated `*.Test.dll` under `bin\Debug` and filtered on the RELATIVE path. An +absolute-path filter excluding `\.claude\` would have matched zero assemblies here, because this +worktree itself lives beneath `.claude\worktrees\`. Nine assemblies were discovered, matching the +Phase 5 count. + +## Tooling + +- MSBuild 18.8.2 for .NET Framework, from the Visual Studio 18 Community install under + ``. +- VSTest 18.8.0 (x64) from the same install. +- Coverage was not re-collected in this run; the Phase 5 Cobertura at + `evidence/qa-gates/coverage-final.cobertura.xml` remains the coverage record, and the rebase added + no line to any file this change set owns. + +EXIT_CODE: 0 + +Output Summary: All four gates pass against the rebased tree at integration tip `37709d22`. Both +rebuild gates are proven non-vacuous by a zero `Skipping target "CoreCompile"` count. 6522 of 6522 +tests pass. No type collision with the merged sibling. The branch is verified against the tree it +will actually merge into, not merely against its original merge base. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t1-failclosed-helper.2026-08-26T09-15.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t1-failclosed-helper.2026-08-26T09-15.md new file mode 100644 index 000000000..3eb5626c3 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t1-failclosed-helper.2026-08-26T09-15.md @@ -0,0 +1,72 @@ +# [P1-T1] Fail-Closed Reflective Gate Helper + +Timestamp: 2026-08-26T09-15 + +Task: [P1-T1] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` — the four-step descending +`GetConstructor` fallback chain (8-type, 7-type, 6-type, 5-type) was replaced by a single exact +`GetConstructor` lookup for the eight-parameter constructor declared at +`QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs:57-66`, guarded by a +FluentAssertions `Should().NotBeNull()` assertion. + +Defect closed: the chain succeeded on the 5-type lookup whenever the wider lookups missed, +silently constructing a gate with `sourceActive` null, the default deadline and no progress +callback across every consuming test method in the class. The helper now fails closed. + +## Verification + +### Intra-phase compile + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +### `GetConstructor` count + +Command: `git grep -c "GetConstructor" -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` +EXIT_CODE: 0 +Output: `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:1` + +The output line ends in `:1`, so the count for that file is 1 as required. `[P0-T15]` recorded the +pre-change count as 4, so this is a real change and not a vacuous match. + +### Scoped test run + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~QfcStreamingDequeueConfidenceGateTests" "/Logger:trx;LogFileName=p1-t1.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t1"` +EXIT_CODE: 0 + +- Total: `23` +- Passed: `23` +- Failed: `0` + +The passed count of 23 equals the `[TestMethod]` total recorded by `[P0-T15]` (23 on the tree that +carries PR #610). + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t1/p1-t1.trx` + +## Note on TRX File Naming + +`/Logger:trx` alone names the output `___net481.trx`, which would commit +a Windows account name and a machine name into the repository as a file name. Every TRX in this +plan is therefore produced with `/Logger:"trx;LogFileName=.trx"` in addition to the +task-private `/ResultsDirectory:`, so the committed file name is deterministic and carries no +host identity. The logger is still `trx` and the file still lands in the directory the plan's +acceptance conditions name, so no acceptance condition is affected. + +The TRX *payload* retains the `runUser` and `computerName` attributes that the VSTest TRX schema +writes unconditionally; no `vstest.console.exe` switch suppresses them, and editing them out would +falsify the evidence. They are left as produced. No artifact authored by this executor reproduces +them. + +## Line Count + +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`: 424 -> 348 lines +(76 lines freed for the gate tests `[P1-T2]` through `[P1-T4]` add). + +## Output Summary + +Helper is fail-closed with exactly one `GetConstructor` lookup. Compile exit 0; scoped run 23/23 +passed, 0 failed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t1/p1-t1.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t1/p1-t1.trx new file mode 100644 index 000000000..7952b3b1d --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t1/p1-t1.trx @@ -0,0 +1,193 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t10-exhausted-stop-red.2026-08-26T09-50.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t10-exhausted-stop-red.2026-08-26T09-50.md new file mode 100644 index 000000000..e78fe82dd --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t10-exhausted-stop-red.2026-08-26T09-50.md @@ -0,0 +1,44 @@ +# [P1-T10] [expect-fail] Source Drain Reports `SourceExhausted` + +Timestamp: 2026-08-26T09-50 + +Task: [P1-T10] (tagged `[expect-fail]`) +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` — added +`DequeueAsync_SourceDrained_ReportsSourceExhaustedStop`. The take delegate returns null and +`sourceActive` reports false, which is the take-returned-null exit. The test asserts +`Stop == QfcDequeueStop.SourceExhausted` and an empty `Accepted`. + +This is the complementary exit to `[P1-T9]`. Together the two tests are what make the caller-side +guard in `[P2-T7]` meaningful: one stop reason must close the queue and the other must not. + +## Verification + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueAsync_SourceDrained_ReportsSourceExhaustedStop" "/Logger:trx;LogFileName=p1-t10.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t10"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t10/p1-t10.trx` + +Recorded outcome: **Failed**. + +Failure message, quoted verbatim from the TRX: + +``` +Expected batch.Stop to be QfcDequeueStop.SourceExhausted {value: 1} because a drained source with no active producer is genuine exhaustion, but found QfcDequeueStop.QuantitySatisfied {value: 0}. +``` + +This is a FluentAssertions assertion-failure message. Note the D-Plan-1 reasoning is borne out +here: had `[P1-T8]` stubbed `Stop` to `SourceExhausted` instead of `QuantitySatisfied`, this test +would have passed vacuously in the RED state and gated nothing. + +## Output Summary + +Test lands RED by assertion on the stop reason. Compile exit 0, scoped run exit 1 with the single +test Failed. `[P2-T1]` maps the take-returned-null exit to `SourceExhausted` and turns it green. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t10/p1-t10.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t10/p1-t10.trx new file mode 100644 index 000000000..2457c6abe --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t10/p1-t10.trx @@ -0,0 +1,72 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + Expected batch.Stop to be QfcDequeueStop.SourceExhausted {value: 1} because a drained source with no active producer is genuine exhaustion, but found QfcDequeueStop.QuantitySatisfied {value: 0}. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Primitives.EnumAssertions`2.Be(TEnum expected, String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Primitives/EnumAssertions.cs:line 68 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_SourceDrained_ReportsSourceExhaustedStop>d__37.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.Part3.cs:line 217 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t11-score-tuple-widening.2026-08-26T09-16.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t11-score-tuple-widening.2026-08-26T09-16.md new file mode 100644 index 000000000..4ba8dba6d --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t11-score-tuple-widening.2026-08-26T09-16.md @@ -0,0 +1,65 @@ +# [P1-T11] Widen the Score Path to the Tuple Shape with `TopFolder` Stubbed + +Timestamp: 2026-08-26T09-16 + +Task: [P1-T11] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +- `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs:179` — the relocated + `ScoreRemainingQueueMailItemAsync` now returns `Task<(long Score, string TopFolder)>` and returns + `(score.Score, string.Empty)` at `:192`. `TopFolder` is deliberately stubbed to `string.Empty` per + D-Plan-1; `[P2-T4]` discriminates the real value. +- `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` — `_scoreLoader` (`:61`) and both + constructor parameters (`:73`, `:105`) widened to + `Func>`. +- `QuickFiler/Controllers/QfcDatamodel.cs:355` — the method-group conversion is repaired with the + in-file adapter lambda `async (m, t) => (await ScoreRemainingQueueMailItemAsync(m, t)).Score,`. +- `QuickFiler/Controllers/QfcRemainingQueueAdmission.cs` is not owned and is unchanged: it declares + its `scoreLoader` locally, null-checks it and never invokes it, so the widening does not reach it. +- Score-loader lambdas updated to the tuple shape in + `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, + `...Part2.cs` and `...Part3.cs`. No line was added to `...Part2.cs` (D-Plan-8). + +## Verification + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~QfcStreamingDequeueConfidenceGateTests|FullyQualifiedName~QfcDatamodelTests|FullyQualifiedName~QfcQueuePurePathsTests" "/Logger:trx;LogFileName=p1-t11.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t11"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t11/p1-t11.trx` + +### Line-count conditions + +| File | Recorded by `[P0-T14]` | Post-change | Condition | Result | +| --- | --- | --- | --- | --- | +| `QuickFiler/Controllers/QfcDatamodel.cs` | 496 | **480** | at most 500 | PASS | +| `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` | 460 | **460** | equals `[P0-T14]` count | PASS | + +### Scoped run — no newly failing test + +TRX counters: `total="42" executed="42" passed="37" failed="5"`. + +All five failures are tests this plan already tagged `[expect-fail]` in an earlier task: + +| Failed test | Tagged by | +| --- | --- | +| `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` | `[P1-T2]` | +| `DequeueAsync_OnRejectedThrows_ScanContinues` | `[P1-T3]` | +| `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` | `[P1-T6]` | +| `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` | `[P1-T9]` | +| `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` | `[P1-T10]` | + +No test outside that set failed, so the widening introduced no newly failing test. + +## Output Summary + +Score path widened to `(long Score, string TopFolder)` end to end with `TopFolder` stubbed to +`string.Empty`. Intra-phase compile EXIT_CODE 0. `QfcDatamodel.cs` at 480 of the 500 cap; +`...Part2.cs` unchanged at 460, exactly the `[P0-T14]` figure. Scoped gate run: 42 executed, +37 passed, 5 failed, and all five failures are the previously `[expect-fail]`-tagged tests from +`[P1-T2]`, `[P1-T3]`, `[P1-T6]`, `[P1-T9]` and `[P1-T10]`. No newly failing test. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t11/p1-t11.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t11/p1-t11.trx new file mode 100644 index 000000000..fdd397652 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t11/p1-t11.trx @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + Expected rejected to contain a single item because the gate must report each discarded candidate exactly once, but the collection is empty. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Collections.GenericCollectionAssertions`3.ContainSingle(String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Collections/GenericCollectionAssertions.cs:line 1186 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce>d__15.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.cs:line 361 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + Expected invocations to contain a single item because the throwing sink must still be invoked once for the rejected item, but the collection is empty. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Collections.GenericCollectionAssertions`3.ContainSingle(String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Collections/GenericCollectionAssertions.cs:line 1186 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_OnRejectedThrows_ScanContinues>d__16.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.cs:line 397 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + Expected batch.Stop to be QfcDequeueStop.DeadlineExpired {value: 2} because an empty batch caused by the first-batch deadline is not source exhaustion, but found QfcDequeueStop.QuantitySatisfied {value: 0}. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Primitives.EnumAssertions`2.Be(TEnum expected, String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Primitives/EnumAssertions.cs:line 68 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop>d__36.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.Part3.cs:line 191 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + Expected batch.Stop to be QfcDequeueStop.SourceExhausted {value: 1} because a drained source with no active producer is genuine exhaustion, but found QfcDequeueStop.QuantitySatisfied {value: 0}. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Primitives.EnumAssertions`2.Be(TEnum expected, String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Primitives/EnumAssertions.cs:line 68 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_SourceDrained_ReportsSourceExhaustedStop>d__37.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.Part3.cs:line 221 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + Test method QuickFiler.Controllers.Tests.QfcQueuePurePathsTests.DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor threw exception: +Moq.MockException: the datamodel must release the rejected candidate's monitor hook exactly once +Expected invocation on the mock once, but was 0 times: x => x.UnhookItem(Mock<MailItem:14>.Object) + +Performed invocations: + + Mock<IEmailMoveMonitor:2> (x): + No invocations performed. + + at Moq.Mock.Verify(Mock mock, LambdaExpression expression, Times times, String failMessage) in /_/src/Moq/Mock.cs:line 332 + at Moq.Mock`1.Verify(Expression`1 expression, Func`1 times, String failMessage) in /_/src/Moq/Mock`1.cs:line 787 + at QuickFiler.Controllers.Tests.QfcQueuePurePathsTests.<DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor>d__9.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcQueuePurePathsTests.cs:line 185 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t12-topfolder-datamodel-red.2026-08-26T09-22.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t12-topfolder-datamodel-red.2026-08-26T09-22.md new file mode 100644 index 000000000..d142d3fec --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t12-topfolder-datamodel-red.2026-08-26T09-22.md @@ -0,0 +1,57 @@ +# [P1-T12] [expect-fail] Datamodel Scorer Must Return Score AND Top Folder + +Timestamp: 2026-08-26T09-22 + +Task: [P1-T12] (tagged `[expect-fail]`) +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcDatamodelTests.cs` — added +`ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` in a new +`#region Issue #446 — Top-folder propagation from the master-queue admission scorer`. + +The test builds the datamodel with `CreateUninitializedDatamodel`, sets `_globals` through +`SetPrivateField`, and assigns the `ScoringServiceFactory` seam added by `[P1-T5]` to a +`Mock` (`MockBehavior.Strict`) whose `ScoreAsync` returns the known pair +`(875L, @"Inbox\Projects\Alpha")`. The private `ScoreRemainingQueueMailItemAsync` is invoked +through a small reflection helper, `InvokeScoreRemainingQueueMailItemAsync`, using the file's +existing `NonPublicInstance` binding flags. No live Outlook COM, no filesystem and no wall-clock +wait is involved, per `.claude/rules/general-unit-test.md` UT4. + +The test asserts both halves of the returned tuple: `Score` (already propagated) and `TopFolder` +(discarded today). + +## Verification + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder" "/Logger:trx;LogFileName=p1-t12.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t12"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t12/p1-t12.trx` + +TRX counters: `total="1" executed="1" passed="0" failed="1"`. + +Recorded outcome: **Failed**. + +Failure message, quoted verbatim from the TRX: + +``` +Expected result.TopFolder to be "Inbox\Projects\Alpha" with a length of 20 because the top-ranked folder the scorer already computed must reach the caller instead of being discarded and re-derived downstream, but "" has a length of 0, differs near "" (index 0). +``` + +This is a FluentAssertions assertion-failure message, not a build error and not an unhandled +exception. The RED state is exactly the D-Plan-1 stub: `[P1-T11]` widened the return type to +`(long Score, string TopFolder)` but hard-codes `TopFolder` to `string.Empty` at +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs:192`. The `Score` half of the assertion +already passes, which confirms the test reaches the real method and fails only on the undelivered +behaviour. + +## Output Summary + +Failing-first test for AC5 lands RED by assertion on `TopFolder`. Compile EXIT_CODE 0; scoped run +EXIT_CODE 1 with 1 executed and 1 Failed. `[P2-T4]` replaces the `string.Empty` stub with the real +`score.TopFolder` and turns this test green. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t12/p1-t12.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t12/p1-t12.trx new file mode 100644 index 000000000..4832d57bb --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t12/p1-t12.trx @@ -0,0 +1,74 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + Expected result.TopFolder to be "Inbox\Projects\Alpha" with a length of 20 because the top-ranked folder the scorer already computed must reach the caller instead of being discarded and re-derived downstream, but "" has a length of 0, differs near "" (index 0). + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Primitives.StringEqualityStrategy.ValidateAgainstLengthDifferences(AssertionChain assertion, String subject, String expected) + at FluentAssertions.Primitives.StringValidator.Validate(String subject, String expected) in /_/Src/FluentAssertions/Primitives/StringValidator.cs:line 37 + at FluentAssertions.Primitives.StringAssertions`1.Be(String expected, String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Primitives/StringAssertions.cs:line 67 + at QuickFiler.Controllers.Tests.QfcDatamodelTests.<ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder>d__12.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcDatamodelTests.cs:line 361 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t13-topfolder-gate-red.2026-08-26T09-28.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t13-topfolder-gate-red.2026-08-26T09-28.md new file mode 100644 index 000000000..34b3c41c8 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t13-topfolder-gate-red.2026-08-26T09-28.md @@ -0,0 +1,55 @@ +# [P1-T13] [expect-fail] Accepted Candidate Must Carry Its Top Folder + +Timestamp: 2026-08-26T09-28 + +Task: [P1-T13] (tagged `[expect-fail]`) +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` — added +`DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult`. + +The test drives the reflective nine-parameter `CreateGate` seam with a single high-scoring +candidate and a score loader returning `(950L, @"Inbox\Projects\Alpha")`, then reads the gate +result through `DequeueBatchAsync`. It asserts the single entry in `Accepted` is the same +`MailItem` instance and that its `PredeterminedFolder` equals the folder the score loader +returned. `FakeTimeProvider` supplies the clock, so no wall-clock wait occurs. + +## Verification + +Command: `dotnet tool run csharpier check "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult" "/Logger:trx;LogFileName=p1-t13.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t13"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t13/p1-t13.trx` + +TRX counters: `total="1" executed="1" passed="0" failed="1"`. + +Recorded outcome: **Failed**. + +Failure message, quoted verbatim from the TRX: + +``` +Expected accepted.PredeterminedFolder to be "Inbox\Projects\Alpha" with a length of 20 because the folder the score loader already returned must travel with the accepted candidate instead of being discarded and re-derived downstream, but "" has a length of 0, differs near "" (index 0). +``` + +This is a FluentAssertions assertion-failure message, not a build error and not an unhandled +exception. The RED state is the D-Plan-1 stub in the gate's accept branch: the gate destructures +`(long score, string topFolder)` from the widened loader but constructs the carrier as +`new QfcPreScoredItem(mailItem, string.Empty)`. The `MailItem` half of the assertion already +passes, confirming the test reaches the real accept path and fails only on the undelivered +behaviour. + +## Output Summary + +Failing-first test for the gate-side half of top-folder propagation lands RED by assertion on +`PredeterminedFolder`. Format check EXIT_CODE 0, compile EXIT_CODE 0, scoped run EXIT_CODE 1 with +1 executed and 1 Failed. Phase 2 replaces the `string.Empty` argument with the loader's +`topFolder` and turns this test green. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t13/p1-t13.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t13/p1-t13.trx new file mode 100644 index 000000000..64633bf9f --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t13/p1-t13.trx @@ -0,0 +1,74 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + Expected accepted.PredeterminedFolder to be "Inbox\Projects\Alpha" with a length of 20 because the folder the score loader already returned must travel with the accepted candidate instead of being discarded and re-derived downstream, but "" has a length of 0, differs near "" (index 0). + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Primitives.StringEqualityStrategy.ValidateAgainstLengthDifferences(AssertionChain assertion, String subject, String expected) + at FluentAssertions.Primitives.StringValidator.Validate(String subject, String expected) in /_/Src/FluentAssertions/Primitives/StringValidator.cs:line 37 + at FluentAssertions.Primitives.StringAssertions`1.Be(String expected, String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Primitives/StringAssertions.cs:line 67 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult>d__38.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.Part3.cs:line 261 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t14-arrangeiterate-dedup.2026-08-26T09-26.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t14-arrangeiterate-dedup.2026-08-26T09-26.md new file mode 100644 index 000000000..55b88d0b7 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t14-arrangeiterate-dedup.2026-08-26T09-26.md @@ -0,0 +1,73 @@ +# [P1-T14] Deduplicate the Iteration Test File Before It Absorbs New Tests + +Timestamp: 2026-08-26T09-26 + +Task: [P1-T14] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` — extracted one shared +`ArrangeIterate(...)` helper from the five duplicated arrangements the plan names (the four +`IterateQueueAsync_*` setups formerly at `:84`, `:130`, `:201` and `:268`, and the `Iterate` setup +formerly at `:372`). The helper builds the `IQfcDatamodel`, `IQfcQueue`, `IQfcFormController` and +`IQfcCollectionController` mocks, wires them into `_controller` (including the `_formController` +private-field reflection assignment that appeared five times), and returns all four mocks as a +named tuple so each test keeps its own assertions. + +No `Part2` partial file was added and `QuickFiler.Test/QuickFiler.Test.csproj` was not edited. +`using System.Linq.Expressions;` was added. + +### Matchers are parameters, and the pins survive + +`ArrangeIterate` takes the quantity and timeout matchers as +`Expression>` parameters and applies them with `It.Is(quantity)` / +`It.Is(timeOut)`. Passing `It.IsAny()` as an ordinary argument would evaluate to `0` before +the setup expression was built, so the expression form is what keeps a pinned call site pinned. + +Post-change call sites, read directly from the post-change test bodies: + +| Test (formerly at) | Post-change arguments | Pin preserved | +| --- | --- | --- | +| `IterateQueueAsync_WhenDequeueReturnsFullQualifiedPage_EnqueuesAllItems` (`:268`) | `quantity: q => q == 8, timeOut: t => t == 2000` | yes — `8` and `2000` are reproduced concretely, not widened to `It.IsAny()` | +| `Iterate_HighConfidenceEnabled_DoesNotLoadDirectSynchronousBatch` (`:372`) | `quantity: q => q == itemsPerIteration, timeOut: t => true, itemsPerIteration: itemsPerIteration` | yes — the `itemsPerIteration` argument is reproduced; only the timeout, which was `It.IsAny()` at base, is unconstrained | +| `IterateQueueAsync_DataModelComplete` (`:84`) | `quantity: q => true, timeOut: t => true, complete: true` | n/a — was `It.IsAny()` at base | +| `IterateQueueAsync_QueueEmpty` (`:130`) | `quantity: q => true, timeOut: t => true` | n/a — was `It.IsAny()` at base | +| `IterateQueueAsync_Queue2` (`:201`) | `quantity: q => true, timeOut: t => true, dequeued: mailItems` | n/a — was `It.IsAny()` at base | + +`ArrangeIterate` currently arranges `DequeueNextItemGroupAsync` only, because +`DequeueNextItemGroupWithOutcomeAsync` does not exist until `[P1-T15]` declares it. `[P1-T15]` +adds the second arrangement to this same helper, which is what keeps +`Iterate_HighConfidenceEnabled_DoesNotLoadDirectSynchronousBatch` on the synchronous-path member +while the four `IterateQueueAsync_*` tests move to the outcome-bearing member. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~QfcHomeControllerIterationTests" "/Logger:trx;LogFileName=p1-t14.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t14"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t14/p1-t14.trx` + +Total tests 8, Passed 8, **Failed 0**. + +Command: `wc -l "QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs"` +EXIT_CODE: 0 + +| File | Recorded by `[P0-T14]` | Post-change | Condition | Result | +| --- | --- | --- | --- | --- | +| `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` | 464 | **428** | strictly less than 464 | PASS (36 lines freed) | + +`git diff --stat` for the file: 97 insertions, 133 deletions. + +## Output Summary + +`ArrangeIterate` extracted and shared across all five arrangements the plan names. File drops from +464 to 428 lines, freeing 36 lines of headroom under the 500-line cap before `[P1-T16]`, +`[P1-T17]` and `[P1-T19]` add five more tests. Format EXIT_CODE 0, compile EXIT_CODE 0, scoped run +EXIT_CODE 0 with 8 passed and 0 failed. Both pinned call sites reproduce their concrete arguments. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t14/p1-t14.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t14/p1-t14.trx new file mode 100644 index 000000000..c22cc1fd1 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t14/p1-t14.trx @@ -0,0 +1,112 @@ + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t15-outcome-member.2026-08-26T09-29.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t15-outcome-member.2026-08-26T09-29.md new file mode 100644 index 000000000..249939356 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t15-outcome-member.2026-08-26T09-29.md @@ -0,0 +1,105 @@ +# [P1-T15] Outcome-Bearing Interface Member with a Stubbed Stop Reason + +Timestamp: 2026-08-26T09-29 + +Task: [P1-T15] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +### Interface + +`QuickFiler/Interfaces/IQfcDatamodel.cs` — declared + +```csharp +Task DequeueNextItemGroupWithOutcomeAsync( + int quantity, + int timeOut, + TimeSpan firstBatchDeadline, + Action progress +); +``` + +The three pre-existing members (`DequeueNextItemGroupAsync(int, int)`, the four-argument +`DequeueNextItemGroupAsync` overload and `DequeueNextItemGroup(int)`) are byte-unchanged; the new +member and its doc comment are inserted between the four-argument overload and +`DequeueNextItemGroup`. + +### Implementation + +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` — implemented by delegating to the +existing four-argument path for the items and returning a `QfcDequeueBatch` whose `Stop` is +hard-coded to `QfcDequeueStop.QuantitySatisfied`, per D-Plan-1. `using QuickFiler.Interfaces;` +added. + +### Caller + +`QuickFiler/Controllers/QfcHomeController.Iteration.cs` — `IterateQueueAsync` now calls the new +member and reads `batch.Items`: + +```csharp +QfcDequeueBatch batch = await _datamodel.DequeueNextItemGroupWithOutcomeAsync( + _formController.ItemsPerIteration, + 2000, + QfcStreamingDequeueConfidenceGate.DefaultFirstBatchDeadline, + null +); +IList listObjects = batch.Items; +``` + +The `else` branch (`await QfcQueue.CompleteAddingAsync(Token, 10000);`) is left unconditional, as +this task requires; `[P2-T7]` adds the `SourceExhausted` guard. `using QuickFiler.Interfaces;` +added. + +### Tests + +`QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`: + +- `ArrangeIterate` (added by `[P1-T14]` and shared with + `Iterate_HighConfidenceEnabled_DoesNotLoadDirectSynchronousBatch`) now arranges **both** members. + It keeps its `DequeueNextItemGroupAsync(It.Is(quantity), It.Is(timeOut))` setup — which is what + `Iterate_HighConfidenceEnabled_DoesNotLoadDirectSynchronousBatch` consumes, since that test drives + the synchronous `Iterate()` path this plan does not change — and adds a + `DequeueNextItemGroupWithOutcomeAsync` setup returning + `new QfcDequeueBatch(batch, null, QfcDequeueStop.QuantitySatisfied)`. +- The three `mockDataModel.Verify` expressions, located by the `mockDataModel.Verify(` call opening + `m => m.DequeueNextItemGroupAsync(It.IsAny(), It.IsAny())` rather than by line, were + retargeted to the new member with their `Times` arguments preserved: + +| Test | `Times` at base | `Times` post-change | Member named | +| --- | --- | --- | --- | +| `IterateQueueAsync_DataModelComplete` | `Times.Never` | `Times.Never` | `DequeueNextItemGroupWithOutcomeAsync` | +| `IterateQueueAsync_QueueEmpty` | `Times.Once` | `Times.Once` | `DequeueNextItemGroupWithOutcomeAsync` | +| `IterateQueueAsync_Queue2` | `Times.Once` | `Times.Once` | `DequeueNextItemGroupWithOutcomeAsync` | + +- The two synchronous `DequeueNextItemGroup` verifications (base `:343` and `:392`, now `:316` and + `:357`) are untouched. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler/Interfaces/IQfcDatamodel.cs" "QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs" "QuickFiler/Controllers/QfcHomeController.Iteration.cs" "QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~QfcHomeControllerIterationTests" "/Logger:trx;LogFileName=p1-t15.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t15"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t15/p1-t15.trx` + +Total tests 8, Passed 8, **Failed 0**. +`Iterate_HighConfidenceEnabled_DoesNotLoadDirectSynchronousBatch` Passed. + +Post-change line counts (all under the 500-line cap): +`QfcHomeControllerIterationTests.cs` 456, `QfcDatamodel.QueueProcessing.cs` 230, +`IQfcDatamodel.cs` 133, `QfcHomeController.Iteration.cs` 90. + +## Output Summary + +The outcome-bearing member exists end to end (interface, datamodel, `IterateQueueAsync` caller) with +its stop reason stubbed to `QuantitySatisfied`. Format EXIT_CODE 0, compile EXIT_CODE 0, scoped run +EXIT_CODE 0 with 8 passed and 0 failed. `ArrangeIterate` arranges both dequeue members, so the +high-confidence synchronous `Iterate` test keeps its `DequeueNextItemGroupAsync` arrangement, and all +three retargeted verifications name `DequeueNextItemGroupWithOutcomeAsync` with `Times.Never`, +`Times.Once` and `Times.Once` preserved. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t15/p1-t15.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t15/p1-t15.trx new file mode 100644 index 000000000..0684b1914 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t15/p1-t15.trx @@ -0,0 +1,112 @@ + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t16-deadline-guard-red.2026-08-26T09-33.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t16-deadline-guard-red.2026-08-26T09-33.md new file mode 100644 index 000000000..867118246 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t16-deadline-guard-red.2026-08-26T09-33.md @@ -0,0 +1,62 @@ +# [P1-T16] [expect-fail] Deadline-Expired Empty Batch Must Not Close the Queue + +Timestamp: 2026-08-26T09-33 + +Task: [P1-T16] (tagged `[expect-fail]`) +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` — added +`IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding`. + +`ArrangeIterate` gained a `QfcDequeueStop stop = QfcDequeueStop.QuantitySatisfied` parameter, which +is the value the helper now puts on the `QfcDequeueBatch` returned by the mocked +`DequeueNextItemGroupWithOutcomeAsync`. The default preserves every existing call site unchanged. +The new test passes `stop: QfcDequeueStop.DeadlineExpired` with the default empty batch, drives +`IterateQueueAsync`, and asserts `IQfcQueue.CompleteAddingAsync` was invoked `Times.Never`. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding" "/Logger:trx;LogFileName=p1-t16.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t16"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t16/p1-t16.trx` + +TRX counters: `total="1" executed="1" passed="0" failed="1"`. + +Recorded outcome: **Failed**. + +Failure message, quoted verbatim from the TRX (entity references expanded for readability): + +``` +Moq.MockException: a deadline-bounded empty batch must not close the queue +Expected invocation on the mock should never have been performed, but was 1 times: m => m.CompleteAddingAsync(It.IsAny(), It.IsAny()) + +Performed invocations: + + Mock (m): + + IQfcQueue.CompleteAddingAsync(CancellationToken, 10000) +``` + +This is a Moq verification assertion failure raised by `Mock.Verify`, carrying the reason string the +test supplied. The TRX stack trace begins at `Moq.Mock.Verify(...)`, confirming the failure is the +assertion itself and not a build error or an unhandled production exception. The RED state is the +`else` branch of `QuickFiler/Controllers/QfcHomeController.Iteration.cs`, which +`[P1-T15]` deliberately left unconditional: any empty batch closes the queue today, whatever the +stop reason. `[P2-T7]` adds the `SourceExhausted` guard and turns this test green. + +## Output Summary + +Failing-first test for AC2 lands RED by Moq verification assertion. Format EXIT_CODE 0, compile +EXIT_CODE 0, scoped run EXIT_CODE 1 with 1 executed and 1 Failed. The observed invocation shows the +production path calling `CompleteAddingAsync(CancellationToken, 10000)` on a deadline-expired empty +batch, which is exactly the defect issue #446 reports. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t16/p1-t16.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t16/p1-t16.trx new file mode 100644 index 000000000..f52070cfa --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t16/p1-t16.trx @@ -0,0 +1,56 @@ + + + + + + + + + + Debug Trace: + + + Test method QuickFiler.Controllers.Tests.QfcHomeControllerIterationTests.IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding threw exception: +Moq.MockException: a deadline-bounded empty batch must not close the queue +Expected invocation on the mock should never have been performed, but was 1 times: m => m.CompleteAddingAsync(It.IsAny<CancellationToken>(), It.IsAny<int>()) + +Performed invocations: + + Mock<IQfcQueue:1> (m): + + IQfcQueue.CompleteAddingAsync(CancellationToken, 10000) + + at Moq.Mock.Verify(Mock mock, LambdaExpression expression, Times times, String failMessage) in /_/src/Moq/Mock.cs:line 332 + at Moq.Mock`1.Verify[TResult](Expression`1 expression, Func`1 times, String failMessage) in /_/src/Moq/Mock`1.cs:line 857 + at QuickFiler.Controllers.Tests.QfcHomeControllerIterationTests.VerifyCompleteAdding(Mock`1 queue, Func`1 times, String because) in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcHomeControllerIterationTests.cs:line 165 + at QuickFiler.Controllers.Tests.QfcHomeControllerIterationTests.<IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding>d__23.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcHomeControllerIterationTests.cs:line 418 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t17-exhausted-control-green.2026-08-26T09-36.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t17-exhausted-control-green.2026-08-26T09-36.md new file mode 100644 index 000000000..5ac0174c9 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t17-exhausted-control-green.2026-08-26T09-36.md @@ -0,0 +1,40 @@ +# [P1-T17] Source-Exhausted Empty Batch Closes the Queue (AC2 Negative Control) + +Timestamp: 2026-08-26T09-36 + +Task: [P1-T17] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` — added +`IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce`, which arranges an empty +batch whose `Stop` is `QfcDequeueStop.SourceExhausted` through the `ArrangeIterate` `stop` +parameter and asserts `IQfcQueue.CompleteAddingAsync` was invoked `Times.Once`. + +This is the negative control of AC2 and is green in both the pre-fix and post-fix states, so it is +NOT tagged `[expect-fail]`. AC2's failing-first obligation is carried by `[P1-T16]`. The control +matters because it forecloses a degenerate fix: a change that simply stopped calling +`CompleteAddingAsync` would turn `[P1-T16]` green while breaking this test. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce" "/Logger:trx;LogFileName=p1-t17.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t17"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t17/p1-t17.trx` + +Total tests 1, **Passed 1**, Failed 0. + +## Output Summary + +AC2's negative control lands green as planned. Format EXIT_CODE 0, compile EXIT_CODE 0, scoped run +EXIT_CODE 0 with the single test recorded Passed. Paired with `[P1-T16]`, the two tests pin both +sides of the stop-reason discrimination: one stop reason must close the queue and the other must +not. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t17/p1-t17.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t17/p1-t17.trx new file mode 100644 index 000000000..ed9ca41f9 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t17/p1-t17.trx @@ -0,0 +1,35 @@ + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t18-datamodel-deadline-projection-red.2026-08-26T09-45.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t18-datamodel-deadline-projection-red.2026-08-26T09-45.md new file mode 100644 index 000000000..373b68d9a --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t18-datamodel-deadline-projection-red.2026-08-26T09-45.md @@ -0,0 +1,61 @@ +# [P1-T18] [expect-fail] Datamodel Must Project the Deadline-Expired Gate Stop + +Timestamp: 2026-08-26T09-45 + +Task: [P1-T18] (tagged `[expect-fail]`) +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` — added +`DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop`, and +`using Microsoft.Extensions.Time.Testing;`. + +The test builds an uninitialized `QfcDatamodel`, injects a `FakeTimeProvider` through the +`TimeProvider` seam, fills the master queue with ten candidates, enables high-confidence mode with a +`0.90` threshold, and drives scoring through the `ScoringServiceFactory` seam added by `[P1-T5]` so +no live Outlook COM is touched (`.claude/rules/general-unit-test.md` UT4). Every score advances the +fake clock by one second and returns `100L`, which is below the cutoff, so a three-second +`firstBatchDeadline` expires after three scored candidates with an empty accepted set — the gate's +deadline exit. The test then asserts the datamodel projects that gate result as +`QfcDequeueStop.DeadlineExpired`. + +This gates the datamodel-side projection that `[P2-T6]` implements. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop" "/Logger:trx;LogFileName=p1-t18.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t18"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t18/p1-t18.trx` + +TRX counters: `total="1" executed="1" passed="0" failed="1"`. + +Recorded outcome: **Failed**. + +Failure message, quoted verbatim from the TRX: + +``` +Expected batch.Stop to be QfcDequeueStop.DeadlineExpired {value: 2} because a deadline-bounded empty batch must not be reported as quantity satisfaction, but found QfcDequeueStop.QuantitySatisfied {value: 0}. +``` + +This is a FluentAssertions assertion-failure message, not a build error and not an unhandled +exception; the TRX stack trace begins at `FluentAssertions.Primitives.EnumAssertions.Be`. The RED +state has two stubbed layers, both deliberate under D-Plan-1: the gate hard-codes +`QfcDequeueStop.QuantitySatisfied` at all four exits (`[P1-T8]`), and the datamodel's +`DequeueNextItemGroupWithOutcomeAsync` hard-codes the same value (`[P1-T15]`). The empty `Items` +half of the assertion already passes, confirming the test really drives the gate's deadline exit. + +## Output Summary + +Failing-first test for the datamodel-side stop projection lands RED by assertion. Format EXIT_CODE +0, compile EXIT_CODE 0, scoped run EXIT_CODE 1 with 1 executed and 1 Failed. +`QfcQueuePurePathsTests.cs` finishes at 262 lines. `[P2-T1]` discriminates the gate's exits and +`[P2-T6]` projects the gate stop through the datamodel, turning this test green. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t18/p1-t18.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t18/p1-t18.trx new file mode 100644 index 000000000..351a140b7 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t18/p1-t18.trx @@ -0,0 +1,72 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + Expected batch.Stop to be QfcDequeueStop.DeadlineExpired {value: 2} because a deadline-bounded empty batch must not be reported as quantity satisfaction, but found QfcDequeueStop.QuantitySatisfied {value: 0}. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Primitives.EnumAssertions`2.Be(TEnum expected, String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Primitives/EnumAssertions.cs:line 68 + at QuickFiler.Controllers.Tests.QfcQueuePurePathsTests.<DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop>d__10.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcQueuePurePathsTests.cs:line 254 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t19-iteration-exception-branches.2026-08-26T09-39.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t19-iteration-exception-branches.2026-08-26T09-39.md new file mode 100644 index 000000000..44e4f6c6e --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t19-iteration-exception-branches.2026-08-26T09-39.md @@ -0,0 +1,100 @@ +# [P1-T19] Cover the Two Exception Branches of `IterateQueueAsync` + +Timestamp: 2026-08-26T09-39 + +Task: [P1-T19] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` — added three tests that reach the +exception branches of `QuickFiler/Controllers/QfcHomeController.Iteration.cs`. Those branches were +`:38-52` at base and are now `:42-56`, shifted by the four lines `[P1-T15]` added to the caller; +the code in them is unchanged. + +| Test | Arrangement | Branch reached | +| --- | --- | --- | +| `IterateQueueAsync_DequeueThrowsOperationCanceled_SwallowsAndReturns` | dequeue throws `OperationCanceledException` | `catch (OperationCanceledException)` | +| `IterateQueueAsync_DequeueThrowsWhenTokenCancelled_SwallowsAndReturns` | dequeue cancels the controller token from inside its callback, then throws `InvalidOperationException` | `catch (System.Exception)` with `Token.IsCancellationRequested` true | +| `IterateQueueAsync_DequeueThrowsWhenTokenNotCancelled_Rethrows` | dequeue throws `InvalidOperationException` with no cancellation pending | `catch (System.Exception)` `else` — rethrow | + +The second test cancels from **inside** the callback, as the task requires: the entry guard +`Token.ThrowIfCancellationRequested()` sits outside the `try`, so a token already cancelled at entry +escapes the method uncaught and never reaches the `IsCancellationRequested` branch. The controller's +private `_token` field is assigned through the file's `SetPrivateField` helper so the test and the +production code share one `CancellationTokenSource`. + +All three are green in both the pre-fix and post-fix states and are NOT tagged `[expect-fail]`. + +### Reuse of `ArrangeIterate` and the 500-line cap + +The task requires reusing `ArrangeIterate` so the file stays under the 500-line cap. After +`[P1-T15]`, `[P1-T16]` and `[P1-T17]` the file stood at 513 lines, over the cap, so this task also +performed the reductions below. None changes the behaviour of any test. + +- `ArrangeIterate` gained `outcome` (`Func>`), which replaces the dequeue + result outright and is what lets each exception test arrange a throwing dequeue in one call. +- `ArrangeIterate`'s `quantity` and `timeOut` matchers became optional, defaulting to the new + `AnyValue` matcher. Every call site that passed `q => true, t => true` now omits them. The two + pinned call sites are unchanged and still reproduce their concrete arguments: `q => q == 8` with + `t => t == 2000` (line 270), and `q => q == itemsPerIteration` with + `itemsPerIteration: itemsPerIteration` (lines 339-340). The base `It.IsAny()` timeout on the + second of those is now expressed as the `AnyValue` default, which is the same matcher semantics. +- Call sites use tuple deconstruction instead of three separate local assignments. +- Four raw `_controller.GetType().GetField(...).SetValue(...)` blocks were replaced by one + `SetPrivateField(string, object)` helper. +- The two repeated queue verifications became `VerifyCompleteAdding` and `VerifyEnqueue` helpers. + Their `times` parameter is `Func`, not `Times`, because `Times.Never` and `Times.Once` are + static methods in Moq 4 and a method group cannot bind to a `Times` parameter. +- The three `mockDataModel.Verify` expressions that `[P1-T15]` retargeted are **untouched**: each + still names `DequeueNextItemGroupWithOutcomeAsync` inline with its `Times.Never`, `Times.Once` + and `Times.Once` argument, so `[P1-T15]`'s acceptance still holds against the current tree. +- XML doc comments on the helpers and on the tests added by `[P1-T16]`, `[P1-T17]` and this task + were shortened. Assertion reason strings were left byte-identical so the failure message quoted in + the `[P1-T16]` artifact remains reproducible; the `p1-t16` and `p1-t17` TRX files were re-run + against this final tree and reproduce their recorded outcomes exactly. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~QfcHomeControllerIterationTests" "/Logger:trx;LogFileName=p1-t19.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t19"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t19/p1-t19.trx` + +TRX counters: `total="13" executed="13" passed="12" failed="1"`. + +The three named tests are recorded **Passed**: + +``` +Passed IterateQueueAsync_DequeueThrowsOperationCanceled_SwallowsAndReturns +Passed IterateQueueAsync_DequeueThrowsWhenTokenCancelled_SwallowsAndReturns +Passed IterateQueueAsync_DequeueThrowsWhenTokenNotCancelled_Rethrows +``` + +The single failed test is `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding`, +which `[P1-T16]` tagged `[expect-fail]` and which stays Failed until `[P2-T7]` lands the +`SourceExhausted` guard. No other test failed. + +Command: `(Get-Content "QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs").Count` +EXIT_CODE: 0 + +| File | Condition | Post-change | Result | +| --- | --- | --- | --- | +| `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` | at most 500 | **494** | PASS | + +## Output Summary + +The two exception branches of `IterateQueueAsync` are now driven by three passing tests, which is +what makes the `[P5-T7]` changed-file coverage gate on +`QuickFiler/Controllers/QfcHomeController.Iteration.cs` reachable rather than merely demanding: the +eleven uncovered occurrences recorded at base (`lines=80 covered=69 rate=86.25`) are all inside +those branches. Format EXIT_CODE 0, compile EXIT_CODE 0, scoped run EXIT_CODE 1 with 13 executed, +12 passed and the single expected `[expect-fail]` failure. The file finishes at 494 of the 500-line +cap. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t19/p1-t19.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t19/p1-t19.trx new file mode 100644 index 000000000..7a0bfc7db --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t19/p1-t19.trx @@ -0,0 +1,211 @@ + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + Test method QuickFiler.Controllers.Tests.QfcHomeControllerIterationTests.IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding threw exception: +Moq.MockException: a deadline-bounded empty batch must not close the queue +Expected invocation on the mock should never have been performed, but was 1 times: m => m.CompleteAddingAsync(It.IsAny<CancellationToken>(), It.IsAny<int>()) + +Performed invocations: + + Mock<IQfcQueue:7> (m): + + IQfcQueue.CompleteAddingAsync(CancellationToken, 10000) + + at Moq.Mock.Verify(Mock mock, LambdaExpression expression, Times times, String failMessage) in /_/src/Moq/Mock.cs:line 332 + at Moq.Mock`1.Verify[TResult](Expression`1 expression, Func`1 times, String failMessage) in /_/src/Moq/Mock`1.cs:line 857 + at QuickFiler.Controllers.Tests.QfcHomeControllerIterationTests.VerifyCompleteAdding(Mock`1 queue, Func`1 times, String because) in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcHomeControllerIterationTests.cs:line 165 + at QuickFiler.Controllers.Tests.QfcHomeControllerIterationTests.<IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding>d__23.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcHomeControllerIterationTests.cs:line 418 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t2-onrejected-seam-red.2026-08-26T09-20.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t2-onrejected-seam-red.2026-08-26T09-20.md new file mode 100644 index 000000000..d89279b79 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t2-onrejected-seam-red.2026-08-26T09-20.md @@ -0,0 +1,65 @@ +# [P1-T2] [expect-fail] #426 Rejection Seam and Its Failing-First Test + +Timestamp: 2026-08-26T09-20 + +Task: [P1-T2] (tagged `[expect-fail]`) +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +Production — `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`: + +- Added a final optional constructor parameter `Action onRejected = null` to the + widest constructor, with an XML `` doc stating the #426 rationale. +- Added `private readonly Action _onRejected;` and assigned it in that constructor. +- **No invocation of `_onRejected` was added.** Per D5 and D-Plan-1 the invocation lands in + `[P2-T2]`, which is what turns this test green. + +Test — `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`: + +- Both `CreateGate` overloads gained an `Action onRejected = null` parameter and + forward it. +- The exact reflective lookup was widened from the 8-type to the 9-type shape, with the guard + message updated to name the nine-parameter seam. The lookup remains a single `GetConstructor` + call, so the `[P4-T20]` count of 1 is unaffected. +- Added `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce`, asserting the sink is + invoked exactly once for a single below-cutoff candidate and that the discarded item is the + same instance. It also re-asserts the drop-on-reject contract (`result.Should().BeEmpty()`). + +## Verification + +### Intra-phase compile + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +The tree compiles. The RED state below is therefore an assertion failure against a compiling +tree, which is exactly what AC4 requires. + +### Scoped run (expected to fail) + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce" "/Logger:trx;LogFileName=p1-t2.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t2"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +- Total: `1` +- Failed: `1` +- Passed: `0` + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t2/p1-t2.trx` + +Recorded outcome for `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce`: **Failed**. + +Failure message, quoted verbatim from the TRX `` element: + +``` +Expected rejected to contain a single item because the gate must report each discarded candidate exactly once, but the collection is empty. +``` + +This is a FluentAssertions assertion-failure message. It is not a build error and not an +unhandled exception. + +## Output Summary + +Seam landed without an invocation; regression test lands RED by assertion against a compiling +tree. Compile exit 0, scoped run exit 1 with 1 failed as designed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t2/p1-t2.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t2/p1-t2.trx new file mode 100644 index 000000000..fa8e4f48f --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t2/p1-t2.trx @@ -0,0 +1,72 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + Expected rejected to contain a single item because the gate must report each discarded candidate exactly once, but the collection is empty. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Collections.GenericCollectionAssertions`3.ContainSingle(String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Collections/GenericCollectionAssertions.cs:line 1186 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce>d__14.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.cs:line 347 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t20-red-index.2026-08-26T09-50.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t20-red-index.2026-08-26T09-50.md new file mode 100644 index 000000000..1c7094e6e --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t20-red-index.2026-08-26T09-50.md @@ -0,0 +1,65 @@ +# [P1-T20] Phase 1 RED-State Commit and `[expect-fail]` TRX Index + +Timestamp: 2026-08-26T09-50 + +Task: [P1-T20] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Commands + +Command: `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` +EXIT_CODE: 0 + +Command: `git commit -m "test(446): failing-first regression tests for 446, 426 and 427-A producer side"` +EXIT_CODE: 0 + +Resulting HEAD sha: **`68d525a2d9219ee0d00f08418ba0b46d8fc68187`** +(`68d525a2 test(446): failing-first regression tests for 446, 426 and 427-A producer side`, +one commit ahead of `3d4e8e9d chore(446): capture phase 0 policy reads, bootstrap and baselines`.) + +Command: `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` +EXIT_CODE: 0 +Output: zero lines. + +The untracked `.claude/state/` directory was deliberately left unstaged; the `git add` pathspec +names only `QuickFiler`, `QuickFiler.Test` and the feature folder. + +## Index of the nine `[expect-fail]` TRX artifacts + +| # | Task | Test | TRX path | +| --- | --- | --- | --- | +| 1 | `[P1-T2]` | `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t2/p1-t2.trx` | +| 2 | `[P1-T3]` | `DequeueAsync_OnRejectedThrows_ScanContinues` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t3/p1-t3.trx` | +| 3 | `[P1-T6]` | `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t6/p1-t6.trx` | +| 4 | `[P1-T9]` | `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t9/p1-t9.trx` | +| 5 | `[P1-T10]` | `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t10/p1-t10.trx` | +| 6 | `[P1-T12]` | `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t12/p1-t12.trx` | +| 7 | `[P1-T13]` | `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t13/p1-t13.trx` | +| 8 | `[P1-T16]` | `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t16/p1-t16.trx` | +| 9 | `[P1-T18]` | `DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop` | `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t18/p1-t18.trx` | + +Nine TRX paths, one per `[expect-fail]` task in Phase 1. Every one records its test as **Failed** +with an assertion-failure message (FluentAssertions for eight of them, a Moq `Verify` assertion for +`[P1-T16]`); none failed with a build error or an unhandled exception. + +## Committed change set + +Production (5 files): `QuickFiler/Controllers/QfcDatamodel.cs`, +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, +`QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`, +`QuickFiler/Controllers/QfcHomeController.Iteration.cs`, +`QuickFiler/Interfaces/IQfcDatamodel.cs`. + +Test (6 files): `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, +`...Part2.cs`, `...Part3.cs`, `QuickFiler.Test/Controllers/QfcDatamodelTests.cs`, +`QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs`, +`QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`. + +No new file was added to either project and neither `.csproj` was edited, per D2 and D4. +`QuickFiler.Test/Controllers/QfcFormControllerTests.cs` is untouched, per D-Plan-2. + +## Output Summary + +Phase 1 RED state committed at `68d525a2`. `git add` and `git commit` both EXIT_CODE 0; +`git status --porcelain -- "QuickFiler" "QuickFiler.Test"` produces zero output lines. The index +names nine `[expect-fail]` TRX paths, one per Phase 1 `[expect-fail]` task. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t3-onrejected-throws-red.2026-08-26T09-23.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t3-onrejected-throws-red.2026-08-26T09-23.md new file mode 100644 index 000000000..86b775b73 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t3-onrejected-throws-red.2026-08-26T09-23.md @@ -0,0 +1,47 @@ +# [P1-T3] [expect-fail] Rejection Sink Failure Must Not Abort the Scan + +Timestamp: 2026-08-26T09-23 + +Task: [P1-T3] (tagged `[expect-fail]`) +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` — added +`DequeueAsync_OnRejectedThrows_ScanContinues`. The test drives one below-cutoff candidate whose +rejection sink throws `InvalidOperationException`, followed by one above-cutoff candidate, and +asserts both: + +1. the sink was invoked exactly once, for the below-cutoff item; and +2. the scan continued and accepted the following above-cutoff candidate. + +Assertion (1) is what makes this a real gate. A test that asserted only (2) would pass vacuously +in the RED state, because no sink exists yet and the scan already continues past a rejected item. + +## Verification + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueAsync_OnRejectedThrows_ScanContinues" "/Logger:trx;LogFileName=p1-t3.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t3"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t3/p1-t3.trx` + +Recorded outcome for `DequeueAsync_OnRejectedThrows_ScanContinues`: **Failed** +(`outcome="Failed"` on the `UnitTestResult` element). + +Failure message, quoted verbatim from the TRX `` element: + +``` +Expected invocations to contain a single item because the throwing sink must still be invoked once for the rejected item, but the collection is empty. +``` + +This is a FluentAssertions assertion-failure message, not a build error and not an unhandled +exception. + +## Output Summary + +Test lands RED by assertion on the invocation-count conjunct, exactly as intended. Compile exit 0, +scoped run exit 1 with the single test Failed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t3/p1-t3.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t3/p1-t3.trx new file mode 100644 index 000000000..650f2b7d5 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t3/p1-t3.trx @@ -0,0 +1,72 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + Expected invocations to contain a single item because the throwing sink must still be invoked once for the rejected item, but the collection is empty. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Collections.GenericCollectionAssertions`3.ContainSingle(String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Collections/GenericCollectionAssertions.cs:line 1186 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_OnRejectedThrows_ScanContinues>d__15.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.cs:line 383 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t4-accepted-negative-control.2026-08-26T09-25.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t4-accepted-negative-control.2026-08-26T09-25.md new file mode 100644 index 000000000..90b9c4e26 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t4-accepted-negative-control.2026-08-26T09-25.md @@ -0,0 +1,36 @@ +# [P1-T4] Negative Control — An Accepted Candidate Does Not Invoke the Rejection Sink + +Timestamp: 2026-08-26T09-25 + +Task: [P1-T4] (not tagged `[expect-fail]`) +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` — added +`DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected` as the AC13 negative control. It arranges +a single above-cutoff candidate with a recording rejection sink and asserts the candidate is +accepted while the sink stays empty. + +This test is green in both the pre-fix and post-fix states by construction — pre-fix because no +sink is ever invoked, post-fix because `[P2-T2]` invokes the sink only in the `else` of the accept +decision — so it is deliberately not tagged `[expect-fail]`. Its value is as a guard against an +over-broad `[P2-T2]` implementation that fired the sink for every scanned candidate. + +## Verification + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected" "/Logger:trx;LogFileName=p1-t4.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t4"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t4/p1-t4.trx` + +Recorded outcome for `DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected`: **Passed** +(`outcome="Passed"` on the `UnitTestResult` element; the run-level element records +`outcome="Completed"`). + +## Output Summary + +Negative control added and Passed on the first run, as the acceptance condition requires. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t4/p1-t4.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t4/p1-t4.trx new file mode 100644 index 000000000..68fac8f9e --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t4/p1-t4.trx @@ -0,0 +1,61 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t5-scoring-relocation.2026-08-26T09-29.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t5-scoring-relocation.2026-08-26T09-29.md new file mode 100644 index 000000000..2ff1f8cb9 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t5-scoring-relocation.2026-08-26T09-29.md @@ -0,0 +1,48 @@ +# [P1-T5] Scoring-Method Relocation and Injectable Scoring Seam + +Timestamp: 2026-08-26T09-29 + +Task: [P1-T5] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +Per D3, `ScoreRemainingQueueMailItemAsync` was moved verbatim out of +`QuickFiler/Controllers/QfcDatamodel.cs` (it occupied `:363-377` at baseline) into +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`. Signature and behaviour are otherwise +unchanged: same accessibility, same parameters, same return type, same `Probability debug` log +line text. + +Alongside it, the injectable factory seam was added: + +```csharp +internal Func ScoringServiceFactory { get; set; } = + () => new FolderScoringService(); +``` + +and the hard-coded `new FolderScoringService()` inside the relocated method was replaced by a call +through that seam (`var scoringService = ScoringServiceFactory();`). The default preserves +production behaviour exactly. + +This task precedes every high-confidence-path test task in this phase because the seam is what +keeps `[P1-T6]` and `[P1-T12]` off live Outlook COM, which `.claude/rules/general-unit-test.md` +UT4 prohibits. + +## Verification + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `wc -l "QuickFiler/Controllers/QfcDatamodel.cs" "QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs"` +EXIT_CODE: 0 + +| Path | Baseline (`[P0-T14]`) | Post-change | Condition | Result | +| --- | --- | --- | --- | --- | +| `QuickFiler/Controllers/QfcDatamodel.cs` | 496 | **480** | strictly less than 496 | satisfied (16 lines freed) | +| `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` | 177 | **203** | at most 500 | satisfied (297 of headroom) | + +## Output Summary + +Scoring method relocated and seamed. `QfcDatamodel.cs` drops from 496 to 480 lines, buying 16 +lines of budget under the 500-line cap before any widening. `QfcDatamodel.QueueProcessing.cs` +grows from 177 to 203, well inside the cap. Compile exit 0. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t6-datamodel-unhook-red.2026-08-26T09-34.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t6-datamodel-unhook-red.2026-08-26T09-34.md new file mode 100644 index 000000000..de8049af9 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t6-datamodel-unhook-red.2026-08-26T09-34.md @@ -0,0 +1,65 @@ +# [P1-T6] [expect-fail] Datamodel Releases the Rejected Candidate's Monitor Hook + +Timestamp: 2026-08-26T09-34 + +Task: [P1-T6] (tagged `[expect-fail]`) +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` — added +`DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor`. + +It follows the `Mock` plus reflection-injection pattern already established in +this file by `DequeueNextItemGroupAsync_HighConfidenceDisabled_PreservesDirectBatchDequeue`, +reusing that file's own `CreateUninitializedDatamodel` and `SetPrivateField` helpers (the same +helpers `QfcDatamodelTests.cs` declares). High-confidence mode is enabled, the threshold is `0.90` +and the single candidate scores `100`, so it is discarded. + +Scoring is supplied by a `Mock` injected through the `ScoringServiceFactory` +seam added by `[P1-T5]`, so the test touches no live Outlook COM, satisfying +`.claude/rules/general-unit-test.md` UT4. + +The test asserts the datamodel's own `_moveMonitor.UnhookItem` is invoked exactly once for the +below-cutoff candidate, and re-asserts that the candidate is still absent from the result and +still removed from the master queue. + +## Verification + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor" "/Logger:trx;LogFileName=p1-t6.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t6"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t6/p1-t6.trx` + +Recorded outcome: **Failed** (`outcome="Failed"`). + +Failure message, quoted verbatim from the TRX `ErrorInfo/Message` element: + +``` +Test method QuickFiler.Controllers.Tests.QfcQueuePurePathsTests.DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor threw exception: +Moq.MockException: the datamodel must release the rejected candidate's monitor hook exactly once +Expected invocation on the mock once, but was 0 times: x => x.UnhookItem(Mock.Object) + +Performed invocations: + + Mock (x): + No invocations performed. +``` + +This is a `Moq.MockException` raised by the test's own `Verify` call — Moq's assertion-failure +mechanism, carrying the `because` reason supplied by the test. It is not a build error and it is +not an unhandled exception escaping the system under test: the dequeue call itself completed +normally and the two preceding FluentAssertions checks (`result` empty, `masterQueue.Count == 0`) +both passed before the verification ran. MSTest renders every non-`AssertFailedException` +verification failure with the "threw exception" preamble; the substantive content is the +"Expected invocation on the mock once, but was 0 times" assertion. + +## Output Summary + +Test lands RED on the unhook-invocation assertion against a compiling tree. Compile exit 0, +scoped run exit 1 with the single test Failed. `[P2-T5]` wires `onRejected: TryReleaseRejectedHook` +and turns it green. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t6/p1-t6.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t6/p1-t6.trx new file mode 100644 index 000000000..2fe91e827 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t6/p1-t6.trx @@ -0,0 +1,80 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + Test method QuickFiler.Controllers.Tests.QfcQueuePurePathsTests.DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor threw exception: +Moq.MockException: the datamodel must release the rejected candidate's monitor hook exactly once +Expected invocation on the mock once, but was 0 times: x => x.UnhookItem(Mock<MailItem:1>.Object) + +Performed invocations: + + Mock<IEmailMoveMonitor:1> (x): + No invocations performed. + + at Moq.Mock.Verify(Mock mock, LambdaExpression expression, Times times, String failMessage) in /_/src/Moq/Mock.cs:line 332 + at Moq.Mock`1.Verify(Expression`1 expression, Func`1 times, String failMessage) in /_/src/Moq/Mock`1.cs:line 787 + at QuickFiler.Controllers.Tests.QfcQueuePurePathsTests.<DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor>d__9.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcQueuePurePathsTests.cs:line 185 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t7-carrier-types.2026-08-26T09-38.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t7-carrier-types.2026-08-26T09-38.md new file mode 100644 index 000000000..998c2f2dc --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t7-carrier-types.2026-08-26T09-38.md @@ -0,0 +1,48 @@ +# [P1-T7] Carrier Types Introduced With No Consumer + +Timestamp: 2026-08-26T09-38 + +Task: [P1-T7] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Interfaces/IQfcDatamodel.cs`: + +- Added `public enum QfcDequeueStop { QuantitySatisfied, SourceExhausted, DeadlineExpired }`. +- Added `public readonly struct QfcDequeueBatch` with a constructor taking + `IList items`, `IList preScored` and `QfcDequeueStop stop`. + `Items` and `PreScored` each return an empty list when the backing field is null, so a defaulted + struct returned by an unconfigured loose Moq setup is inert rather than a null-reference trap. +- Added `using QuickFiler.Controllers;`, required to reference `QfcPreScoredItem`. + +`QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`: + +- Added `internal readonly struct QfcGateBatch` with `Accepted`, `Stop` and `Scanned` members. + `Accepted` likewise coerces a null backing field to an empty list. +- Added `using QuickFiler.Interfaces;`, required to reference `QfcDequeueStop`. + +All three types are plain `readonly struct` / `enum` with get-only properties, because `net481` +has no `IsExternalInit` and therefore no `record`, `record struct` or `init` accessor. + +No consumer was added by this task: `DequeueAsync` still returns `Task>` at this +point, and nothing constructs a `QfcGateBatch` or a `QfcDequeueBatch` yet. + +## Verification + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 +Output Summary: build succeeded; no line matching `: error` in the output. + +Command: `wc -l "QuickFiler/Interfaces/IQfcDatamodel.cs"` +EXIT_CODE: 0 + +| Path | Baseline | Post-change | Condition | Result | +| --- | --- | --- | --- | --- | +| `QuickFiler/Interfaces/IQfcDatamodel.cs` | 59 | **118** | at most 500 | satisfied | +| `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` | 177 | **221** | (no gate this task) | recorded | + +## Output Summary + +Three carrier types added in the two owned files D2 designates for them, with no new production +file and no project-file edit. Compile exit 0. `IQfcDatamodel.cs` at 118 of 500. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t8-gate-batch-return.2026-08-26T09-44.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t8-gate-batch-return.2026-08-26T09-44.md new file mode 100644 index 000000000..3b847ba13 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t8-gate-batch-return.2026-08-26T09-44.md @@ -0,0 +1,63 @@ +# [P1-T8] Gate Returns `QfcGateBatch` With the Stop Reason Stubbed + +Timestamp: 2026-08-26T09-44 + +Task: [P1-T8] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`: + +- `DequeueAsync` now returns `Task`. +- `Accepted` carries each accepted `MailItem` wrapped as `new QfcPreScoredItem(mailItem, string.Empty)` + — the deliberate D-Plan-1 stub that `[P2-T3]` replaces with the real folder. +- `Scanned` carries the existing `scanned` counter (its declaration moved above the degenerate + `quantity <= 0` exit so every exit can report it). +- `Stop` is hard-coded to `QfcDequeueStop.QuantitySatisfied` at all four exits per D-Plan-1. + `QuantitySatisfied` is chosen deliberately over `SourceExhausted`: with `SourceExhausted` + stubbed, `[P1-T10]`'s `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` would pass + vacuously in the RED state and would gate nothing. + +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` — the single call site now reads the batch +and projects `Accepted` back to `IList` before `UnhookDequeuedNodes`, so the datamodel's +observable behaviour is unchanged at this point. + +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` — the reflective +`DequeueAsync` helper now casts to `Task` (in a new `DequeueBatchAsync` helper that +performs the single `GetMethod` lookup) and the existing `DequeueAsync` helper projects +`Accepted` back to `IList`, so the pre-existing gate tests keep their current shape. + +## Verification + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~QfcStreamingDequeueConfidenceGateTests|FullyQualifiedName~QfcQueuePurePathsTests" "/Logger:trx;LogFileName=p1-t8.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t8"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +- Total: `32` +- Passed: `29` +- Failed: `3` + +The three failures are exactly the tests already tagged `[expect-fail]`: + +| Failed test | Tagged by | +| --- | --- | +| `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` | `[P1-T2]` | +| `DequeueAsync_OnRejectedThrows_ScanContinues` | `[P1-T3]` | +| `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` | `[P1-T6]` | + +There is **no** failure other than those three, which is the acceptance condition. In particular +all 23 pre-existing gate tests and the pre-existing +`DequeueNextItemGroupAsync_HighConfidenceDisabled_PreservesDirectBatchDequeue` still pass through +the projected helper. + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t8/p1-t8.trx` + +## Output Summary + +Gate return type widened to `QfcGateBatch` with `Stop` stubbed to `QuantitySatisfied` and +`PredeterminedFolder` stubbed to `string.Empty`. Compile exit 0; scoped run 29 passed, 3 failed, +all three pre-tagged `[expect-fail]`. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t8/p1-t8.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t8/p1-t8.trx new file mode 100644 index 000000000..fcda31db1 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t8/p1-t8.trx @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + Test method QuickFiler.Controllers.Tests.QfcQueuePurePathsTests.DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor threw exception: +Moq.MockException: the datamodel must release the rejected candidate's monitor hook exactly once +Expected invocation on the mock once, but was 0 times: x => x.UnhookItem(Mock<MailItem:9>.Object) + +Performed invocations: + + Mock<IEmailMoveMonitor:2> (x): + No invocations performed. + + at Moq.Mock.Verify(Mock mock, LambdaExpression expression, Times times, String failMessage) in /_/src/Moq/Mock.cs:line 332 + at Moq.Mock`1.Verify(Expression`1 expression, Func`1 times, String failMessage) in /_/src/Moq/Mock`1.cs:line 787 + at QuickFiler.Controllers.Tests.QfcQueuePurePathsTests.<DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor>d__9.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcQueuePurePathsTests.cs:line 185 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + Expected invocations to contain a single item because the throwing sink must still be invoked once for the rejected item, but the collection is empty. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Collections.GenericCollectionAssertions`3.ContainSingle(String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Collections/GenericCollectionAssertions.cs:line 1186 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_OnRejectedThrows_ScanContinues>d__16.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.cs:line 397 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + Expected rejected to contain a single item because the gate must report each discarded candidate exactly once, but the collection is empty. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Collections.GenericCollectionAssertions`3.ContainSingle(String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Collections/GenericCollectionAssertions.cs:line 1186 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce>d__15.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.cs:line 361 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t9-deadline-stop-red.2026-08-26T09-49.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t9-deadline-stop-red.2026-08-26T09-49.md new file mode 100644 index 000000000..21e549909 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t9-deadline-stop-red.2026-08-26T09-49.md @@ -0,0 +1,48 @@ +# [P1-T9] [expect-fail] Deadline Expiry Reports `DeadlineExpired` + +Timestamp: 2026-08-26T09-49 + +Task: [P1-T9] (tagged `[expect-fail]`) +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs` — added +`DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop`, plus the +`using QuickFiler.Interfaces;` directive required to name `QfcDequeueStop`. + +The test follows the established `FakeTimeProvider` pattern from +`QfcStreamingDequeueConfidenceGateTests.Part2.cs:36-69`: ten candidates that all score below the +cutoff, each score advancing the fake clock by one second against a three-second first-batch +deadline. It asserts `Stop == QfcDequeueStop.DeadlineExpired` and an empty `Accepted`. + +No wall-clock wait, no `Thread.Sleep` and no `Task.Delay` is used, satisfying the determinism +requirements of `.claude/rules/general-unit-test.md`. + +## Verification + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop" "/Logger:trx;LogFileName=p1-t9.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p1-t9"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t9/p1-t9.trx` + +Recorded outcome: **Failed**. + +Failure message, quoted verbatim from the TRX: + +``` +Expected batch.Stop to be QfcDequeueStop.DeadlineExpired {value: 2} because an empty batch caused by the first-batch deadline is not source exhaustion, but found QfcDequeueStop.QuantitySatisfied {value: 0}. +``` + +This is a FluentAssertions assertion-failure message. It confirms the D-Plan-1 stub is in force +(`QuantitySatisfied` at every exit) and that the test discriminates against it, so the test is a +real gate rather than a vacuous one. + +## Output Summary + +Test lands RED by assertion on the stop reason. Compile exit 0, scoped run exit 1 with the single +test Failed. `[P2-T1]` maps the deadline exit to `DeadlineExpired` and turns it green. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t9/p1-t9.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t9/p1-t9.trx new file mode 100644 index 000000000..9544ed152 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t9/p1-t9.trx @@ -0,0 +1,72 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + Expected batch.Stop to be QfcDequeueStop.DeadlineExpired {value: 2} because an empty batch caused by the first-batch deadline is not source exhaustion, but found QfcDequeueStop.QuantitySatisfied {value: 0}. + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Primitives.EnumAssertions`2.Be(TEnum expected, String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Primitives/EnumAssertions.cs:line 68 + at QuickFiler.Controllers.Tests.QfcStreamingDequeueConfidenceGateTests.<DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop>d__36.MoveNext() in C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\Controllers\QfcStreamingDequeueConfidenceGateTests.Part3.cs:line 187 +--- End of stack trace from previous location where exception was thrown --- + at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() + at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) + at Microsoft.VisualStudio.TestPlatform.MSTest.TestAdapter.Execution.TestMethodInfo.<ExecuteInternalAsync>d__58.MoveNext() + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for C:\Users\REDACTED-USER\repos\TaskMaster\.claude\worktrees\agent-ab67db189e5df1287\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t1-stop-reason-discrimination.2026-08-26T09-51.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t1-stop-reason-discrimination.2026-08-26T09-51.md new file mode 100644 index 000000000..cba29b53e --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t1-stop-reason-discrimination.2026-08-26T09-51.md @@ -0,0 +1,55 @@ +# [P2-T1] Discriminate the Gate Stop Reasons + +Timestamp: 2026-08-26T09-51 + +Task: [P2-T1] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` — the four `DequeueAsync` exits now +report discriminated stop reasons instead of the `QfcDequeueStop.QuantitySatisfied` stub landed by +`[P1-T8]` (per D-Plan-1): + +- degenerate `quantity <= 0` exit: `QfcDequeueStop.QuantitySatisfied` (unchanged). +- first-batch deadline exit (immediately after `LogDeadlineExpiry`): now + `QfcDequeueStop.DeadlineExpired`. +- take-returned-null exit (`timeOut <= 0` or already-waited with an inactive source): now + `QfcDequeueStop.SourceExhausted`. +- loop-completion exit (`accepted.Count == quantity`): `QfcDequeueStop.QuantitySatisfied` + (unchanged). + +`LogDeadlineExpiry` and `LogScore` message text is byte-for-byte unchanged. + +## Verification + +Command: `dotnet tool run csharpier check "QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs"` +EXIT_CODE: 1 (first pass; the edited `return` collapsed to one line under CSharpier) + +Command: `dotnet tool run csharpier format "QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop|FullyQualifiedName~DequeueAsync_SourceDrained_ReportsSourceExhaustedStop" "/Logger:trx;LogFileName=p2-t1.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p2-t1"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t1/p2-t1.trx` + +Counters: total 2, executed 2, **passed 2**, failed 0, error 0, timeout 0, aborted 0. + +- `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` = **Passed** + (was Failed at `[P1-T9]`). +- `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` = **Passed** + (was Failed at `[P1-T10]`). + +TRX hygiene: the TRX was scrubbed of the absolute worktree path, the account name and the machine +name, then re-parsed as XML; ``, all test names and all outcomes survive the scrub +unchanged. A case-insensitive search for the account name and the machine name across the feature +folder returns no match. + +## Output Summary + +Both `[expect-fail]` tests from Phase 1 transition Failed -> Passed. Format EXIT_CODE 0 after one +formatter rewrite, compile EXIT_CODE 0, scoped run EXIT_CODE 0 with 2 of 2 Passed and 0 Failed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t1/p2-t1.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t1/p2-t1.trx new file mode 100644 index 000000000..e86eb1adf --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t1/p2-t1.trx @@ -0,0 +1,67 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t2-rejection-path.2026-08-26T09-53.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t2-rejection-path.2026-08-26T09-53.md new file mode 100644 index 000000000..f7e8d166e --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t2-rejection-path.2026-08-26T09-53.md @@ -0,0 +1,60 @@ +# [P2-T2] Rejection Path on the Below-Cutoff Branch (Issue #426) + +Timestamp: 2026-08-26T09-53 + +Task: [P2-T2] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` — the `score >= _cutoff` accept +decision inside `DequeueAsync` gained an `else` branch that invokes the `[P1-T2]` `_onRejected` +seam: + +``` +else +{ + try { _onRejected?.Invoke(mailItem); } + catch (System.Exception e) { logger.Error("Rejection sink threw ...", e); } +} +``` + +The catch is deliberate and narrow in effect: a failing move monitor must not abort the scan, +because aborting would strand the remaining candidates of the batch. The candidate is still +discarded on both paths, so the drop-on-reject contract is unchanged. + +`TryUnhookOrReplace` was deliberately NOT reused: its recovery path pulls a replacement item out of +`_masterQueue`, which is meaningless for a candidate the gate is discarding. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce|FullyQualifiedName~DequeueAsync_OnRejectedThrows_ScanContinues|FullyQualifiedName~DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected|FullyQualifiedName~DequeueAsync_BelowThresholdItemsAreDiscarded" "/Logger:trx;LogFileName=p2-t2.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p2-t2"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t2/p2-t2.trx` + +Counters: total 4, executed 4, **passed 4**, failed 0, error 0, timeout 0, aborted 0. + +- `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` = **Passed** (was Failed at `[P1-T2]`). +- `DequeueAsync_OnRejectedThrows_ScanContinues` = **Passed** (was Failed at `[P1-T3]`). +- `DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected` = **Passed** (negative control, `[P1-T4]`). +- `DequeueAsync_BelowThresholdItemsAreDiscarded` = **Passed** (pre-existing drop-on-reject contract). + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test names and outcomes unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +## Output Summary + +Both `[expect-fail]` #426 tests transition Failed -> Passed while the accepted-path negative control +and the pre-existing discard contract stay Passed. Format EXIT_CODE 0, check EXIT_CODE 0, compile +EXIT_CODE 0, scoped run EXIT_CODE 0 with 4 of 4 Passed and 0 Failed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t2/p2-t2.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t2/p2-t2.trx new file mode 100644 index 000000000..91470444c --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t2/p2-t2.trx @@ -0,0 +1,79 @@ + + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t3-topfolder-carried-forward.2026-08-26T09-54.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t3-topfolder-carried-forward.2026-08-26T09-54.md new file mode 100644 index 000000000..ad47883cb --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t3-topfolder-carried-forward.2026-08-26T09-54.md @@ -0,0 +1,49 @@ +# [P2-T3] Carry the Computed Folder Forward (Scope 427-A) + +Timestamp: 2026-08-26T09-54 + +Task: [P2-T3] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` — the accepted-candidate construction +inside `DequeueAsync` now reads +`accepted.Add(new QfcPreScoredItem(mailItem, topFolder));`, where `topFolder` is the second element +of the tuple already returned by the widened `_scoreLoader`. This replaces the `string.Empty` stub +introduced by `[P1-T8]` under D-Plan-1. + +No other line changed; the tuple deconstruction +`(long score, string topFolder) = await _scoreLoader(mailItem, token)` was already in place from +`[P1-T8]`. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult" "/Logger:trx;LogFileName=p2-t3.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p2-t3"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t3/p2-t3.trx` + +Counters: total 1, executed 1, **passed 1**, failed 0, error 0, timeout 0, aborted 0. + +- `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` = **Passed** + (was Failed at `[P1-T13]`). + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test name and outcome unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +## Output Summary + +The Scope 427-A producer-side carrier is now populated at the gate boundary. The `[P1-T13]` +`[expect-fail]` test transitions Failed -> Passed. Format EXIT_CODE 0, check EXIT_CODE 0, compile +EXIT_CODE 0, scoped run EXIT_CODE 0 with 1 of 1 Passed and 0 Failed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t3/p2-t3.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t3/p2-t3.trx new file mode 100644 index 000000000..e8ba5c3c2 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t3/p2-t3.trx @@ -0,0 +1,61 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t4-datamodel-scorer-topfolder.2026-08-26T09-56.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t4-datamodel-scorer-topfolder.2026-08-26T09-56.md new file mode 100644 index 000000000..791cbcaa4 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t4-datamodel-scorer-topfolder.2026-08-26T09-56.md @@ -0,0 +1,45 @@ +# [P2-T4] Return the Real Folder from the Datamodel Scorer (Scope 427-A) + +Timestamp: 2026-08-26T09-56 + +Task: [P2-T4] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` — the relocated +`ScoreRemainingQueueMailItemAsync` now returns `(score.Score, score.TopFolder)` in place of the +`(score.Score, string.Empty)` stub landed by `[P1-T11]` under D-Plan-1. This is the only changed +line in the method; its `Probability debug` log line text is byte-for-byte unchanged. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder" "/Logger:trx;LogFileName=p2-t4.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p2-t4"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t4/p2-t4.trx` + +Counters: total 1, executed 1, **passed 1**, failed 0, error 0, timeout 0, aborted 0. + +- `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` = **Passed** + (was Failed at `[P1-T12]`). + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test name and outcome unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +## Output Summary + +The producer end of the Scope 427-A folder path is complete: the scorer surfaces the folder the +classifier already ranked highest, and the gate (`[P2-T3]`) carries it into the accepted carrier. +The `[P1-T12]` `[expect-fail]` test transitions Failed -> Passed. Format EXIT_CODE 0, check +EXIT_CODE 0, compile EXIT_CODE 0, scoped run EXIT_CODE 0 with 1 of 1 Passed and 0 Failed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t4/p2-t4.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t4/p2-t4.trx new file mode 100644 index 000000000..77a82331b --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t4/p2-t4.trx @@ -0,0 +1,61 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t5-rejected-hook-release.2026-08-26T09-59.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t5-rejected-hook-release.2026-08-26T09-59.md new file mode 100644 index 000000000..40ef2a63b --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t5-rejected-hook-release.2026-08-26T09-59.md @@ -0,0 +1,57 @@ +# [P2-T5] Release the Rejected Candidate's Monitor Hook (Issue #426) + +Timestamp: 2026-08-26T09-59 + +Task: [P2-T5] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`: + +1. Added `private void TryReleaseRejectedHook(MailItem item)`, which calls the datamodel's own + `_moveMonitor.UnhookItem(item)` inside a `try`/`catch (System.Exception e)` that logs at error + level and returns. +2. Wired `onRejected: TryReleaseRejectedHook` into the `QfcStreamingDequeueConfidenceGate` + construction inside `DequeueWithHighConfidenceGateAsync`. + +Exactly one `UnhookItem` call is made per rejected item, preserving the +one-marshal-hop-per-operation contract; no unhooks are batched into a single hop. + +`QuickFiler/Helper Classes/EmailMoveMonitor.cs` gained no member and is absent from the change set +(`git diff --stat` against it produces no output). + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor|FullyQualifiedName~DequeueNextItemGroupAsync_HighConfidenceDisabled_PreservesDirectBatchDequeue" "/Logger:trx;LogFileName=p2-t5.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p2-t5"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t5/p2-t5.trx` + +Counters: total 2, executed 2, **passed 2**, failed 0, error 0, timeout 0, aborted 0. + +- `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` = **Passed** + (was Failed at `[P1-T6]`). Its `Times.Once` verification is what pins the marshal-hop contract. +- `DequeueNextItemGroupAsync_HighConfidenceDisabled_PreservesDirectBatchDequeue` = **still Passed** + (normal-mode path unaffected). + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test names and outcomes unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +## Output Summary + +The #426 leak is closed end to end: the gate reports each discarded candidate through `_onRejected` +(`[P2-T2]`) and the datamodel releases the hook through its own monitor instance exactly once. The +`[P1-T6]` `[expect-fail]` test transitions Failed -> Passed and the normal-mode control stays +Passed. Format EXIT_CODE 0, check EXIT_CODE 0, compile EXIT_CODE 0, scoped run EXIT_CODE 0 with 2 +of 2 Passed and 0 Failed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t5/p2-t5.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t5/p2-t5.trx new file mode 100644 index 000000000..fafe9f199 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t5/p2-t5.trx @@ -0,0 +1,67 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t6-outcome-projection.2026-08-26T10-02.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t6-outcome-projection.2026-08-26T10-02.md new file mode 100644 index 000000000..29d412f43 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t6-outcome-projection.2026-08-26T10-02.md @@ -0,0 +1,63 @@ +# [P2-T6] Real Outcome Projection at the Datamodel Boundary (Issue #446) + +Timestamp: 2026-08-26T10-02 + +Task: [P2-T6] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`: + +1. `DequeueNextItemGroupWithOutcomeAsync` no longer delegates to the `IList` four-argument + overload and no longer hard-codes `QfcDequeueStop.QuantitySatisfied` (the `[P1-T15]` stub). It + now branches on `HighConfidenceModeEnabled` itself: + - high-confidence mode returns the new + `DequeueWithHighConfidenceGateWithOutcomeAsync(...)` result verbatim; + - normal mode calls `DequeueDirectAsync(quantity)` and reports + `QfcDequeueStop.SourceExhausted` when `(items?.Count ?? 0) < quantity`, otherwise + `QfcDequeueStop.QuantitySatisfied`, with an empty `PreScored`. +2. Added `private async Task DequeueWithHighConfidenceGateWithOutcomeAsync(...)`, + which holds the gate construction previously inside `DequeueWithHighConfidenceGateAsync`, and + returns `new QfcDequeueBatch(UnhookDequeuedNodes(nodes), accepted, batch.Stop)`. `Items` is + therefore populated from the same accepted set as `PreScored`, after `UnhookDequeuedNodes` runs + over it. `batch.Accepted` is captured into a local once, because the property materializes a + fresh empty list on each read when the backing field is null. +3. `DequeueWithHighConfidenceGateAsync` now delegates to that method and returns `batch.Items`. + +The three pre-existing `IQfcDatamodel` overloads (`DequeueNextItemGroupAsync(int, int)`, +`DequeueNextItemGroupAsync(int, int, TimeSpan, Action)` and +`DequeueNextItemGroup(int)`) were not edited; they keep delegating internally and their observable +behaviour, including the pre-existing `null` return from `UnhookDequeuedNodes`, is unchanged. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop" "/Logger:trx;LogFileName=p2-t6.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p2-t6"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t6/p2-t6.trx` + +Counters: total 1, executed 1, **passed 1**, failed 0, error 0, timeout 0, aborted 0. + +- `DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop` = **Passed** + (was Failed at `[P1-T18]`). + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test name and outcome unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +## Output Summary + +The gate's stop reason now survives the datamodel boundary instead of being flattened. The +`[P1-T18]` `[expect-fail]` test transitions Failed -> Passed. Format EXIT_CODE 0, check EXIT_CODE 0, +compile EXIT_CODE 0, scoped run EXIT_CODE 0 with 1 of 1 Passed and 0 Failed. +`QfcDatamodel.QueueProcessing.cs` is 288 lines, within the 500-line cap. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t6/p2-t6.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t6/p2-t6.trx new file mode 100644 index 000000000..7b38b1178 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t6/p2-t6.trx @@ -0,0 +1,61 @@ + + + + + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t7-queue-close-guard.2026-08-26T10-04.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t7-queue-close-guard.2026-08-26T10-04.md new file mode 100644 index 000000000..0af95ea0d --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t7-queue-close-guard.2026-08-26T10-04.md @@ -0,0 +1,53 @@ +# [P2-T7] Guard the Queue Close on the Empty-Batch Path (Issue #446, AC2) + +Timestamp: 2026-08-26T10-04 + +Task: [P2-T7] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Controllers/QfcHomeController.Iteration.cs` — the unconditional `else` around +`await QfcQueue.CompleteAddingAsync(Token, 10000);` inside `IterateQueueAsync` became +`else if (batch.Stop == QfcDequeueStop.SourceExhausted)`, with a comment recording that a +`DeadlineExpired` or `QuantitySatisfied` empty batch deliberately leaves the queue open for a later +iteration. + +`QfcQueue.CompleteAddingAsync` reaches `BlockingCollection.CompleteAdding()` at +`QuickFiler/Controllers/QfcQueue.cs:59`, which is irreversible for the rest of the session; that is +why the guard is on the close rather than on a recovery path. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler/Controllers/QfcHomeController.Iteration.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler/Controllers/QfcHomeController.Iteration.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding|FullyQualifiedName~IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce" "/Logger:trx;LogFileName=p2-t7.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p2-t7"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t7/p2-t7.trx` + +Counters: total 2, executed 2, **passed 2**, failed 0, error 0, timeout 0, aborted 0. + +- `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` = **Passed** + (was Failed at `[P1-T16]`). +- `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` = **still Passed** + (`[P1-T17]` negative control; it forecloses the degenerate fix of never closing the queue). + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test names and outcomes unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +## Output Summary + +The consumer end of the stop reason is now wired: only `SourceExhausted` closes the UI queue. The +`[P1-T16]` `[expect-fail]` test transitions Failed -> Passed and its negative control stays Passed, +so both sides of the discrimination are pinned. Format EXIT_CODE 0, check EXIT_CODE 0, compile +EXIT_CODE 0, scoped run EXIT_CODE 0 with 2 of 2 Passed and 0 Failed. +`QfcHomeController.Iteration.cs` is 95 lines, within the 500-line cap. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t7/p2-t7.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t7/p2-t7.trx new file mode 100644 index 000000000..a8511d4c7 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t7/p2-t7.trx @@ -0,0 +1,46 @@ + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t8-assembly-green.2026-08-26T10-09.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t8-assembly-green.2026-08-26T10-09.md new file mode 100644 index 000000000..14330a6df --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t8-assembly-green.2026-08-26T10-09.md @@ -0,0 +1,59 @@ +# [P2-T8] Whole-Assembly Green After the Phase 2 Change Set + +Timestamp: 2026-08-26T10-09 + +Task: [P2-T8] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/Logger:trx;LogFileName=p2-t8.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p2-t8"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t8/p2-t8.trx` + +Counters: **total 952, executed 952, passed 952, failed 0**, error 0, timeout 0, aborted 0, +notExecuted 0. + +## First run and the one invalidated pre-existing test + +The first execution of this task returned total 952, passed 951, **failed 1**: +`QfcHomeControllerIterationTests.IterateQueueAsync_QueueEmpty`, with +`Moq.MockException: Expected invocation on the mock once, but was 0 times: +m => m.CompleteAddingAsync(...)`. + +That failure is the intended consequence of `[P2-T7]`, not a defect. The test arranged an empty +batch through `ArrangeIterate()`, whose `stop` parameter defaults to +`QfcDequeueStop.QuantitySatisfied`, and asserted the queue was closed. Under issue #446 an empty +batch no longer closes the queue on its own; only `QfcDequeueStop.SourceExhausted` does. The test as +written encoded the defect being fixed. + +Correction applied: `IterateQueueAsync_QueueEmpty` now arranges +`ArrangeIterate(stop: QfcDequeueStop.SourceExhausted)`, which is the stop reason its name and intent +("queue empty, source drained, so close") always described. **No assertion was weakened**: the test +still verifies `DequeueNextItemGroupWithOutcomeAsync` `Times.Once`, `CompleteAddingAsync` +`Times.Once` and `EnqueueAsync` `Times.Never`. A two-line comment records why the stop reason is now +stated explicitly. + +`QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` is **497 lines** after the change +and after `csharpier format`, within the 500-line cap. + +Toolchain rerun after that edit: + +Command: `dotnet tool run csharpier format "QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +TRX hygiene: the recorded TRX is the second (green) run. It was scrubbed of the absolute worktree +path, the account name and the machine name, then re-parsed as XML; ``, all test +names and all outcomes survive unchanged. A case-insensitive search for the account name and the +machine name across the feature folder returns no match. The empty `Deploy_*` scratch directories `vstest /InIsolation` leaves behind contain +no files and are therefore untracked by git. + +## Output Summary + +**Failed 0, total 952 (> 0).** All nine Phase 1 `[expect-fail]` tests that Phase 2 owns are green, +and the whole `QuickFiler.Test` assembly is green with them. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t8/p2-t8.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t8/p2-t8.trx new file mode 100644 index 000000000..6f23131d3 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t8/p2-t8.trx @@ -0,0 +1,6712 @@ + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t1-undo-consumer-seams.2026-08-26T10-18.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t1-undo-consumer-seams.2026-08-26T10-18.md new file mode 100644 index 000000000..edfe79542 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t1-undo-consumer-seams.2026-08-26T10-18.md @@ -0,0 +1,63 @@ +# [P3-T1] Three Injectable Seams on the Undo Consumer (Issue #448) + +Timestamp: 2026-08-26T10-18 + +Task: [P3-T1] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Controllers/QfcFormController.Actions.cs` — a partial declaration of +`QfcFormController`, so the seams land without editing the non-owned +`QuickFiler/Controllers/QfcFormController.cs` where `_undoQueue` and `_undoConsumerTask` are +declared. + +1. `internal TimeProvider TimeProvider { get; set; } = TimeProvider.System;` +2. `internal Func, Task> UndoConsumerStarter { get; set; } = body => Task.Run(body);` +3. `internal Func UndoItemProcessor { get; set; }`, defaulted to the new + private `ProcessUndoItemAsync(IMovedMailInfo item)` which holds the take-branch body verbatim + (D-Plan-3). The default is resolved lazily through a backing field + (`get => _undoItemProcessor ??= ProcessUndoItemAsync;`) because a C# instance property + initializer cannot reference an instance method (CS0236); a constructor-based default would have + required editing the non-owned `QfcFormController.cs`. +4. `_undoConsumerTask ??= Task.Run(UndoConsumer);` became + `_undoConsumerTask ??= UndoConsumerStarter(UndoConsumer);`. +5. The take branch became `await UndoItemProcessor(item).ConfigureAwait(false);`. + +The loop itself is **unchanged by this task**: `new Stopwatch()`, the `|| exit` disjunction, the +`sw.ElapsedMilliseconds > 10000` branch, `await Task.Delay(200)` and the conditional +`if (exit) { _undoConsumerTask = null; }` all remain exactly as they were. Production behaviour is +byte-for-byte unchanged because every seam defaults to the code it replaced. + +`Microsoft.Bcl.TimeProvider` and `Microsoft.Extensions.TimeProvider.Testing` were already +referenced; no package was added. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler/Controllers/QfcFormController.Actions.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler/Controllers/QfcFormController.Actions.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~QfcFormControllerSeamTests|FullyQualifiedName~QfcFormControllerTests" "/Logger:trx;LogFileName=p3-t1.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p3-t1"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t1/p3-t1.trx` + +Counters: total 53, executed 53, passed 53, **failed 0**, error 0, timeout 0, aborted 0. + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, all test names and all outcomes unchanged. A case-insensitive search +for the account name and the machine name across the feature folder returns no match. + +`QfcFormController.Actions.cs` is 343 lines after `csharpier format`, within the 500-line cap. + +## Output Summary + +The intra-phase compile exits 0 and the scoped `QfcFormControllerSeamTests` / +`QfcFormControllerTests` run records **0 failed** across 53 tests, so the seams are additive and +regress nothing. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t1/p3-t1.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t1/p3-t1.trx new file mode 100644 index 000000000..7186f51b5 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t1/p3-t1.trx @@ -0,0 +1,630 @@ + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t2-timeprovider-delay-red.2026-08-26T10-22.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t2-timeprovider-delay-red.2026-08-26T10-22.md new file mode 100644 index 000000000..27a8aaaf6 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t2-timeprovider-delay-red.2026-08-26T10-22.md @@ -0,0 +1,71 @@ +# [P3-T2] [expect-fail] Idle Iterations Must Wait Through the Injected Clock (Issue #448) + +Timestamp: 2026-08-26T10-22 + +Task: [P3-T2] — `[expect-fail]`; a failing test is the expected outcome of this task only. +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` — added +`UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay`, plus two supporting members in a new +`Issue #448` region: + +- `private sealed class CountingTimeProvider : FakeTimeProvider`, which counts delay requests by + overriding `CreateTimer` (the `TimeProvider.Delay` extension routes through it) and never advances + time on its own, so a consumer that parks on a delay stays parked instead of spinning. +- `private QfcFormController ArrangeUndoConsumer(TimeProvider clock, Func processor = null)`, + which assigns the clock, sets `UndoConsumerStarter = body => body()` so the consumer runs inline, + and optionally assigns `UndoItemProcessor`. Extracting this helper up front is what `[P3-T7]` + prescribes and keeps the file under the 500-line cap. + +The test does **not** await the returned consumer task. The pre-fix loop never terminates, so +awaiting it would produce a hang rather than a usable RED state (D5). Running the consumer inline +means control returns at its first `await`, which is exactly where the assertion is meaningful. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay" "/Logger:trx;LogFileName=p3-t2.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p3-t2"` +EXIT_CODE: 1 +ExpectedExitCode: 1 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t2/p3-t2.trx` + +Counters: total 1, executed 1, passed 0, **failed 1**, error 0, timeout 0, aborted 0. + +- `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` = **Failed**, with the + assertion-failure message: + + `Expected clock.DelayRequests to be greater than or equal to 1 because an idle iteration must wait + through the injected TimeProvider, not Task.Delay, but found 0 (difference of -1).` + + This is an assertion failure against a compiling tree, not a compile error and not a timeout: the + `timeout` and `aborted` counters are both 0. + +## Test-host residue + +Command: `pwsh -NoProfile -File scripts\vscode\TestProcessCleanup.ps1` +EXIT_CODE: 0 + +Command: `Get-Process -Name vstest.console,testhost,testhost.x86,testhost.net48 -ErrorAction SilentlyContinue` +Result: **0 processes remaining**. No `vstest` or `testhost` process survived the scoped run, so the +runaway pre-fix consumer died with its test host as intended. + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test name and outcome unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +## Output Summary + +RED state achieved by assertion, as required. The pre-fix `UndoConsumer` waits on +`await Task.Delay(200)`, so the injected clock records 0 delay requests. `[P3-T3]` rewrites the loop +to wait through `TimeProvider.Delay` and turns this test green. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t2/p3-t2.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t2/p3-t2.trx new file mode 100644 index 000000000..229149418 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t2/p3-t2.trx @@ -0,0 +1,65 @@ + + + + + + + + + + Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + Expected clock.DelayRequests to be greater than or equal to 1 because an idle iteration must wait through the injected TimeProvider, not Task.Delay, but found 0 (difference of -1). + at FluentAssertions.Execution.LateBoundTestFramework.Throw(String message) in /_/Src/FluentAssertions/Execution/LateBoundTestFramework.cs:line 22 + at FluentAssertions.Execution.AssertionChain.FailWith(Func`1 getFailureReason) in /_/Src/FluentAssertions/Execution/AssertionChain.cs:line 277 + at FluentAssertions.Numeric.NumericAssertionsBase`3.BeGreaterThanOrEqualTo(T expected, String because, Object[] becauseArgs) in /_/Src/FluentAssertions/Numeric/NumericAssertionsBase.cs:line 263 + at QuickFiler.Controllers.Tests.QfcFormControllerSeamTests.UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay() in REDACTED-REPO-ROOT\QuickFiler.Test\Controllers\QfcFormControllerSeamTests.cs:line 445 + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t3-undo-consumer-loop-rewrite.2026-08-26T10-26.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t3-undo-consumer-loop-rewrite.2026-08-26T10-26.md new file mode 100644 index 000000000..92ed6242b --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t3-undo-consumer-loop-rewrite.2026-08-26T10-26.md @@ -0,0 +1,69 @@ +# [P3-T3] Rewrite the Undo-Consumer Loop (Issue #448) + +Timestamp: 2026-08-26T10-26 + +Task: [P3-T3] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler/Controllers/QfcFormController.Actions.cs` — `UndoConsumer` rewritten: + +- Added `private static readonly TimeSpan UndoConsumerIdleTimeout = TimeSpan.FromSeconds(10);`, + preserving the previous ten-second threshold value. +- `long start = TimeProvider.GetTimestamp();` before the loop, replacing `new Stopwatch()` / + `sw.Start()`. +- Loop condition is now `while (!_undoQueue.IsCompleted)`. The `|| exit` disjunction and the `exit` + flag are gone entirely. The old condition `!_undoQueue.IsCompleted || exit` was the termination + defect: setting `exit = true` made the disjunction **true**, so the loop it was meant to end + spun instead. +- On a successful take: `await UndoItemProcessor(item)` then `start = TimeProvider.GetTimestamp();` + so the threshold measures idle time rather than total session time. +- `else if (TimeProvider.GetElapsedTime(start) > UndoConsumerIdleTimeout) { break; }`. +- `else { await TimeProvider.Delay(TimeSpan.FromMilliseconds(200)).ConfigureAwait(false); }`, + replacing the ambient `await Task.Delay(200)`. +- The whole loop is wrapped in `try`/`finally` with `_undoConsumerTask = null;` moved into the + `finally`, so it runs unconditionally including on the exception path that disposing `_undoQueue` + mid-take (`QuickFiler/Controllers/QfcFormController.SetupDisposal.cs:216`) can produce. + +Every branch of the loop body either awaits or breaks, so no branch reaches the loop head without +yielding. + +Noted residue, not changed: `using System.Diagnostics;` at line 4 of the file is now unused, since +`Stopwatch` was the only `System.Diagnostics` type this file referenced. It is left in place because +the plan task does not authorize removing it. It is inert for every gate in this plan: no +`IDE0005` severity is configured in `.editorconfig` or `.globalconfig`, and `QuickFiler.csproj` sets +no `GenerateDocumentationFile`, which the compiler requires before it reports `IDE0005` during +build. Recorded here so a reviewer can decide rather than discover it. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler/Controllers/QfcFormController.Actions.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler/Controllers/QfcFormController.Actions.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay" "/Logger:trx;LogFileName=p3-t3.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p3-t3"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t3/p3-t3.trx` + +Counters: total 1, executed 1, **passed 1**, failed 0, error 0, timeout 0, aborted 0. + +- `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` = **Passed** + (was Failed at `[P3-T2]` with `found 0` delay requests). + +`QfcFormController.Actions.cs` is 360 lines after `csharpier format`, within the 500-line cap. + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test name and outcome unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +## Output Summary + +The `[P3-T2]` `[expect-fail]` test transitions Failed -> Passed. Format EXIT_CODE 0, check +EXIT_CODE 0, compile EXIT_CODE 0, scoped run EXIT_CODE 0 with 1 of 1 Passed and 0 Failed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t3/p3-t3.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t3/p3-t3.trx new file mode 100644 index 000000000..58b8dc033 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t3/p3-t3.trx @@ -0,0 +1,58 @@ + + + + + + + + + + Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t4-idle-threshold-completes.2026-08-26T10-29.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t4-idle-threshold-completes.2026-08-26T10-29.md new file mode 100644 index 000000000..dde297160 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t4-idle-threshold-completes.2026-08-26T10-29.md @@ -0,0 +1,56 @@ +# [P3-T4] Idle Consumer Past the Threshold Terminates (Issue #448) + +Timestamp: 2026-08-26T10-29 + +Task: [P3-T4] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` — added +`UndoConsumer_IdleBeyondThreshold_Completes`. It arranges the consumer through +`ArrangeUndoConsumer(clock)` with a `FakeTimeProvider` and an empty `_undoQueue`, starts it inline, +advances the clock eleven seconds (past the ten-second `UndoConsumerIdleTimeout`), awaits the +consumer task and asserts `Status == TaskStatus.RanToCompletion`. + +Added after the loop rewrite deliberately: its pre-fix state is a hang, not an assertion failure, so +it cannot serve as a failing-first test (D5). `[P3-T2]`/`[P3-T3]` carry the failing-first obligation +for #448. + +`[Timeout(10000)]` bounds the test so that a regression reintroducing the non-terminating loop is +recorded as a timeout rather than stalling the suite. No wall-clock wait occurs on the passing path: +all elapsed time is simulated by `FakeTimeProvider.Advance`, satisfying the determinism rules in +`.claude/rules/general-unit-test.md`. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~UndoConsumer_IdleBeyondThreshold_Completes" "/Logger:trx;LogFileName=p3-t4.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p3-t4"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t4/p3-t4.trx` + +Counters: total 1, executed 1, **passed 1**, failed 0, error 0, **timeout 0**, aborted 0. + +- `UndoConsumer_IdleBeyondThreshold_Completes` = **Passed** in 289 ms. + +**No `[Timeout]` trip recorded**: the TRX `timeout` counter is `0` and the recorded duration +(289 ms) is far inside the 10 000 ms bound. + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test name and outcome unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +## Output Summary + +The rewritten loop terminates on the idle path. Format EXIT_CODE 0, check EXIT_CODE 0, compile +EXIT_CODE 0, scoped run EXIT_CODE 0 with 1 of 1 Passed, 0 Failed and 0 timed out. +`QfcFormControllerSeamTests.cs` is 484 lines, within the 500-line cap. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t4/p3-t4.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t4/p3-t4.trx new file mode 100644 index 000000000..0dcc630b2 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t4/p3-t4.trx @@ -0,0 +1,35 @@ + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t5-take-resets-idle-timer.2026-08-26T10-34.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t5-take-resets-idle-timer.2026-08-26T10-34.md new file mode 100644 index 000000000..f157c8d0b --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t5-take-resets-idle-timer.2026-08-26T10-34.md @@ -0,0 +1,74 @@ +# [P3-T5] A Successful Take Resets the Idle Timer (Issue #448, AC9) + +Timestamp: 2026-08-26T10-34 + +Task: [P3-T5] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` — added +`UndoConsumer_SuccessfulTake_ResetsIdleTimer`. The shared `ArrangeUndoConsumer` helper gained an +optional `queuedItems` parameter so the seeding of `_undoQueue` is written once rather than in each +test (this is the helper extraction `[P3-T7]` prescribes). + +Arrangement: a `CountingTimeProvider`, a fake `UndoItemProcessor` that records the item and advances +the clock six seconds, and three queued items. **No live Outlook COM call and no WinForms dispatcher +call occurs**, because the fake replaces the whole take-branch body extracted by `[P3-T1]`, which is +what `.claude/rules/general-unit-test.md` UT4 requires and why D-Plan-3 added that third seam. + +Aggregate simulated time across the three takes is 18 s, past the ten-second threshold, while every +individual idle gap is 0 s. + +## Why this test can fail + +Because the consumer runs inline (`UndoConsumerStarter = body => body()`) and nothing else advances +the clock, the consumer is deterministically parked at the moment the starter returns. There is no +race in the observations: + +- `processed` has 3 items — the consumer drained rather than exiting early. +- `consumer.IsCompleted` is `false` — it parked on an idle wait. +- `clock.DelayRequests` is `1` — it reached the idle branch, not the exit branch. + +Against a session timer (the pre-`[P3-T3]` behaviour) the same arrangement produces +`IsCompleted == true` and `DelayRequests == 0`, because 18 s of accumulated session time exceeds the +threshold on the first empty take. The last two assertions are therefore genuine discriminators, not +restatements of the drain. + +The test then advances 11 s — past the threshold measured from the last take — awaits the consumer +and asserts `TaskStatus.RanToCompletion`, so the fixed consumer is shown to terminate as well as to +persist. All elapsed time is simulated; `[Timeout(10000)]` bounds a regression that reintroduced a +non-terminating loop. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~UndoConsumer_SuccessfulTake_ResetsIdleTimer" "/Logger:trx;LogFileName=p3-t5.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p3-t5"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t5/p3-t5.trx` + +Counters: total 1, executed 1, **passed 1**, failed 0, error 0, timeout 0, aborted 0. + +- `UndoConsumer_SuccessfulTake_ResetsIdleTimer` = **Passed** in 309 ms. + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test name and outcome unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +Line-count note: `QfcFormControllerSeamTests.cs` stands at 534 lines after this task, above the +500-line cap. `[P3-T7]` is the designated task for bringing it back under and is executed after +`[P3-T6]` adds the last test. + +## Output Summary + +Format EXIT_CODE 0, check EXIT_CODE 0, compile EXIT_CODE 0, scoped run EXIT_CODE 0 with 1 of 1 +Passed and 0 Failed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t5/p3-t5.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t5/p3-t5.trx new file mode 100644 index 000000000..91ec86838 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t5/p3-t5.trx @@ -0,0 +1,58 @@ + + + + + + + + + + Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t6-exit-resets-task-handle.2026-08-26T10-38.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t6-exit-resets-task-handle.2026-08-26T10-38.md new file mode 100644 index 000000000..c06e40349 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t6-exit-resets-task-handle.2026-08-26T10-38.md @@ -0,0 +1,59 @@ +# [P3-T6] Every Exit Path Clears `_undoConsumerTask` (Issue #448) + +Timestamp: 2026-08-26T10-38 + +Task: [P3-T6] +Feature: docs/features/active/quickfiler-bug-family-446 + +## Change + +`QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` — added +`UndoConsumer_OnExit_ResetsUndoConsumerTask`, covering both exit paths in one test: + +1. **Idle exit.** Empty queue, `FakeTimeProvider` advanced eleven seconds past the threshold. After + awaiting the consumer, `_undoConsumerTask` must be null. +2. **Exception exit.** One queued item and a `UndoItemProcessor` that throws + `InvalidOperationException`, which stands in for the exception path that disposing `_undoQueue` + mid-take (`QuickFiler/Controllers/QfcFormController.SetupDisposal.cs:216`) can produce. After the + throw propagates, `_undoConsumerTask` must be null as well. + +Both halves plant `Task.CompletedTask` into `_undoConsumerTask` as a sentinel **before** the +consumer runs. Without the sentinel the field is null from construction and the assertion would pass +vacuously. With it, a path that fails to clear the field leaves the sentinel behind and the +assertion fails — which is precisely the pre-`[P3-T3]` behaviour on the exception path, where +`_undoConsumerTask = null;` sat inside `if (exit)` and `exit` was never set when the loop threw. + +The consequence being pinned: a stale non-null `_undoConsumerTask` makes the `??=` in `UndoDialog()` +a no-op, so the user's next undo silently never starts a consumer. + +## Verification + +Command: `dotnet tool run csharpier format "QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs"` +EXIT_CODE: 0 + +Command: `dotnet tool run csharpier check "QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs"` +EXIT_CODE: 0 + +Command: `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` +EXIT_CODE: 0 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/TestCaseFilter:FullyQualifiedName~UndoConsumer_OnExit_ResetsUndoConsumerTask" "/Logger:trx;LogFileName=p3-t6.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p3-t6"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t6/p3-t6.trx` + +Counters: total 1, executed 1, **passed 1**, failed 0, error 0, timeout 0, aborted 0. + +- `UndoConsumer_OnExit_ResetsUndoConsumerTask` = **Passed** in 315 ms. + +TRX hygiene: scrubbed of the absolute worktree path, account name and machine name, then re-parsed +as XML; ``, test name and outcome unchanged. A case-insensitive search for the +account name and the machine name across the feature folder returns no match. + +Line-count note: `QfcFormControllerSeamTests.cs` stands at 576 lines after this task, above the +500-line cap. `[P3-T7]` is the designated task for bringing it back under. + +## Output Summary + +Format EXIT_CODE 0, check EXIT_CODE 0, compile EXIT_CODE 0, scoped run EXIT_CODE 0 with 1 of 1 +Passed and 0 Failed. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t6/p3-t6.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t6/p3-t6.trx new file mode 100644 index 000000000..33b716487 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t6/p3-t6.trx @@ -0,0 +1,58 @@ + + + + + + + + + + Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t7/p3-t7.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t7/p3-t7.trx new file mode 100644 index 000000000..6024d48fc --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t7/p3-t7.trx @@ -0,0 +1,223 @@ + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8-assembly-green.2026-08-26T10-53.md b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8-assembly-green.2026-08-26T10-53.md new file mode 100644 index 000000000..5b9c5320e --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8-assembly-green.2026-08-26T10-53.md @@ -0,0 +1,31 @@ +# [P3-T8] Whole-Assembly Green After the Phase 3 Change Set + +Timestamp: 2026-08-26T10-53 + +Task: [P3-T8] +Feature: docs/features/active/quickfiler-bug-family-446 + +Command: `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" "/Logger:trx;LogFileName=p3-t8.trx" "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p3-t8"` +EXIT_CODE: 0 + +TRX: `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8/p3-t8.trx` + +Counters: **total 956, executed 956, passed 956, failed 0**, error 0, timeout 0, aborted 0, +notExecuted 0. + +The total rose from 952 at `[P2-T8]` to 956, which is exactly the four undo-consumer tests added by +`[P3-T2]` and `[P3-T4]` through `[P3-T6]`. No test was removed. + +This run was clean on the first attempt: unlike `[P2-T8]`, no pre-existing test was invalidated by +the Phase 3 change set, because every seam introduced by `[P3-T1]` defaults to the behaviour it +replaced and the loop rewrite preserves the ten-second threshold value. + +TRX hygiene: scrubbed of the absolute worktree path, the account name and the machine name, then +re-parsed as XML; ``, all test names and all outcomes survive unchanged. A case-insensitive +search for the account name and the machine name across the feature folder returns no match. The empty `Deploy_*` scratch +directories `vstest /InIsolation` leaves behind contain no files and are untracked by git. + +## Output Summary + +**Failed 0, total 956 (> 0).** Every previously `[expect-fail]` test across Phase 1 and Phase 3 is +green and the whole `QuickFiler.Test` assembly is green with them. diff --git a/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8/p3-t8.trx b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8/p3-t8.trx new file mode 100644 index 000000000..701cd7a70 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8/p3-t8.trx @@ -0,0 +1,6756 @@ + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'UtilitiesCS.resources': System.IO.FileNotFoundException: Could not load file or assembly 'UtilitiesCS.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: + + + + + + + Debug Trace: + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + Debug Trace: + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + Debug Trace: + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + +Debug Trace: + Warning: + The component "Fluent Assertions" is governed by the rules defined in the Xceed License Agreement and + the Xceed Fluent Assertions Community License. You may use Fluent Assertions free of charge for + non-commercial use only. An active subscription is required to use Fluent Assertions for commercial use. + + Please contact Xceed Sales mailto:sales@xceed.com to acquire a subscription at a very low cost. + + A paid commercial license supports the development and continued increasing support of + Fluent Assertions users under both commercial and community licenses. Help us + keep Fluent Assertions at the forefront of unit testing. + + For more information, visit https://xceed.com/products/unit-testing/fluent-assertions/ + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + Debug Trace: + + + + + + + + + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + Debug Trace: + + + + + + + + Debug Trace: +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. +testhost.exe Warning: 0 : SvgRenderer load 'QuickFiler.resources': System.IO.FileNotFoundException: Could not load file or assembly 'QuickFiler.resources' or one of its dependencies. The system cannot find the file specified. + + + + + + + + + + + + + + + + + + + + + + Debug Trace: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test Parallelization enabled for REDACTED-REPO-ROOT\QuickFiler.Test\bin\Debug\QuickFiler.Test.dll (Workers: 24, Scope: ClassLevel) + + + + \ No newline at end of file diff --git a/docs/features/active/quickfiler-bug-family-446/feature-audit.2026-08-26T11-29.md b/docs/features/active/quickfiler-bug-family-446/feature-audit.2026-08-26T11-29.md new file mode 100644 index 000000000..ccf8e181e --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/feature-audit.2026-08-26T11-29.md @@ -0,0 +1,69 @@ +# Feature Audit — quickfiler-bug-family-446 + +- Reviewer: feature-review agent +- Timestamp: 2026-08-26T11-29 +- Work mode: `full-bug` — `spec.md` is the sole acceptance-criteria source (28 criteria) +- Baseline: merge base `61edc19b`; head `fd746f55` +- Verification style: independent re-derivation where feasible (diff reads, greps, TRX re-parse, Cobertura re-parse); executor evidence artifacts cited where the underlying command run is the evidence. + +## Acceptance Criteria Evaluation + +| AC | Verdict | Evidence (independently verified unless noted) | +| --- | --- | --- | +| AC1 | PASS | Both stop-reason tests present in `QfcStreamingDequeueConfidenceGateTests.Part3.cs` (`:165`, `:206`), FakeTimeProvider-driven; red TRXs `p1-t9`/`p1-t10` re-parsed: `outcome="Failed"`; green in final 6501/6501 run. | +| AC2 | PASS | Both tests present in `QfcHomeControllerIterationTests.cs` (`:415`, `:433`) asserting `CompleteAddingAsync` Times.Never / Times.Once respectively via `VerifyCompleteAdding`. | +| AC3 | PASS | `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` present (`QfcFormControllerSeamTests.cs:397`); red state recorded as an assertion failure in `p1/p3` evidence (`p3-t2` TRX Failed, evidence records assertion message and test-host cleanup, per D5). | +| AC4 | PASS | `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` present (`QfcStreamingDequeueConfidenceGateTests.cs:345`); `p1-t2` TRX records Failed against a compiling tree (seam landed without invocation, per plan [P1-T2]). | +| AC5 | PASS | `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` present (`QfcDatamodelTests.cs:327`), driven through the `ScoringServiceFactory` seam; red TRX under `p1-t11`/`p1-t12` evidence. | +| AC6 | PASS | Diff read: `CompleteAddingAsync` call sits only inside `else if (batch.Stop == QfcDequeueStop.SourceExhausted)` in `QfcHomeController.Iteration.cs`, with a why-comment naming the irreversibility. | +| AC7 | PASS | Diff read: all four gate exits return explicit stop reasons — degenerate-quantity and loop-completion `QuantitySatisfied`, deadline `DeadlineExpired`, drained source `SourceExhausted`. | +| AC8 | PASS | `UndoConsumer_IdleBeyondThreshold_Completes` with `[Timeout(10000)]` on FakeTimeProvider; passes in final run. | +| AC9 | PASS | `UndoConsumer_SuccessfulTake_ResetsIdleTimer`: three takes advance 6 s each (18 s aggregate) with zero idle gap; asserts the loop drained, parked, and only then exits on an 11 s idle advance. | +| AC10 | PASS | Diff read: `_undoConsumerTask = null` sits in the `finally` block; `UndoConsumer_OnExit_ResetsUndoConsumerTask` plants sentinels and asserts both the idle and the exception exit clear it. | +| AC11 | PASS | Diff read of the rewritten loop: the empty-queue branch either breaks (idle past threshold) or awaits `TimeProvider.Delay(200 ms)`; no branch reaches the loop head without an await or break. Verified together with AC3. | +| AC12 | PASS | `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` present (`QfcQueuePurePathsTests.cs:146`); production sink `TryReleaseRejectedHook` calls `_moveMonitor.UnhookItem` once per rejected item. | +| AC13 | PASS | `DequeueAsync_OnRejectedThrows_ScanContinues` present (`QfcStreamingDequeueConfidenceGateTests.cs:377`); gate wraps the sink invocation in try/catch with log-and-continue. | +| AC14 | PASS | Independently verified via `-U0` hunk map: nearest hunks in that file sit at base lines 285 and 324; the `DequeueAsync_BelowThresholdItemsAreDiscarded` body (base 298–310) is inside no hunk — byte-unchanged. Test passes in the final run. | +| AC15 | PASS | `git diff --name-status`: neither `EmailMoveMonitor.cs` nor `EmailMoveMonitorTests.cs` appears in the branch diff; both pinned tests pass in the final 6501/6501 run. | +| AC16 | PASS | `ScoreRemainingQueueMailItemAsync` returns `(long Score, string TopFolder)` (diff read); `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` present (`Part3.cs:237`); `QfcDequeueBatch.PreScored` carries accepted candidates to the boundary. | +| AC17 | PASS (with pre-PR obligation) | Independent scan of `git log 61edc19b..HEAD --format=%B` for closing-keyword-plus-issue-reference: zero matches (conventional-commit prefixes like `fix(448):` are not GitHub closing references). No file in the change set carries a closing keyword before #427. The PR body does not exist yet; `evidence/issue-updates/p4-t17-pr-closing-keyword-constraint.2026-08-26T10-41.md` records the binding constraint for the PR author, including that `issue.md:5` (`Also closes: … #427 …`) is superseded by D1 and must not be transcribed. See code review CR-4: correct that `issue.md` line before or during PR authoring. | +| AC18 | PASS | `git diff --name-only -- "QuickFiler/**/*.cs"` returns exactly the six owned production paths; all twelve named non-owned files absent. Independently confirmed the five sibling partial declarations of `QfcFormController`/`QfcHomeController` exist on the tree and are untouched. | +| AC19 | PASS | Diff contains zero `*.csproj`, `*.props`, `*.targets`, `packages.config` paths. | +| AC20 | PASS | `IQfcDatamodel.cs` diff is additive (new enum, struct, and one overload); the three pre-existing `DequeueNextItemGroupAsync`/`DequeueNextItemGroup` declarations are unaltered (the only touched pre-existing line is the BOM-bearing first `using` line, outside any declaration). | +| AC21 | PASS | Neither `QfcHomeControllerIssue218Tests.cs` nor `QfcHomeControllerRunAsyncHighConfidenceTests.cs` appears in the diff. | +| AC22 | PASS | `git diff --name-status` reports no `A` entry under `QuickFiler/` or `QuickFiler.Test/` (the only `A` entries are the four promoted potential documents under `docs/`). | +| AC23 | PASS | `git grep -c "GetConstructor"` on the gate test file returns 1; the helper is a single exact nine-type lookup guarded by `Should().NotBeNull`, fail-closed (read directly); all gate tests pass in the final run. | +| AC24 | PASS | All 13 changed `.cs` files re-counted: every one is at most 500 (max 497). `QfcFormControllerTests.cs` untouched, so its 827-line exception clause is not exercised. `QfcDatamodel.cs` is 480. | +| AC25 | PASS | The accepted Phase 5 pass ran `csharpier format` (0 rewrites, SHA-256-verified) before the final vstest; `LoadItemsAsync_MailItemPath_DoesNotApplyPostDisplayHighConfidenceRemoval` passes in that post-format run (6501/6501). | +| AC26 | PASS | Independent grep of all 7 changed test files for `Thread.Sleep`, `Task.Delay`, `DateTime.Now`, `DateTime.UtcNow`, `Path.GetTempPath`, `Path.GetTempFileName`: only an XML doc-comment mention of `Task.Delay` describing what the seam avoids. | +| AC27 | PASS | `p5-t9-clean-pass.2026-08-26T11-11.md`: all four gates EXIT_CODE 0 in one accepted pass (`csharpier check .`; both msbuild `/t:Rebuild` invocations; vstest `/InIsolation /EnableCodeCoverage`); neither msbuild uses `/t:Build` nor `/p:Nullable=enable`; TRX re-parse confirms 6501/6501/0. One documented restart preceded the accepted pass, per the toolchain-loop rule. | +| AC28 | PARTIAL — left unchecked (non-blocking) | Three components: (a) no regression on changed lines — PASS, independently re-parsed (all three changed files and both repo-wide rates improved against the same-session baseline); (b) plan-designated blocking changed-file gate — PASS (97.39 / 47.89-on-carve-out / 100.00 per [P5-T7], figures re-derived from the committed Cobertura); (c) literal whole-type >= 90% — FAIL (97.39 / 55.37 / 71.05). Component (c) is a genuine spec self-contradiction: reaching 90% whole-type requires coverage in five sibling-owned partial files, unreachable from this change set (owned-file coverage alone peaks both types at 71.0% arithmetically) without violating AC18 or annexing sibling scope. Checkbox correctly left unchecked per the "Leave unmet items unchecked" rule; requires maintainer spec amendment at or before epic close. Does not block merge. | + +## Adjudication: could AC28 have been met another way? + +Considered and rejected alternatives: (1) modifying sibling partials to add seams — forbidden verbatim by AC18; (2) writing tests that exercise sibling-partial code without touching production — arithmetically required to add roughly 245 covered lines in `QfcFormController`'s siblings and 85 in `QfcHomeController`'s, code that is WinForms/COM-bound (baseline rates 51.93/68.31 reflect this) and whose testability uplift is explicitly assigned to sibling epic children 442/484/444/489, so this route would annex sibling scope, duplicate their in-flight work, and mostly still require seams in files this branch may not modify; (3) `[ExcludeFromCodeCoverage]` on the untestable members — a coverage-exemption route this repository's policy direction disfavors and which no plan task or maintainer waiver authorized. Conclusion: the criterion is unsatisfiable within this feature's lawful scope; the contradiction is in the spec text, not the delivery. + +## Regression-net assessment (caller-referred item 2) + +`IterateQueueAsync_QueueEmpty` was compared base-to-head directly. Base assertions: dequeue verified `Times.Once`, `CompleteAddingAsync` `Times.Once`, `EnqueueAsync` `Times.Never`. Head assertions: identical trio (dequeue via the new outcome-bearing overload). The rearrangement to `stop: QfcDequeueStop.SourceExhausted` was mandatory — production no longer calls the old overload, so the unmodified arrangement would have produced a meaningless default-batch run — and the old test's implicit semantics (empty batch closes queue unconditionally) were the defect under repair. The discrimination previously hidden inside that single test is now explicit across the AC2 pair, which additionally pins the negative case (`DeadlineExpired` empty batch must NOT close). Net effect: the regression net is strictly stronger. Modification legitimate. + +## Acceptance Criteria Status + +- Source: `docs/features/active/quickfiler-bug-family-446/spec.md` +- Total AC items: 28 +- Checked off (delivered): 27 +- Remaining (unchecked): 1 +- Items remaining: AC28 — coverage: no regression on changed lines, and >= 90% line coverage on `QfcStreamingDequeueConfidenceGate`, `QfcFormController` and `QfcHomeController` (left unchecked by design: whole-type reading conflicts with AC18; maintainer spec amendment required; both operative sub-conditions pass) + +No AC checkbox was newly checked or unchecked by this review: all 27 PASS items were already checked by the executor with valid evidence, and AC28 (PARTIAL) correctly remains unchecked. + +## Residual items for the epic orchestrator / maintainer + +1. AC28 spec amendment (restate the 90% condition over the changed-file scope, or defer the whole-type target to the epic-level close-out) — maintainer decision. +2. Correct `issue.md:5` (`Also closes:` list includes #427) before PR authoring; enforce the P4-T17 closing-keyword constraint on the PR body (#446, #448, #426 only). +3. Route the `QfcFormController.Actions.cs` testability-seam debt (dialog service seam, loader seams) through the promotion lifecycle (code review CR-1). +4. Remove the dead `using System.Diagnostics;` in `QfcFormController.Actions.cs` on the next authorized touch (code review CR-3). + +## Verdict + +27 of 28 acceptance criteria PASS; AC28 PARTIAL and non-blocking with both operative sub-conditions passing. Zero blocking findings. The branch is fit to merge into `epic/quickfiler-bug-family-integration`. diff --git a/docs/features/active/quickfiler-bug-family-446/issue.md b/docs/features/active/quickfiler-bug-family-446/issue.md index 77dee32ef..bf6245033 100644 --- a/docs/features/active/quickfiler-bug-family-446/issue.md +++ b/docs/features/active/quickfiler-bug-family-446/issue.md @@ -2,7 +2,10 @@ - Issue: #446 - Issue URL: https://github.com/drmoisan/TaskMaster/issues/446 -- Also closes: #426, #427, #448 +- Also closes: #426, #448 +- Advances (must remain open): #427 - only the 427-A producer side is delivered here, so no + closing keyword may precede #427 in any commit message or pull-request body (see + `evidence/issue-updates/p4-t17-pr-closing-keyword-constraint.2026-08-26T10-41.md`) - Type: bug - Work Mode: full-bug - Epic: quickfiler-bug-family diff --git a/docs/features/active/quickfiler-bug-family-446/plan.2026-08-24T09-37.md b/docs/features/active/quickfiler-bug-family-446/plan.2026-08-24T09-37.md index e7a447054..215231db8 100644 --- a/docs/features/active/quickfiler-bug-family-446/plan.2026-08-24T09-37.md +++ b/docs/features/active/quickfiler-bug-family-446/plan.2026-08-24T09-37.md @@ -253,22 +253,22 @@ plan is explicitly scoped by pathspec and never run unscoped. ### Phase 0 — Policy Reads, C# Toolchain Bootstrap, and Baseline Capture -- [ ] [P0-T1] Read, in this exact order, `CLAUDE.md`, `.claude/rules/general-code-change.md`, `.claude/rules/general-unit-test.md`, `.claude/rules/csharp.md`, `.claude/rules/quality-tiers.md`, `.claude/rules/plan-acceptance-gates.md`, `.claude/skills/policy-compliance-order/SKILL.md`, `.claude/skills/atomic-plan-contract/SKILL.md`, `.claude/skills/evidence-and-timestamp-conventions/SKILL.md` and `.claude/skills/acceptance-criteria-tracking/SKILL.md`, and write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t1-instructions-read..md` carrying `Timestamp:`, `Policy Order:` and the explicit list of the ten files read. **Acceptance:** that artifact exists and lists all ten paths. -- [ ] [P0-T2] Read `docs/features/active/quickfiler-bug-family-446/spec.md`, `docs/features/active/quickfiler-bug-family-446/issue.md` and `docs/features/active/quickfiler-bug-family-446/research/2026-08-24T09-50-quickfiler-queue-datamodel-defects-research.md`, and write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t2-feature-inputs-read..md` enumerating the acceptance-criteria identifiers AC1 through AC28 and the eight owned production paths listed in the spec's Scope section. Then correct the two stale document pointers at `docs/features/active/quickfiler-bug-family-446/spec.md:970-971`, which name the non-existent folder `docs/features/active/quickfiler-queue-datamodel-defects-446/`, to the real folder `docs/features/active/quickfiler-bug-family-446/`; this edits document pointers only and does not touch any acceptance-criteria text. **Acceptance:** the artifact enumerates exactly 28 criterion identifiers and 8 owned paths, and `git grep -c "quickfiler-queue-datamodel-defects-446" -- "docs/features/active/quickfiler-bug-family-446/spec.md"` reports no match. -- [ ] [P0-T3] Resolve the merge base. Run `pwsh -NoProfile -Command 'git rev-parse --verify --quiet "epic/quickfiler-bug-family-integration"'`; if that succeeds use that ref, otherwise use `origin/main`, otherwise `main`. Then run `git merge-base HEAD ` and write the resolved ref name, the 40-character merge-base sha and the current HEAD sha to `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t3-merge-base..md`. **Acceptance:** the artifact records a ref name and a 40-character hexadecimal merge-base sha, and `EXIT_CODE: 0`. -- [ ] [P0-T4] Provision the repo-local .NET SDK. Run `pwsh -NoProfile -Command 'dotnet --version'` from the workspace root; `global.json` pins `sdk.version` `8.0.205` with `rollForward: latestFeature` and `paths` of `.dotnet-sdk` and `$host$`, and this worktree has no `.dotnet-sdk` directory, so if the command prints the `global.json` `errorMessage` instead of a version, run `pwsh -NoProfile -File scripts\vscode\Install-RepoDotNetSdk.ps1` and re-run. Record both invocations in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t4-dotnet-sdk..md`. **Acceptance:** the artifact records a final `dotnet --version` with `EXIT_CODE: 0` whose printed version begins with `8.0.`. -- [ ] [P0-T5] Restore NuGet packages. This worktree has no `packages/` directory; every project declares an `EnsureNuGetPackageBuildImports` target whose `` fires before compilation when the tree is missing, and every `Reference` `HintPath` under `..\packages\` is unresolvable. Run `pwsh -NoProfile -File scripts\vscode\Invoke-Restore.ps1 -SolutionPath TaskMaster.sln -Configuration Debug -Platform "Any CPU"`, which drives MSBuild `/t:Restore /p:RestorePackagesConfig=true` and therefore covers both the packages.config projects and the PackageReference projects. Record the run in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t5-nuget-restore..md`. **Acceptance:** `EXIT_CODE: 0` and the directory `packages/Meziantou.Analyzer.3.0.174` exists. -- [ ] [P0-T6] Back-fill the skewed analyzer packages. Restore alone is not sufficient: all 16 first-party `.csproj` files carry unconditional `` items naming `..\packages\Meziantou.Analyzer.3.0.156\` and `..\packages\Roslynator.Analyzers.4.16.0\` DLLs, while every `packages.config` pins `3.0.174` and `4.16.1`; a missing `Analyzer` path is `error CS0006` and fails the compile rather than emitting a warning. Obtain `Meziantou.Analyzer` `3.0.156` and `Roslynator.Analyzers` `4.16.0` into `packages/`, either with `nuget install -Version -OutputDirectory packages` when `nuget.exe` is available, or by copying the two directories from the parent checkout's `packages/` tree (the workspace root is nested three levels below it). Record the route taken in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t6-analyzer-backfill..md`. **Acceptance:** both `packages/Meziantou.Analyzer.3.0.156` and `packages/Roslynator.Analyzers.4.16.0` exist and each contains at least one `.dll` under `analyzers/dotnet/`. -- [ ] [P0-T7] Restore the pinned local tool. `dotnet-tools.json` sits at the repository root (not under `.config/`) and pins CSharpier `1.2.6`, whose commands are `format`, `check`, `pipe-files` and `server`; the bare `csharpier .` form of CSharpier v0 does not run. Run `pwsh -NoProfile -Command 'dotnet tool restore'` then `pwsh -NoProfile -Command 'dotnet tool run csharpier --version'`, recording both in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t7-tool-restore..md`. **Acceptance:** the recorded version output is `1.2.6` and `EXIT_CODE: 0`. -- [ ] [P0-T8] Ensure the Cobertura collector is available. Run `pwsh -NoProfile -Command 'dotnet-coverage --version'`; if the command is not found, run `pwsh -NoProfile -Command 'dotnet tool install --global dotnet-coverage'` and re-run. `scripts/vscode/Invoke-MSTestWithCoverage.ps1` requires this tool. Record both invocations in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t8-dotnet-coverage..md`. **Acceptance:** the artifact records a final `dotnet-coverage --version` with `EXIT_CODE: 0` and a printed version string. -- [ ] [P0-T9] Baseline formatting gate. Run `pwsh -NoProfile -Command 'dotnet tool run csharpier check .'` from the workspace root and write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t9-csharpier-check..md` with `Timestamp:`, `Command:`, `EXIT_CODE:` and `Output Summary:`; when the exit code is non-zero, the summary lists every path CSharpier reports as unformatted. **Acceptance:** exactly one artifact matching `p0-t9-csharpier-check.*.md` exists under that folder and carries all four fields with a numeric `EXIT_CODE:`. -- [ ] [P0-T10] Baseline analyzer gate. Run `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true` through `pwsh -NoProfile` and write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t10-analyzer-build..md` recording the error and warning counts from the MSBuild summary. **Acceptance:** the artifact carries all four required fields, a numeric `EXIT_CODE:` and both counts. -- [ ] [P0-T11] Baseline nullable gate. Run `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true` through `pwsh -NoProfile` and write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t11-nullable-build..md`. The command must not add `/p:Nullable=enable` and must not use `/t:Build`. **Acceptance:** the artifact carries all four required fields, a numeric `EXIT_CODE:` and the recorded command text contains neither `Nullable=enable` nor `/t:Build`. -- [ ] [P0-T12] Baseline full-suite tests with Cobertura coverage. Run `pwsh -NoProfile -File scripts\vscode\Invoke-MSTestWithCoverage.ps1 -SearchRoot . -Configuration Debug -CoverageOutput "docs\features\active\quickfiler-bug-family-446\evidence\baseline\coverage-baseline.cobertura.xml"`. Write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t12-test-and-coverage..md` recording total, passed, failed and skipped test counts, the discovered assembly count printed by the script plus the assembly list reproduced by the executor with the discovery prelude from the Command conventions section (the script itself prints only `Discovered N test assemblies.`, a count and not a list), the fully qualified name of every failed test whenever the failed count is non-zero (this named set is the reconciliation reference for `[P5-T5]`), and the repository-wide `line-rate` and `branch-rate` from the Cobertura root `` element. **Acceptance:** `coverage-baseline.cobertura.xml` exists under that folder, the artifact records four numeric test counts and two numeric coverage rates, no discovered assembly path recorded in the artifact contains a `.claude` segment when expressed relative to the workspace root, and the artifact states explicitly whether any recorded failure belongs to `QuickFiler.Test.dll`. -- [ ] [P0-T13] Baseline coverage scope extraction. From `docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml`, aggregate every `` element by `filename` and record six line-coverage figures: the **changed-file scope** for `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`, `QuickFiler/Controllers/QfcFormController.Actions.cs` and `QuickFiler/Controllers/QfcHomeController.Iteration.cs`; and the **whole-type scope** summing every partial file of `QfcStreamingDequeueConfidenceGate`, `QfcFormController` and `QfcHomeController`. Use `pwsh -NoProfile -Command '$x=[xml](Get-Content -Raw "docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml"); $all=$x.SelectNodes("//class"); foreach ($n in @("QfcStreamingDequeueConfidenceGate.cs","QfcFormController.Actions.cs","QfcHomeController.Iteration.cs","QfcStreamingDequeueConfidenceGate","QfcFormController","QfcHomeController")) { $s=@($all | Where-Object { $_.filename -like ("*" + $n + "*") }); $ln=@($s.lines.line); $h=@($ln | Where-Object { [int]$_.hits -gt 0 }); "{0} lines={1} covered={2} rate={3:N2}" -f $n,$ln.Count,$h.Count,(100*$h.Count/[math]::Max(1,$ln.Count)) }'` and write the output to `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t13-coverage-scope..md`. **Acceptance:** the artifact records six rows, each with a numeric `lines=`, `covered=` and `rate=` value, and every row's `lines=` value is a positive integer (a `lines=0` row indicates the needle matched no `` element and is a measurement failure, not a baseline). -- [ ] [P0-T14] Baseline line counts. Record the exact pre-change line count of each of the thirteen files this plan may touch: `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`, `QuickFiler/Controllers/QfcDatamodel.cs`, `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, `QuickFiler/Controllers/QfcFormController.Actions.cs`, `QuickFiler/Controllers/QfcHomeController.Iteration.cs`, `QuickFiler/Interfaces/IQfcDatamodel.cs`, `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs`, `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`, `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`, `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` and `QuickFiler.Test/Controllers/QfcDatamodelTests.cs`, into `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t14-line-counts..md`. **Acceptance:** the artifact records thirteen paths each with a numeric line count, and the recorded count for `QuickFiler/Controllers/QfcDatamodel.cs` is `496`. -- [ ] [P0-T15] Baseline pinned-surface inventory. Record, in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t15-pinned-surface..md`: the count of `[TestMethod]` occurrences across `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, `...Part2.cs` and `...Part3.cs`; the count of `GetConstructor` occurrences in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`; and the SHA-256 of the body text of `DequeueAsync_BelowThresholdItemsAreDiscarded` extracted from that same file. The literal this task counts is `GetConstructor`. **Acceptance:** the artifact records a `[TestMethod]` total of at least `23` (the count observed on the tree that carries PR #610; the artifact records the exact observed number, and a total below 23 means gate tests were deleted), a `GetConstructor` count of `4`, and a 64-character SHA-256 hex digest. -- [ ] [P0-T16] Commit the Phase 0 evidence. Run `git add "docs/features/active/quickfiler-bug-family-446"` followed by `git commit -m "chore(446): capture phase 0 policy reads, bootstrap and baselines"`, and record the resulting HEAD sha in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t16-commit..md`. **Acceptance:** `EXIT_CODE: 0`, and `git status --porcelain -- "QuickFiler" "QuickFiler.Test" "*.csproj" "*.sln"` produces zero output lines. +- [x] [P0-T1] Read, in this exact order, `CLAUDE.md`, `.claude/rules/general-code-change.md`, `.claude/rules/general-unit-test.md`, `.claude/rules/csharp.md`, `.claude/rules/quality-tiers.md`, `.claude/rules/plan-acceptance-gates.md`, `.claude/skills/policy-compliance-order/SKILL.md`, `.claude/skills/atomic-plan-contract/SKILL.md`, `.claude/skills/evidence-and-timestamp-conventions/SKILL.md` and `.claude/skills/acceptance-criteria-tracking/SKILL.md`, and write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t1-instructions-read..md` carrying `Timestamp:`, `Policy Order:` and the explicit list of the ten files read. **Acceptance:** that artifact exists and lists all ten paths. +- [x] [P0-T2] Read `docs/features/active/quickfiler-bug-family-446/spec.md`, `docs/features/active/quickfiler-bug-family-446/issue.md` and `docs/features/active/quickfiler-bug-family-446/research/2026-08-24T09-50-quickfiler-queue-datamodel-defects-research.md`, and write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t2-feature-inputs-read..md` enumerating the acceptance-criteria identifiers AC1 through AC28 and the eight owned production paths listed in the spec's Scope section. Then correct the two stale document pointers at `docs/features/active/quickfiler-bug-family-446/spec.md:970-971`, which name the non-existent folder `docs/features/active/quickfiler-queue-datamodel-defects-446/`, to the real folder `docs/features/active/quickfiler-bug-family-446/`; this edits document pointers only and does not touch any acceptance-criteria text. **Acceptance:** the artifact enumerates exactly 28 criterion identifiers and 8 owned paths, and `git grep -c "quickfiler-queue-datamodel-defects-446" -- "docs/features/active/quickfiler-bug-family-446/spec.md"` reports no match. +- [x] [P0-T3] Resolve the merge base. Run `pwsh -NoProfile -Command 'git rev-parse --verify --quiet "epic/quickfiler-bug-family-integration"'`; if that succeeds use that ref, otherwise use `origin/main`, otherwise `main`. Then run `git merge-base HEAD ` and write the resolved ref name, the 40-character merge-base sha and the current HEAD sha to `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t3-merge-base..md`. **Acceptance:** the artifact records a ref name and a 40-character hexadecimal merge-base sha, and `EXIT_CODE: 0`. +- [x] [P0-T4] Provision the repo-local .NET SDK. Run `pwsh -NoProfile -Command 'dotnet --version'` from the workspace root; `global.json` pins `sdk.version` `8.0.205` with `rollForward: latestFeature` and `paths` of `.dotnet-sdk` and `$host$`, and this worktree has no `.dotnet-sdk` directory, so if the command prints the `global.json` `errorMessage` instead of a version, run `pwsh -NoProfile -File scripts\vscode\Install-RepoDotNetSdk.ps1` and re-run. Record both invocations in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t4-dotnet-sdk..md`. **Acceptance:** the artifact records a final `dotnet --version` with `EXIT_CODE: 0` whose printed version begins with `8.0.`. +- [x] [P0-T5] Restore NuGet packages. This worktree has no `packages/` directory; every project declares an `EnsureNuGetPackageBuildImports` target whose `` fires before compilation when the tree is missing, and every `Reference` `HintPath` under `..\packages\` is unresolvable. Run `pwsh -NoProfile -File scripts\vscode\Invoke-Restore.ps1 -SolutionPath TaskMaster.sln -Configuration Debug -Platform "Any CPU"`, which drives MSBuild `/t:Restore /p:RestorePackagesConfig=true` and therefore covers both the packages.config projects and the PackageReference projects. Record the run in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t5-nuget-restore..md`. **Acceptance:** `EXIT_CODE: 0` and the directory `packages/Meziantou.Analyzer.3.0.174` exists. +- [x] [P0-T6] Back-fill the skewed analyzer packages. Restore alone is not sufficient: all 16 first-party `.csproj` files carry unconditional `` items naming `..\packages\Meziantou.Analyzer.3.0.156\` and `..\packages\Roslynator.Analyzers.4.16.0\` DLLs, while every `packages.config` pins `3.0.174` and `4.16.1`; a missing `Analyzer` path is `error CS0006` and fails the compile rather than emitting a warning. Obtain `Meziantou.Analyzer` `3.0.156` and `Roslynator.Analyzers` `4.16.0` into `packages/`, either with `nuget install -Version -OutputDirectory packages` when `nuget.exe` is available, or by copying the two directories from the parent checkout's `packages/` tree (the workspace root is nested three levels below it). Record the route taken in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t6-analyzer-backfill..md`. **Acceptance:** both `packages/Meziantou.Analyzer.3.0.156` and `packages/Roslynator.Analyzers.4.16.0` exist and each contains at least one `.dll` under `analyzers/dotnet/`. +- [x] [P0-T7] Restore the pinned local tool. `dotnet-tools.json` sits at the repository root (not under `.config/`) and pins CSharpier `1.2.6`, whose commands are `format`, `check`, `pipe-files` and `server`; the bare `csharpier .` form of CSharpier v0 does not run. Run `pwsh -NoProfile -Command 'dotnet tool restore'` then `pwsh -NoProfile -Command 'dotnet tool run csharpier --version'`, recording both in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t7-tool-restore..md`. **Acceptance:** the recorded version output is `1.2.6` and `EXIT_CODE: 0`. +- [x] [P0-T8] Ensure the Cobertura collector is available. Run `pwsh -NoProfile -Command 'dotnet-coverage --version'`; if the command is not found, run `pwsh -NoProfile -Command 'dotnet tool install --global dotnet-coverage'` and re-run. `scripts/vscode/Invoke-MSTestWithCoverage.ps1` requires this tool. Record both invocations in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t8-dotnet-coverage..md`. **Acceptance:** the artifact records a final `dotnet-coverage --version` with `EXIT_CODE: 0` and a printed version string. +- [x] [P0-T9] Baseline formatting gate. Run `pwsh -NoProfile -Command 'dotnet tool run csharpier check .'` from the workspace root and write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t9-csharpier-check..md` with `Timestamp:`, `Command:`, `EXIT_CODE:` and `Output Summary:`; when the exit code is non-zero, the summary lists every path CSharpier reports as unformatted. **Acceptance:** exactly one artifact matching `p0-t9-csharpier-check.*.md` exists under that folder and carries all four fields with a numeric `EXIT_CODE:`. +- [x] [P0-T10] Baseline analyzer gate. Run `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true` through `pwsh -NoProfile` and write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t10-analyzer-build..md` recording the error and warning counts from the MSBuild summary. **Acceptance:** the artifact carries all four required fields, a numeric `EXIT_CODE:` and both counts. +- [x] [P0-T11] Baseline nullable gate. Run `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true` through `pwsh -NoProfile` and write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t11-nullable-build..md`. The command must not add `/p:Nullable=enable` and must not use `/t:Build`. **Acceptance:** the artifact carries all four required fields, a numeric `EXIT_CODE:` and the recorded command text contains neither `Nullable=enable` nor `/t:Build`. +- [x] [P0-T12] Baseline full-suite tests with Cobertura coverage. Run `pwsh -NoProfile -File scripts\vscode\Invoke-MSTestWithCoverage.ps1 -SearchRoot . -Configuration Debug -CoverageOutput "docs\features\active\quickfiler-bug-family-446\evidence\baseline\coverage-baseline.cobertura.xml"`. Write `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t12-test-and-coverage..md` recording total, passed, failed and skipped test counts, the discovered assembly count printed by the script plus the assembly list reproduced by the executor with the discovery prelude from the Command conventions section (the script itself prints only `Discovered N test assemblies.`, a count and not a list), the fully qualified name of every failed test whenever the failed count is non-zero (this named set is the reconciliation reference for `[P5-T5]`), and the repository-wide `line-rate` and `branch-rate` from the Cobertura root `` element. **Acceptance:** `coverage-baseline.cobertura.xml` exists under that folder, the artifact records four numeric test counts and two numeric coverage rates, no discovered assembly path recorded in the artifact contains a `.claude` segment when expressed relative to the workspace root, and the artifact states explicitly whether any recorded failure belongs to `QuickFiler.Test.dll`. +- [x] [P0-T13] Baseline coverage scope extraction. From `docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml`, aggregate every `` element by `filename` and record six line-coverage figures: the **changed-file scope** for `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`, `QuickFiler/Controllers/QfcFormController.Actions.cs` and `QuickFiler/Controllers/QfcHomeController.Iteration.cs`; and the **whole-type scope** summing every partial file of `QfcStreamingDequeueConfidenceGate`, `QfcFormController` and `QfcHomeController`. Use `pwsh -NoProfile -Command '$x=[xml](Get-Content -Raw "docs/features/active/quickfiler-bug-family-446/evidence/baseline/coverage-baseline.cobertura.xml"); $all=$x.SelectNodes("//class"); foreach ($n in @("QfcStreamingDequeueConfidenceGate.cs","QfcFormController.Actions.cs","QfcHomeController.Iteration.cs","QfcStreamingDequeueConfidenceGate","QfcFormController","QfcHomeController")) { $s=@($all | Where-Object { $_.filename -like ("*" + $n + "*") }); $ln=@($s.lines.line); $h=@($ln | Where-Object { [int]$_.hits -gt 0 }); "{0} lines={1} covered={2} rate={3:N2}" -f $n,$ln.Count,$h.Count,(100*$h.Count/[math]::Max(1,$ln.Count)) }'` and write the output to `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t13-coverage-scope..md`. **Acceptance:** the artifact records six rows, each with a numeric `lines=`, `covered=` and `rate=` value, and every row's `lines=` value is a positive integer (a `lines=0` row indicates the needle matched no `` element and is a measurement failure, not a baseline). +- [x] [P0-T14] Baseline line counts. Record the exact pre-change line count of each of the thirteen files this plan may touch: `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`, `QuickFiler/Controllers/QfcDatamodel.cs`, `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, `QuickFiler/Controllers/QfcFormController.Actions.cs`, `QuickFiler/Controllers/QfcHomeController.Iteration.cs`, `QuickFiler/Interfaces/IQfcDatamodel.cs`, `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs`, `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`, `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`, `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` and `QuickFiler.Test/Controllers/QfcDatamodelTests.cs`, into `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t14-line-counts..md`. **Acceptance:** the artifact records thirteen paths each with a numeric line count, and the recorded count for `QuickFiler/Controllers/QfcDatamodel.cs` is `496`. +- [x] [P0-T15] Baseline pinned-surface inventory. Record, in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t15-pinned-surface..md`: the count of `[TestMethod]` occurrences across `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, `...Part2.cs` and `...Part3.cs`; the count of `GetConstructor` occurrences in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`; and the SHA-256 of the body text of `DequeueAsync_BelowThresholdItemsAreDiscarded` extracted from that same file. The literal this task counts is `GetConstructor`. **Acceptance:** the artifact records a `[TestMethod]` total of at least `23` (the count observed on the tree that carries PR #610; the artifact records the exact observed number, and a total below 23 means gate tests were deleted), a `GetConstructor` count of `4`, and a 64-character SHA-256 hex digest. +- [x] [P0-T16] Commit the Phase 0 evidence. Run `git add "docs/features/active/quickfiler-bug-family-446"` followed by `git commit -m "chore(446): capture phase 0 policy reads, bootstrap and baselines"`, and record the resulting HEAD sha in `docs/features/active/quickfiler-bug-family-446/evidence/baseline/p0-t16-commit..md`. **Acceptance:** `EXIT_CODE: 0`, and `git status --porcelain -- "QuickFiler" "QuickFiler.Test" "*.csproj" "*.sln"` produces zero output lines. --- @@ -279,26 +279,26 @@ named test is recorded as **Failed with an assertion-failure message** in its ow build error and not as an unhandled exception. Evidence for this phase is written under `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/`. -- [ ] [P1-T1] Make the reflective gate helper fail closed against the constructor that exists today. In `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, replace the four-step descending `GetConstructor` fallback chain at `:26-156` (8-type at `:45-76`, 7-type at `:78-107`, 6-type at `:109-136`, 5-type at `:138-155`) with a single exact `GetConstructor` lookup for the 8-parameter constructor declared at `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs:57-66`, guarded by a FluentAssertions `Should().NotBeNull()` assertion. The chain currently succeeds on the 5-type lookup whenever the wider lookups miss, silently constructing a gate with `sourceActive` null, the default deadline and no progress callback across 23 consuming test methods. The scoped run below depends on the intra-phase compile (D-Plan-5), run first exactly as in the other test-bearing Phase 1 tasks. **Acceptance:** the intra-phase compile exits 0, `git grep -c "GetConstructor" -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` reports a count of 1 for that file (with an explicit pathspec, `git grep -c` prefixes the count with the path, so the output line ends in `:1`), and a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcStreamingDequeueConfidenceGateTests` records a passed count equal to the `[TestMethod]` total recorded by `[P0-T15]` (23 on the tree that carries PR #610) and 0 failed, with the TRX under `.../evidence/regression-testing/p1-t1`. -- [ ] [P1-T2] [expect-fail] Land the #426 rejection seam together with its regression test, per D5. In `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` add a final optional constructor parameter `Action onRejected = null` to the 8-parameter constructor and a matching `private readonly Action _onRejected;` field assigned in that constructor; do **not** add any invocation of it. Update the `CreateGate` helper in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` to the new exact 9-type lookup; both `CreateGate` overloads (declared at `:26` and `:158` at base, before the `[P1-T1]` rewrite shifts line numbers) gain and forward an `Action onRejected = null` parameter as part of this update. Add `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` to that same test file, asserting the callback is invoked exactly once for a single below-cutoff candidate. **Acceptance:** the intra-phase compile exits 0 and the TRX under `.../evidence/regression-testing/p1-t2` records `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` as Failed with an assertion-failure message. -- [ ] [P1-T3] [expect-fail] Add `DequeueAsync_OnRejectedThrows_ScanContinues` to `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, asserting both that the rejection callback was invoked exactly once for the below-cutoff candidate and that the scan continued to accept the following above-cutoff candidate after the callback threw. Asserting the invocation count is what makes this a real gate; a test that only asserts the scan continued would pass vacuously while no callback exists. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t3` records that test as Failed with an assertion-failure message. -- [ ] [P1-T4] Add `DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected` to `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` as the negative control for AC13. This test is green in both the pre-fix and post-fix states by construction and is not tagged `[expect-fail]`. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t4` records that test as Passed. -- [ ] [P1-T5] Relocate the scoring method to buy line budget and land the injectable scoring seam, per D3. Move `ScoreRemainingQueueMailItemAsync` verbatim from `QuickFiler/Controllers/QfcDatamodel.cs:363-377` into `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, and add alongside it an injectable factory seam `internal Func ScoringServiceFactory { get; set; } = () => new FolderScoringService();`, replacing the hard-coded `new FolderScoringService()` inside the relocated method with a call through the seam. Signature and behaviour are otherwise unchanged. This task precedes every high-confidence-path test task in this phase because the seam is what keeps those tests off live Outlook COM (`.claude/rules/general-unit-test.md` UT4). **Acceptance:** the intra-phase compile exits 0, the post-change line count of `QuickFiler/Controllers/QfcDatamodel.cs` is strictly less than the `496` recorded by `[P0-T14]`, and the post-change line count of `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` is at most 500. -- [ ] [P1-T6] [expect-fail] Add `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` to `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs`, following the `Mock` plus reflection-injection pattern already established at `:119-125` of that file and reusing `CreateUninitializedDatamodel` and `SetPrivateField` from `QuickFiler.Test/Controllers/QfcDatamodelTests.cs:231-241`, injecting a `Mock` through the `ScoringServiceFactory` seam added by `[P1-T5]` so no live Outlook COM is touched. The test asserts that the datamodel's own `_moveMonitor.UnhookItem` is invoked exactly once for a below-cutoff candidate. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t6` records that test as Failed with an assertion-failure message. -- [ ] [P1-T7] Introduce the carrier types with no consumer. Add `public enum QfcDequeueStop { QuantitySatisfied, SourceExhausted, DeadlineExpired }` and `public readonly struct QfcDequeueBatch` (constructor taking `IList items`, `IList preScored`, `QfcDequeueStop stop`; `Items` and `PreScored` each returning an empty list when the backing field is null, so a defaulted struct returned by an unconfigured loose Moq setup is inert rather than a null-reference trap) to `QuickFiler/Interfaces/IQfcDatamodel.cs`, adding the `using QuickFiler.Controllers;` directive required to reference `QfcPreScoredItem`. Add `internal readonly struct QfcGateBatch` with `Accepted`, `Stop` and `Scanned` members to `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`. All three are plain `readonly struct` with get-only properties, because `net481` has no `IsExternalInit` and therefore no `record`, `record struct` or `init` accessor. **Acceptance:** `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` exits 0, and the post-change line count of `QuickFiler/Interfaces/IQfcDatamodel.cs` is at most 500. -- [ ] [P1-T8] Change `QfcStreamingDequeueConfidenceGate.DequeueAsync` in `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` to return `Task`, with `Stop` hard-coded to `QfcDequeueStop.QuantitySatisfied` at all four exits (`:100`, `:119`, `:128`, `:154`) per D-Plan-1, `Accepted` carrying each accepted `MailItem` wrapped as `new QfcPreScoredItem(mailItem, string.Empty)`, and `Scanned` carrying the existing `scanned` counter. Update the reflective `DequeueAsync` helper at `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:192-205` to cast to `Task` and project `Accepted` back to `IList` so the 23 existing gate tests keep their current shape, and update the single call site at `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs:128` to project the batch the same way. **Acceptance:** the intra-phase compile exits 0 and a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcStreamingDequeueConfidenceGateTests|FullyQualifiedName~QfcQueuePurePathsTests` records 0 failed other than the tests already tagged `[expect-fail]` in `[P1-T2]`, `[P1-T3]` and `[P1-T6]`, with the TRX under `.../evidence/regression-testing/p1-t8`. -- [ ] [P1-T9] [expect-fail] Add `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` to `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, driven by `FakeTimeProvider` from `Microsoft.Extensions.Time.Testing` following the established pattern at `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs:36-69`, asserting `Stop == QfcDequeueStop.DeadlineExpired` and an empty `Accepted`. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t9` records that test as Failed with an assertion-failure message. -- [ ] [P1-T10] [expect-fail] Add `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` to `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, asserting `Stop == QfcDequeueStop.SourceExhausted` when the take delegate returns null and `sourceActive` reports false. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t10` records that test as Failed with an assertion-failure message. -- [ ] [P1-T11] Widen the score path to the tuple shape with `TopFolder` stubbed. Change the relocated `ScoreRemainingQueueMailItemAsync` in `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` to return `Task<(long Score, string TopFolder)>` returning `(score.Score, string.Empty)`; widen `_scoreLoader` and both constructor parameters in `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` to `Func>`; repair the method-group conversion at `QuickFiler/Controllers/QfcDatamodel.cs:355` with the in-file adapter lambda `async (m, t) => (await ScoreRemainingQueueMailItemAsync(m, t)).Score,` (`QuickFiler/Controllers/QfcRemainingQueueAdmission.cs` is not owned, declares that `scoreLoader` at `:17`, null-checks it at `:23-26` and never invokes it, so that file needs no change); and update every score-loader lambda in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, `...Part2.cs` and `...Part3.cs` to the tuple shape without adding lines to `...Part2.cs`. **Acceptance:** the intra-phase compile exits 0, the post-change line count of `QuickFiler/Controllers/QfcDatamodel.cs` is at most 500, the post-change line count of `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` equals the count recorded for that file by `[P0-T14]`, and the scoped gate run under `.../evidence/regression-testing/p1-t11` records no newly failing test beyond those already tagged `[expect-fail]`. -- [ ] [P1-T12] [expect-fail] Add `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` to `QuickFiler.Test/Controllers/QfcDatamodelTests.cs`, using `CreateUninitializedDatamodel` plus the `ScoringServiceFactory` seam added by `[P1-T5]` to supply a `Mock` returning a known `(long Score, string TopFolder)` pair, and asserting the returned `TopFolder` equals that known value. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t12` records that test as Failed with an assertion-failure message. -- [ ] [P1-T13] [expect-fail] Add `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` to `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, asserting that the single accepted entry in `Accepted` has a `PredeterminedFolder` equal to the folder returned by the widened score loader. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t13` records that test as Failed with an assertion-failure message. -- [ ] [P1-T14] Deduplicate the iteration test file before it absorbs new tests, per D4 and spec risk R4. In `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` (464 of 500 at base) extract one shared `ArrangeIterate(...)` helper from the duplicated mock setups of the four `IterateQueueAsync_*` tests at `:84`, `:130`, `:201` and `:268`, and from the `Iterate` setup at `:372`; because `[P1-T15]` retargets only the four `IterateQueueAsync_*` setups, `ArrangeIterate` must arrange both `DequeueNextItemGroupAsync` and `DequeueNextItemGroupWithOutcomeAsync` if it is shared with the `Iterate` test. Do not add a `Part2` partial file, which would require editing `QuickFiler.Test/QuickFiler.Test.csproj`. **Acceptance:** the post-change line count of that file is strictly less than the `464` recorded by `[P0-T14]`, and a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcHomeControllerIterationTests` records 0 failed, with the TRX under `.../evidence/regression-testing/p1-t14`. `ArrangeIterate` must take the quantity and timeout matchers as parameters; the concrete `(8, 2000)` arguments at `:268` and the `itemsPerIteration` argument at `:372` are pins and must not be widened to `It.IsAny()`, and the post-change `ArrangeIterate` call sites reproduce the concrete `8`, `2000` and `itemsPerIteration` arguments, verified by reading the post-change bodies of the tests formerly at `:268` and `:372`. -- [ ] [P1-T15] Add the outcome-bearing interface member with a stubbed stop reason. Declare `Task DequeueNextItemGroupWithOutcomeAsync(int quantity, int timeOut, TimeSpan firstBatchDeadline, Action progress);` in `QuickFiler/Interfaces/IQfcDatamodel.cs` leaving the three pre-existing overloads byte-unchanged; implement it in `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` returning a `QfcDequeueBatch` whose `Items` come from the existing path and whose `Stop` is hard-coded to `QfcDequeueStop.QuantitySatisfied`; retarget, in `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`, the four `Mock` setups of `DequeueNextItemGroupAsync` that belong to the `IterateQueueAsync_*` tests (at `:84`, `:130`, `:201` and `:268` at base, however many survive `[P1-T14]`'s `ArrangeIterate` extraction), leaving the fifth setup at `:372` on `DequeueNextItemGroupAsync` because it belongs to `Iterate_HighConfidenceEnabled_DoesNotLoadDirectSynchronousBatch`, which drives the synchronous `Iterate()` path that this plan does not change (if `[P1-T14]`'s `ArrangeIterate` helper is shared with that test, the helper must arrange both members); retarget, unconditionally and in every case, the three `mockDataModel.Verify` expressions on `DequeueNextItemGroupAsync` (at `:105`, `:166` and `:240` at base, before `[P1-T14]` shifts those line numbers; locate them by the `mockDataModel.Verify(` call opening the expression `m => m.DequeueNextItemGroupAsync(It.IsAny(), It.IsAny())`, not by line) to the new member, preserving their `Times.Never`, `Times.Once` and `Times.Once` arguments respectively and leaving the two `DequeueNextItemGroup` (synchronous, non-Async) verifications at `:343` and `:392` untouched; and change `QuickFiler/Controllers/QfcHomeController.Iteration.cs:21-24` to call the new member and read `batch.Items`, leaving the `else` branch at `:32-36` unconditional for now. **Acceptance:** the intra-phase compile exits 0 and a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcHomeControllerIterationTests` records 0 failed, with the TRX under `.../evidence/regression-testing/p1-t15`, and `Iterate_HighConfidenceEnabled_DoesNotLoadDirectSynchronousBatch` still arranges `DequeueNextItemGroupAsync` (verified by reading the post-change test body and, when `[P1-T14]` moved the arrangement into `ArrangeIterate`, the body of that helper as well), and each of the three retargeted `mockDataModel.Verify` expressions names `DequeueNextItemGroupWithOutcomeAsync` with `Times.Never`, `Times.Once` and `Times.Once` preserved respectively. -- [ ] [P1-T16] [expect-fail] Add `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` to `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`, arranging the mocked datamodel to return an empty batch whose `Stop` is `QfcDequeueStop.DeadlineExpired` and asserting `IQfcQueue.CompleteAddingAsync` was invoked `Times.Never`. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t16` records that test as Failed with an assertion-failure message. -- [ ] [P1-T17] Add `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` to `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`, asserting `IQfcQueue.CompleteAddingAsync` was invoked `Times.Once` for an empty batch whose `Stop` is `QfcDequeueStop.SourceExhausted`. This is the negative control of AC2 and is green in both states, so it is not tagged `[expect-fail]`; AC2's failing-first obligation is carried by `[P1-T16]`. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t17` records that test as Passed. -- [ ] [P1-T18] [expect-fail] Add `DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop` to `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs`, asserting that a deadline-expired gate result is projected through the datamodel as `QfcDequeueStop.DeadlineExpired`. This gates the datamodel-side projection that `[P2-T6]` implements. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t18` records that test as Failed with an assertion-failure message. -- [ ] [P1-T19] Cover the two exception branches of `IterateQueueAsync` so the `[P5-T7]` changed-file gate on `QuickFiler/Controllers/QfcHomeController.Iteration.cs` is reachable. Add `IterateQueueAsync_DequeueThrowsOperationCanceled_SwallowsAndReturns`, `IterateQueueAsync_DequeueThrowsWhenTokenCancelled_SwallowsAndReturns` and `IterateQueueAsync_DequeueThrowsWhenTokenNotCancelled_Rethrows` to `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`, arranging the mocked `DequeueNextItemGroupWithOutcomeAsync` added by `[P1-T15]` to throw `OperationCanceledException` for the first test and a plain `System.Exception` for the other two, and driving the second with a cancelled `Token` and the third with an uncancelled one. These three tests reach `QuickFiler/Controllers/QfcHomeController.Iteration.cs:38-52`, which is the file's entire uncovered set at base: measured by the `[P0-T13]` aggregation method the file is `lines=80 covered=69 rate=86.25`, with the eleven uncovered occurrences at `:38`, `:39`, `:41`, `:42`, `:43`, `:44`, `:45`, `:47`, `:49`, `:50` and `:52`. They are green in both the pre-fix and the post-fix states and are not tagged `[expect-fail]`. The second test must arrange the mocked member to cancel the token from inside its callback and only then throw, because `Token.ThrowIfCancellationRequested()` at `QuickFiler/Controllers/QfcHomeController.Iteration.cs:13` sits outside the `try` that opens at `:19`, so a token already cancelled at entry escapes the method uncaught and never reaches the `:44` branch. Reuse the `ArrangeIterate` helper added by `[P1-T14]` so the file stays under the 500-line cap. **Acceptance:** the intra-phase compile exits 0, a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcHomeControllerIterationTests` records the three named tests as Passed with the TRX under `.../evidence/regression-testing/p1-t19` and records no failed test other than `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding`, which `[P1-T16]` tagged `[expect-fail]` and which stays Failed until `[P2-T7]` lands the `SourceExhausted` guard, and the post-change line count of `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` is at most 500. -- [ ] [P1-T20] Commit the Phase 1 RED state. Run `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` followed by `git commit -m "test(446): failing-first regression tests for 446, 426 and 427-A producer side"`, and write an index of the nine `[expect-fail]` TRX paths produced by `[P1-T2]`, `[P1-T3]`, `[P1-T6]`, `[P1-T9]`, `[P1-T10]`, `[P1-T12]`, `[P1-T13]`, `[P1-T16]` and `[P1-T18]`, plus the resulting HEAD sha, to `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t20-red-index..md`. **Acceptance:** `EXIT_CODE: 0`, the index names nine TRX paths, and `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` produces zero output lines. +- [x] [P1-T1] Make the reflective gate helper fail closed against the constructor that exists today. In `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, replace the four-step descending `GetConstructor` fallback chain at `:26-156` (8-type at `:45-76`, 7-type at `:78-107`, 6-type at `:109-136`, 5-type at `:138-155`) with a single exact `GetConstructor` lookup for the 8-parameter constructor declared at `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs:57-66`, guarded by a FluentAssertions `Should().NotBeNull()` assertion. The chain currently succeeds on the 5-type lookup whenever the wider lookups miss, silently constructing a gate with `sourceActive` null, the default deadline and no progress callback across 23 consuming test methods. The scoped run below depends on the intra-phase compile (D-Plan-5), run first exactly as in the other test-bearing Phase 1 tasks. **Acceptance:** the intra-phase compile exits 0, `git grep -c "GetConstructor" -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` reports a count of 1 for that file (with an explicit pathspec, `git grep -c` prefixes the count with the path, so the output line ends in `:1`), and a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcStreamingDequeueConfidenceGateTests` records a passed count equal to the `[TestMethod]` total recorded by `[P0-T15]` (23 on the tree that carries PR #610) and 0 failed, with the TRX under `.../evidence/regression-testing/p1-t1`. +- [x] [P1-T2] [expect-fail] Land the #426 rejection seam together with its regression test, per D5. In `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` add a final optional constructor parameter `Action onRejected = null` to the 8-parameter constructor and a matching `private readonly Action _onRejected;` field assigned in that constructor; do **not** add any invocation of it. Update the `CreateGate` helper in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` to the new exact 9-type lookup; both `CreateGate` overloads (declared at `:26` and `:158` at base, before the `[P1-T1]` rewrite shifts line numbers) gain and forward an `Action onRejected = null` parameter as part of this update. Add `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` to that same test file, asserting the callback is invoked exactly once for a single below-cutoff candidate. **Acceptance:** the intra-phase compile exits 0 and the TRX under `.../evidence/regression-testing/p1-t2` records `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` as Failed with an assertion-failure message. +- [x] [P1-T3] [expect-fail] Add `DequeueAsync_OnRejectedThrows_ScanContinues` to `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, asserting both that the rejection callback was invoked exactly once for the below-cutoff candidate and that the scan continued to accept the following above-cutoff candidate after the callback threw. Asserting the invocation count is what makes this a real gate; a test that only asserts the scan continued would pass vacuously while no callback exists. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t3` records that test as Failed with an assertion-failure message. +- [x] [P1-T4] Add `DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected` to `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` as the negative control for AC13. This test is green in both the pre-fix and post-fix states by construction and is not tagged `[expect-fail]`. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t4` records that test as Passed. +- [x] [P1-T5] Relocate the scoring method to buy line budget and land the injectable scoring seam, per D3. Move `ScoreRemainingQueueMailItemAsync` verbatim from `QuickFiler/Controllers/QfcDatamodel.cs:363-377` into `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, and add alongside it an injectable factory seam `internal Func ScoringServiceFactory { get; set; } = () => new FolderScoringService();`, replacing the hard-coded `new FolderScoringService()` inside the relocated method with a call through the seam. Signature and behaviour are otherwise unchanged. This task precedes every high-confidence-path test task in this phase because the seam is what keeps those tests off live Outlook COM (`.claude/rules/general-unit-test.md` UT4). **Acceptance:** the intra-phase compile exits 0, the post-change line count of `QuickFiler/Controllers/QfcDatamodel.cs` is strictly less than the `496` recorded by `[P0-T14]`, and the post-change line count of `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` is at most 500. +- [x] [P1-T6] [expect-fail] Add `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` to `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs`, following the `Mock` plus reflection-injection pattern already established at `:119-125` of that file and reusing `CreateUninitializedDatamodel` and `SetPrivateField` from `QuickFiler.Test/Controllers/QfcDatamodelTests.cs:231-241`, injecting a `Mock` through the `ScoringServiceFactory` seam added by `[P1-T5]` so no live Outlook COM is touched. The test asserts that the datamodel's own `_moveMonitor.UnhookItem` is invoked exactly once for a below-cutoff candidate. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t6` records that test as Failed with an assertion-failure message. +- [x] [P1-T7] Introduce the carrier types with no consumer. Add `public enum QfcDequeueStop { QuantitySatisfied, SourceExhausted, DeadlineExpired }` and `public readonly struct QfcDequeueBatch` (constructor taking `IList items`, `IList preScored`, `QfcDequeueStop stop`; `Items` and `PreScored` each returning an empty list when the backing field is null, so a defaulted struct returned by an unconfigured loose Moq setup is inert rather than a null-reference trap) to `QuickFiler/Interfaces/IQfcDatamodel.cs`, adding the `using QuickFiler.Controllers;` directive required to reference `QfcPreScoredItem`. Add `internal readonly struct QfcGateBatch` with `Accepted`, `Stop` and `Scanned` members to `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`. All three are plain `readonly struct` with get-only properties, because `net481` has no `IsExternalInit` and therefore no `record`, `record struct` or `init` accessor. **Acceptance:** `& $msbuild TaskMaster.sln /t:Build /m /p:Configuration=Debug "/p:Platform=Any CPU"` exits 0, and the post-change line count of `QuickFiler/Interfaces/IQfcDatamodel.cs` is at most 500. +- [x] [P1-T8] Change `QfcStreamingDequeueConfidenceGate.DequeueAsync` in `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` to return `Task`, with `Stop` hard-coded to `QfcDequeueStop.QuantitySatisfied` at all four exits (`:100`, `:119`, `:128`, `:154`) per D-Plan-1, `Accepted` carrying each accepted `MailItem` wrapped as `new QfcPreScoredItem(mailItem, string.Empty)`, and `Scanned` carrying the existing `scanned` counter. Update the reflective `DequeueAsync` helper at `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:192-205` to cast to `Task` and project `Accepted` back to `IList` so the 23 existing gate tests keep their current shape, and update the single call site at `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs:128` to project the batch the same way. **Acceptance:** the intra-phase compile exits 0 and a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcStreamingDequeueConfidenceGateTests|FullyQualifiedName~QfcQueuePurePathsTests` records 0 failed other than the tests already tagged `[expect-fail]` in `[P1-T2]`, `[P1-T3]` and `[P1-T6]`, with the TRX under `.../evidence/regression-testing/p1-t8`. +- [x] [P1-T9] [expect-fail] Add `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` to `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, driven by `FakeTimeProvider` from `Microsoft.Extensions.Time.Testing` following the established pattern at `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs:36-69`, asserting `Stop == QfcDequeueStop.DeadlineExpired` and an empty `Accepted`. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t9` records that test as Failed with an assertion-failure message. +- [x] [P1-T10] [expect-fail] Add `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` to `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, asserting `Stop == QfcDequeueStop.SourceExhausted` when the take delegate returns null and `sourceActive` reports false. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t10` records that test as Failed with an assertion-failure message. +- [x] [P1-T11] Widen the score path to the tuple shape with `TopFolder` stubbed. Change the relocated `ScoreRemainingQueueMailItemAsync` in `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` to return `Task<(long Score, string TopFolder)>` returning `(score.Score, string.Empty)`; widen `_scoreLoader` and both constructor parameters in `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` to `Func>`; repair the method-group conversion at `QuickFiler/Controllers/QfcDatamodel.cs:355` with the in-file adapter lambda `async (m, t) => (await ScoreRemainingQueueMailItemAsync(m, t)).Score,` (`QuickFiler/Controllers/QfcRemainingQueueAdmission.cs` is not owned, declares that `scoreLoader` at `:17`, null-checks it at `:23-26` and never invokes it, so that file needs no change); and update every score-loader lambda in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, `...Part2.cs` and `...Part3.cs` to the tuple shape without adding lines to `...Part2.cs`. **Acceptance:** the intra-phase compile exits 0, the post-change line count of `QuickFiler/Controllers/QfcDatamodel.cs` is at most 500, the post-change line count of `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part2.cs` equals the count recorded for that file by `[P0-T14]`, and the scoped gate run under `.../evidence/regression-testing/p1-t11` records no newly failing test beyond those already tagged `[expect-fail]`. +- [x] [P1-T12] [expect-fail] Add `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` to `QuickFiler.Test/Controllers/QfcDatamodelTests.cs`, using `CreateUninitializedDatamodel` plus the `ScoringServiceFactory` seam added by `[P1-T5]` to supply a `Mock` returning a known `(long Score, string TopFolder)` pair, and asserting the returned `TopFolder` equals that known value. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t12` records that test as Failed with an assertion-failure message. +- [x] [P1-T13] [expect-fail] Add `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` to `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, asserting that the single accepted entry in `Accepted` has a `PredeterminedFolder` equal to the folder returned by the widened score loader. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t13` records that test as Failed with an assertion-failure message. +- [x] [P1-T14] Deduplicate the iteration test file before it absorbs new tests, per D4 and spec risk R4. In `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` (464 of 500 at base) extract one shared `ArrangeIterate(...)` helper from the duplicated mock setups of the four `IterateQueueAsync_*` tests at `:84`, `:130`, `:201` and `:268`, and from the `Iterate` setup at `:372`; because `[P1-T15]` retargets only the four `IterateQueueAsync_*` setups, `ArrangeIterate` must arrange both `DequeueNextItemGroupAsync` and `DequeueNextItemGroupWithOutcomeAsync` if it is shared with the `Iterate` test. Do not add a `Part2` partial file, which would require editing `QuickFiler.Test/QuickFiler.Test.csproj`. **Acceptance:** the post-change line count of that file is strictly less than the `464` recorded by `[P0-T14]`, and a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcHomeControllerIterationTests` records 0 failed, with the TRX under `.../evidence/regression-testing/p1-t14`. `ArrangeIterate` must take the quantity and timeout matchers as parameters; the concrete `(8, 2000)` arguments at `:268` and the `itemsPerIteration` argument at `:372` are pins and must not be widened to `It.IsAny()`, and the post-change `ArrangeIterate` call sites reproduce the concrete `8`, `2000` and `itemsPerIteration` arguments, verified by reading the post-change bodies of the tests formerly at `:268` and `:372`. +- [x] [P1-T15] Add the outcome-bearing interface member with a stubbed stop reason. Declare `Task DequeueNextItemGroupWithOutcomeAsync(int quantity, int timeOut, TimeSpan firstBatchDeadline, Action progress);` in `QuickFiler/Interfaces/IQfcDatamodel.cs` leaving the three pre-existing overloads byte-unchanged; implement it in `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs` returning a `QfcDequeueBatch` whose `Items` come from the existing path and whose `Stop` is hard-coded to `QfcDequeueStop.QuantitySatisfied`; retarget, in `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`, the four `Mock` setups of `DequeueNextItemGroupAsync` that belong to the `IterateQueueAsync_*` tests (at `:84`, `:130`, `:201` and `:268` at base, however many survive `[P1-T14]`'s `ArrangeIterate` extraction), leaving the fifth setup at `:372` on `DequeueNextItemGroupAsync` because it belongs to `Iterate_HighConfidenceEnabled_DoesNotLoadDirectSynchronousBatch`, which drives the synchronous `Iterate()` path that this plan does not change (if `[P1-T14]`'s `ArrangeIterate` helper is shared with that test, the helper must arrange both members); retarget, unconditionally and in every case, the three `mockDataModel.Verify` expressions on `DequeueNextItemGroupAsync` (at `:105`, `:166` and `:240` at base, before `[P1-T14]` shifts those line numbers; locate them by the `mockDataModel.Verify(` call opening the expression `m => m.DequeueNextItemGroupAsync(It.IsAny(), It.IsAny())`, not by line) to the new member, preserving their `Times.Never`, `Times.Once` and `Times.Once` arguments respectively and leaving the two `DequeueNextItemGroup` (synchronous, non-Async) verifications at `:343` and `:392` untouched; and change `QuickFiler/Controllers/QfcHomeController.Iteration.cs:21-24` to call the new member and read `batch.Items`, leaving the `else` branch at `:32-36` unconditional for now. **Acceptance:** the intra-phase compile exits 0 and a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcHomeControllerIterationTests` records 0 failed, with the TRX under `.../evidence/regression-testing/p1-t15`, and `Iterate_HighConfidenceEnabled_DoesNotLoadDirectSynchronousBatch` still arranges `DequeueNextItemGroupAsync` (verified by reading the post-change test body and, when `[P1-T14]` moved the arrangement into `ArrangeIterate`, the body of that helper as well), and each of the three retargeted `mockDataModel.Verify` expressions names `DequeueNextItemGroupWithOutcomeAsync` with `Times.Never`, `Times.Once` and `Times.Once` preserved respectively. +- [x] [P1-T16] [expect-fail] Add `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` to `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`, arranging the mocked datamodel to return an empty batch whose `Stop` is `QfcDequeueStop.DeadlineExpired` and asserting `IQfcQueue.CompleteAddingAsync` was invoked `Times.Never`. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t16` records that test as Failed with an assertion-failure message. +- [x] [P1-T17] Add `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` to `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`, asserting `IQfcQueue.CompleteAddingAsync` was invoked `Times.Once` for an empty batch whose `Stop` is `QfcDequeueStop.SourceExhausted`. This is the negative control of AC2 and is green in both states, so it is not tagged `[expect-fail]`; AC2's failing-first obligation is carried by `[P1-T16]`. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t17` records that test as Passed. +- [x] [P1-T18] [expect-fail] Add `DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop` to `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs`, asserting that a deadline-expired gate result is projected through the datamodel as `QfcDequeueStop.DeadlineExpired`. This gates the datamodel-side projection that `[P2-T6]` implements. **Acceptance:** the TRX under `.../evidence/regression-testing/p1-t18` records that test as Failed with an assertion-failure message. +- [x] [P1-T19] Cover the two exception branches of `IterateQueueAsync` so the `[P5-T7]` changed-file gate on `QuickFiler/Controllers/QfcHomeController.Iteration.cs` is reachable. Add `IterateQueueAsync_DequeueThrowsOperationCanceled_SwallowsAndReturns`, `IterateQueueAsync_DequeueThrowsWhenTokenCancelled_SwallowsAndReturns` and `IterateQueueAsync_DequeueThrowsWhenTokenNotCancelled_Rethrows` to `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`, arranging the mocked `DequeueNextItemGroupWithOutcomeAsync` added by `[P1-T15]` to throw `OperationCanceledException` for the first test and a plain `System.Exception` for the other two, and driving the second with a cancelled `Token` and the third with an uncancelled one. These three tests reach `QuickFiler/Controllers/QfcHomeController.Iteration.cs:38-52`, which is the file's entire uncovered set at base: measured by the `[P0-T13]` aggregation method the file is `lines=80 covered=69 rate=86.25`, with the eleven uncovered occurrences at `:38`, `:39`, `:41`, `:42`, `:43`, `:44`, `:45`, `:47`, `:49`, `:50` and `:52`. They are green in both the pre-fix and the post-fix states and are not tagged `[expect-fail]`. The second test must arrange the mocked member to cancel the token from inside its callback and only then throw, because `Token.ThrowIfCancellationRequested()` at `QuickFiler/Controllers/QfcHomeController.Iteration.cs:13` sits outside the `try` that opens at `:19`, so a token already cancelled at entry escapes the method uncaught and never reaches the `:44` branch. Reuse the `ArrangeIterate` helper added by `[P1-T14]` so the file stays under the 500-line cap. **Acceptance:** the intra-phase compile exits 0, a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcHomeControllerIterationTests` records the three named tests as Passed with the TRX under `.../evidence/regression-testing/p1-t19` and records no failed test other than `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding`, which `[P1-T16]` tagged `[expect-fail]` and which stays Failed until `[P2-T7]` lands the `SourceExhausted` guard, and the post-change line count of `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs` is at most 500. +- [x] [P1-T20] Commit the Phase 1 RED state. Run `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` followed by `git commit -m "test(446): failing-first regression tests for 446, 426 and 427-A producer side"`, and write an index of the nine `[expect-fail]` TRX paths produced by `[P1-T2]`, `[P1-T3]`, `[P1-T6]`, `[P1-T9]`, `[P1-T10]`, `[P1-T12]`, `[P1-T13]`, `[P1-T16]` and `[P1-T18]`, plus the resulting HEAD sha, to `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p1-t20-red-index..md`. **Acceptance:** `EXIT_CODE: 0`, the index names nine TRX paths, and `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` produces zero output lines. --- @@ -307,16 +307,16 @@ build error and not as an unhandled exception. Evidence for this phase is writte Evidence for this phase is written under `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/`. -- [ ] [P2-T1] Discriminate the gate stop reasons in `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`: map the degenerate `quantity <= 0` exit at `:100` and the quantity-satisfied exit at `:154` to `QfcDequeueStop.QuantitySatisfied`, the deadline exit at `:119` to `QfcDequeueStop.DeadlineExpired`, and the take-returned-null exit at `:128` to `QfcDequeueStop.SourceExhausted`. Preserve the existing `LogDeadlineExpiry` and `LogScore` message text exactly. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t1` records `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` and `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` both as Passed. -- [ ] [P2-T2] Add the rejection path in `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`: an `else` on the `score >= _cutoff` decision at `:144-147` invoking `_onRejected` wrapped as `try { _onRejected?.Invoke(mailItem); } catch (System.Exception e) { logger.Error(...); }` so a monitor failure cannot abort the scan. Do not reuse `TryUnhookOrReplace`, whose recovery path pulls a replacement item out of `_masterQueue` and is meaningless for a discarded candidate. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t2` records `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce`, `DequeueAsync_OnRejectedThrows_ScanContinues`, `DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected` and `DequeueAsync_BelowThresholdItemsAreDiscarded` all as Passed. -- [ ] [P2-T3] Carry the computed folder forward in `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`: construct each accepted entry as `new QfcPreScoredItem(mailItem, topFolder)` from the tuple returned by the widened `_scoreLoader`, replacing the `string.Empty` stub introduced by `[P1-T8]`. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t3` records `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` as Passed. -- [ ] [P2-T4] Return the real folder from the datamodel scorer. In `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, change the relocated `ScoreRemainingQueueMailItemAsync` to return `(score.Score, score.TopFolder)` instead of the `string.Empty` stub, leaving its `Probability debug` log line text unchanged. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t4` records `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` as Passed. -- [ ] [P2-T5] Release the rejected candidate's monitor hook. In `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, add a private `TryReleaseRejectedHook(MailItem item)` that calls the datamodel's own `_moveMonitor.UnhookItem(item)` inside a `try`/`catch` that logs at error level and returns, and wire `onRejected: TryReleaseRejectedHook` into the `QfcStreamingDequeueConfidenceGate` construction at `:117-126`. Exactly one `UnhookItem` call per rejected item preserves the one-marshal-hop-per-operation contract; do not batch several unhooks into one marshal hop and do not add any member to `QuickFiler/Helper Classes/EmailMoveMonitor.cs`. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t5` records `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` as Passed and `DequeueNextItemGroupAsync_HighConfidenceDisabled_PreservesDirectBatchDequeue` as still Passed. -- [ ] [P2-T6] Implement the real outcome projection in `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`: `DequeueNextItemGroupWithOutcomeAsync` propagates the gate's `Stop` and its `Accepted` collection into `QfcDequeueBatch.PreScored`, populates `Items` from the same accepted set after `UnhookDequeuedNodes`, and reports `QfcDequeueStop.SourceExhausted` for the normal-mode `DequeueDirectAsync` path when it yields fewer than `quantity` items. The three pre-existing `IQfcDatamodel` overloads keep delegating internally and their observable behaviour is unchanged. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t6` records `DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop` as Passed. -- [ ] [P2-T7] Guard the queue close in `QuickFiler/Controllers/QfcHomeController.Iteration.cs`: replace the unconditional `else` at `:32-36` with `else if (batch.Stop == QfcDequeueStop.SourceExhausted)` around the `await QfcQueue.CompleteAddingAsync(Token, 10000);` call, and add a short comment recording that a `DeadlineExpired` or `QuantitySatisfied` empty batch deliberately leaves the queue open for a later iteration. `QfcQueue.CompleteAddingAsync` reaches `BlockingCollection.CompleteAdding()` at `QuickFiler/Controllers/QfcQueue.cs:59`, which is irreversible. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t7` records `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` and `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` both as Passed. -- [ ] [P2-T8] Run the whole `QuickFiler.Test` assembly with `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p2-t8"` and record the counts in `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t8-assembly-green..md`. **Acceptance:** the recorded failed count is `0` and the recorded total is greater than zero. -- [ ] [P2-T9] Interim line-cap audit. Record the current line count of each of the five production and six test files touched so far, into `docs/features/active/quickfiler-bug-family-446/evidence/other/p2-t9-line-counts..md`. **Acceptance:** every recorded count is at most 500, and the recorded count for `QuickFiler/Controllers/QfcDatamodel.cs` is at most 500. -- [ ] [P2-T10] Commit the Phase 2 change set. Run `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` then `git commit -m "fix(446): report a dequeue stop reason, release rejected hooks, carry top folder to the datamodel boundary"`, and record the resulting HEAD sha in `docs/features/active/quickfiler-bug-family-446/evidence/other/p2-t10-commit..md`. **Acceptance:** `EXIT_CODE: 0` and `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` produces zero output lines. +- [x] [P2-T1] Discriminate the gate stop reasons in `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`: map the degenerate `quantity <= 0` exit at `:100` and the quantity-satisfied exit at `:154` to `QfcDequeueStop.QuantitySatisfied`, the deadline exit at `:119` to `QfcDequeueStop.DeadlineExpired`, and the take-returned-null exit at `:128` to `QfcDequeueStop.SourceExhausted`. Preserve the existing `LogDeadlineExpiry` and `LogScore` message text exactly. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t1` records `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` and `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` both as Passed. +- [x] [P2-T2] Add the rejection path in `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`: an `else` on the `score >= _cutoff` decision at `:144-147` invoking `_onRejected` wrapped as `try { _onRejected?.Invoke(mailItem); } catch (System.Exception e) { logger.Error(...); }` so a monitor failure cannot abort the scan. Do not reuse `TryUnhookOrReplace`, whose recovery path pulls a replacement item out of `_masterQueue` and is meaningless for a discarded candidate. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t2` records `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce`, `DequeueAsync_OnRejectedThrows_ScanContinues`, `DequeueAsync_AcceptedCandidate_DoesNotInvokeOnRejected` and `DequeueAsync_BelowThresholdItemsAreDiscarded` all as Passed. +- [x] [P2-T3] Carry the computed folder forward in `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`: construct each accepted entry as `new QfcPreScoredItem(mailItem, topFolder)` from the tuple returned by the widened `_scoreLoader`, replacing the `string.Empty` stub introduced by `[P1-T8]`. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t3` records `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` as Passed. +- [x] [P2-T4] Return the real folder from the datamodel scorer. In `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, change the relocated `ScoreRemainingQueueMailItemAsync` to return `(score.Score, score.TopFolder)` instead of the `string.Empty` stub, leaving its `Probability debug` log line text unchanged. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t4` records `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` as Passed. +- [x] [P2-T5] Release the rejected candidate's monitor hook. In `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, add a private `TryReleaseRejectedHook(MailItem item)` that calls the datamodel's own `_moveMonitor.UnhookItem(item)` inside a `try`/`catch` that logs at error level and returns, and wire `onRejected: TryReleaseRejectedHook` into the `QfcStreamingDequeueConfidenceGate` construction at `:117-126`. Exactly one `UnhookItem` call per rejected item preserves the one-marshal-hop-per-operation contract; do not batch several unhooks into one marshal hop and do not add any member to `QuickFiler/Helper Classes/EmailMoveMonitor.cs`. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t5` records `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` as Passed and `DequeueNextItemGroupAsync_HighConfidenceDisabled_PreservesDirectBatchDequeue` as still Passed. +- [x] [P2-T6] Implement the real outcome projection in `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`: `DequeueNextItemGroupWithOutcomeAsync` propagates the gate's `Stop` and its `Accepted` collection into `QfcDequeueBatch.PreScored`, populates `Items` from the same accepted set after `UnhookDequeuedNodes`, and reports `QfcDequeueStop.SourceExhausted` for the normal-mode `DequeueDirectAsync` path when it yields fewer than `quantity` items. The three pre-existing `IQfcDatamodel` overloads keep delegating internally and their observable behaviour is unchanged. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t6` records `DequeueNextItemGroupWithOutcomeAsync_DeadlineExpiredGate_ReportsDeadlineExpiredStop` as Passed. +- [x] [P2-T7] Guard the queue close in `QuickFiler/Controllers/QfcHomeController.Iteration.cs`: replace the unconditional `else` at `:32-36` with `else if (batch.Stop == QfcDequeueStop.SourceExhausted)` around the `await QfcQueue.CompleteAddingAsync(Token, 10000);` call, and add a short comment recording that a `DeadlineExpired` or `QuantitySatisfied` empty batch deliberately leaves the queue open for a later iteration. `QfcQueue.CompleteAddingAsync` reaches `BlockingCollection.CompleteAdding()` at `QuickFiler/Controllers/QfcQueue.cs:59`, which is irreversible. **Acceptance:** the TRX under `.../evidence/regression-testing/p2-t7` records `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` and `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` both as Passed. +- [x] [P2-T8] Run the whole `QuickFiler.Test` assembly with `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p2-t8"` and record the counts in `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p2-t8-assembly-green..md`. **Acceptance:** the recorded failed count is `0` and the recorded total is greater than zero. +- [x] [P2-T9] Interim line-cap audit. Record the current line count of each of the five production and six test files touched so far, into `docs/features/active/quickfiler-bug-family-446/evidence/other/p2-t9-line-counts..md`. **Acceptance:** every recorded count is at most 500, and the recorded count for `QuickFiler/Controllers/QfcDatamodel.cs` is at most 500. +- [x] [P2-T10] Commit the Phase 2 change set. Run `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` then `git commit -m "fix(446): report a dequeue stop reason, release rejected hooks, carry top folder to the datamodel boundary"`, and record the resulting HEAD sha in `docs/features/active/quickfiler-bug-family-446/evidence/other/p2-t10-commit..md`. **Acceptance:** `EXIT_CODE: 0` and `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` produces zero output lines. --- @@ -326,16 +326,16 @@ Evidence for this phase is written under of `QfcFormController`, so the seams may be declared here without editing the non-owned `QuickFiler/Controllers/QfcFormController.cs` where `_undoQueue` and `_undoConsumerTask` are declared. -- [ ] [P3-T1] Add the three injectable seams to `QuickFiler/Controllers/QfcFormController.Actions.cs` without changing the loop. Declare `internal TimeProvider TimeProvider { get; set; } = TimeProvider.System;`, `internal Func, Task> UndoConsumerStarter { get; set; } = body => Task.Run(body);` and `internal Func UndoItemProcessor { get; set; }` defaulted to a new private method holding the take-branch body from `:262-277` verbatim (per D-Plan-3). Change `:211` from `_undoConsumerTask ??= Task.Run(UndoConsumer);` to `_undoConsumerTask ??= UndoConsumerStarter(UndoConsumer);` and change the take branch to `await UndoItemProcessor(item).ConfigureAwait(false);`. Leave `new Stopwatch()` at `:255`, the disjunction at `:258`, the threshold branch at `:279-282`, the `await Task.Delay(200)` at `:285` and the conditional reset at `:288-291` exactly as they are. `Microsoft.Bcl.TimeProvider` and `Microsoft.Extensions.TimeProvider.Testing` are already referenced by `QuickFiler.Test/packages.config`, so no package is added. **Acceptance:** the intra-phase compile exits 0 and a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcFormControllerSeamTests|FullyQualifiedName~QfcFormControllerTests` records 0 failed, with the TRX under `.../evidence/regression-testing/p3-t1`. -- [ ] [P3-T2] [expect-fail] Add `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` to `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`. The test assigns a counting `TimeProvider` test double to the `TimeProvider` seam and `body => body()` to `UndoConsumerStarter`, starts the consumer against an empty `_undoQueue`, and asserts the double recorded at least one delay request. It must not await the returned consumer task: the pre-fix loop never terminates, so awaiting it would produce a hang instead of a usable RED state (D5). Run it as a single scoped test with `/TestCaseFilter:FullyQualifiedName~UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` so the runaway pre-fix consumer dies with the test host, then confirm the host exited with `pwsh -NoProfile -File scripts\vscode\TestProcessCleanup.ps1`. **Acceptance:** the TRX under `.../evidence/regression-testing/p3-t2` records that test as Failed with an assertion-failure message, and the artifact records that no `vstest` or `testhost` process remained after the cleanup script ran. -- [ ] [P3-T3] Rewrite the `UndoConsumer` loop in `QuickFiler/Controllers/QfcFormController.Actions.cs:253-292`. Add `private static readonly TimeSpan UndoConsumerIdleTimeout = TimeSpan.FromSeconds(10);` preserving the current threshold. Replace the body with: `long start = TimeProvider.GetTimestamp();` before the loop; `while (!_undoQueue.IsCompleted)` as the condition, removing the `|| exit` disjunction and the `exit` flag entirely; on a successful take, run `await UndoItemProcessor(item)` and then reset `start = TimeProvider.GetTimestamp();` so the timer measures idle time rather than session time; `else if (TimeProvider.GetElapsedTime(start) > UndoConsumerIdleTimeout) { break; }`; `else { await TimeProvider.Delay(TimeSpan.FromMilliseconds(200)).ConfigureAwait(false); }`. Wrap the whole loop in `try`/`finally` and move `_undoConsumerTask = null;` into the `finally` so it runs unconditionally, including on the exception path that `QuickFiler/Controllers/QfcFormController.SetupDisposal.cs:216` can produce by disposing `_undoQueue` mid-take. No branch may reach the loop head without an `await` or a `break`. **Acceptance:** the TRX under `.../evidence/regression-testing/p3-t3` records `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` as Passed. -- [ ] [P3-T4] Add `UndoConsumer_IdleBeyondThreshold_Completes` to `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`, driving a `FakeTimeProvider` past the ten-second idle threshold with an empty queue and asserting the consumer task reaches `RanToCompletion`. This test is added after the loop rewrite because its pre-fix state is a hang rather than an assertion failure (D5). **Acceptance:** the TRX under `.../evidence/regression-testing/p3-t4` records that test as Passed with no `[Timeout]` trip recorded. -- [ ] [P3-T5] Add `UndoConsumer_SuccessfulTake_ResetsIdleTimer` to `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`, using a fake `UndoItemProcessor` so no live Outlook COM or dispatcher call is made, advancing the `FakeTimeProvider` past ten seconds in aggregate while keeping every individual idle gap below the threshold, and asserting the consumer kept draining rather than exiting early. **Acceptance:** the TRX under `.../evidence/regression-testing/p3-t5` records that test as Passed. -- [ ] [P3-T6] Add `UndoConsumer_OnExit_ResetsUndoConsumerTask` to `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`, asserting `_undoConsumerTask` is null after the consumer exits on the idle path and again after the consumer exits by exception, so a later `UndoDialog()` starts a fresh consumer. **Acceptance:** the TRX under `.../evidence/regression-testing/p3-t6` records that test as Passed. -- [ ] [P3-T7] Line-cap check for the Phase 3 files. Record the post-change line count of `QuickFiler/Controllers/QfcFormController.Actions.cs` and `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` in `docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t7-line-counts..md`. If the test file would exceed 500 lines, extract a shared `ArrangeUndoConsumer(...)` helper from the four new tests rather than adding a file, because a new test file would require editing `QuickFiler.Test/QuickFiler.Test.csproj`. **Acceptance:** both recorded counts are at most 500. -- [ ] [P3-T8] Run the whole `QuickFiler.Test` assembly with `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p3-t8"` and record the counts in `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8-assembly-green..md`. **Acceptance:** the recorded failed count is `0` and the recorded total is greater than zero. -- [ ] [P3-T9] Confirm the over-cap test file was left alone, per D-Plan-2. Run `git diff --name-only ...HEAD -- "QuickFiler.Test/Controllers/QfcFormControllerTests.cs"` and record the result in `docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t9-formcontrollertests-untouched..md`. **Acceptance:** the command produces zero output lines. -- [ ] [P3-T10] Commit the Phase 3 change set. Run `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` then `git commit -m "fix(448): terminate the undo consumer, reset the idle timer on every take, reset the task in finally"`, and record the resulting HEAD sha in `docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t10-commit..md`. **Acceptance:** `EXIT_CODE: 0` and `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` produces zero output lines. +- [x] [P3-T1] Add the three injectable seams to `QuickFiler/Controllers/QfcFormController.Actions.cs` without changing the loop. Declare `internal TimeProvider TimeProvider { get; set; } = TimeProvider.System;`, `internal Func, Task> UndoConsumerStarter { get; set; } = body => Task.Run(body);` and `internal Func UndoItemProcessor { get; set; }` defaulted to a new private method holding the take-branch body from `:262-277` verbatim (per D-Plan-3). Change `:211` from `_undoConsumerTask ??= Task.Run(UndoConsumer);` to `_undoConsumerTask ??= UndoConsumerStarter(UndoConsumer);` and change the take branch to `await UndoItemProcessor(item).ConfigureAwait(false);`. Leave `new Stopwatch()` at `:255`, the disjunction at `:258`, the threshold branch at `:279-282`, the `await Task.Delay(200)` at `:285` and the conditional reset at `:288-291` exactly as they are. `Microsoft.Bcl.TimeProvider` and `Microsoft.Extensions.TimeProvider.Testing` are already referenced by `QuickFiler.Test/packages.config`, so no package is added. **Acceptance:** the intra-phase compile exits 0 and a scoped run filtered with `/TestCaseFilter:FullyQualifiedName~QfcFormControllerSeamTests|FullyQualifiedName~QfcFormControllerTests` records 0 failed, with the TRX under `.../evidence/regression-testing/p3-t1`. +- [x] [P3-T2] [expect-fail] Add `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` to `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`. The test assigns a counting `TimeProvider` test double to the `TimeProvider` seam and `body => body()` to `UndoConsumerStarter`, starts the consumer against an empty `_undoQueue`, and asserts the double recorded at least one delay request. It must not await the returned consumer task: the pre-fix loop never terminates, so awaiting it would produce a hang instead of a usable RED state (D5). Run it as a single scoped test with `/TestCaseFilter:FullyQualifiedName~UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` so the runaway pre-fix consumer dies with the test host, then confirm the host exited with `pwsh -NoProfile -File scripts\vscode\TestProcessCleanup.ps1`. **Acceptance:** the TRX under `.../evidence/regression-testing/p3-t2` records that test as Failed with an assertion-failure message, and the artifact records that no `vstest` or `testhost` process remained after the cleanup script ran. +- [x] [P3-T3] Rewrite the `UndoConsumer` loop in `QuickFiler/Controllers/QfcFormController.Actions.cs:253-292`. Add `private static readonly TimeSpan UndoConsumerIdleTimeout = TimeSpan.FromSeconds(10);` preserving the current threshold. Replace the body with: `long start = TimeProvider.GetTimestamp();` before the loop; `while (!_undoQueue.IsCompleted)` as the condition, removing the `|| exit` disjunction and the `exit` flag entirely; on a successful take, run `await UndoItemProcessor(item)` and then reset `start = TimeProvider.GetTimestamp();` so the timer measures idle time rather than session time; `else if (TimeProvider.GetElapsedTime(start) > UndoConsumerIdleTimeout) { break; }`; `else { await TimeProvider.Delay(TimeSpan.FromMilliseconds(200)).ConfigureAwait(false); }`. Wrap the whole loop in `try`/`finally` and move `_undoConsumerTask = null;` into the `finally` so it runs unconditionally, including on the exception path that `QuickFiler/Controllers/QfcFormController.SetupDisposal.cs:216` can produce by disposing `_undoQueue` mid-take. No branch may reach the loop head without an `await` or a `break`. **Acceptance:** the TRX under `.../evidence/regression-testing/p3-t3` records `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` as Passed. +- [x] [P3-T4] Add `UndoConsumer_IdleBeyondThreshold_Completes` to `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`, driving a `FakeTimeProvider` past the ten-second idle threshold with an empty queue and asserting the consumer task reaches `RanToCompletion`. This test is added after the loop rewrite because its pre-fix state is a hang rather than an assertion failure (D5). **Acceptance:** the TRX under `.../evidence/regression-testing/p3-t4` records that test as Passed with no `[Timeout]` trip recorded. +- [x] [P3-T5] Add `UndoConsumer_SuccessfulTake_ResetsIdleTimer` to `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`, using a fake `UndoItemProcessor` so no live Outlook COM or dispatcher call is made, advancing the `FakeTimeProvider` past ten seconds in aggregate while keeping every individual idle gap below the threshold, and asserting the consumer kept draining rather than exiting early. **Acceptance:** the TRX under `.../evidence/regression-testing/p3-t5` records that test as Passed. +- [x] [P3-T6] Add `UndoConsumer_OnExit_ResetsUndoConsumerTask` to `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`, asserting `_undoConsumerTask` is null after the consumer exits on the idle path and again after the consumer exits by exception, so a later `UndoDialog()` starts a fresh consumer. **Acceptance:** the TRX under `.../evidence/regression-testing/p3-t6` records that test as Passed. +- [x] [P3-T7] Line-cap check for the Phase 3 files. Record the post-change line count of `QuickFiler/Controllers/QfcFormController.Actions.cs` and `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` in `docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t7-line-counts..md`. If the test file would exceed 500 lines, extract a shared `ArrangeUndoConsumer(...)` helper from the four new tests rather than adding a file, because a new test file would require editing `QuickFiler.Test/QuickFiler.Test.csproj`. **Acceptance:** both recorded counts are at most 500. +- [x] [P3-T8] Run the whole `QuickFiler.Test` assembly with `& $vstest "QuickFiler.Test\bin\Debug\QuickFiler.Test.dll" /InIsolation "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\regression-testing\p3-t8"` and record the counts in `docs/features/active/quickfiler-bug-family-446/evidence/regression-testing/p3-t8-assembly-green..md`. **Acceptance:** the recorded failed count is `0` and the recorded total is greater than zero. +- [x] [P3-T9] Confirm the over-cap test file was left alone, per D-Plan-2. Run `git diff --name-only ...HEAD -- "QuickFiler.Test/Controllers/QfcFormControllerTests.cs"` and record the result in `docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t9-formcontrollertests-untouched..md`. **Acceptance:** the command produces zero output lines. +- [x] [P3-T10] Commit the Phase 3 change set. Run `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` then `git commit -m "fix(448): terminate the undo consumer, reset the idle timer on every take, reset the task in finally"`, and record the resulting HEAD sha in `docs/features/active/quickfiler-bug-family-446/evidence/other/p3-t10-commit..md`. **Acceptance:** `EXIT_CODE: 0` and `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` produces zero output lines. --- @@ -350,32 +350,32 @@ the merge-base sha recorded by `[P0-T3]`. AC18, AC19, AC22, AC24, AC25, AC27 and deferred to Phase 5 because they can only be judged after the final formatting pass and the final toolchain run. -- [ ] [P4-T1] Verify AC1 against the TRX files from `[P1-T9]`, `[P1-T10]` and `[P2-T1]`: `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` and `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` exist in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, are driven by `FakeTimeProvider`, failed before and pass after. Write `.../evidence/qa-gates/p4-t1-ac1..md` and check the AC1 box in `spec.md`. **Acceptance:** the artifact cites one pre-fix Failed TRX path and one post-fix Passed TRX path for each of the two tests, and the AC1 checkbox is checked. -- [ ] [P4-T2] Verify AC2 against `[P1-T16]`, `[P1-T17]` and `[P2-T7]`: `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` asserts `Times.Never` and `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` asserts `Times.Once`, both in `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`. Write `.../evidence/qa-gates/p4-t2-ac2..md` and check the AC2 box in `spec.md`. **Acceptance:** the artifact records both `Times` expressions and both tests as Passed post-fix, and the AC2 checkbox is checked. -- [ ] [P4-T3] Verify AC3 against `[P3-T2]` and `[P3-T3]`: `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` is present in `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`, and its recorded pre-fix outcome is an assertion failure rather than a hang or a test-host timeout. Write `.../evidence/qa-gates/p4-t3-ac3..md` quoting the recorded pre-fix failure message verbatim, and check the AC3 box in `spec.md`. **Acceptance:** the quoted pre-fix message is an assertion-failure message and contains no timeout or cancellation wording, and the AC3 checkbox is checked. -- [ ] [P4-T4] Verify AC4 against `[P1-T2]` and `[P2-T2]`: `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` is present in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` and its pre-fix state was an assertion failure against a compiling tree. Write `.../evidence/qa-gates/p4-t4-ac4..md` recording the `[P1-T2]` compile exit code of 0 alongside the Failed outcome, and check the AC4 box in `spec.md`. **Acceptance:** the artifact records a compile `EXIT_CODE: 0` for the same tree state that produced the Failed outcome, and the AC4 checkbox is checked. -- [ ] [P4-T5] Verify AC5 against `[P1-T12]` and `[P2-T4]`: `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` is present in `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` and failed before the real folder was returned. Write `.../evidence/qa-gates/p4-t5-ac5..md` and check the AC5 box in `spec.md`. **Acceptance:** the artifact cites the pre-fix Failed TRX and the post-fix Passed TRX, and the AC5 checkbox is checked. -- [ ] [P4-T6] Verify AC6: `QuickFiler/Controllers/QfcHomeController.Iteration.cs` calls `CompleteAddingAsync` only inside a branch guarded by a `SourceExhausted` comparison. Record the post-change text of `IterateQueueAsync` and the `[P2-T7]` TRX in `.../evidence/qa-gates/p4-t6-ac6..md`, and check the AC6 box in `spec.md`. **Acceptance:** the recorded method text shows exactly one `CompleteAddingAsync` call and it is inside the guarded branch, and the AC6 checkbox is checked. -- [ ] [P4-T7] Verify AC7: `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` returns a stop reason from all four exits with the mapping `QuantitySatisfied`, `DeadlineExpired`, `SourceExhausted`, `QuantitySatisfied`. Record the four post-change return statements and the `[P2-T1]` TRX in `.../evidence/qa-gates/p4-t7-ac7..md`, and check the AC7 box in `spec.md`. **Acceptance:** the artifact records four return sites each carrying an explicit stop value, and the AC7 checkbox is checked. -- [ ] [P4-T8] Verify AC8 against `[P3-T4]`: `UndoConsumer_IdleBeyondThreshold_Completes` passes on a `FakeTimeProvider` with no `[Timeout]` trip. Write `.../evidence/qa-gates/p4-t8-ac8..md` and check the AC8 box in `spec.md`. **Acceptance:** the artifact cites a Passed TRX outcome for that test and records that no timeout was reported, and the AC8 checkbox is checked. -- [ ] [P4-T9] Verify AC9 against `[P3-T5]`: `UndoConsumer_SuccessfulTake_ResetsIdleTimer` passes, and the reset assignment appears on the successful-take path in `QuickFiler/Controllers/QfcFormController.Actions.cs`. Write `.../evidence/qa-gates/p4-t9-ac9..md` recording the take-branch text, and check the AC9 box in `spec.md`. **Acceptance:** the recorded take-branch text contains a timestamp reassignment after the item is processed, the cited TRX outcome is Passed, and the AC9 checkbox is checked. -- [ ] [P4-T10] Verify AC10 against `[P3-T6]`: `UndoConsumer_OnExit_ResetsUndoConsumerTask` passes and the `_undoConsumerTask` reset sits inside a `finally` block in `QuickFiler/Controllers/QfcFormController.Actions.cs`. Write `.../evidence/qa-gates/p4-t10-ac10..md` recording the `finally` block text, and check the AC10 box in `spec.md`. **Acceptance:** the recorded block is a `finally` containing exactly one `_undoConsumerTask` assignment, the cited TRX outcome is Passed, and the AC10 checkbox is checked. -- [ ] [P4-T11] Verify AC11: no branch of the rewritten loop in `QuickFiler/Controllers/QfcFormController.Actions.cs` reaches the loop head without an `await` or a `break`. Record the full rewritten loop text and a per-branch table (take branch, threshold branch, idle branch) in `.../evidence/qa-gates/p4-t11-ac11..md`, and check the AC11 box in `spec.md`. **Acceptance:** the table shows three branches, each terminating in an `await` or a `break`, and the AC11 checkbox is checked. -- [ ] [P4-T12] Verify AC12 against `[P1-T6]` and `[P2-T5]`: `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` in `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` failed before the wiring and passes after, asserting exactly one `UnhookItem` invocation for the rejected item against the datamodel's own monitor instance. Write `.../evidence/qa-gates/p4-t12-ac12..md` and check the AC12 box in `spec.md`. **Acceptance:** the artifact cites the pre-fix Failed TRX and the post-fix Passed TRX, and the AC12 checkbox is checked. -- [ ] [P4-T13] Verify AC13 against `[P2-T2]`: `DequeueAsync_OnRejectedThrows_ScanContinues` passes. Write `.../evidence/qa-gates/p4-t13-ac13..md` and check the AC13 box in `spec.md`. **Acceptance:** the artifact cites a Passed TRX outcome for that test, and the AC13 checkbox is checked. -- [ ] [P4-T14] Verify AC14: the drop-on-reject contract is intact. Extract the body of `DequeueAsync_BelowThresholdItemsAreDiscarded` from `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` at HEAD and compute its SHA-256, then compare it with the digest recorded by `[P0-T15]`; a byte comparison is used rather than a line-range diff because the surrounding helper rewrite shifts that method's line numbers. Also record the `[P2-T2]` TRX outcome for that test. Write `.../evidence/qa-gates/p4-t14-ac14..md` and check the AC14 box in `spec.md`. **Acceptance:** the two SHA-256 digests are identical, the cited TRX outcome is Passed, and the AC14 checkbox is checked. -- [ ] [P4-T15] Verify AC15: the thread-affinity contract is preserved. Run `git diff --name-only ...HEAD -- "QuickFiler/Helper Classes/EmailMoveMonitor.cs" "QuickFiler.Test/Helper Classes/EmailMoveMonitorTests.cs"` and record the result plus the `[P3-T8]` outcomes of `AllComAccess_FlowsThroughInjectedMarshalDelegate` and the null-argument no-op test in `.../evidence/qa-gates/p4-t15-ac15..md`, then check the AC15 box in `spec.md`. **Acceptance:** the diff command produces zero output lines, both cited test outcomes are Passed, and the AC15 checkbox is checked. -- [ ] [P4-T16] Verify AC16 against `[P2-T3]` and `[P2-T4]`: `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` and `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` both pass, and the accepted candidate's folder survives to the datamodel boundary as `QfcDequeueBatch.PreScored`. Write `.../evidence/qa-gates/p4-t16-ac16..md` and check the AC16 box in `spec.md`. **Acceptance:** the artifact cites Passed outcomes for both tests and records the `PreScored` projection site in `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, and the AC16 checkbox is checked. -- [ ] [P4-T17] Verify AC17: issue 427 must remain open. Scan every path returned by `git diff --name-only ...HEAD` and the output of `git log ..HEAD --format=%B` with the case-insensitive pattern `(close[sd]?|fix(es|ed)?|resolve[sd]?):? +#427`, which encodes the AC17 keyword set with the immediately-precedes requirement. Then write a constraint note for the pull-request author to `docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t17-pr-closing-keyword-constraint..md` stating that the pull-request body carries closing keywords for #446, #448 and #426 only, and that the `Also closes:` line in `issue.md` is superseded by decision D1 and is not transcribed. Write `.../evidence/qa-gates/p4-t17-ac17..md` and check the AC17 box in `spec.md`. **Acceptance:** both scans return zero matches, the constraint note exists at the stated path and names exactly three issue numbers, and the AC17 checkbox is checked. -- [ ] [P4-T18] Verify AC20: the three pre-existing `IQfcDatamodel` overloads are unchanged. Run `git diff ...HEAD -- "QuickFiler/Interfaces/IQfcDatamodel.cs"` and record the full hunk list in `.../evidence/qa-gates/p4-t18-ac20..md`, then check the AC20 box in `spec.md`. **Acceptance:** the recorded diff contains no removed or altered line belonging to the existing `DequeueNextItemGroupAsync` or `DequeueNextItemGroup` declarations, and the AC20 checkbox is checked. -- [ ] [P4-T19] Verify AC21: the overload-selection pins are untouched. Run `git diff --name-only ...HEAD -- "QuickFiler.Test/Controllers/QfcHomeControllerIssue218Tests.cs" "QuickFiler.Test/Controllers/QfcHomeControllerRunAsyncHighConfidenceTests.cs"` and record the result in `.../evidence/qa-gates/p4-t19-ac21..md`, then check the AC21 box in `spec.md`. **Acceptance:** the command produces zero output lines and the AC21 checkbox is checked. -- [ ] [P4-T20] Verify AC23: the reflective gate helper is fail-closed. Run `git grep -c "GetConstructor" -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` and record its output alongside the `[P3-T8]` outcomes of the `[P0-T15]`-recorded `[TestMethod]` total plus the six gate test methods added by `[P1-T2]`, `[P1-T3]`, `[P1-T4]`, `[P1-T9]`, `[P1-T10]` and `[P1-T13]` (29 on the tree that carries PR #610) in `.../evidence/qa-gates/p4-t20-ac23..md`, then check the AC23 box in `spec.md`. The literal this task asserts is `GetConstructor`; `[P0-T15]` recorded its pre-change count of 4 so the post-change count of 1 is a real change and not a vacuous match. **Acceptance:** the command reports a count of 1 for that file (with an explicit pathspec, `git grep -c` prefixes the count with the path, so the output line ends in `:1`), the artifact records a Passed gate-test-method count equal to the `[P0-T15]`-recorded `[TestMethod]` total plus the six gate test methods added by `[P1-T2]`, `[P1-T3]`, `[P1-T4]`, `[P1-T9]`, `[P1-T10]` and `[P1-T13]` (29 on the tree that carries PR #610) and 0 failed, and the AC23 checkbox is checked. -- [ ] [P4-T21] Verify AC26: determinism of the changed test files. For every path returned by `git diff --name-only ...HEAD -- "QuickFiler.Test/**/*.cs"`, scan for `Thread.Sleep`, `Task.Delay`, `DateTime.Now`, `DateTime.UtcNow`, `Path.GetTempPath` and `Path.GetTempFileName`, excluding lines whose trimmed text begins with `///` or `//`. The one known pre-existing occurrence is a documentation reference in an XML doc comment at `QuickFiler.Test/Controllers/QfcDatamodelTests.cs:245`, which the comment exclusion removes; record it explicitly as a carve-out so the zero-hit result is auditable rather than accidental. Write `.../evidence/qa-gates/p4-t21-ac26..md` and check the AC26 box in `spec.md`. **Acceptance:** the post-exclusion scan reports zero hits across all changed test paths, the artifact names the one excluded documentation line, and the AC26 checkbox is checked. -- [ ] [P4-T22] File the follow-up issue for the three independent `EmailMoveMonitor` instances (`QuickFiler/Controllers/QfcDatamodel.cs:103`, `QuickFiler/Controllers/QfcQueue.cs:40` and `QuickFiler/Controllers/QfcCollectionController.cs:78` each construct their own monitor, so the `UnhookItem` call at `QuickFiler/Controllers/QfcQueue.cs:76` consults a list that can never hold the datamodel's hooks) through the MCP promotion path (`mcp__drm-copilot__new_potential_bug_entry`, then `mcp__drm-copilot__potential_to_issue` with `promotion_type=bug` and `work_mode=minor-audit`); `gh issue create` and `gh issue new` are denied by the registered `PreToolUse` hook `.claude/hooks/enforce-promotion-mcp-only.ps1` and must not be attempted. Then mirror the created issue URL and body into `docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t22-monitor-consolidation..md`. **Acceptance:** the mirror carries `Timestamp:`, one `Tool:` line per MCP call, `Result:` and `Output Summary:`; it records the potential-entry path returned by the potential-entry tool, the raw result payload returned by `mcp__drm-copilot__potential_to_issue`, and a GitHub issue number and URL under `https://github.com/drmoisan/TaskMaster/issues/` taken either from that payload or, when the payload carries none, from the generated issue file with the source stated explicitly in the mirror. -- [ ] [P4-T23] File the follow-up issue for the `QfcFormController.Cleanup()` disposal ordering defect (`QuickFiler/Controllers/QfcFormController.SetupDisposal.cs:216-220` disposes `_undoQueue` and nulls `_globals` and `_groups` without cancelling or awaiting `_undoConsumerTask`) through the MCP promotion path (`mcp__drm-copilot__new_potential_bug_entry`, then `mcp__drm-copilot__potential_to_issue` with `promotion_type=bug` and `work_mode=minor-audit`); `gh issue create` and `gh issue new` are denied by the registered `PreToolUse` hook `.claude/hooks/enforce-promotion-mcp-only.ps1` and must not be attempted. Then mirror it into `docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t23-disposal-ordering..md`. **Acceptance:** the mirror carries `Timestamp:`, one `Tool:` line per MCP call, `Result:` and `Output Summary:`; it records the potential-entry path returned by the potential-entry tool, the raw result payload returned by `mcp__drm-copilot__potential_to_issue`, and a GitHub issue number and URL under `https://github.com/drmoisan/TaskMaster/issues/` taken either from that payload or, when the payload carries none, from the generated issue file with the source stated explicitly in the mirror. -- [ ] [P4-T24] File the follow-up issue for the dead `scoreLoader` parameter on `QuickFiler/Controllers/QfcRemainingQueueAdmission.cs` (declared at `:17`, null-checked at `:23-26`, never assigned or invoked) through the MCP promotion path (`mcp__drm-copilot__new_potential_bug_entry`, then `mcp__drm-copilot__potential_to_issue` with `promotion_type=bug` and `work_mode=minor-audit`); `gh issue create` and `gh issue new` are denied by the registered `PreToolUse` hook `.claude/hooks/enforce-promotion-mcp-only.ps1` and must not be attempted. Then mirror it into `docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t24-dead-scoreloader..md`. **Acceptance:** the mirror carries `Timestamp:`, one `Tool:` line per MCP call, `Result:` and `Output Summary:`; it records the potential-entry path returned by the potential-entry tool, the raw result payload returned by `mcp__drm-copilot__potential_to_issue`, and a GitHub issue number and URL under `https://github.com/drmoisan/TaskMaster/issues/` taken either from that payload or, when the payload carries none, from the generated issue file with the source stated explicitly in the mirror. -- [ ] [P4-T25] File the follow-up issue for the pre-existing 500-line cap violations `QuickFiler/Controllers/QfcQueue.cs` (610), `QuickFiler/Controllers/QfcCollectionController.cs` (2349) and `QuickFiler.Test/Controllers/QfcFormControllerTests.cs` (827) through the MCP promotion path (`mcp__drm-copilot__new_potential_entry`, then `mcp__drm-copilot__potential_to_issue` with `promotion_type=feature` and `work_mode=minor-audit`); `gh issue create` and `gh issue new` are denied by the registered `PreToolUse` hook `.claude/hooks/enforce-promotion-mcp-only.ps1` and must not be attempted. Then mirror it into `docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t25-line-cap-violations..md`. **Acceptance:** the mirror carries `Timestamp:`, one `Tool:` line per MCP call, `Result:` and `Output Summary:`; it records the potential-entry path returned by the potential-entry tool, the raw result payload returned by `mcp__drm-copilot__potential_to_issue`, and a GitHub issue number and URL under `https://github.com/drmoisan/TaskMaster/issues/` taken either from that payload or, when the payload carries none, from the generated issue file with the source stated explicitly in the mirror. -- [ ] [P4-T26] Commit the Phase 4 verification artifacts and acceptance-criteria check-offs. Run `git add "docs/features/active/quickfiler-bug-family-446" "docs/features/potential"` then `git commit -m "docs(446): record acceptance-criteria verification for AC1 through AC17, AC20, AC21, AC23 and AC26"`, and record the resulting HEAD sha in `docs/features/active/quickfiler-bug-family-446/evidence/other/p4-t26-commit..md`. When `[P4-T22]` through `[P4-T25]` left no file on disk under `docs/features/potential/`, record that absence explicitly in the artifact rather than treating it as a promotion failure. **Acceptance:** `EXIT_CODE: 0` and `git status --porcelain -- "docs/features/active/quickfiler-bug-family-446" "docs/features/potential"` produces zero output lines. +- [x] [P4-T1] Verify AC1 against the TRX files from `[P1-T9]`, `[P1-T10]` and `[P2-T1]`: `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` and `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` exist in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, are driven by `FakeTimeProvider`, failed before and pass after. Write `.../evidence/qa-gates/p4-t1-ac1..md` and check the AC1 box in `spec.md`. **Acceptance:** the artifact cites one pre-fix Failed TRX path and one post-fix Passed TRX path for each of the two tests, and the AC1 checkbox is checked. +- [x] [P4-T2] Verify AC2 against `[P1-T16]`, `[P1-T17]` and `[P2-T7]`: `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` asserts `Times.Never` and `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` asserts `Times.Once`, both in `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`. Write `.../evidence/qa-gates/p4-t2-ac2..md` and check the AC2 box in `spec.md`. **Acceptance:** the artifact records both `Times` expressions and both tests as Passed post-fix, and the AC2 checkbox is checked. +- [x] [P4-T3] Verify AC3 against `[P3-T2]` and `[P3-T3]`: `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` is present in `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs`, and its recorded pre-fix outcome is an assertion failure rather than a hang or a test-host timeout. Write `.../evidence/qa-gates/p4-t3-ac3..md` quoting the recorded pre-fix failure message verbatim, and check the AC3 box in `spec.md`. **Acceptance:** the quoted pre-fix message is an assertion-failure message and contains no timeout or cancellation wording, and the AC3 checkbox is checked. +- [x] [P4-T4] Verify AC4 against `[P1-T2]` and `[P2-T2]`: `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` is present in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` and its pre-fix state was an assertion failure against a compiling tree. Write `.../evidence/qa-gates/p4-t4-ac4..md` recording the `[P1-T2]` compile exit code of 0 alongside the Failed outcome, and check the AC4 box in `spec.md`. **Acceptance:** the artifact records a compile `EXIT_CODE: 0` for the same tree state that produced the Failed outcome, and the AC4 checkbox is checked. +- [x] [P4-T5] Verify AC5 against `[P1-T12]` and `[P2-T4]`: `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` is present in `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` and failed before the real folder was returned. Write `.../evidence/qa-gates/p4-t5-ac5..md` and check the AC5 box in `spec.md`. **Acceptance:** the artifact cites the pre-fix Failed TRX and the post-fix Passed TRX, and the AC5 checkbox is checked. +- [x] [P4-T6] Verify AC6: `QuickFiler/Controllers/QfcHomeController.Iteration.cs` calls `CompleteAddingAsync` only inside a branch guarded by a `SourceExhausted` comparison. Record the post-change text of `IterateQueueAsync` and the `[P2-T7]` TRX in `.../evidence/qa-gates/p4-t6-ac6..md`, and check the AC6 box in `spec.md`. **Acceptance:** the recorded method text shows exactly one `CompleteAddingAsync` call and it is inside the guarded branch, and the AC6 checkbox is checked. +- [x] [P4-T7] Verify AC7: `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` returns a stop reason from all four exits with the mapping `QuantitySatisfied`, `DeadlineExpired`, `SourceExhausted`, `QuantitySatisfied`. Record the four post-change return statements and the `[P2-T1]` TRX in `.../evidence/qa-gates/p4-t7-ac7..md`, and check the AC7 box in `spec.md`. **Acceptance:** the artifact records four return sites each carrying an explicit stop value, and the AC7 checkbox is checked. +- [x] [P4-T8] Verify AC8 against `[P3-T4]`: `UndoConsumer_IdleBeyondThreshold_Completes` passes on a `FakeTimeProvider` with no `[Timeout]` trip. Write `.../evidence/qa-gates/p4-t8-ac8..md` and check the AC8 box in `spec.md`. **Acceptance:** the artifact cites a Passed TRX outcome for that test and records that no timeout was reported, and the AC8 checkbox is checked. +- [x] [P4-T9] Verify AC9 against `[P3-T5]`: `UndoConsumer_SuccessfulTake_ResetsIdleTimer` passes, and the reset assignment appears on the successful-take path in `QuickFiler/Controllers/QfcFormController.Actions.cs`. Write `.../evidence/qa-gates/p4-t9-ac9..md` recording the take-branch text, and check the AC9 box in `spec.md`. **Acceptance:** the recorded take-branch text contains a timestamp reassignment after the item is processed, the cited TRX outcome is Passed, and the AC9 checkbox is checked. +- [x] [P4-T10] Verify AC10 against `[P3-T6]`: `UndoConsumer_OnExit_ResetsUndoConsumerTask` passes and the `_undoConsumerTask` reset sits inside a `finally` block in `QuickFiler/Controllers/QfcFormController.Actions.cs`. Write `.../evidence/qa-gates/p4-t10-ac10..md` recording the `finally` block text, and check the AC10 box in `spec.md`. **Acceptance:** the recorded block is a `finally` containing exactly one `_undoConsumerTask` assignment, the cited TRX outcome is Passed, and the AC10 checkbox is checked. +- [x] [P4-T11] Verify AC11: no branch of the rewritten loop in `QuickFiler/Controllers/QfcFormController.Actions.cs` reaches the loop head without an `await` or a `break`. Record the full rewritten loop text and a per-branch table (take branch, threshold branch, idle branch) in `.../evidence/qa-gates/p4-t11-ac11..md`, and check the AC11 box in `spec.md`. **Acceptance:** the table shows three branches, each terminating in an `await` or a `break`, and the AC11 checkbox is checked. +- [x] [P4-T12] Verify AC12 against `[P1-T6]` and `[P2-T5]`: `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` in `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs` failed before the wiring and passes after, asserting exactly one `UnhookItem` invocation for the rejected item against the datamodel's own monitor instance. Write `.../evidence/qa-gates/p4-t12-ac12..md` and check the AC12 box in `spec.md`. **Acceptance:** the artifact cites the pre-fix Failed TRX and the post-fix Passed TRX, and the AC12 checkbox is checked. +- [x] [P4-T13] Verify AC13 against `[P2-T2]`: `DequeueAsync_OnRejectedThrows_ScanContinues` passes. Write `.../evidence/qa-gates/p4-t13-ac13..md` and check the AC13 box in `spec.md`. **Acceptance:** the artifact cites a Passed TRX outcome for that test, and the AC13 checkbox is checked. +- [x] [P4-T14] Verify AC14: the drop-on-reject contract is intact. Extract the body of `DequeueAsync_BelowThresholdItemsAreDiscarded` from `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs` at HEAD and compute its SHA-256, then compare it with the digest recorded by `[P0-T15]`; a byte comparison is used rather than a line-range diff because the surrounding helper rewrite shifts that method's line numbers. Also record the `[P2-T2]` TRX outcome for that test. Write `.../evidence/qa-gates/p4-t14-ac14..md` and check the AC14 box in `spec.md`. **Acceptance:** the two SHA-256 digests are identical, the cited TRX outcome is Passed, and the AC14 checkbox is checked. +- [x] [P4-T15] Verify AC15: the thread-affinity contract is preserved. Run `git diff --name-only ...HEAD -- "QuickFiler/Helper Classes/EmailMoveMonitor.cs" "QuickFiler.Test/Helper Classes/EmailMoveMonitorTests.cs"` and record the result plus the `[P3-T8]` outcomes of `AllComAccess_FlowsThroughInjectedMarshalDelegate` and the null-argument no-op test in `.../evidence/qa-gates/p4-t15-ac15..md`, then check the AC15 box in `spec.md`. **Acceptance:** the diff command produces zero output lines, both cited test outcomes are Passed, and the AC15 checkbox is checked. +- [x] [P4-T16] Verify AC16 against `[P2-T3]` and `[P2-T4]`: `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult` and `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` both pass, and the accepted candidate's folder survives to the datamodel boundary as `QfcDequeueBatch.PreScored`. Write `.../evidence/qa-gates/p4-t16-ac16..md` and check the AC16 box in `spec.md`. **Acceptance:** the artifact cites Passed outcomes for both tests and records the `PreScored` projection site in `QuickFiler/Controllers/QfcDatamodel.QueueProcessing.cs`, and the AC16 checkbox is checked. +- [x] [P4-T17] Verify AC17: issue 427 must remain open. Scan every path returned by `git diff --name-only ...HEAD` and the output of `git log ..HEAD --format=%B` with the case-insensitive pattern `(close[sd]?|fix(es|ed)?|resolve[sd]?):? +#427`, which encodes the AC17 keyword set with the immediately-precedes requirement. Then write a constraint note for the pull-request author to `docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t17-pr-closing-keyword-constraint..md` stating that the pull-request body carries closing keywords for #446, #448 and #426 only, and that the `Also closes:` line in `issue.md` is superseded by decision D1 and is not transcribed. Write `.../evidence/qa-gates/p4-t17-ac17..md` and check the AC17 box in `spec.md`. **Acceptance:** both scans return zero matches, the constraint note exists at the stated path and names exactly three issue numbers, and the AC17 checkbox is checked. +- [x] [P4-T18] Verify AC20: the three pre-existing `IQfcDatamodel` overloads are unchanged. Run `git diff ...HEAD -- "QuickFiler/Interfaces/IQfcDatamodel.cs"` and record the full hunk list in `.../evidence/qa-gates/p4-t18-ac20..md`, then check the AC20 box in `spec.md`. **Acceptance:** the recorded diff contains no removed or altered line belonging to the existing `DequeueNextItemGroupAsync` or `DequeueNextItemGroup` declarations, and the AC20 checkbox is checked. +- [x] [P4-T19] Verify AC21: the overload-selection pins are untouched. Run `git diff --name-only ...HEAD -- "QuickFiler.Test/Controllers/QfcHomeControllerIssue218Tests.cs" "QuickFiler.Test/Controllers/QfcHomeControllerRunAsyncHighConfidenceTests.cs"` and record the result in `.../evidence/qa-gates/p4-t19-ac21..md`, then check the AC21 box in `spec.md`. **Acceptance:** the command produces zero output lines and the AC21 checkbox is checked. +- [x] [P4-T20] Verify AC23: the reflective gate helper is fail-closed. Run `git grep -c "GetConstructor" -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` and record its output alongside the `[P3-T8]` outcomes of the `[P0-T15]`-recorded `[TestMethod]` total plus the six gate test methods added by `[P1-T2]`, `[P1-T3]`, `[P1-T4]`, `[P1-T9]`, `[P1-T10]` and `[P1-T13]` (29 on the tree that carries PR #610) in `.../evidence/qa-gates/p4-t20-ac23..md`, then check the AC23 box in `spec.md`. The literal this task asserts is `GetConstructor`; `[P0-T15]` recorded its pre-change count of 4 so the post-change count of 1 is a real change and not a vacuous match. **Acceptance:** the command reports a count of 1 for that file (with an explicit pathspec, `git grep -c` prefixes the count with the path, so the output line ends in `:1`), the artifact records a Passed gate-test-method count equal to the `[P0-T15]`-recorded `[TestMethod]` total plus the six gate test methods added by `[P1-T2]`, `[P1-T3]`, `[P1-T4]`, `[P1-T9]`, `[P1-T10]` and `[P1-T13]` (29 on the tree that carries PR #610) and 0 failed, and the AC23 checkbox is checked. +- [x] [P4-T21] Verify AC26: determinism of the changed test files. For every path returned by `git diff --name-only ...HEAD -- "QuickFiler.Test/**/*.cs"`, scan for `Thread.Sleep`, `Task.Delay`, `DateTime.Now`, `DateTime.UtcNow`, `Path.GetTempPath` and `Path.GetTempFileName`, excluding lines whose trimmed text begins with `///` or `//`. The one known pre-existing occurrence is a documentation reference in an XML doc comment at `QuickFiler.Test/Controllers/QfcDatamodelTests.cs:245`, which the comment exclusion removes; record it explicitly as a carve-out so the zero-hit result is auditable rather than accidental. Write `.../evidence/qa-gates/p4-t21-ac26..md` and check the AC26 box in `spec.md`. **Acceptance:** the post-exclusion scan reports zero hits across all changed test paths, the artifact names the one excluded documentation line, and the AC26 checkbox is checked. +- [x] [P4-T22] File the follow-up issue for the three independent `EmailMoveMonitor` instances (`QuickFiler/Controllers/QfcDatamodel.cs:103`, `QuickFiler/Controllers/QfcQueue.cs:40` and `QuickFiler/Controllers/QfcCollectionController.cs:78` each construct their own monitor, so the `UnhookItem` call at `QuickFiler/Controllers/QfcQueue.cs:76` consults a list that can never hold the datamodel's hooks) through the MCP promotion path (`mcp__drm-copilot__new_potential_bug_entry`, then `mcp__drm-copilot__potential_to_issue` with `promotion_type=bug` and `work_mode=minor-audit`); `gh issue create` and `gh issue new` are denied by the registered `PreToolUse` hook `.claude/hooks/enforce-promotion-mcp-only.ps1` and must not be attempted. Then mirror the created issue URL and body into `docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t22-monitor-consolidation..md`. **Acceptance:** the mirror carries `Timestamp:`, one `Tool:` line per MCP call, `Result:` and `Output Summary:`; it records the potential-entry path returned by the potential-entry tool, the raw result payload returned by `mcp__drm-copilot__potential_to_issue`, and a GitHub issue number and URL under `https://github.com/drmoisan/TaskMaster/issues/` taken either from that payload or, when the payload carries none, from the generated issue file with the source stated explicitly in the mirror. +- [x] [P4-T23] File the follow-up issue for the `QfcFormController.Cleanup()` disposal ordering defect (`QuickFiler/Controllers/QfcFormController.SetupDisposal.cs:216-220` disposes `_undoQueue` and nulls `_globals` and `_groups` without cancelling or awaiting `_undoConsumerTask`) through the MCP promotion path (`mcp__drm-copilot__new_potential_bug_entry`, then `mcp__drm-copilot__potential_to_issue` with `promotion_type=bug` and `work_mode=minor-audit`); `gh issue create` and `gh issue new` are denied by the registered `PreToolUse` hook `.claude/hooks/enforce-promotion-mcp-only.ps1` and must not be attempted. Then mirror it into `docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t23-disposal-ordering..md`. **Acceptance:** the mirror carries `Timestamp:`, one `Tool:` line per MCP call, `Result:` and `Output Summary:`; it records the potential-entry path returned by the potential-entry tool, the raw result payload returned by `mcp__drm-copilot__potential_to_issue`, and a GitHub issue number and URL under `https://github.com/drmoisan/TaskMaster/issues/` taken either from that payload or, when the payload carries none, from the generated issue file with the source stated explicitly in the mirror. +- [x] [P4-T24] File the follow-up issue for the dead `scoreLoader` parameter on `QuickFiler/Controllers/QfcRemainingQueueAdmission.cs` (declared at `:17`, null-checked at `:23-26`, never assigned or invoked) through the MCP promotion path (`mcp__drm-copilot__new_potential_bug_entry`, then `mcp__drm-copilot__potential_to_issue` with `promotion_type=bug` and `work_mode=minor-audit`); `gh issue create` and `gh issue new` are denied by the registered `PreToolUse` hook `.claude/hooks/enforce-promotion-mcp-only.ps1` and must not be attempted. Then mirror it into `docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t24-dead-scoreloader..md`. **Acceptance:** the mirror carries `Timestamp:`, one `Tool:` line per MCP call, `Result:` and `Output Summary:`; it records the potential-entry path returned by the potential-entry tool, the raw result payload returned by `mcp__drm-copilot__potential_to_issue`, and a GitHub issue number and URL under `https://github.com/drmoisan/TaskMaster/issues/` taken either from that payload or, when the payload carries none, from the generated issue file with the source stated explicitly in the mirror. +- [x] [P4-T25] File the follow-up issue for the pre-existing 500-line cap violations `QuickFiler/Controllers/QfcQueue.cs` (610), `QuickFiler/Controllers/QfcCollectionController.cs` (2349) and `QuickFiler.Test/Controllers/QfcFormControllerTests.cs` (827) through the MCP promotion path (`mcp__drm-copilot__new_potential_entry`, then `mcp__drm-copilot__potential_to_issue` with `promotion_type=feature` and `work_mode=minor-audit`); `gh issue create` and `gh issue new` are denied by the registered `PreToolUse` hook `.claude/hooks/enforce-promotion-mcp-only.ps1` and must not be attempted. Then mirror it into `docs/features/active/quickfiler-bug-family-446/evidence/issue-updates/p4-t25-line-cap-violations..md`. **Acceptance:** the mirror carries `Timestamp:`, one `Tool:` line per MCP call, `Result:` and `Output Summary:`; it records the potential-entry path returned by the potential-entry tool, the raw result payload returned by `mcp__drm-copilot__potential_to_issue`, and a GitHub issue number and URL under `https://github.com/drmoisan/TaskMaster/issues/` taken either from that payload or, when the payload carries none, from the generated issue file with the source stated explicitly in the mirror. +- [x] [P4-T26] Commit the Phase 4 verification artifacts and acceptance-criteria check-offs. Run `git add "docs/features/active/quickfiler-bug-family-446" "docs/features/potential"` then `git commit -m "docs(446): record acceptance-criteria verification for AC1 through AC17, AC20, AC21, AC23 and AC26"`, and record the resulting HEAD sha in `docs/features/active/quickfiler-bug-family-446/evidence/other/p4-t26-commit..md`. When `[P4-T22]` through `[P4-T25]` left no file on disk under `docs/features/potential/`, record that absence explicitly in the artifact rather than treating it as a promotion failure. **Acceptance:** `EXIT_CODE: 0` and `git status --porcelain -- "docs/features/active/quickfiler-bug-family-446" "docs/features/potential"` produces zero output lines. --- @@ -389,21 +389,21 @@ alongside the artifact from the pass that finally succeeded. No task in this pha this phase is written under `docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/`. -- [ ] [P5-T1] Formatting pass, scoped to the change set per D-Plan-4. Compute the SHA-256 of every `.cs` path returned by `git diff --name-only ...HEAD -- "*.cs"`, run `pwsh -NoProfile -Command 'dotnet tool run csharpier format '`, then recompute the digests. Record both digest sets and the derived rewritten-file count in `.../evidence/qa-gates/p5-t1-csharpier-format..md`; the rewritten count is derived from the digest comparison, not from CSharpier's own "Formatted N files" line, which reports files processed rather than files changed. **Acceptance:** `EXIT_CODE: 0` and the artifact records a rewritten-file count of `0` for the pass that the loop finally accepts. -- [ ] [P5-T2] Formatting gate, read-only and repository-wide. Run `pwsh -NoProfile -Command 'dotnet tool run csharpier check .'` and record it in `.../evidence/qa-gates/p5-t2-csharpier-check..md`. **Acceptance:** `EXIT_CODE: 0`, or, when `[P0-T9]` recorded a non-zero exit, the artifact records an unformatted path set identical to the `[P0-T9]` set and containing no change-set path, and names the pre-existing formatting blocker. -- [ ] [P5-T3] Analyzer gate. Run `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true` through `pwsh -NoProfile` and record it in `.../evidence/qa-gates/p5-t3-analyzer-build..md`. The command uses `/t:Rebuild` and adds no `Nullable` property. **Acceptance:** `EXIT_CODE: 0` with a recorded error count of `0`, and the recorded command text contains neither `/t:Build` nor `Nullable=enable`. -- [ ] [P5-T4] Type-check gate. Run `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true` through `pwsh -NoProfile` and record it in `.../evidence/qa-gates/p5-t4-nullable-build..md`. **Acceptance:** `EXIT_CODE: 0` with a recorded error count of `0`, and the recorded command text contains neither `/t:Build` nor `Nullable=enable`. -- [ ] [P5-T5] Test gate. Using the discovery prelude, run `& $vstest $asm /InIsolation /EnableCodeCoverage "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\qa-gates\p5-t5"` and record the discovered assembly list and the total, passed, failed and skipped counts in `.../evidence/qa-gates/p5-t5-vstest..md`. **Acceptance:** a recorded total greater than zero, every recorded assembly path expressed relative to the workspace root free of a `.claude` segment, and either `EXIT_CODE: 0` with a recorded failed count of `0`, or the recorded failed set is identical to the failed set recorded by `[P0-T12]`, contains no `QuickFiler.Test` test, and the artifact names each pre-existing failure. -- [ ] [P5-T6] Post-change Cobertura capture, comparable with `[P0-T12]`. Run `pwsh -NoProfile -File scripts\vscode\Invoke-MSTestWithCoverage.ps1 -SearchRoot . -Configuration Debug -CoverageOutput "docs\features\active\quickfiler-bug-family-446\evidence\qa-gates\coverage-final.cobertura.xml"` and record the repository-wide `line-rate` and `branch-rate` in `.../evidence/qa-gates/p5-t6-coverage-run..md`. **Acceptance:** `coverage-final.cobertura.xml` exists at that path, the artifact records two numeric coverage rates, and either a failed count of `0` or a failed set identical to the set recorded by `[P0-T12]` that contains no `QuickFiler.Test` test, with each pre-existing failure named in the artifact. -- [ ] [P5-T7] Coverage comparison against the Phase 0 baseline, per D-Plan-7. Apply the same aggregation command used by `[P0-T13]` to `docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/coverage-final.cobertura.xml`, and write `.../evidence/qa-gates/p5-t7-coverage-comparison..md` containing: the repository-wide baseline and post-change line rates (recorded and reported, not a blocking threshold, because no merge-base baseline exists for this feature folder); three changed-file rows for `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`, `QuickFiler/Controllers/QfcFormController.Actions.cs` and `QuickFiler/Controllers/QfcHomeController.Iteration.cs`; and three whole-type rows for `QfcStreamingDequeueConfidenceGate`, `QfcFormController` and `QfcHomeController`, each carrying its `[P0-T13]` baseline value and its post-change value. **Acceptance:** the changed-file line rates for `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` and `QuickFiler/Controllers/QfcHomeController.Iteration.cs` are each at least `90.00`; the changed-file line rate for `QuickFiler/Controllers/QfcFormController.Actions.cs` is either at least `90.00`, or is greater than or equal to its `[P0-T13]` baseline value with the artifact carrying, verbatim, the line `REMEDIATION-REQUIRED: QfcFormController.Actions.cs changed-file coverage is bounded by the un-seamed MessageBox.Show calls in UndoDialog at :225, :238 and :248, which UT4 prohibits exercising and which no task in this plan seams`; each of the three whole-type line rates is greater than or equal to its recorded baseline value; all eight figures are numeric; and every aggregation row's `lines=` value is a positive integer. -- [ ] [P5-T8] Post-format file-size audit. For every path returned by `git diff --name-only ...HEAD -- "*.cs"`, record the post-change line count in `.../evidence/qa-gates/p5-t8-line-cap-audit..md`. This audit runs after `[P5-T1]` because a formatting pass can change line counts. Markdown documentation under the feature folder is exempt from the 500-line cap per `.claude/rules/general-code-change.md` and is not part of this audit. **Acceptance:** every recorded count is at most 500, and `QuickFiler.Test/Controllers/QfcFormControllerTests.cs` does not appear in the audited path list. -- [ ] [P5-T9] Record the single clean toolchain pass. Write `.../evidence/qa-gates/p5-t9-clean-pass..md` listing, for the pass the loop finally accepted, the five command strings from `[P5-T1]`, `[P5-T2]`, `[P5-T3]`, `[P5-T4]` and `[P5-T5]` with their exit codes, plus the rewritten-file count from `[P5-T1]`. **Acceptance:** the recorded rewritten-file count is `0`; the `[P5-T1]`, `[P5-T3]` and `[P5-T4]` exit codes are `0`; either the `[P5-T2]` exit code is `0`, or this artifact records that `[P5-T2]` completed on its pre-existing-baseline branch with an unformatted path set identical to the `[P0-T9]` set and containing no change-set path; and either the `[P5-T5]` exit code is `0`, or `[P5-T5]` completed on its pre-existing-baseline branch and this artifact reproduces that reconciled failed set. -- [ ] [P5-T10] Commit the final change set. Run `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` then `git commit -m "chore(446): record final QA gates and coverage comparison"`, and record the resulting HEAD sha in `.../evidence/qa-gates/p5-t10-commit..md`. **Acceptance:** `EXIT_CODE: 0` and `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` produces zero output lines. -- [ ] [P5-T11] Verify AC18: no non-owned production file is modified. Run `git diff --name-only ...HEAD -- "QuickFiler/**/*.cs"` and confirm every returned path is one of the six owned production paths this plan writes. Record the returned list and an explicit absence check for `QfcHomeController.cs`, `QfcHomeController.Metrics.cs`, `QfcCollectionController.cs`, `QfcItemController.cs`, `QfcItemController.Initialization.cs`, `QfcHighConfidencePreFilter.cs`, `QfcItemGroup.cs`, `QfcQueue.cs`, `QfcRemainingQueueAdmission.cs`, `QfcFormController.cs`, `QfcFormController.EventHandlers.cs` and `QfcFormController.SetupDisposal.cs` in `.../evidence/qa-gates/p5-t11-ac18..md`, then check the AC18 box in `spec.md`. **Acceptance:** every returned path is an owned path, all twelve named paths are absent, and the AC18 checkbox is checked. -- [ ] [P5-T12] Verify AC19: no project file is modified. Run `git diff --name-only ...HEAD -- "*.csproj" "*.props" "*.targets" "packages.config"` and record the result in `.../evidence/qa-gates/p5-t12-ac19..md`, then check the AC19 box in `spec.md`. **Acceptance:** the command produces zero output lines and the AC19 checkbox is checked. -- [ ] [P5-T13] Verify AC22: no new file under the two projects. Run `git diff --name-status ...HEAD -- "QuickFiler/" "QuickFiler.Test/"` and record the result in `.../evidence/qa-gates/p5-t13-ac22..md`, then check the AC22 box in `spec.md`. **Acceptance:** the output contains no line whose status field is `A`, and the AC22 checkbox is checked. -- [ ] [P5-T14] Verify AC24 against `[P5-T8]`: the 500-line cap holds on every touched file, `QuickFiler/Controllers/QfcDatamodel.cs` is at most 500, and the single permitted exception for `QuickFiler.Test/Controllers/QfcFormControllerTests.cs` is vacuous because that file is not touched (D-Plan-2). Write `.../evidence/qa-gates/p5-t14-ac24..md` and check the AC24 box in `spec.md`. **Acceptance:** the artifact records the `QuickFiler/Controllers/QfcDatamodel.cs` count as at most 500, records that `QfcFormControllerTests.cs` is absent from the diff, and the AC24 checkbox is checked. -- [ ] [P5-T15] Verify AC25: the source-text signature-order test survives formatting. Confirm from the `[P5-T5]` TRX that `LoadItemsAsync_MailItemPath_DoesNotApplyPostDisplayHighConfidenceRemoval` in `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` is Passed, and record that the `[P5-T1]` formatting pass preceded that run. Write `.../evidence/qa-gates/p5-t15-ac25..md` and check the AC25 box in `spec.md`. **Acceptance:** the cited TRX outcome is Passed, its recorded timestamp is later than the `[P5-T1]` artifact timestamp, and the AC25 checkbox is checked. -- [ ] [P5-T16] Verify AC27 against `[P5-T2]`, `[P5-T3]`, `[P5-T4]`, `[P5-T5]` and `[P5-T9]`: the full four-step toolchain is green in a single final pass. Write `.../evidence/qa-gates/p5-t16-ac27..md` reproducing the four exact command strings and their exit codes. Check the AC27 box only when the `[P5-T2]`, `[P5-T3]`, `[P5-T4]` and `[P5-T5]` exit codes are all `0` and the recorded failed test count is `0`. When `[P5-T2]` or `[P5-T5]` completed on its pre-existing-baseline branch, leave the AC27 checkbox unchecked, name every reconciled pre-existing failure or unformatted non-owned path, and write the line `REMEDIATION-REQUIRED: AC27 blocked by pre-existing baseline state outside the change set` into the artifact. **Acceptance:** neither msbuild command string contains `/t:Build` or `Nullable=enable`, and either all four exit codes are `0` with a failed test count of `0` and the AC27 checkbox checked, or the AC27 checkbox is unchecked and the artifact carries the `REMEDIATION-REQUIRED` line verbatim. -- [ ] [P5-T17] Verify AC28 against `[P5-T7]`: no regression on the changed scope, at least 90% line coverage on the three non-excluded targets measured over the changed-file scope, and the repository-wide figure recorded and reported without acting as a blocking threshold. Write `.../evidence/qa-gates/p5-t17-ac28..md` restating the eight figures and naming the two excluded types `QfcDatamodel` and `FolderScoringService` with their exclusion sites. Check the AC28 box in `spec.md` only if every whole-type line rate is at least `90.00`. Whenever any whole-type line rate is below `90.00`, record all eight coverage figures in the artifact, leave the AC28 checkbox unchecked, and write the line `REMEDIATION-REQUIRED: AC28 whole-type reading conflicts with AC18` into the artifact, per the "Leave unmet items unchecked" rule of `.claude/skills/acceptance-criteria-tracking/SKILL.md`; the blocking changed-file-scope gate remains `[P5-T7]` per D-Plan-7 and is unaffected by this check-off outcome. **Acceptance:** the artifact records three changed-file line rates, of which the two for `QfcStreamingDequeueConfidenceGate.cs` and `QfcHomeController.Iteration.cs` are each at least `90.00` and the one for `QfcFormController.Actions.cs` satisfies the `[P5-T7]` condition, three whole-type line rates each at or above baseline, one repository-wide baseline figure and one repository-wide post-change figure, and either every whole-type line rate is at least `90.00` with the AC28 checkbox checked, or the AC28 checkbox is unchecked and the artifact carries the `REMEDIATION-REQUIRED` line verbatim. -- [ ] [P5-T18] Terminal commit and clean-tree gate. Run `git add "docs/features/active/quickfiler-bug-family-446"` then `git commit -m "docs(446): record terminal acceptance criteria AC18, AC19, AC22, AC24, AC25, AC27 and AC28"`, and record the resulting HEAD sha in `docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t18-final-commit..md`. **Acceptance:** `EXIT_CODE: 0`, `git status --porcelain -- "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` produces zero output lines (`.claude/agent-memory/**` is tracked, is written by the executing agent, is outside this change set, and must not be staged by any task in this plan, so the clean-tree requirement is scoped to the change-set and feature-folder pathspecs and is never run unscoped), and every acceptance-criteria checkbox in `docs/features/active/quickfiler-bug-family-446/spec.md` is either checked with a citing `evidence/qa-gates/` artifact or explicitly left unchecked with a recorded gap; `[P5-T16]`'s and `[P5-T17]`'s `REMEDIATION-REQUIRED` notes satisfy the recorded-gap condition for AC27 and AC28 respectively. +- [x] [P5-T1] Formatting pass, scoped to the change set per D-Plan-4. Compute the SHA-256 of every `.cs` path returned by `git diff --name-only ...HEAD -- "*.cs"`, run `pwsh -NoProfile -Command 'dotnet tool run csharpier format '`, then recompute the digests. Record both digest sets and the derived rewritten-file count in `.../evidence/qa-gates/p5-t1-csharpier-format..md`; the rewritten count is derived from the digest comparison, not from CSharpier's own "Formatted N files" line, which reports files processed rather than files changed. **Acceptance:** `EXIT_CODE: 0` and the artifact records a rewritten-file count of `0` for the pass that the loop finally accepts. +- [x] [P5-T2] Formatting gate, read-only and repository-wide. Run `pwsh -NoProfile -Command 'dotnet tool run csharpier check .'` and record it in `.../evidence/qa-gates/p5-t2-csharpier-check..md`. **Acceptance:** `EXIT_CODE: 0`, or, when `[P0-T9]` recorded a non-zero exit, the artifact records an unformatted path set identical to the `[P0-T9]` set and containing no change-set path, and names the pre-existing formatting blocker. +- [x] [P5-T3] Analyzer gate. Run `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:EnableNETAnalyzers=true /p:EnforceCodeStyleInBuild=true` through `pwsh -NoProfile` and record it in `.../evidence/qa-gates/p5-t3-analyzer-build..md`. The command uses `/t:Rebuild` and adds no `Nullable` property. **Acceptance:** `EXIT_CODE: 0` with a recorded error count of `0`, and the recorded command text contains neither `/t:Build` nor `Nullable=enable`. +- [x] [P5-T4] Type-check gate. Run `& $msbuild TaskMaster.sln /t:Rebuild /m /p:Configuration=Debug "/p:Platform=Any CPU" /p:TreatWarningsAsErrors=true` through `pwsh -NoProfile` and record it in `.../evidence/qa-gates/p5-t4-nullable-build..md`. **Acceptance:** `EXIT_CODE: 0` with a recorded error count of `0`, and the recorded command text contains neither `/t:Build` nor `Nullable=enable`. +- [x] [P5-T5] Test gate. Using the discovery prelude, run `& $vstest $asm /InIsolation /EnableCodeCoverage "/Settings:scripts\vscode\TaskMaster.cli.runsettings" /Logger:trx "/ResultsDirectory:docs\features\active\quickfiler-bug-family-446\evidence\qa-gates\p5-t5"` and record the discovered assembly list and the total, passed, failed and skipped counts in `.../evidence/qa-gates/p5-t5-vstest..md`. **Acceptance:** a recorded total greater than zero, every recorded assembly path expressed relative to the workspace root free of a `.claude` segment, and either `EXIT_CODE: 0` with a recorded failed count of `0`, or the recorded failed set is identical to the failed set recorded by `[P0-T12]`, contains no `QuickFiler.Test` test, and the artifact names each pre-existing failure. +- [x] [P5-T6] Post-change Cobertura capture, comparable with `[P0-T12]`. Run `pwsh -NoProfile -File scripts\vscode\Invoke-MSTestWithCoverage.ps1 -SearchRoot . -Configuration Debug -CoverageOutput "docs\features\active\quickfiler-bug-family-446\evidence\qa-gates\coverage-final.cobertura.xml"` and record the repository-wide `line-rate` and `branch-rate` in `.../evidence/qa-gates/p5-t6-coverage-run..md`. **Acceptance:** `coverage-final.cobertura.xml` exists at that path, the artifact records two numeric coverage rates, and either a failed count of `0` or a failed set identical to the set recorded by `[P0-T12]` that contains no `QuickFiler.Test` test, with each pre-existing failure named in the artifact. +- [x] [P5-T7] Coverage comparison against the Phase 0 baseline, per D-Plan-7. Apply the same aggregation command used by `[P0-T13]` to `docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/coverage-final.cobertura.xml`, and write `.../evidence/qa-gates/p5-t7-coverage-comparison..md` containing: the repository-wide baseline and post-change line rates (recorded and reported, not a blocking threshold, because no merge-base baseline exists for this feature folder); three changed-file rows for `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs`, `QuickFiler/Controllers/QfcFormController.Actions.cs` and `QuickFiler/Controllers/QfcHomeController.Iteration.cs`; and three whole-type rows for `QfcStreamingDequeueConfidenceGate`, `QfcFormController` and `QfcHomeController`, each carrying its `[P0-T13]` baseline value and its post-change value. **Acceptance:** the changed-file line rates for `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` and `QuickFiler/Controllers/QfcHomeController.Iteration.cs` are each at least `90.00`; the changed-file line rate for `QuickFiler/Controllers/QfcFormController.Actions.cs` is either at least `90.00`, or is greater than or equal to its `[P0-T13]` baseline value with the artifact carrying, verbatim, the line `REMEDIATION-REQUIRED: QfcFormController.Actions.cs changed-file coverage is bounded by the un-seamed MessageBox.Show calls in UndoDialog at :225, :238 and :248, which UT4 prohibits exercising and which no task in this plan seams`; each of the three whole-type line rates is greater than or equal to its recorded baseline value; all eight figures are numeric; and every aggregation row's `lines=` value is a positive integer. +- [x] [P5-T8] Post-format file-size audit. For every path returned by `git diff --name-only ...HEAD -- "*.cs"`, record the post-change line count in `.../evidence/qa-gates/p5-t8-line-cap-audit..md`. This audit runs after `[P5-T1]` because a formatting pass can change line counts. Markdown documentation under the feature folder is exempt from the 500-line cap per `.claude/rules/general-code-change.md` and is not part of this audit. **Acceptance:** every recorded count is at most 500, and `QuickFiler.Test/Controllers/QfcFormControllerTests.cs` does not appear in the audited path list. +- [x] [P5-T9] Record the single clean toolchain pass. Write `.../evidence/qa-gates/p5-t9-clean-pass..md` listing, for the pass the loop finally accepted, the five command strings from `[P5-T1]`, `[P5-T2]`, `[P5-T3]`, `[P5-T4]` and `[P5-T5]` with their exit codes, plus the rewritten-file count from `[P5-T1]`. **Acceptance:** the recorded rewritten-file count is `0`; the `[P5-T1]`, `[P5-T3]` and `[P5-T4]` exit codes are `0`; either the `[P5-T2]` exit code is `0`, or this artifact records that `[P5-T2]` completed on its pre-existing-baseline branch with an unformatted path set identical to the `[P0-T9]` set and containing no change-set path; and either the `[P5-T5]` exit code is `0`, or `[P5-T5]` completed on its pre-existing-baseline branch and this artifact reproduces that reconciled failed set. +- [x] [P5-T10] Commit the final change set. Run `git add "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` then `git commit -m "chore(446): record final QA gates and coverage comparison"`, and record the resulting HEAD sha in `.../evidence/qa-gates/p5-t10-commit..md`. **Acceptance:** `EXIT_CODE: 0` and `git status --porcelain -- "QuickFiler" "QuickFiler.Test"` produces zero output lines. +- [x] [P5-T11] Verify AC18: no non-owned production file is modified. Run `git diff --name-only ...HEAD -- "QuickFiler/**/*.cs"` and confirm every returned path is one of the six owned production paths this plan writes. Record the returned list and an explicit absence check for `QfcHomeController.cs`, `QfcHomeController.Metrics.cs`, `QfcCollectionController.cs`, `QfcItemController.cs`, `QfcItemController.Initialization.cs`, `QfcHighConfidencePreFilter.cs`, `QfcItemGroup.cs`, `QfcQueue.cs`, `QfcRemainingQueueAdmission.cs`, `QfcFormController.cs`, `QfcFormController.EventHandlers.cs` and `QfcFormController.SetupDisposal.cs` in `.../evidence/qa-gates/p5-t11-ac18..md`, then check the AC18 box in `spec.md`. **Acceptance:** every returned path is an owned path, all twelve named paths are absent, and the AC18 checkbox is checked. +- [x] [P5-T12] Verify AC19: no project file is modified. Run `git diff --name-only ...HEAD -- "*.csproj" "*.props" "*.targets" "packages.config"` and record the result in `.../evidence/qa-gates/p5-t12-ac19..md`, then check the AC19 box in `spec.md`. **Acceptance:** the command produces zero output lines and the AC19 checkbox is checked. +- [x] [P5-T13] Verify AC22: no new file under the two projects. Run `git diff --name-status ...HEAD -- "QuickFiler/" "QuickFiler.Test/"` and record the result in `.../evidence/qa-gates/p5-t13-ac22..md`, then check the AC22 box in `spec.md`. **Acceptance:** the output contains no line whose status field is `A`, and the AC22 checkbox is checked. +- [x] [P5-T14] Verify AC24 against `[P5-T8]`: the 500-line cap holds on every touched file, `QuickFiler/Controllers/QfcDatamodel.cs` is at most 500, and the single permitted exception for `QuickFiler.Test/Controllers/QfcFormControllerTests.cs` is vacuous because that file is not touched (D-Plan-2). Write `.../evidence/qa-gates/p5-t14-ac24..md` and check the AC24 box in `spec.md`. **Acceptance:** the artifact records the `QuickFiler/Controllers/QfcDatamodel.cs` count as at most 500, records that `QfcFormControllerTests.cs` is absent from the diff, and the AC24 checkbox is checked. +- [x] [P5-T15] Verify AC25: the source-text signature-order test survives formatting. Confirm from the `[P5-T5]` TRX that `LoadItemsAsync_MailItemPath_DoesNotApplyPostDisplayHighConfidenceRemoval` in `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` is Passed, and record that the `[P5-T1]` formatting pass preceded that run. Write `.../evidence/qa-gates/p5-t15-ac25..md` and check the AC25 box in `spec.md`. **Acceptance:** the cited TRX outcome is Passed, its recorded timestamp is later than the `[P5-T1]` artifact timestamp, and the AC25 checkbox is checked. +- [x] [P5-T16] Verify AC27 against `[P5-T2]`, `[P5-T3]`, `[P5-T4]`, `[P5-T5]` and `[P5-T9]`: the full four-step toolchain is green in a single final pass. Write `.../evidence/qa-gates/p5-t16-ac27..md` reproducing the four exact command strings and their exit codes. Check the AC27 box only when the `[P5-T2]`, `[P5-T3]`, `[P5-T4]` and `[P5-T5]` exit codes are all `0` and the recorded failed test count is `0`. When `[P5-T2]` or `[P5-T5]` completed on its pre-existing-baseline branch, leave the AC27 checkbox unchecked, name every reconciled pre-existing failure or unformatted non-owned path, and write the line `REMEDIATION-REQUIRED: AC27 blocked by pre-existing baseline state outside the change set` into the artifact. **Acceptance:** neither msbuild command string contains `/t:Build` or `Nullable=enable`, and either all four exit codes are `0` with a failed test count of `0` and the AC27 checkbox checked, or the AC27 checkbox is unchecked and the artifact carries the `REMEDIATION-REQUIRED` line verbatim. +- [x] [P5-T17] Verify AC28 against `[P5-T7]`: no regression on the changed scope, at least 90% line coverage on the three non-excluded targets measured over the changed-file scope, and the repository-wide figure recorded and reported without acting as a blocking threshold. Write `.../evidence/qa-gates/p5-t17-ac28..md` restating the eight figures and naming the two excluded types `QfcDatamodel` and `FolderScoringService` with their exclusion sites. Check the AC28 box in `spec.md` only if every whole-type line rate is at least `90.00`. Whenever any whole-type line rate is below `90.00`, record all eight coverage figures in the artifact, leave the AC28 checkbox unchecked, and write the line `REMEDIATION-REQUIRED: AC28 whole-type reading conflicts with AC18` into the artifact, per the "Leave unmet items unchecked" rule of `.claude/skills/acceptance-criteria-tracking/SKILL.md`; the blocking changed-file-scope gate remains `[P5-T7]` per D-Plan-7 and is unaffected by this check-off outcome. **Acceptance:** the artifact records three changed-file line rates, of which the two for `QfcStreamingDequeueConfidenceGate.cs` and `QfcHomeController.Iteration.cs` are each at least `90.00` and the one for `QfcFormController.Actions.cs` satisfies the `[P5-T7]` condition, three whole-type line rates each at or above baseline, one repository-wide baseline figure and one repository-wide post-change figure, and either every whole-type line rate is at least `90.00` with the AC28 checkbox checked, or the AC28 checkbox is unchecked and the artifact carries the `REMEDIATION-REQUIRED` line verbatim. +- [x] [P5-T18] Terminal commit and clean-tree gate. Run `git add "docs/features/active/quickfiler-bug-family-446"` then `git commit -m "docs(446): record terminal acceptance criteria AC18, AC19, AC22, AC24, AC25, AC27 and AC28"`, and record the resulting HEAD sha in `docs/features/active/quickfiler-bug-family-446/evidence/qa-gates/p5-t18-final-commit..md`. **Acceptance:** `EXIT_CODE: 0`, `git status --porcelain -- "QuickFiler" "QuickFiler.Test" "docs/features/active/quickfiler-bug-family-446"` produces zero output lines (`.claude/agent-memory/**` is tracked, is written by the executing agent, is outside this change set, and must not be staged by any task in this plan, so the clean-tree requirement is scoped to the change-set and feature-folder pathspecs and is never run unscoped), and every acceptance-criteria checkbox in `docs/features/active/quickfiler-bug-family-446/spec.md` is either checked with a citing `evidence/qa-gates/` artifact or explicitly left unchecked with a recorded gap; `[P5-T16]`'s and `[P5-T17]`'s `REMEDIATION-REQUIRED` notes satisfy the recorded-gap condition for AC27 and AC28 respectively. diff --git a/docs/features/active/quickfiler-bug-family-446/policy-audit.2026-08-26T11-29.md b/docs/features/active/quickfiler-bug-family-446/policy-audit.2026-08-26T11-29.md new file mode 100644 index 000000000..390770b18 --- /dev/null +++ b/docs/features/active/quickfiler-bug-family-446/policy-audit.2026-08-26T11-29.md @@ -0,0 +1,96 @@ +# Policy Compliance Audit — quickfiler-bug-family-446 + +- Reviewer: feature-review agent +- Timestamp: 2026-08-26T11-29 +- Branch: `bug/quickfiler-bug-family-446` (epic child; PR target `epic/quickfiler-bug-family-integration`) +- Merge base: `61edc19befcf6c4e95b5acd32542f2dcdab41b78` (independently recomputed via `git merge-base HEAD origin/epic/quickfiler-bug-family-integration`; matches the caller-supplied SHA) +- Head: `fd746f558c210119fd625bbf1bb7f43d9e43e7d2` (11 commits) +- Work mode: `full-bug` (AC source: `spec.md` only) +- Audit scope: the full branch diff `61edc19b...fd746f55` — 161 files (13 C# source/test files, 4 promoted potential documents, 144 feature-folder documentation/evidence files) +- CI note: `ci.yml` triggers only on main/development; this PR receives zero CI checks. Local toolchain evidence is the only gate and was weighted accordingly. + +## Rejected Scope Narrowing + +None. The caller requested the full feature-vs-base audit and supplied no scope restriction. Two caller artifact-path constraints (do not create `artifacts/csharp/coverage.xml`; do not retain helper scripts under `evidence/`) are hygiene constraints consistent with this agent's own conventions, not scope narrowing, and were honored. + +## 1. General Code Change Policy + +| Item | Verdict | Evidence | +| --- | --- | --- | +| Bugfix Workflow: failing regression test first, per defect | PASS | Ten deliberately-RED tests across Phases 1 and 3, each with a fail-before TRX and pass-after TRX under `evidence/regression-testing/p1-*` and `p3-*`. Sampled independently: `p1-t9/p1-t9.trx` and `p1-t10/p1-t10.trx` record `outcome="Failed"` for the pre-fix gate stop-reason tests; the final run records all green. | +| Minimal, targeted fix; no opportunistic refactor widening | PASS | Production diff confined to 6 owned files named in `issue.md`. Deeper problems found during the work were routed to four new promoted potential documents (`docs/features/potential/promoted/2026-08-26-*.md`) instead of widening scope. | +| File size limit (500 lines) | PASS | All 13 changed `.cs` files measured with `awk END{print NR}`: max is 497 (`QfcHomeControllerIterationTests.cs`); production max is 480 (`QfcDatamodel.cs`). Pre-existing 827-line `QfcFormControllerTests.cs` untouched (verified absent from the diff). | +| Error handling: fail fast; no silent broad catch | PASS with note | Two broad `catch (System.Exception)` sites added (`QfcStreamingDequeueConfidenceGate.DequeueAsync` rejection-sink guard; `QfcDatamodel.QueueProcessing.TryReleaseRejectedHook`). Both are boundary guards that log with context via log4net and continue by documented design (a discarded candidate must not abort the batch scan). Compliant with the "clear boundary with added context" exception. See code review CR-2 for the redundancy note. | +| Logging via project pattern | PASS | log4net used in all new production error paths; no ad-hoc console output. | +| I/O isolation; no temp files in tests | PASS | New tests use Moq doubles, `FakeTimeProvider`, and injected seams. Grep of all 7 changed test files for `GetTempPath`/`GetTempFileName`: zero matches. | +| Supporting documents updated | PASS | `plan.2026-08-24T09-37.md` fully checked off (100 tasks); `spec.md` checkbox state maintained; 5 issue-update evidence records under `evidence/issue-updates/`. | + +## 2. C# Code Change Policy + +| Item | Verdict | Evidence | +| --- | --- | --- | +| CSharpier formatting (pinned, via `dotnet tool run`) | PASS | `evidence/qa-gates/p5-t9-clean-pass.2026-08-26T11-11.md`: scoped format then repo-wide `csharpier check .`, both EXIT_CODE 0; rewritten-file count 0 verified by SHA-256 digest comparison in the accepted pass. | +| Analyzer gate (`/t:Rebuild`, analyzers on) | PASS | `p5-t3-analyzer-build.2026-08-26T10-59.md` EXIT_CODE 0. Command string uses `/t:Rebuild`, not `/t:Build`. | +| Nullable/type-check gate (`TreatWarningsAsErrors`, no `/p:Nullable=enable`) | PASS | `p5-t4-nullable-build.2026-08-26T11-00.md` EXIT_CODE 0; command matches the CLAUDE.md-approved form; `/p:Nullable=enable` absent. | +| MSTest via vstest with coverage | PASS | `p5-t5-vstest.2026-08-26T11-01.md` EXIT_CODE 0 with `/InIsolation /EnableCodeCoverage`; TRX counters independently re-read from `evidence/qa-gates/p5-t5/p5-t5.trx`: total 6501, passed 6501, failed 0, error 0, timeout 0, aborted 0. | +| net481 constraints respected | PASS | New `QfcGateBatch` and `QfcDequeueBatch` declared as `readonly struct` with get-only properties and null-tolerant accessors; no `init`/`record` (CS0518 trap avoided). | + +## 3. Unit Test Policy (General + C#) + +| Item | Verdict | Evidence | +| --- | --- | --- | +| MSTest + Moq + FluentAssertions | PASS | All new tests use `[TestClass]`/`[TestMethod]`, Moq mocks, FluentAssertions with `because` messages. | +| Determinism: no banned APIs | PASS | Grep of the 7 changed test files for `Thread.Sleep`, `Task.Delay`, `DateTime.Now`, `DateTime.UtcNow`: the only match is an XML doc comment naming `Task.Delay` as the thing being avoided. All async timing is driven by `FakeTimeProvider` / `CountingTimeProvider`. | +| Arrange–Act–Assert with documented intent | PASS | Sampled new tests carry AAA markers and scenario doc comments (some markers merged with the arrange comment after the [P3-T7] compaction; structure retained). | +| Independence / isolation / no external deps | PASS | No live COM: the `UndoItemProcessor` and `ScoringServiceFactory` seams keep Outlook and the WinForms dispatcher out of the unit under test. | +| Pre-existing tests as spec — modifications examined | PASS | `IterateQueueAsync_QueueEmpty` modification adjudicated legitimate (Section 6 and the feature audit); `DequeueAsync_BelowThresholdItemsAreDiscarded` byte-unchanged (hunk map verified: nearest hunks at base lines 285 and 324, method body at 298–310 untouched); `EmailMoveMonitorTests.cs` and the two overload-selection pin files absent from the diff. | + +## 4. Coverage Verification (mandatory, per language with changed files) + +Languages with changed files in the branch diff, from `git diff --numstat` and the regenerated `artifacts/pr_context.summary.txt`: **C# only** (13 `.cs` files). Zero `.ts/.tsx`, `.py`, `.ps1/.psm1` files changed on the branch, so TypeScript, Python and PowerShell have no changed files and therefore no coverage obligation on this branch. + +Coverage evidence source: committed Cobertura artifacts `evidence/baseline/coverage-baseline.cobertura.xml` (Phase 0 baseline, same session) and `evidence/qa-gates/coverage-final.cobertura.xml` (accepted final pass). Figures below were independently re-parsed by this reviewer from those XMLs, not transcribed from executor prose. Per established adjudication practice, a committed feature-evidence Cobertura file is the canonical C# coverage artifact for review; `artifacts/csharp/coverage.xml` was deliberately not created. + +| Language coverage row | Verdict | +| --- | --- | +| C# repo-wide line coverage 84.84% (root `line-rate` 0.848402) is below the 85% uniform floor | FAIL — dispositioned non-blocking, see disposition below | +| C# repo-wide branch coverage 78.75% (root `branch-rate` 0.787469) meets the 75% floor | PASS | +| C# changed-file line coverage: `QfcStreamingDequeueConfidenceGate.cs` 97.39% (112/115) against the 90% new/changed-code target | PASS | +| C# changed-file line coverage: `QfcHomeController.Iteration.cs` 100.00% (60/60) | PASS | +| C# changed-file line coverage: `QfcFormController.Actions.cs` 47.89% (102/213) is below the 90% target | FAIL — dispositioned non-blocking carve-out, see disposition below | +| C# changed-line no-regression coverage check (all three files improved against the same-session baseline: 96.77 to 97.39, 35.78 to 47.89, 80.36 to 100.00; repo-wide 84.7782 to 84.8402) | PASS | +| C# changed-file branch coverage: gate file 90.91%, iteration file 85.71%, against the 75% floor | PASS | +| C# changed-file branch coverage: `QfcFormController.Actions.cs` 45.24% (38/84) below the 75% floor | FAIL — same non-blocking disposition as its line row | + +**Disposition of the repo-wide FAIL row (non-blocking).** The 84.84% figure is the unfiltered all-instrumented-package rate including vendored code; the filtered first-party denominator differs materially in this repository and historically clears the floor. The figure is pre-existing debt: it improved on this branch (+0.062 points against the same-session Phase 0 baseline), there is zero changed-line regression, and `spec.md` AC28 explicitly designates the repository-wide figure record-and-report for this change. No remediation task on this branch could responsibly move a repo-wide vendor-inflated figure. + +**Disposition of the `QfcFormController.Actions.cs` FAIL rows (non-blocking carve-out — independently verified).** I re-derived the uncovered-line map from the final Cobertura: uncovered ranges are 29–160 (pre-existing `LoadItems`/`LoadItemsAsync` overloads bound to `TableLayoutPanel`/COM types), 241–258 (`ProcessUndoItemAsync`, the verbatim-extracted COM-and-dispatcher take branch), and 267–306 (`UndoDialog`, three modal `MessageBox.Show` calls). All are pre-existing untestable-without-seam code; every line this branch added or changed for the fix (the three seams and the rewritten `UndoConsumer`) is covered. The executor's carve-out line names only the `MessageBox.Show` calls; that understates the case — even a full `MessageBox` seam would lift the file only to roughly 67%, because the COM-bound loader overloads at 29–160 dominate the uncovered set. The carve-out conclusion is therefore correct and stronger than stated. The file improved 35.78 to 47.89 (line) and 35.37 to 45.24 (branch). Seam work for `UndoDialog` and the loaders is legitimate follow-up refactoring, out of minimal-bugfix scope per the Bugfix Workflow ("open a new issue instead of widening scope"); see the remediation-routing note in the code review (CR-1). + +Coverage exclusions check: no `[ExcludeFromCodeCoverage]` attribute is added or moved by this branch (the `QfcDatamodel` and `FolderScoringService` exclusions pre-date the merge base and are within the ratified COM/VSTO exemption). No coverage-config exclude entry was added. + +## 5. Evidence Location Compliance + +- All executor evidence lives under `docs/features/active/quickfiler-bug-family-446/evidence/{baseline,regression-testing,qa-gates,issue-updates,other}/` — the canonical `/evidence//` layout. PASS. +- Branch diff scan for `artifacts/baselines/`, `artifacts/qa/`, `artifacts/evidence/`, `artifacts/coverage/`: zero files. PASS. +- `validate_evidence_locations.py` does not exist in this repository (known port gap); the scan above was performed directly with `git diff --name-only`. +- No `.ps1`/`.py`/`.sh`/`.psm1` files anywhere in the branch diff (count: 0), so no helper-script residue and no spurious language-gate trigger. +- TRX hygiene: case-insensitive grep of the feature folder for the account name and the machine name returned zero matches; sampled TRX files re-parse as well-formed XML. + +## 6. Adjudicated Items (caller-referred) + +1. **AC28 unchecked — genuine spec self-contradiction; does NOT block merge.** Full reasoning in `feature-audit.2026-08-26T11-29.md` (AC28 row), summarized: the literal whole-type >= 90% reading is arithmetically unreachable from this change set. Even at 100% coverage of the owned files, `QfcFormController` peaks at (290+213)/708 = 71.0% and `QfcHomeController` at (259+60)/449 = 71.0%, because the remaining uncovered lines live in five sibling-owned partial declarations that AC18 forbids modifying and whose testability uplift is assigned to sibling epic children (442, 484, 444, 489). The spec's own Test Strategy states the blocking conditions are "change-scoped", so the checkbox wording is the internal outlier. The executor disposition (leave unchecked, record `REMEDIATION-REQUIRED: AC28 whole-type reading conflicts with AC18`, defer to maintainer) follows the ratified plan ([P5-T7]/[P5-T17]) and the acceptance-criteria-tracking skill exactly. A maintainer spec amendment is required at or before epic close; the blocking changed-file gate passed. +2. **Pre-existing test modified** (`IterateQueueAsync_QueueEmpty`) — legitimate. Base and head compared directly: the three `Verify` calls (dequeue Once, `CompleteAddingAsync` Once, `EnqueueAsync` Never) are preserved one-for-one through the `VerifyCompleteAdding`/`VerifyEnqueue` helpers with identical matchers and `Times` values. The arrangement had to change because production now calls `DequeueNextItemGroupWithOutcomeAsync`; the explicit `stop: QfcDequeueStop.SourceExhausted` converts the test from encoding the defect (any empty batch closes the queue) into pinning the corrected contract. The regression net is strengthened, not weakened: the new `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` asserts the previously-defective path now does NOT close the queue. +3. **`QfcFormController.Actions.cs` 47.89% carve-out** — legitimate, with the rationale correction recorded in Section 4. A `MessageBox` seam was technically available but insufficient alone and out of minimal-fix scope. +4. **Dead `using System.Diagnostics;`** — confirmed (line 4 of `QfcFormController.Actions.cs`; sole consumer `Stopwatch` removed by the Phase 3 rewrite; no other `System.Diagnostics` member used in the file). Severity Minor, non-blocking; the analyzer gate passes because IDE0005 is not error-severity in this repository. The executor's restraint (no unauthorized plan deviation) was correct; remove it on the next authorized touch of the file. + +## 7. Verdict Summary + +| Category | Verdict | +| --- | --- | +| General Code Change Policy | PASS | +| C# Code Change Policy | PASS | +| Unit Test Policy | PASS | +| C# repo-wide line coverage row | FAIL (non-blocking, dispositioned) | +| C# changed-file and no-regression coverage rows | PASS, except the `QfcFormController.Actions.cs` FAIL rows (non-blocking carve-out) | +| Evidence locations | PASS | +| Blocking findings | **0** | diff --git a/docs/features/active/quickfiler-bug-family-446/spec.md b/docs/features/active/quickfiler-bug-family-446/spec.md index 537c12071..1ad0c8167 100644 --- a/docs/features/active/quickfiler-bug-family-446/spec.md +++ b/docs/features/active/quickfiler-bug-family-446/spec.md @@ -872,42 +872,42 @@ of this branch against its integration branch. **Regression tests (failing-first)** -- [ ] AC1 — #446 gate: `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` and `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` exist in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, are driven by `FakeTimeProvider`, fail against the pre-fix gate and pass after. -- [ ] AC2 — #446 caller: `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` asserts `IQfcQueue.CompleteAddingAsync` was invoked `Times.Never`, and `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` asserts `Times.Once`. Both live in `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`. -- [ ] AC3 — #448: `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` is present in `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` and its pre-fix failure is an **assertion failure, not a hang or a test-host timeout**. Verified by running that single test against the pre-fix tree and recording the failure message. -- [ ] AC4 — #426 gate: `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` is present in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, and its pre-fix state is an **assertion failure against a compiling tree** (the seam and the test land in one task, the `else` invocation in the next), not a compile error. -- [ ] AC5 — #427-A: `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` is present in `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` and fails against the current `return score.Score;` at `QuickFiler/Controllers/QfcDatamodel.cs:376`. +- [x] AC1 — #446 gate: `DequeueAsync_DeadlineExpiresWithZeroAccepted_ReportsDeadlineExpiredStop` and `DequeueAsync_SourceDrained_ReportsSourceExhaustedStop` exist in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.Part3.cs`, are driven by `FakeTimeProvider`, fail against the pre-fix gate and pass after. +- [x] AC2 — #446 caller: `IterateQueueAsync_EmptyBatchWithDeadlineExpired_DoesNotCompleteAdding` asserts `IQfcQueue.CompleteAddingAsync` was invoked `Times.Never`, and `IterateQueueAsync_EmptyBatchWithSourceExhausted_CompletesAddingOnce` asserts `Times.Once`. Both live in `QuickFiler.Test/Controllers/QfcHomeControllerIterationTests.cs`. +- [x] AC3 — #448: `UndoConsumer_EveryIdleIteration_InvokesTimeProviderDelay` is present in `QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs` and its pre-fix failure is an **assertion failure, not a hang or a test-host timeout**. Verified by running that single test against the pre-fix tree and recording the failure message. +- [x] AC4 — #426 gate: `DequeueAsync_BelowThresholdCandidate_InvokesOnRejectedOnce` is present in `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs`, and its pre-fix state is an **assertion failure against a compiling tree** (the seam and the test land in one task, the `else` invocation in the next), not a compile error. +- [x] AC5 — #427-A: `ScoreRemainingQueueMailItemAsync_ReturnsScoreAndTopFolder` is present in `QuickFiler.Test/Controllers/QfcDatamodelTests.cs` and fails against the current `return score.Score;` at `QuickFiler/Controllers/QfcDatamodel.cs:376`. **Fixed behaviour** -- [ ] AC6 — `QuickFiler/Controllers/QfcHomeController.Iteration.cs` calls `CompleteAddingAsync` only inside a branch guarded by `Stop == QfcDequeueStop.SourceExhausted`. Verified by AC2 plus reading the diff of that file. -- [ ] AC7 — `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` returns a stop reason from all four exits, mapped `:100`/`:154` -> `QuantitySatisfied`, `:119` -> `DeadlineExpired`, `:128` -> `SourceExhausted`. Verified by AC1. -- [ ] AC8 — `UndoConsumer` terminates once the queue is drained and the idle threshold elapses. Verified by `UndoConsumer_IdleBeyondThreshold_Completes` completing without a `[Timeout]` trip on a `FakeTimeProvider`. -- [ ] AC9 — the `UndoConsumer` idle timer is **reset after every successful take**. Verified by `UndoConsumer_SuccessfulTake_ResetsIdleTimer`, which advances the fake clock past the threshold in aggregate while keeping every idle gap below it and asserts the loop kept draining. -- [ ] AC10 — `_undoConsumerTask` is reset to `null` on every exit path, including the exception path, so a subsequent `UndoDialog()` starts a fresh consumer. Verified by `UndoConsumer_OnExit_ResetsUndoConsumerTask` and by the reset sitting in a `finally` block in `QuickFiler/Controllers/QfcFormController.Actions.cs`. -- [ ] AC11 — the empty-queue path always yields; no loop branch reaches the loop head without an `await` or a `break`. Verified by AC3 and by reading the rewritten loop. -- [ ] AC12 — a below-cutoff candidate causes the datamodel's own `_moveMonitor.UnhookItem` to be invoked exactly once for that item. Verified by `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` in `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs`. -- [ ] AC13 — a throwing rejection callback does not abort the scan. Verified by `DequeueAsync_OnRejectedThrows_ScanContinues`. -- [ ] AC14 — the drop-on-reject contract is intact: `DequeueAsync_BelowThresholdItemsAreDiscarded` at `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:298-310` still passes and its body is byte-unchanged. Verified by `git diff ...HEAD -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` showing no hunk inside that test method. -- [ ] AC15 — the STA thread-affinity contract is preserved: `EmailMoveMonitorTests.cs` `AllComAccess_FlowsThroughInjectedMarshalDelegate` (`:176-198`) and the null-argument no-op test (`:134-145`) still pass unmodified, and `QuickFiler/Helper Classes/EmailMoveMonitor.cs` appears in no diff hunk. -- [ ] AC16 — #427-A producer side: an accepted candidate's `TopFolder` survives to the datamodel boundary as `QfcDequeueBatch.PreScored`, and `ScoreRemainingQueueMailItemAsync` returns `(long Score, string TopFolder)`. Verified by AC5 and `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult`. +- [x] AC6 — `QuickFiler/Controllers/QfcHomeController.Iteration.cs` calls `CompleteAddingAsync` only inside a branch guarded by `Stop == QfcDequeueStop.SourceExhausted`. Verified by AC2 plus reading the diff of that file. +- [x] AC7 — `QuickFiler/Controllers/QfcStreamingDequeueConfidenceGate.cs` returns a stop reason from all four exits, mapped `:100`/`:154` -> `QuantitySatisfied`, `:119` -> `DeadlineExpired`, `:128` -> `SourceExhausted`. Verified by AC1. +- [x] AC8 — `UndoConsumer` terminates once the queue is drained and the idle threshold elapses. Verified by `UndoConsumer_IdleBeyondThreshold_Completes` completing without a `[Timeout]` trip on a `FakeTimeProvider`. +- [x] AC9 — the `UndoConsumer` idle timer is **reset after every successful take**. Verified by `UndoConsumer_SuccessfulTake_ResetsIdleTimer`, which advances the fake clock past the threshold in aggregate while keeping every idle gap below it and asserts the loop kept draining. +- [x] AC10 — `_undoConsumerTask` is reset to `null` on every exit path, including the exception path, so a subsequent `UndoDialog()` starts a fresh consumer. Verified by `UndoConsumer_OnExit_ResetsUndoConsumerTask` and by the reset sitting in a `finally` block in `QuickFiler/Controllers/QfcFormController.Actions.cs`. +- [x] AC11 — the empty-queue path always yields; no loop branch reaches the loop head without an `await` or a `break`. Verified by AC3 and by reading the rewritten loop. +- [x] AC12 — a below-cutoff candidate causes the datamodel's own `_moveMonitor.UnhookItem` to be invoked exactly once for that item. Verified by `DequeueNextItemGroupAsync_HighConfidenceRejectedItem_UnhooksFromMoveMonitor` in `QuickFiler.Test/Controllers/QfcQueuePurePathsTests.cs`. +- [x] AC13 — a throwing rejection callback does not abort the scan. Verified by `DequeueAsync_OnRejectedThrows_ScanContinues`. +- [x] AC14 — the drop-on-reject contract is intact: `DequeueAsync_BelowThresholdItemsAreDiscarded` at `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:298-310` still passes and its body is byte-unchanged. Verified by `git diff ...HEAD -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` showing no hunk inside that test method. +- [x] AC15 — the STA thread-affinity contract is preserved: `EmailMoveMonitorTests.cs` `AllComAccess_FlowsThroughInjectedMarshalDelegate` (`:176-198`) and the null-argument no-op test (`:134-145`) still pass unmodified, and `QuickFiler/Helper Classes/EmailMoveMonitor.cs` appears in no diff hunk. +- [x] AC16 — #427-A producer side: an accepted candidate's `TopFolder` survives to the datamodel boundary as `QfcDequeueBatch.PreScored`, and `ScoreRemainingQueueMailItemAsync` returns `(long Score, string TopFolder)`. Verified by AC5 and `DequeueAsync_AcceptedCandidate_CarriesTopFolderInPreScoredResult`. **Scope containment** -- [ ] AC17 — **Issue #427 remains open after this work merges.** No GitHub closing keyword immediately precedes a reference to that issue number in any commit message, in the pull-request body, or in any file in this change set. The keyword set to scan for is `close`, `closes`, `closed`, `fix`, `fixes`, `fixed`, `resolve`, `resolves`, `resolved`, each optionally followed by a colon. The pull-request body carries closing keywords for **#446, #448 and #426 only**. Verified by reading the pull-request body file and `git log ..HEAD --format=%B` before opening the pull request. -- [ ] AC18 — no non-owned production file is modified. `git diff --name-only ...HEAD -- "QuickFiler/**/*.cs"` returns only paths from the owned list in Scope & Non-Goals. In particular `QfcHomeController.cs`, `QfcHomeController.Metrics.cs`, `QfcCollectionController.cs`, `QfcItemController.cs`, `QfcItemController.Initialization.cs`, `QfcHighConfidencePreFilter.cs`, `QfcItemGroup.cs`, `QfcQueue.cs`, `QfcRemainingQueueAdmission.cs`, `QfcFormController.cs`, `QfcFormController.EventHandlers.cs` and `QfcFormController.SetupDisposal.cs` are absent from the output. -- [ ] AC19 — no project file is modified. `git diff --name-only ...HEAD -- "*.csproj" "*.props" "*.targets" "packages.config"` returns an empty result. -- [ ] AC20 — the three pre-existing `IQfcDatamodel` overloads are unchanged. `git diff ...HEAD -- "QuickFiler/Interfaces/IQfcDatamodel.cs"` contains only additions; no line of the existing `DequeueNextItemGroupAsync` or `DequeueNextItemGroup` declarations is removed or altered. -- [ ] AC21 — the overload-selection pins are untouched. `git diff --name-only ...HEAD` does not list `QuickFiler.Test/Controllers/QfcHomeControllerIssue218Tests.cs` or `QuickFiler.Test/Controllers/QfcHomeControllerRunAsyncHighConfidenceTests.cs`. -- [ ] AC22 — no new file is added under `QuickFiler/` or `QuickFiler.Test/`. `git diff --name-status ...HEAD -- "QuickFiler/" "QuickFiler.Test/"` reports no `A` status entry. +- [x] AC17 — **Issue #427 remains open after this work merges.** No GitHub closing keyword immediately precedes a reference to that issue number in any commit message, in the pull-request body, or in any file in this change set. The keyword set to scan for is `close`, `closes`, `closed`, `fix`, `fixes`, `fixed`, `resolve`, `resolves`, `resolved`, each optionally followed by a colon. The pull-request body carries closing keywords for **#446, #448 and #426 only**. Verified by reading the pull-request body file and `git log ..HEAD --format=%B` before opening the pull request. +- [x] AC18 — no non-owned production file is modified. `git diff --name-only ...HEAD -- "QuickFiler/**/*.cs"` returns only paths from the owned list in Scope & Non-Goals. In particular `QfcHomeController.cs`, `QfcHomeController.Metrics.cs`, `QfcCollectionController.cs`, `QfcItemController.cs`, `QfcItemController.Initialization.cs`, `QfcHighConfidencePreFilter.cs`, `QfcItemGroup.cs`, `QfcQueue.cs`, `QfcRemainingQueueAdmission.cs`, `QfcFormController.cs`, `QfcFormController.EventHandlers.cs` and `QfcFormController.SetupDisposal.cs` are absent from the output. +- [x] AC19 — no project file is modified. `git diff --name-only ...HEAD -- "*.csproj" "*.props" "*.targets" "packages.config"` returns an empty result. +- [x] AC20 — the three pre-existing `IQfcDatamodel` overloads are unchanged. `git diff ...HEAD -- "QuickFiler/Interfaces/IQfcDatamodel.cs"` contains only additions; no line of the existing `DequeueNextItemGroupAsync` or `DequeueNextItemGroup` declarations is removed or altered. +- [x] AC21 — the overload-selection pins are untouched. `git diff --name-only ...HEAD` does not list `QuickFiler.Test/Controllers/QfcHomeControllerIssue218Tests.cs` or `QuickFiler.Test/Controllers/QfcHomeControllerRunAsyncHighConfidenceTests.cs`. +- [x] AC22 — no new file is added under `QuickFiler/` or `QuickFiler.Test/`. `git diff --name-status ...HEAD -- "QuickFiler/" "QuickFiler.Test/"` reports no `A` status entry. **Quality gates** -- [ ] AC23 — the reflective gate helper is **fail-closed**. The descending `GetConstructor` fallback chain at `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:26-156` is replaced by a single exact lookup guarded by a `Should().NotBeNull()` assertion. Verified by `git grep -c "GetConstructor" -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` reporting `1`, and by all 29 gate test methods passing (the 23 present on the tree that carries PR #610, plus the six added by `[P1-T2]`, `[P1-T3]`, `[P1-T4]`, `[P1-T9]`, `[P1-T10]` and `[P1-T13]`). -- [ ] AC24 — the 500-line cap holds on every file this change touches. For each path in `git diff --name-only ...HEAD -- "*.cs"`, the post-change line count is `<= 500`. The single permitted exception is `QuickFiler.Test/Controllers/QfcFormControllerTests.cs` (pre-existing 827); if it is touched at all its post-change line count must be strictly less than 827. `QuickFiler/Controllers/QfcDatamodel.cs` must be `<= 500` (its pre-change count is 496). -- [ ] AC25 — the source-text signature-order test survives formatting: `LoadItemsAsync_MailItemPath_DoesNotApplyPostDisplayHighConfidenceRemoval` (`QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs:352-374`) passes **after** `dotnet tool run csharpier format .` has run, not before. -- [ ] AC26 — determinism: no test file added or modified by this change set contains `Thread.Sleep`, `Task.Delay`, `DateTime.Now`, `DateTime.UtcNow`, `Path.GetTempPath` or `Path.GetTempFileName`. Verified by grepping the changed test paths from `git diff --name-only ...HEAD -- "QuickFiler.Test/**/*.cs"`. -- [ ] AC27 — full four-step C# toolchain green in a single final pass: `dotnet tool run csharpier check .` clean; both `msbuild TaskMaster.sln /t:Rebuild ...` commands (analyzer and `TreatWarningsAsErrors`) exit 0 with zero errors and zero warnings-as-errors; `vstest.console.exe /EnableCodeCoverage` reports zero failed tests. Neither msbuild invocation uses `/t:Build` and neither adds `/p:Nullable=enable`. The exact commands run and their results are recorded in the feature's evidence folder. +- [x] AC23 — the reflective gate helper is **fail-closed**. The descending `GetConstructor` fallback chain at `QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs:26-156` is replaced by a single exact lookup guarded by a `Should().NotBeNull()` assertion. Verified by `git grep -c "GetConstructor" -- "QuickFiler.Test/Controllers/QfcStreamingDequeueConfidenceGateTests.cs"` reporting `1`, and by all 29 gate test methods passing (the 23 present on the tree that carries PR #610, plus the six added by `[P1-T2]`, `[P1-T3]`, `[P1-T4]`, `[P1-T9]`, `[P1-T10]` and `[P1-T13]`). +- [x] AC24 — the 500-line cap holds on every file this change touches. For each path in `git diff --name-only ...HEAD -- "*.cs"`, the post-change line count is `<= 500`. The single permitted exception is `QuickFiler.Test/Controllers/QfcFormControllerTests.cs` (pre-existing 827); if it is touched at all its post-change line count must be strictly less than 827. `QuickFiler/Controllers/QfcDatamodel.cs` must be `<= 500` (its pre-change count is 496). +- [x] AC25 — the source-text signature-order test survives formatting: `LoadItemsAsync_MailItemPath_DoesNotApplyPostDisplayHighConfidenceRemoval` (`QuickFiler.Test/Controllers/QfcFormControllerSeamTests.cs:352-374`) passes **after** `dotnet tool run csharpier format .` has run, not before. +- [x] AC26 — determinism: no test file added or modified by this change set contains `Thread.Sleep`, `Task.Delay`, `DateTime.Now`, `DateTime.UtcNow`, `Path.GetTempPath` or `Path.GetTempFileName`. Verified by grepping the changed test paths from `git diff --name-only ...HEAD -- "QuickFiler.Test/**/*.cs"`. +- [x] AC27 — full four-step C# toolchain green in a single final pass: `dotnet tool run csharpier check .` clean; both `msbuild TaskMaster.sln /t:Rebuild ...` commands (analyzer and `TreatWarningsAsErrors`) exit 0 with zero errors and zero warnings-as-errors; `vstest.console.exe /EnableCodeCoverage` reports zero failed tests. Neither msbuild invocation uses `/t:Build` and neither adds `/p:Nullable=enable`. The exact commands run and their results are recorded in the feature's evidence folder. - [ ] AC28 — coverage: no regression on changed lines, and `>= 90%` line coverage on `QfcStreamingDequeueConfidenceGate`, `QfcFormController` and `QfcHomeController` (the three non-excluded types this work touches). The repository-wide figure is recorded and reported from the `/EnableCodeCoverage` run but is not a blocking threshold for this change, because no merge-base baseline exists for this feature folder and `QfcDatamodel` is `[ExcludeFromCodeCoverage]`. --- @@ -967,8 +967,8 @@ of this branch against its integration branch. - Issue: https://github.com/drmoisan/TaskMaster/issues/446 - Related issues: #448, #426, #427 (partially addressed; remains open) -- Feature issue record: `docs/features/active/quickfiler-queue-datamodel-defects-446/issue.md` -- Research: `docs/features/active/quickfiler-queue-datamodel-defects-446/research/2026-08-24T09-50-quickfiler-queue-datamodel-defects-research.md` +- Feature issue record: `docs/features/active/quickfiler-bug-family-446/issue.md` +- Research: `docs/features/active/quickfiler-bug-family-446/research/2026-08-24T09-50-quickfiler-queue-datamodel-defects-research.md` - Promoted potential documents: `docs/features/potential/promoted/2026-08-07-iteratequeueasync-deadline-closes-queue-early.md`, `docs/features/potential/promoted/2026-08-07-quickfiler-undoconsumer-nonterminating-loop.md`, diff --git a/docs/features/potential/promoted/2026-08-26-qfcformcontroller-actions-testability-seams.md b/docs/features/potential/promoted/2026-08-26-qfcformcontroller-actions-testability-seams.md new file mode 100644 index 000000000..eb6ca9a22 --- /dev/null +++ b/docs/features/potential/promoted/2026-08-26-qfcformcontroller-actions-testability-seams.md @@ -0,0 +1,65 @@ +# qfcformcontroller-actions-testability-seams (Issue #624) + +- Date captured: 2026-08-26 +- Author: Dan Moisan +- Status: Promoted -> docs/features/active/qfcformcontroller-actions-testability-seams/ (Issue #624) + +- Issue: #624 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/624 +- Last Updated: 2026-08-26 +## Problem / Why + + +`QuickFiler/Controllers/QfcFormController.Actions.cs` sits at 47.89% line and 45.24% branch coverage because three blocks of it cannot be exercised without injectable seams. Measured during issue #446, the uncovered set is: + +| Lines | Block | Why untestable today | +| --- | --- | --- | +| 29-160 | `LoadItems` / `LoadItemsAsync` overloads | bound directly to `TableLayoutPanel` and Outlook COM types with no seam | +| 241-258 | `ProcessUndoItemAsync` | COM-and-dispatcher take branch | +| 267-306 | `UndoDialog` | three modal `MessageBox.Show` calls at :225, :238 and :248 | + +This was accepted as a documented carve-out for #446 because the Bugfix Workflow requires a minimal targeted fix and directs that deeper design problems be opened as a new issue rather than widening scope. The #446 feature review confirmed the carve-out was legitimate but recorded that no promoted document routed the resulting debt, which is what this entry fixes. + +One correction to the original #446 rationale, established by the review: the carve-out note named only the `MessageBox.Show` calls, which understates the problem. A `MessageBox` seam alone would lift the file to roughly 67%, not past 90%, because the COM-bound loader overloads at 29-160 dominate the uncovered set. Any plan that seams only the dialog will miss the target. + +## Proposed Behavior + + +Introduce injectable seams so the three blocks become testable without a live Outlook or a real WinForms message pump: + +- a dialog-service seam replacing direct `MessageBox.Show` calls; +- loader seams isolating `TableLayoutPanel` and COM interaction from the `LoadItems*` control flow; +- a seam or fake for the `ProcessUndoItemAsync` take branch's COM and dispatcher dependencies. + +Pure logic moves behind the seams and is covered by unit tests; the residual host-bound wiring stays as thin as possible. + +## Acceptance Criteria (early draft) + + +- [ ] `QuickFiler/Controllers/QfcFormController.Actions.cs` line coverage is at least 90% +- [ ] Branch coverage on that file is at least 75% +- [ ] No `[ExcludeFromCodeCoverage]` is added to reach the target +- [ ] No test starts a real dialog, message pump, or live COM object +- [ ] Existing behavior is unchanged and the full QuickFiler.Test assembly remains green + +## Constraints & Risks + + +- The repository's policy direction disfavors coverage exemptions where the real answer is a testability seam, so `[ExcludeFromCodeCoverage]` is not an acceptable route here. +- `QfcFormController` is a partial type; sibling declarations are owned by other epic children (features 442, 484, 444, 489). Coordinate to avoid annexing their scope. +- The file is currently 496 of the 500-line cap, so seam work must extract rather than add. +- UT4 prohibits exercising modal dialogs and live COM in unit tests; the seams exist precisely to keep tests off them. + +## Test Conditions to Consider + + +- [ ] Dialog seam: each of the three call sites drives its branch through an inert fake +- [ ] Loader seams: positive, empty, and error paths for both `LoadItems*` overloads +- [ ] `ProcessUndoItemAsync`: take branch, exception branch, and cancellation +- [ ] Coverage re-measured on the changed-file scope, with the denominator stated + +## Next Step + +- [ ] Promote to GitHub issue (feature request template) +- [ ] Create `docs/features/active/qfcformcontroller-actions-testability-seams/` folder from the template + diff --git a/docs/features/potential/promoted/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md b/docs/features/potential/promoted/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md new file mode 100644 index 000000000..57a7fafb2 --- /dev/null +++ b/docs/features/potential/promoted/2026-08-26-qfcformcontroller-cleanup-disposal-ordering.md @@ -0,0 +1,68 @@ +# qfcformcontroller-cleanup-disposal-ordering (Issue #621) + +- Date captured: 2026-08-26 +- Author: Dan Moisan +- Status: Promoted -> docs/features/active/qfcformcontroller-cleanup-disposal-ordering/ (Issue #621) + +> Automation note: Keep the section headings below unchanged; the promotion tooling maps each of them into the GitHub bug issue template. + +- Issue: #621 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/621 +- Last Updated: 2026-08-26 +## Summary + + +`QfcFormController.Cleanup()` tears down state the undo consumer is still using, without first stopping that consumer. `QuickFiler/Controllers/QfcFormController.SetupDisposal.cs:216-220` disposes `_undoQueue` and nulls `_globals` and `_groups` while never cancelling or awaiting `_undoConsumerTask`. A consumer iteration still in flight can therefore observe a disposed queue or a null global, producing an `ObjectDisposedException` or a `NullReferenceException` on a background task during teardown. + +## Environment + +- OS/version: +- Python version: +- Command/flags used: +- Data source or fixture: + +## Steps to Reproduce + + +1. Start the undo consumer so `_undoConsumerTask` is running and blocked on a take. +2. Invoke `Cleanup()` while that iteration is in flight. +3. Observe the consumer touching `_undoQueue`, `_globals` or `_groups` after `QuickFiler/Controllers/QfcFormController.SetupDisposal.cs:216-220` has disposed or nulled them. + +## Expected Behavior + + +Cleanup cancels the consumer, awaits `_undoConsumerTask` to a terminal state, and only then disposes the queue and releases `_globals` and `_groups`. + +## Actual Behavior + + +Cleanup disposes and nulls first and never awaits the task, so teardown races the consumer. + +## Logs / Screenshots + +- [ ] Attached minimal logs or screenshot +- Snippet: + +## Impact / Severity + + +- [x] Medium + +Race confined to teardown, but it can surface as an unobserved background task exception. + +## Suspected Cause / Notes + + +Discovered during issue #446 (`docs/features/active/quickfiler-bug-family-446`), which fixed the consumer loop's own termination and its `finally` reset but did not change `Cleanup()`. `QuickFiler/Controllers/QfcFormController.SetupDisposal.cs` was outside #446's owned file set. + +## Proposed Fix / Validation Ideas + + +- [ ] Cancel the consumer's token, then await `_undoConsumerTask` (with a bounded timeout) before disposing `_undoQueue` +- [ ] Unit coverage driving Cleanup() against an in-flight consumer, asserting no exception escapes and the task reaches a terminal state +- [ ] Confirm Cleanup() remains safe when the consumer was never started + +## Next Step + +- [ ] Promote to GitHub issue (bug-report template) +- [ ] Move to active fix folder / branch diff --git a/docs/features/potential/promoted/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md b/docs/features/potential/promoted/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md new file mode 100644 index 000000000..f1fd47673 --- /dev/null +++ b/docs/features/potential/promoted/2026-08-26-qfcremainingqueueadmission-dead-scoreloader.md @@ -0,0 +1,68 @@ +# qfcremainingqueueadmission-dead-scoreloader (Issue #622) + +- Date captured: 2026-08-26 +- Author: Dan Moisan +- Status: Promoted -> docs/features/active/qfcremainingqueueadmission-dead-scoreloader/ (Issue #622) + +> Automation note: Keep the section headings below unchanged; the promotion tooling maps each of them into the GitHub bug issue template. + +- Issue: #622 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/622 +- Last Updated: 2026-08-26 +## Summary + + +`QfcRemainingQueueAdmission` accepts a `scoreLoader` delegate it never uses. The parameter is declared at `QuickFiler/Controllers/QfcRemainingQueueAdmission.cs:17` and null-checked at `QuickFiler/Controllers/QfcRemainingQueueAdmission.cs:23-26`, but it is never assigned to a field and never invoked. The null check makes the dead parameter look load-bearing and forces every caller to supply a non-null delegate that cannot affect behavior, which is actively misleading when the scoring signature changes. + +## Environment + +- OS/version: +- Python version: +- Command/flags used: +- Data source or fixture: + +## Steps to Reproduce + + +1. Read `QuickFiler/Controllers/QfcRemainingQueueAdmission.cs:17` and observe the `scoreLoader` parameter. +2. Read `:23-26` and observe the null guard. +3. Search the file for any assignment or invocation of `scoreLoader` and find none. + +## Expected Behavior + + +Either the delegate participates in admission scoring, or the parameter and its guard are removed and callers stop constructing one. + +## Actual Behavior + + +The parameter is guarded, then discarded. Callers pay the cost of building a delegate that is never called. + +## Logs / Screenshots + +- [ ] Attached minimal logs or screenshot +- Snippet: + +## Impact / Severity + + +- [x] Low + +No runtime misbehavior; a maintainability and API-honesty defect. + +## Suspected Cause / Notes + + +Confirmed during issue #446 (`docs/features/active/quickfiler-bug-family-446`). #446 widened the score loader to a `(long Score, string TopFolder)` tuple across the real consumers and specifically established that this file needed no change precisely because the parameter is never invoked. That finding is what makes the deadness certain rather than suspected. The file was not in #446's owned set. + +## Proposed Fix / Validation Ideas + + +- [ ] Decide whether admission should score; if not, delete the parameter, the guard, and the caller-side construction +- [ ] If it should score, wire it to a field and invoke it, with unit coverage proving the delegate is consulted +- [ ] Confirm no caller relies on the guard for its own null validation + +## Next Step + +- [ ] Promote to GitHub issue (bug-report template) +- [ ] Move to active fix folder / branch diff --git a/docs/features/potential/promoted/2026-08-26-quickfiler-500-line-cap-violations.md b/docs/features/potential/promoted/2026-08-26-quickfiler-500-line-cap-violations.md new file mode 100644 index 000000000..31ff426b6 --- /dev/null +++ b/docs/features/potential/promoted/2026-08-26-quickfiler-500-line-cap-violations.md @@ -0,0 +1,55 @@ +# quickfiler-500-line-cap-violations (Issue #623) + +- Date captured: 2026-08-26 +- Author: Dan Moisan +- Status: Promoted -> docs/features/active/quickfiler-500-line-cap-violations/ (Issue #623) + +- Issue: #623 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/623 +- Last Updated: 2026-08-26 +## Problem / Why + + +Three QuickFiler files exceed the repository's 500-line cap defined in `.claude/rules/general-code-change.md`: + +| Path | Lines | +| --- | --- | +| `QuickFiler/Controllers/QfcCollectionController.cs` | 2349 | +| `QuickFiler.Test/Controllers/QfcFormControllerTests.cs` | 827 | +| `QuickFiler/Controllers/QfcQueue.cs` | 610 | + +All three predate issue #446 and none were in its owned file set, so #446 could not address them without widening its blast radius. The cap is not cosmetic here: during #446 the proximity of several files to the cap repeatedly constrained the shape of otherwise-straightforward changes and forced extraction work into unrelated tasks. `QfcCollectionController.cs` at 2349 lines is more than four times the cap. + +## Proposed Behavior + + +Each file is decomposed into cohesive units under 500 lines, preserving public API and behavior. For the test file, split along fixture or scenario boundaries; note that `QuickFiler.Test.csproj` lists all Compile Include entries explicitly, so any new file must be registered there. + +## Acceptance Criteria (early draft) + + +- [ ] `QuickFiler/Controllers/QfcCollectionController.cs` is at most 500 lines +- [ ] `QuickFiler.Test/Controllers/QfcFormControllerTests.cs` is at most 500 lines +- [ ] `QuickFiler/Controllers/QfcQueue.cs` is at most 500 lines +- [ ] No public API change and no test assertion weakened or removed +- [ ] The full QuickFiler.Test assembly remains green + +## Constraints & Risks + + +- `QuickFiler.Test.csproj` enumerates every Compile Include explicitly; new files must be added there or they will not build. +- `QfcCollectionController.cs` at 2349 lines is large enough that decomposition should be staged rather than attempted in one change. +- Partial-class splits are the lowest-risk mechanism where a type must stay whole. + +## Test Conditions to Consider + + +- [ ] Whole-assembly run green before and after each split +- [ ] Coverage does not regress on the moved lines +- [ ] No behavioral diff in the decomposed types + +## Next Step + +- [ ] Promote to GitHub issue (feature request template) +- [ ] Create `docs/features/active/quickfiler-500-line-cap-violations/` folder from the template + diff --git a/docs/features/potential/promoted/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md b/docs/features/potential/promoted/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md new file mode 100644 index 000000000..bacd8d752 --- /dev/null +++ b/docs/features/potential/promoted/2026-08-26-quickfiler-emailmovemonitor-instances-not-shared.md @@ -0,0 +1,68 @@ +# quickfiler-emailmovemonitor-instances-not-shared (Issue #620) + +- Date captured: 2026-08-26 +- Author: Dan Moisan +- Status: Promoted -> docs/features/active/quickfiler-emailmovemonitor-instances-not-shared/ (Issue #620) + +> Automation note: Keep the section headings below unchanged; the promotion tooling maps each of them into the GitHub bug issue template. + +- Issue: #620 +- Issue URL: https://github.com/drmoisan/TaskMaster/issues/620 +- Last Updated: 2026-08-26 +## Summary + + +`UnhookItem` can never release a hook that `QfcDatamodel` registered, because three collaborators each construct their own independent `EmailMoveMonitor` rather than sharing one. `QuickFiler/Controllers/QfcDatamodel.cs:103`, `QuickFiler/Controllers/QfcQueue.cs:40` and `QuickFiler/Controllers/QfcCollectionController.cs:78` each build a separate instance, so the `UnhookItem` call at `QuickFiler/Controllers/QfcQueue.cs:76` consults a hook list that structurally cannot contain the datamodel's registrations. Any unhook routed through `QfcQueue` is therefore a silent no-op against datamodel-registered items, and the monitor retains those hooks for the life of the object. + +## Environment + +- OS/version: +- Python version: +- Command/flags used: +- Data source or fixture: + +## Steps to Reproduce + + +1. Register a mail item hook through `QfcDatamodel`, which uses the monitor constructed at `QuickFiler/Controllers/QfcDatamodel.cs:103`. +2. Route an unhook for that same item through `QfcQueue`, which calls `UnhookItem` at `QuickFiler/Controllers/QfcQueue.cs:76` against the distinct monitor constructed at `QuickFiler/Controllers/QfcQueue.cs:40`. +3. Inspect the datamodel monitor's hook list and observe the hook is still present. + +## Expected Behavior + + +The unhook releases the item, whichever collaborator registered it. + +## Actual Behavior + + +The unhook is a no-op. The two monitors are separate objects with separate hook lists, so the lookup cannot match. + +## Logs / Screenshots + +- [ ] Attached minimal logs or screenshot +- Snippet: + +## Impact / Severity + + +- [x] Medium + +Correctness and lifetime issue rather than a crash. Hooks accumulate and are never released through this path. + +## Suspected Cause / Notes + + +Discovered during issue #446 (`docs/features/active/quickfiler-bug-family-446`). Out of scope there: #446 fixed the datamodel's own unhook path by calling its own monitor directly, which is correct but does not consolidate the instances. Consolidating ownership is a separate cross-cutting change to three files that were not in #446's owned set. + +## Proposed Fix / Validation Ideas + + +- [ ] Establish a single shared `EmailMoveMonitor` (constructor injection or a shared owner) consumed by all three collaborators +- [ ] Unit coverage asserting a hook registered via one collaborator is released by an unhook routed through another +- [ ] Verify no double-unhook or double-dispose is introduced by the consolidation + +## Next Step + +- [ ] Promote to GitHub issue (bug-report template) +- [ ] Move to active fix folder / branch