private void ProcessTopScripts(AgentCircuit circuit, SceneInterface scene, LandStatFilterFlags flags, string filter)
        {
            RwLockedDictionary <uint, ScriptReportData> execTimes = scene.ScriptThreadPool.GetExecutionTimes();
            var reply = new LandStatReply
            {
                ReportType       = LandStatReportEnum.TopScripts,
                RequestFlags     = 0,
                TotalObjectCount = (uint)execTimes.Count
            };

            int allocedlength = 0;

            /* make top objects go first */
            foreach (KeyValuePair <uint, ScriptReportData> kvp in execTimes.OrderByDescending(x => x.Value.Score))
            {
                if (reply.ReportData.Count == 100)
                {
                    break;
                }
                ObjectPart p;
                try
                {
                    if (!scene.Primitives.TryGetValue(kvp.Key, out p))
                    {
                        continue;
                    }

                    UGUIWithName owner = scene.AvatarNameService.ResolveName(p.Owner);

                    if ((flags & LandStatFilterFlags.FilterByObject) != 0 && !p.Name.Contains(filter))
                    {
                        continue;
                    }

                    if ((flags & LandStatFilterFlags.FilterByOwner) != 0 && !owner.FullName.Contains(filter))
                    {
                        continue;
                    }

                    ParcelInfo pinfo;
                    if ((flags & LandStatFilterFlags.FilterByParcelName) != 0 && !scene.Parcels.TryGetValue(p.GlobalPosition, out pinfo) && !pinfo.Name.Equals(filter, System.StringComparison.InvariantCultureIgnoreCase))
                    {
                        continue;
                    }

                    var entry = new LandStatReply.ReportDataEntry
                    {
                        Location    = p.GlobalPosition,
                        Score       = kvp.Value.Score,
                        TaskID      = p.ID,
                        TaskLocalID = kvp.Key,
                        TaskName    = p.Name,
                        OwnerName   = owner.FullName
                    };

                    if (allocedlength + entry.MessageLength > 1400)
                    {
                        circuit.SendMessage(reply);
                        reply = new LandStatReply
                        {
                            ReportType       = 0,
                            RequestFlags     = 0,
                            TotalObjectCount = (uint)execTimes.Count
                        };
                    }

                    reply.ReportData.Add(entry);
                    allocedlength += entry.MessageLength;
                }
                catch
                {
                    /* ignore the report */
                }
            }
            circuit.SendMessage(reply);
        }