// @(#)root/proofplayer:$Id$
// Author: G.Ganis July 2011

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TProofMonSenderML                                                    //
//                                                                      //
// TProofMonSender implementation for the ML writer.                    //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TProofMonSenderML.h"

#include "TDSet.h"
#include "TFileInfo.h"
#include "THashList.h"
#include "TList.h"
#include "TParameter.h"
#include "TPluginManager.h"
#include "TProofDebug.h"
#include "TROOT.h"
#include "TSystem.h"
#include "TVirtualMonitoring.h"

//________________________________________________________________________
TProofMonSenderML::TProofMonSenderML(const char *serv, const char *tag,
                                     const char *id, const char *subid,
                                     const char *opt)
                  : TProofMonSender(serv, "ProofMonSenderML")
{
   // Main constructor

   fWriter = 0;
   // Init the sender instance using the plugin manager
   TPluginHandler *h = 0;
   if ((h = gROOT->GetPluginManager()->FindHandler("TVirtualMonitoringWriter", "MonaLisa"))) {
      if (h->LoadPlugin() != -1) {
         fWriter = (TVirtualMonitoringWriter *) h->ExecPlugin(5, serv, tag, id, subid, opt);
         if (fWriter && fWriter->IsZombie()) SafeDelete(fWriter);
      }
   }
   // Flag this instance as valid if the writer initialization succeeded
   if (fWriter) ResetBit(TObject::kInvalidObject);

   // Set default send control options
   SetBit(TProofMonSender::kSendSummary);
   ResetBit(TProofMonSender::kSendDataSetInfo);
   ResetBit(TProofMonSender::kSendFileInfo);
   fSummaryVrs = 1;
   fDataSetInfoVrs = 1;
   fFileInfoVrs = 1;

   // Transfer verbosity requirements
   PDB(kMonitoring,1) if (fWriter) fWriter->Verbose(kTRUE);
}

//________________________________________________________________________
TProofMonSenderML::~TProofMonSenderML()
{
   // Destructor

   SafeDelete(fWriter);
}

//________________________________________________________________________
Int_t TProofMonSenderML::SendSummary(TList *recs, const char *id)
{
   // Send summary record
   //
   // There are three versions of this record, corresponding the evolution
   // in time of the monitoring requirements.
   //
   // The default version 2 contains the following information
   //
   //    user                  XRD_STRING
   //    proofgroup            XRD_STRING
   //    begin                 XRD_STRING
   //    end                   XRD_STRING
   //    walltime              XRD_REAL64
   //    cputime               XRD_REAL64
   //    bytesread             XRD_REAL64
   //    events                XRD_REAL64
   //    totevents             XRD_REAL64
   //    workers               XRD_REAL64
   //    vmemmxw               XRD_REAL64
   //    rmemmxw               XRD_REAL64
   //    vmemmxm               XRD_REAL64
   //    rmemmxm               XRD_REAL64
   //    numfiles              XRD_REAL64
   //    missfiles             XRD_REAL64
   //    status                XRD_REAL64
   //    rootver               XRD_STRING
   //
   // Version 1 contains the following information
   //    (no 'status', 'missfiles', 'rootver'; 'dataset' field with name(s) of
   //     processed dataset(s))
   //
   //    user                  XRD_STRING
   //    proofgroup            XRD_STRING
   //    begin                 XRD_STRING
   //    end                   XRD_STRING
   //    walltime              XRD_REAL64
   //    cputime               XRD_REAL64
   //    bytesread             XRD_REAL64
   //    events                XRD_REAL64
   //    totevents             XRD_REAL64
   //    workers               XRD_REAL64
   //    vmemmxw               XRD_REAL64
   //    rmemmxw               XRD_REAL64
   //    vmemmxm               XRD_REAL64
   //    rmemmxm               XRD_REAL64
   //    numfiles              XRD_REAL64
   //    dataset               XRD_STRING
   //
   // Version 0 contains the following information
   //    ('group' instead of 'proofgroup'; no 'vmemmxw',
   //     'rmemmxw', 'vmemmxm', 'rmemmxm', 'numfiles', 'dataset')
   //
   //    user                  XRD_STRING
   //    group                 XRD_STRING
   //    begin                 XRD_STRING
   //    end                   XRD_STRING
   //    walltime              XRD_REAL64
   //    cputime               XRD_REAL64
   //    bytesread             XRD_REAL64
   //    events                XRD_REAL64
   //    totevents             XRD_REAL64
   //    workers               XRD_REAL64
   //
   //  Return 0 on success, -1 on any failure.

   if (!IsValid()) {
      Error("SendSummary", "invalid instance: do nothing!");
      return -1;
   }

   // Are we requested to send this info?
   if (!TestBit(TProofMonSender::kSendSummary)) return 0;

   // Make sure we have something to send
   if (!recs || (recs && recs->GetSize() <= 0)) {
      Error("SendSummary", "records list undefined or empty!");
      return -1;
   }
   TList *xrecs = recs;

   PDB(kMonitoring,1) Info("SendSummary", "preparing (qid: '%s')", id);

   // Do not send duplicated information
   TObject *qtag = recs->FindObject("querytag");
   if (qtag) recs->Remove(qtag);

   TObject *dsn = 0;
   // We may need to correct some variable names first
   if (fSummaryVrs == 0) {
      if ((dsn = recs->FindObject("dataset"))) recs->Remove(dsn);
   } else if (fSummaryVrs == 0) {
      // Only the first records
      xrecs = new TList;
      xrecs->SetOwner(kFALSE);
      TIter nxr(recs);
      TObject *o = 0;
      while ((o = nxr())) {
         if (!strcmp(o->GetName(), "vmemmxw")) break;
         xrecs->Add(o);
      }
   }

   PDB(kMonitoring,1)
      Info("SendSummary", "sending (%d entries)", xrecs->GetSize());

   // Now we are ready to send
   Bool_t rc = fWriter->SendParameters(xrecs, id);

   // Restore the "dataset" entry in the list
   if (fSummaryVrs > 1 && dsn && xrecs == recs) {
      TObject *num = recs->FindObject("numfiles");
      if (num)
         recs->AddBefore(num, dsn);
      else
         recs->Add(dsn);
   }
   // Restore the "querytag" entry in the list
   if (qtag) {
      TObject *wrks = recs->FindObject("workers");
      if (wrks)
         recs->AddAfter(wrks, qtag);
      else
         recs->Add(qtag);
   }
   if (xrecs != recs) SafeDelete(xrecs);

   // Done
   return (rc ? 0 : -1);
}

//________________________________________________________________________
Int_t TProofMonSenderML::SendDataSetInfo(TDSet *dset, TList *missing,
                                         const char *begin, const char *qid)
{
   // Post information about the processed dataset(s). The information is taken
   // from the TDSet object 'dset' and integrated with the missing files
   // information in the list 'missing'. The string 'qid' is the uninque
   // ID of the query; 'begin' the starting time.
   //
   // The records sent by this call will appear with ids 'dataset_<dataset_name_hash>'
   //
   // There are two versions of this record, with or without the starting time.
   // The starting time could be looked up from the summary record, if available.
   //
   // The default version 1 contains the following information:
   //
   //    dsn              XRD_STRING
   //    querytag         XRD_STRING
   //    querybegin       XRD_STRING
   //    numfiles         XRD_REAL64
   //    missfiles        XRD_REAL64
   //
   // Version 0 contains the following information:
   //    (no 'querybegin')
   //
   //    dsn              XRD_STRING
   //    querytag         XRD_STRING
   //    numfiles         XRD_REAL64
   //    missfiles        XRD_REAL64
   //
   // The information is posted with a bulk insert.
   //
   // Returns 0 on success, -1 on failure.

   if (!IsValid()) {
      Error("SendDataSetInfo", "invalid instance: do nothing!");
      return -1;
   }

   // Are we requested to send this info?
   if (!TestBit(TProofMonSender::kSendDataSetInfo)) return 0;

   // The query id (tag) must be given
   if (!qid || (qid && strlen(qid) <= 0)) {
      Error("SendDataSetInfo", "query id (tag) undefined!");
      return -1;
   }
   // The dataset must be given
   if (!dset) {
      Error("SendDataSetInfo", "TDSet object undefined! (qid: '%s')", qid);
      return -1;
   }

   PDB(kMonitoring,1)
      Info("SendDataSetInfo", "preparing (qid: '%s')", qid);

   TList plets;
   // Extract the information and save it into the relevant multiplets
   TString dss(dset->GetName()), ds;
   Ssiz_t from = 0;
   while ((dss.Tokenize(ds, from , "[,| ]"))) {
      // Create a new TDSetPlet and add it to the list
      plets.Add(new TDSetPlet(ds.Data()));
   }
   // Now try to count the files
   TDSetPlet *plet = 0;
   TIter nxpl(&plets);
   TObject *o = 0;
   TDSetElement *e = 0, *ee = 0;
   TDSet *dsete = 0;
   TIter nxe(dset->GetListOfElements());
   TString dse;
   while ((o = nxe())) {
      if ((e = dynamic_cast<TDSetElement *>(o))) {
         dse = e->GetDataSet();
         if (!dse.IsNull()) {
            nxpl.Reset();
            while ((plet = (TDSetPlet *) nxpl())) {
               if (dse == plet->GetName()) {
                  plet->fFiles += 1;
                  break;
               }
            }
         }
      } else if ((dsete = dynamic_cast<TDSet *>(o))) {
         PDB(kMonitoring,1)
            Info("SendDataSetInfo", "dset '%s' (%d files)",
                                    o->GetName(), dsete->GetListOfElements()->GetSize());
         TIter nxee(dsete->GetListOfElements());
         while ((ee = (TDSetElement *) nxee())) {
            dse = ee->GetDataSet();
            if (!dse.IsNull()) {
               nxpl.Reset();
               while ((plet = (TDSetPlet *) nxpl())) {
                  if (dse == plet->GetName()) {
                     plet->fFiles += 1;
                     plet->fDSet = dsete;
                     break;
                  }
               }
            }
         }
      } else {
         Warning("SendDataSetInfo", "ignoring unknown element type: '%s'", o->ClassName());
      }
   }

   // Now try to include the missing files info
   if (missing) {
      TFileInfo *fi = 0;
      TIter nxm(missing);
      TString dsfi, fn;
      while ((fi = (TFileInfo *) nxm())) {
         dsfi = fi->GetTitle();
         if (!dsfi.IsNull() && dsfi != "TFileInfo") {
            nxpl.Reset();
            while ((plet = (TDSetPlet *) nxpl())) {
               if (dsfi == plet->GetName()) {
                  fn = fi->GetCurrentUrl()->GetUrl();
                  if (plet->fDSet && plet->fDSet->GetListOfElements() &&
                      !(plet->fDSet->GetListOfElements()->FindObject(fn))) plet->fFiles += 1;
                  plet->fMissing += 1;
                  break;
               }
            }
         }
      }
   }

   // Prepare objects to be sent
   TList values;
   TNamed *nm_dsn = new TNamed("dsn", "");
   values.Add(nm_dsn);
   TNamed *nm_querytag = new TNamed("querytag", qid);
   values.Add(nm_querytag);
   TNamed *nm_begin = 0;
   if (fDataSetInfoVrs > 0) {
      nm_begin = new TNamed("begin", begin);
      values.Add(nm_begin);
   }
   TParameter<Int_t> *pi_numfiles = new TParameter<Int_t>("numfiles", -1);
   values.Add(pi_numfiles);
   TParameter<Int_t> *pi_missfiles = new TParameter<Int_t>("missfiles", -1);
   values.Add(pi_missfiles);

   PDB(kMonitoring,1)
      Info("SendDataSetInfo", "sending (%d entries)", plets.GetSize());

   Bool_t rc = kTRUE;
   TString dsnh;
   nxpl.Reset();
   while ((plet = (TDSetPlet *) nxpl())) {
      nm_dsn->SetTitle(plet->GetName());
      pi_numfiles->SetVal(plet->fFiles);
      pi_missfiles->SetVal(plet->fMissing);
      dsnh.Form("dataset_%x", TString(plet->GetName()).Hash());
      if (!(rc = fWriter->SendParameters(&values, dsnh.Data()))) break;
   }

   // Done
   return (rc ? 0 : -1);
}

//________________________________________________________________________
Int_t TProofMonSenderML::SendFileInfo(TDSet *dset, TList *missing,
                                      const char *begin, const char *qid)
{
   // Post information about the requested files. The information is taken
   // from the TDSet object 'dset' and integrated with the missing files
   // information in the list 'missing'. The string 'qid' is the unique
   // ID of the query; 'begin' the starting time.
   //
   // The records sent by this call will appear with ids 'file_<file_name_hash>'
   //
   // There are two versions of this record, with or without the starting time.
   // The starting time could be looked up from the summary record, if available.
   //
   // The default version 1 contains the following information:
   //
   //    lfn              XRD_STRING
   //    path             XRD_STRING
   //    querytag         XRD_STRING
   //    querybegin       XRD_STRING
   //    status           XRD_REAL64
   //
   // Version 0 contains the following information:
   //    (no 'querybegin')
   //
   //    lfn              XRD_STRING
   //    path             XRD_STRING
   //    querytag         XRD_STRING
   //    status           XRD_REAL64
   //
   // The information is posted with a bulk insert.
   //
   // Returns 0 on success, -1 on failure.

   if (!IsValid()) {
      Error("SendFileInfo", "invalid instance: do nothing!");
      return -1;
   }

   // Are we requested to send this info?
   if (!TestBit(TProofMonSender::kSendFileInfo)) return 0;

   // The query id (tag) must be given
   if (!qid || (qid && strlen(qid) <= 0)) {
      Error("SendFileInfo", "query id (tag) undefined!");
      return -1;
   }
   // The dataset must be given
   if (!dset) {
      Error("SendFileInfo", "TDSet object undefined! (qid: '%s')", qid);
      return -1;
   }

   PDB(kMonitoring,1) Info("SendFileInfo", "preparing (qid: '%s')", qid);

   THashList hmiss;
   if (missing) {
      TIter nxfm(missing);
      TFileInfo *fi = 0;
      while ((fi = (TFileInfo *)nxfm())) {
         hmiss.Add(new TObjString(fi->GetCurrentUrl()->GetUrl()));
      }
      hmiss.Print();
   }

   // Prepare objects to be sent
   TList values;
   TNamed *nm_lnf = new TNamed("lnf", "");
   values.Add(nm_lnf);
   TNamed *nm_path = new TNamed("path", "");
   values.Add(nm_path);
   TNamed *nm_querytag = new TNamed("querytag", qid);
   values.Add(nm_querytag);
   TNamed *nm_begin = 0;
   if (fFileInfoVrs > 0) {
      nm_begin = new TNamed("begin", begin);
      values.Add(nm_begin);
   }
   TParameter<Int_t> *pi_status = new TParameter<Int_t>("status", -1);
   values.Add(pi_status);

   PDB(kMonitoring,1)
      Info("SendFileInfo", "sending (%d entries)",
                           dset->GetListOfElements()->GetSize());

   // Loop over files
   Bool_t rc = kTRUE;
   TObject *o = 0;
   TDSetElement *e = 0, *ee = 0;
   TDSet *dsete = 0;
   TIter nxe(dset->GetListOfElements());
   TString fne, fneh;
   Int_t status = -1;
   while ((o = nxe())) {
      if ((e = dynamic_cast<TDSetElement *>(o))) {
         fne = e->GetName();
         // Try to determine the status
         status = 1;
         if (hmiss.FindObject(fne)) status = 0;
         // Prepare the parameters list
         nm_lnf->SetTitle(gSystem->BaseName(fne));
         nm_path->SetTitle(gSystem->DirName(fne));
         pi_status->SetVal(status);
         fneh.Form("file_%x", TString(TUrl(fne.Data()).GetFile()).Hash());
         if (!(rc = fWriter->SendParameters(&values, fneh.Data()))) break;
      } else if ((dsete = dynamic_cast<TDSet *>(o))) {
         PDB(kMonitoring,1)
            Info("SendFileInfo", "dset '%s' (%d files)",
                                 o->GetName(), dsete->GetListOfElements()->GetSize());
         TIter nxee(dsete->GetListOfElements());
         while ((ee = (TDSetElement *) nxee())) {
            fne = ee->GetName();
            // Try to determine the status
            status = 1;
            if (hmiss.FindObject(fne)) status = 0;
            // Prepare the parameters list
            nm_lnf->SetTitle(gSystem->BaseName(fne));
            nm_path->SetTitle(gSystem->DirName(fne));
            pi_status->SetVal(status);
            fneh.Form("file_%x", TString(TUrl(fne.Data()).GetFile()).Hash());
            if (!(rc = fWriter->SendParameters(&values, fneh.Data()))) break;
         }
      } else {
         Warning("SendFileInfo", "ignoring unknown element type: '%s'", o->ClassName());
      }
   }

   // Done
   return (rc ? 0 : -1);
}
 TProofMonSenderML.cxx:1
 TProofMonSenderML.cxx:2
 TProofMonSenderML.cxx:3
 TProofMonSenderML.cxx:4
 TProofMonSenderML.cxx:5
 TProofMonSenderML.cxx:6
 TProofMonSenderML.cxx:7
 TProofMonSenderML.cxx:8
 TProofMonSenderML.cxx:9
 TProofMonSenderML.cxx:10
 TProofMonSenderML.cxx:11
 TProofMonSenderML.cxx:12
 TProofMonSenderML.cxx:13
 TProofMonSenderML.cxx:14
 TProofMonSenderML.cxx:15
 TProofMonSenderML.cxx:16
 TProofMonSenderML.cxx:17
 TProofMonSenderML.cxx:18
 TProofMonSenderML.cxx:19
 TProofMonSenderML.cxx:20
 TProofMonSenderML.cxx:21
 TProofMonSenderML.cxx:22
 TProofMonSenderML.cxx:23
 TProofMonSenderML.cxx:24
 TProofMonSenderML.cxx:25
 TProofMonSenderML.cxx:26
 TProofMonSenderML.cxx:27
 TProofMonSenderML.cxx:28
 TProofMonSenderML.cxx:29
 TProofMonSenderML.cxx:30
 TProofMonSenderML.cxx:31
 TProofMonSenderML.cxx:32
 TProofMonSenderML.cxx:33
 TProofMonSenderML.cxx:34
 TProofMonSenderML.cxx:35
 TProofMonSenderML.cxx:36
 TProofMonSenderML.cxx:37
 TProofMonSenderML.cxx:38
 TProofMonSenderML.cxx:39
 TProofMonSenderML.cxx:40
 TProofMonSenderML.cxx:41
 TProofMonSenderML.cxx:42
 TProofMonSenderML.cxx:43
 TProofMonSenderML.cxx:44
 TProofMonSenderML.cxx:45
 TProofMonSenderML.cxx:46
 TProofMonSenderML.cxx:47
 TProofMonSenderML.cxx:48
 TProofMonSenderML.cxx:49
 TProofMonSenderML.cxx:50
 TProofMonSenderML.cxx:51
 TProofMonSenderML.cxx:52
 TProofMonSenderML.cxx:53
 TProofMonSenderML.cxx:54
 TProofMonSenderML.cxx:55
 TProofMonSenderML.cxx:56
 TProofMonSenderML.cxx:57
 TProofMonSenderML.cxx:58
 TProofMonSenderML.cxx:59
 TProofMonSenderML.cxx:60
 TProofMonSenderML.cxx:61
 TProofMonSenderML.cxx:62
 TProofMonSenderML.cxx:63
 TProofMonSenderML.cxx:64
 TProofMonSenderML.cxx:65
 TProofMonSenderML.cxx:66
 TProofMonSenderML.cxx:67
 TProofMonSenderML.cxx:68
 TProofMonSenderML.cxx:69
 TProofMonSenderML.cxx:70
 TProofMonSenderML.cxx:71
 TProofMonSenderML.cxx:72
 TProofMonSenderML.cxx:73
 TProofMonSenderML.cxx:74
 TProofMonSenderML.cxx:75
 TProofMonSenderML.cxx:76
 TProofMonSenderML.cxx:77
 TProofMonSenderML.cxx:78
 TProofMonSenderML.cxx:79
 TProofMonSenderML.cxx:80
 TProofMonSenderML.cxx:81
 TProofMonSenderML.cxx:82
 TProofMonSenderML.cxx:83
 TProofMonSenderML.cxx:84
 TProofMonSenderML.cxx:85
 TProofMonSenderML.cxx:86
 TProofMonSenderML.cxx:87
 TProofMonSenderML.cxx:88
 TProofMonSenderML.cxx:89
 TProofMonSenderML.cxx:90
 TProofMonSenderML.cxx:91
 TProofMonSenderML.cxx:92
 TProofMonSenderML.cxx:93
 TProofMonSenderML.cxx:94
 TProofMonSenderML.cxx:95
 TProofMonSenderML.cxx:96
 TProofMonSenderML.cxx:97
 TProofMonSenderML.cxx:98
 TProofMonSenderML.cxx:99
 TProofMonSenderML.cxx:100
 TProofMonSenderML.cxx:101
 TProofMonSenderML.cxx:102
 TProofMonSenderML.cxx:103
 TProofMonSenderML.cxx:104
 TProofMonSenderML.cxx:105
 TProofMonSenderML.cxx:106
 TProofMonSenderML.cxx:107
 TProofMonSenderML.cxx:108
 TProofMonSenderML.cxx:109
 TProofMonSenderML.cxx:110
 TProofMonSenderML.cxx:111
 TProofMonSenderML.cxx:112
 TProofMonSenderML.cxx:113
 TProofMonSenderML.cxx:114
 TProofMonSenderML.cxx:115
 TProofMonSenderML.cxx:116
 TProofMonSenderML.cxx:117
 TProofMonSenderML.cxx:118
 TProofMonSenderML.cxx:119
 TProofMonSenderML.cxx:120
 TProofMonSenderML.cxx:121
 TProofMonSenderML.cxx:122
 TProofMonSenderML.cxx:123
 TProofMonSenderML.cxx:124
 TProofMonSenderML.cxx:125
 TProofMonSenderML.cxx:126
 TProofMonSenderML.cxx:127
 TProofMonSenderML.cxx:128
 TProofMonSenderML.cxx:129
 TProofMonSenderML.cxx:130
 TProofMonSenderML.cxx:131
 TProofMonSenderML.cxx:132
 TProofMonSenderML.cxx:133
 TProofMonSenderML.cxx:134
 TProofMonSenderML.cxx:135
 TProofMonSenderML.cxx:136
 TProofMonSenderML.cxx:137
 TProofMonSenderML.cxx:138
 TProofMonSenderML.cxx:139
 TProofMonSenderML.cxx:140
 TProofMonSenderML.cxx:141
 TProofMonSenderML.cxx:142
 TProofMonSenderML.cxx:143
 TProofMonSenderML.cxx:144
 TProofMonSenderML.cxx:145
 TProofMonSenderML.cxx:146
 TProofMonSenderML.cxx:147
 TProofMonSenderML.cxx:148
 TProofMonSenderML.cxx:149
 TProofMonSenderML.cxx:150
 TProofMonSenderML.cxx:151
 TProofMonSenderML.cxx:152
 TProofMonSenderML.cxx:153
 TProofMonSenderML.cxx:154
 TProofMonSenderML.cxx:155
 TProofMonSenderML.cxx:156
 TProofMonSenderML.cxx:157
 TProofMonSenderML.cxx:158
 TProofMonSenderML.cxx:159
 TProofMonSenderML.cxx:160
 TProofMonSenderML.cxx:161
 TProofMonSenderML.cxx:162
 TProofMonSenderML.cxx:163
 TProofMonSenderML.cxx:164
 TProofMonSenderML.cxx:165
 TProofMonSenderML.cxx:166
 TProofMonSenderML.cxx:167
 TProofMonSenderML.cxx:168
 TProofMonSenderML.cxx:169
 TProofMonSenderML.cxx:170
 TProofMonSenderML.cxx:171
 TProofMonSenderML.cxx:172
 TProofMonSenderML.cxx:173
 TProofMonSenderML.cxx:174
 TProofMonSenderML.cxx:175
 TProofMonSenderML.cxx:176
 TProofMonSenderML.cxx:177
 TProofMonSenderML.cxx:178
 TProofMonSenderML.cxx:179
 TProofMonSenderML.cxx:180
 TProofMonSenderML.cxx:181
 TProofMonSenderML.cxx:182
 TProofMonSenderML.cxx:183
 TProofMonSenderML.cxx:184
 TProofMonSenderML.cxx:185
 TProofMonSenderML.cxx:186
 TProofMonSenderML.cxx:187
 TProofMonSenderML.cxx:188
 TProofMonSenderML.cxx:189
 TProofMonSenderML.cxx:190
 TProofMonSenderML.cxx:191
 TProofMonSenderML.cxx:192
 TProofMonSenderML.cxx:193
 TProofMonSenderML.cxx:194
 TProofMonSenderML.cxx:195
 TProofMonSenderML.cxx:196
 TProofMonSenderML.cxx:197
 TProofMonSenderML.cxx:198
 TProofMonSenderML.cxx:199
 TProofMonSenderML.cxx:200
 TProofMonSenderML.cxx:201
 TProofMonSenderML.cxx:202
 TProofMonSenderML.cxx:203
 TProofMonSenderML.cxx:204
 TProofMonSenderML.cxx:205
 TProofMonSenderML.cxx:206
 TProofMonSenderML.cxx:207
 TProofMonSenderML.cxx:208
 TProofMonSenderML.cxx:209
 TProofMonSenderML.cxx:210
 TProofMonSenderML.cxx:211
 TProofMonSenderML.cxx:212
 TProofMonSenderML.cxx:213
 TProofMonSenderML.cxx:214
 TProofMonSenderML.cxx:215
 TProofMonSenderML.cxx:216
 TProofMonSenderML.cxx:217
 TProofMonSenderML.cxx:218
 TProofMonSenderML.cxx:219
 TProofMonSenderML.cxx:220
 TProofMonSenderML.cxx:221
 TProofMonSenderML.cxx:222
 TProofMonSenderML.cxx:223
 TProofMonSenderML.cxx:224
 TProofMonSenderML.cxx:225
 TProofMonSenderML.cxx:226
 TProofMonSenderML.cxx:227
 TProofMonSenderML.cxx:228
 TProofMonSenderML.cxx:229
 TProofMonSenderML.cxx:230
 TProofMonSenderML.cxx:231
 TProofMonSenderML.cxx:232
 TProofMonSenderML.cxx:233
 TProofMonSenderML.cxx:234
 TProofMonSenderML.cxx:235
 TProofMonSenderML.cxx:236
 TProofMonSenderML.cxx:237
 TProofMonSenderML.cxx:238
 TProofMonSenderML.cxx:239
 TProofMonSenderML.cxx:240
 TProofMonSenderML.cxx:241
 TProofMonSenderML.cxx:242
 TProofMonSenderML.cxx:243
 TProofMonSenderML.cxx:244
 TProofMonSenderML.cxx:245
 TProofMonSenderML.cxx:246
 TProofMonSenderML.cxx:247
 TProofMonSenderML.cxx:248
 TProofMonSenderML.cxx:249
 TProofMonSenderML.cxx:250
 TProofMonSenderML.cxx:251
 TProofMonSenderML.cxx:252
 TProofMonSenderML.cxx:253
 TProofMonSenderML.cxx:254
 TProofMonSenderML.cxx:255
 TProofMonSenderML.cxx:256
 TProofMonSenderML.cxx:257
 TProofMonSenderML.cxx:258
 TProofMonSenderML.cxx:259
 TProofMonSenderML.cxx:260
 TProofMonSenderML.cxx:261
 TProofMonSenderML.cxx:262
 TProofMonSenderML.cxx:263
 TProofMonSenderML.cxx:264
 TProofMonSenderML.cxx:265
 TProofMonSenderML.cxx:266
 TProofMonSenderML.cxx:267
 TProofMonSenderML.cxx:268
 TProofMonSenderML.cxx:269
 TProofMonSenderML.cxx:270
 TProofMonSenderML.cxx:271
 TProofMonSenderML.cxx:272
 TProofMonSenderML.cxx:273
 TProofMonSenderML.cxx:274
 TProofMonSenderML.cxx:275
 TProofMonSenderML.cxx:276
 TProofMonSenderML.cxx:277
 TProofMonSenderML.cxx:278
 TProofMonSenderML.cxx:279
 TProofMonSenderML.cxx:280
 TProofMonSenderML.cxx:281
 TProofMonSenderML.cxx:282
 TProofMonSenderML.cxx:283
 TProofMonSenderML.cxx:284
 TProofMonSenderML.cxx:285
 TProofMonSenderML.cxx:286
 TProofMonSenderML.cxx:287
 TProofMonSenderML.cxx:288
 TProofMonSenderML.cxx:289
 TProofMonSenderML.cxx:290
 TProofMonSenderML.cxx:291
 TProofMonSenderML.cxx:292
 TProofMonSenderML.cxx:293
 TProofMonSenderML.cxx:294
 TProofMonSenderML.cxx:295
 TProofMonSenderML.cxx:296
 TProofMonSenderML.cxx:297
 TProofMonSenderML.cxx:298
 TProofMonSenderML.cxx:299
 TProofMonSenderML.cxx:300
 TProofMonSenderML.cxx:301
 TProofMonSenderML.cxx:302
 TProofMonSenderML.cxx:303
 TProofMonSenderML.cxx:304
 TProofMonSenderML.cxx:305
 TProofMonSenderML.cxx:306
 TProofMonSenderML.cxx:307
 TProofMonSenderML.cxx:308
 TProofMonSenderML.cxx:309
 TProofMonSenderML.cxx:310
 TProofMonSenderML.cxx:311
 TProofMonSenderML.cxx:312
 TProofMonSenderML.cxx:313
 TProofMonSenderML.cxx:314
 TProofMonSenderML.cxx:315
 TProofMonSenderML.cxx:316
 TProofMonSenderML.cxx:317
 TProofMonSenderML.cxx:318
 TProofMonSenderML.cxx:319
 TProofMonSenderML.cxx:320
 TProofMonSenderML.cxx:321
 TProofMonSenderML.cxx:322
 TProofMonSenderML.cxx:323
 TProofMonSenderML.cxx:324
 TProofMonSenderML.cxx:325
 TProofMonSenderML.cxx:326
 TProofMonSenderML.cxx:327
 TProofMonSenderML.cxx:328
 TProofMonSenderML.cxx:329
 TProofMonSenderML.cxx:330
 TProofMonSenderML.cxx:331
 TProofMonSenderML.cxx:332
 TProofMonSenderML.cxx:333
 TProofMonSenderML.cxx:334
 TProofMonSenderML.cxx:335
 TProofMonSenderML.cxx:336
 TProofMonSenderML.cxx:337
 TProofMonSenderML.cxx:338
 TProofMonSenderML.cxx:339
 TProofMonSenderML.cxx:340
 TProofMonSenderML.cxx:341
 TProofMonSenderML.cxx:342
 TProofMonSenderML.cxx:343
 TProofMonSenderML.cxx:344
 TProofMonSenderML.cxx:345
 TProofMonSenderML.cxx:346
 TProofMonSenderML.cxx:347
 TProofMonSenderML.cxx:348
 TProofMonSenderML.cxx:349
 TProofMonSenderML.cxx:350
 TProofMonSenderML.cxx:351
 TProofMonSenderML.cxx:352
 TProofMonSenderML.cxx:353
 TProofMonSenderML.cxx:354
 TProofMonSenderML.cxx:355
 TProofMonSenderML.cxx:356
 TProofMonSenderML.cxx:357
 TProofMonSenderML.cxx:358
 TProofMonSenderML.cxx:359
 TProofMonSenderML.cxx:360
 TProofMonSenderML.cxx:361
 TProofMonSenderML.cxx:362
 TProofMonSenderML.cxx:363
 TProofMonSenderML.cxx:364
 TProofMonSenderML.cxx:365
 TProofMonSenderML.cxx:366
 TProofMonSenderML.cxx:367
 TProofMonSenderML.cxx:368
 TProofMonSenderML.cxx:369
 TProofMonSenderML.cxx:370
 TProofMonSenderML.cxx:371
 TProofMonSenderML.cxx:372
 TProofMonSenderML.cxx:373
 TProofMonSenderML.cxx:374
 TProofMonSenderML.cxx:375
 TProofMonSenderML.cxx:376
 TProofMonSenderML.cxx:377
 TProofMonSenderML.cxx:378
 TProofMonSenderML.cxx:379
 TProofMonSenderML.cxx:380
 TProofMonSenderML.cxx:381
 TProofMonSenderML.cxx:382
 TProofMonSenderML.cxx:383
 TProofMonSenderML.cxx:384
 TProofMonSenderML.cxx:385
 TProofMonSenderML.cxx:386
 TProofMonSenderML.cxx:387
 TProofMonSenderML.cxx:388
 TProofMonSenderML.cxx:389
 TProofMonSenderML.cxx:390
 TProofMonSenderML.cxx:391
 TProofMonSenderML.cxx:392
 TProofMonSenderML.cxx:393
 TProofMonSenderML.cxx:394
 TProofMonSenderML.cxx:395
 TProofMonSenderML.cxx:396
 TProofMonSenderML.cxx:397
 TProofMonSenderML.cxx:398
 TProofMonSenderML.cxx:399
 TProofMonSenderML.cxx:400
 TProofMonSenderML.cxx:401
 TProofMonSenderML.cxx:402
 TProofMonSenderML.cxx:403
 TProofMonSenderML.cxx:404
 TProofMonSenderML.cxx:405
 TProofMonSenderML.cxx:406
 TProofMonSenderML.cxx:407
 TProofMonSenderML.cxx:408
 TProofMonSenderML.cxx:409
 TProofMonSenderML.cxx:410
 TProofMonSenderML.cxx:411
 TProofMonSenderML.cxx:412
 TProofMonSenderML.cxx:413
 TProofMonSenderML.cxx:414
 TProofMonSenderML.cxx:415
 TProofMonSenderML.cxx:416
 TProofMonSenderML.cxx:417
 TProofMonSenderML.cxx:418
 TProofMonSenderML.cxx:419
 TProofMonSenderML.cxx:420
 TProofMonSenderML.cxx:421
 TProofMonSenderML.cxx:422
 TProofMonSenderML.cxx:423
 TProofMonSenderML.cxx:424
 TProofMonSenderML.cxx:425
 TProofMonSenderML.cxx:426
 TProofMonSenderML.cxx:427
 TProofMonSenderML.cxx:428
 TProofMonSenderML.cxx:429
 TProofMonSenderML.cxx:430
 TProofMonSenderML.cxx:431
 TProofMonSenderML.cxx:432
 TProofMonSenderML.cxx:433
 TProofMonSenderML.cxx:434
 TProofMonSenderML.cxx:435
 TProofMonSenderML.cxx:436
 TProofMonSenderML.cxx:437
 TProofMonSenderML.cxx:438
 TProofMonSenderML.cxx:439
 TProofMonSenderML.cxx:440
 TProofMonSenderML.cxx:441
 TProofMonSenderML.cxx:442
 TProofMonSenderML.cxx:443
 TProofMonSenderML.cxx:444
 TProofMonSenderML.cxx:445
 TProofMonSenderML.cxx:446
 TProofMonSenderML.cxx:447
 TProofMonSenderML.cxx:448
 TProofMonSenderML.cxx:449
 TProofMonSenderML.cxx:450
 TProofMonSenderML.cxx:451
 TProofMonSenderML.cxx:452
 TProofMonSenderML.cxx:453
 TProofMonSenderML.cxx:454
 TProofMonSenderML.cxx:455
 TProofMonSenderML.cxx:456
 TProofMonSenderML.cxx:457
 TProofMonSenderML.cxx:458
 TProofMonSenderML.cxx:459
 TProofMonSenderML.cxx:460
 TProofMonSenderML.cxx:461
 TProofMonSenderML.cxx:462
 TProofMonSenderML.cxx:463
 TProofMonSenderML.cxx:464
 TProofMonSenderML.cxx:465
 TProofMonSenderML.cxx:466
 TProofMonSenderML.cxx:467
 TProofMonSenderML.cxx:468
 TProofMonSenderML.cxx:469
 TProofMonSenderML.cxx:470
 TProofMonSenderML.cxx:471
 TProofMonSenderML.cxx:472
 TProofMonSenderML.cxx:473
 TProofMonSenderML.cxx:474
 TProofMonSenderML.cxx:475
 TProofMonSenderML.cxx:476
 TProofMonSenderML.cxx:477
 TProofMonSenderML.cxx:478
 TProofMonSenderML.cxx:479
 TProofMonSenderML.cxx:480
 TProofMonSenderML.cxx:481
 TProofMonSenderML.cxx:482
 TProofMonSenderML.cxx:483
 TProofMonSenderML.cxx:484
 TProofMonSenderML.cxx:485
 TProofMonSenderML.cxx:486
 TProofMonSenderML.cxx:487
 TProofMonSenderML.cxx:488
 TProofMonSenderML.cxx:489
 TProofMonSenderML.cxx:490
 TProofMonSenderML.cxx:491
 TProofMonSenderML.cxx:492
 TProofMonSenderML.cxx:493
 TProofMonSenderML.cxx:494
 TProofMonSenderML.cxx:495
 TProofMonSenderML.cxx:496
 TProofMonSenderML.cxx:497
 TProofMonSenderML.cxx:498