protected void onProject(string project, ExecutionOrderType type, bool fSuccess = true)
        {
            lock (_plock)
            {
                var eop = new EOProject()
                {
                    Project = project, Order = type
                };

                int max       = Cmd.Env.ProjectsDTE.Count();
                var _projects = projects.Where(p => !ExecutionOrder.IsSpecial(p.Key));
                int count     = _projects.Count();

                // 'First Project' & 'First Type' Before
                if (count < 1)
                {
                    eop.aProject = ExecutionOrder.FIRST_PROJECT;
                    eop.aType    = ExecutionOrder.FIRST_TYPE;
                }
                // 'Last Project' & 'Last Type' Before
                else if (!projects.ContainsKey(project) && count + 1 == max)
                {
                    eop.aProject = ExecutionOrder.LAST_PROJECT;
                    eop.aType    = ExecutionOrder.LAST_TYPE;
                }
                else
                {
                    // 'First Project' After
                    if (projects.ContainsKey(project) && projects[project].aProject == ExecutionOrder.FIRST_PROJECT)
                    {
                        eop.aProject = ExecutionOrder.FIRST_PROJECT;
                    }
                    // 'Last Project' After
                    else if (projects.ContainsKey(project) && projects[project].aProject == ExecutionOrder.LAST_PROJECT)
                    {
                        eop.aProject = ExecutionOrder.LAST_PROJECT;
                    }

                    // 'First Type' After
                    if (type == ExecutionOrderType.After && !projects.Any(p => p.Value.Order == ExecutionOrderType.After))
                    {
                        eop.aType = ExecutionOrder.FIRST_TYPE;
                    }
                    // 'Last Type' After
                    else if (type == ExecutionOrderType.After && count == max)
                    {
                        var list = _projects.Where(p => p.Value.Order == ExecutionOrderType.Before);
                        if (list.Count() == 1 && list.FirstOrDefault().Key == project)
                        {
                            eop.aType = ExecutionOrder.LAST_TYPE;
                        }
                    }
                }

                projects[project] = eop;
                current.Project   = project;
                current.Order     = type;

                if (eop.aProject != null)
                {
                    projects[eop.aProject] = eop; // alias to 'First/Last Project'
                }

                if (eop.aType != null)
                {
                    projects[eop.aType] = eop; // alias to 'First/Last Type'
                }
            }

            Log.Trace($"onProject: '{project}'({projects[project].aProject}/{projects[project].aType}):{type} == {fSuccess}");

            if (Status._.contains(SolutionEventType.Pre, StatusType.Deferred))
            {
                monitoringPre(project, type, fSuccess);
            }
        }