// @(#)root/proofplayer:$Id$
// Author: G. Ganis Mar 2008

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

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TProofPlayerLite                                                     //
//                                                                      //
// This version of TProofPlayerRemote merges the functionality needed   //
// by clients and masters. It is used in optmized local sessions.       //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TProofPlayerLite.h"

#include "MessageTypes.h"
#include "TDSet.h"
#include "TDSetProxy.h"
#include "TEntryList.h"
#include "TEventList.h"
#include "THashList.h"
#include "TMap.h"
#include "TMessage.h"
#include "TObjString.h"
#include "TPerfStats.h"
#include "TProofLite.h"
#include "TProofDebug.h"
#include "TProofServ.h"
#include "TROOT.h"
#include "TSelector.h"
#include "TVirtualPacketizer.h"

//______________________________________________________________________________
Int_t TProofPlayerLite::MakeSelector(const char *selfile)
{
   // Create the selector object and save the relevant files and binary information
   // in the cache so that the worker can pick it up.
   // Returns 0 and fill fSelector in case of success. Returns -1 and sets
   // fSelector to 0 in case of failure.

   fSelectorClass = 0;
   SafeDelete(fSelector);
   if (!selfile || strlen(selfile) <= 0) {
      Error("MakeSelector", "input file path or name undefined");
      return -1;
   }

   // If we are just given a name, init the selector and return
   if (!strchr(gSystem->BaseName(selfile), '.')) {
      if (gDebug > 1)
         Info("MakeSelector", "selector name '%s' does not contain a '.':"
              " no file to check, it will be loaded from a library", selfile);
      if (!(fSelector = TSelector::GetSelector(selfile))) {
         Error("MakeSelector", "could not create a %s selector", selfile);
         return -1;
      }
      // Done
      return 0;
   }

   if (((TProofLite*)fProof)->CopyMacroToCache(selfile, 1, &fSelector, TProof::kCp | TProof::kCpBin) < 0)
      return -1;

   // Done
   return 0;
}

//______________________________________________________________________________
Long64_t TProofPlayerLite::Process(TDSet *dset, TSelector *selector,
                                   Option_t *option, Long64_t nentries,
                                   Long64_t first)
{
   // Process specified TDSet on PROOF.
   // This method is called on client and on the PROOF master.
   // The return value is -1 in case of an error and TSelector::GetStatus() in
   // in case of success.

   if (!selector) {
      Error("Process", "selector object undefined");
      return -1;
   }

   // Define fSelector in Client
   if (selector != fSelector) {
      if (fCreateSelObj) SafeDelete(fSelector);
      fSelector = selector;
   }

   fCreateSelObj = kFALSE;
   Long64_t rc = Process(dset, selector->ClassName(), option, nentries, first);
   fCreateSelObj = kTRUE;

   // Done
   return rc;
}

//______________________________________________________________________________
Long64_t TProofPlayerLite::Process(TDSet *dset, const char *selector_file,
                                   Option_t *option, Long64_t nentries,
                                   Long64_t first)
{
   // Process specified TDSet on PROOF.
   // This method is called on client and on the PROOF master.
   // The return value is -1 in case of error and TSelector::GetStatus() in
   // in case of success.

   PDB(kGlobal,1) Info("Process","Enter");
   fDSet = dset;
   fExitStatus = kFinished;

   if (!fProgressStatus) {
      Error("Process", "No progress status");
      return -1;
   }
   fProgressStatus->Reset();

   //   delete fOutput;
   if (!fOutput)
      fOutput = new THashList;
   else
      fOutput->Clear();

   TPerfStats::Setup(fInput);
   TPerfStats::Start(fInput, fOutput);

   TStopwatch elapsed;

   TMessage mesg(kPROOF_PROCESS);
   TString fn(gSystem->BaseName(selector_file));

   // Parse option
   Bool_t sync = (fProof->GetQueryMode(option) == TProof::kSync);

   // Make sure that the temporary output list is empty
   if (fOutputLists) {
      fOutputLists->Delete();
      delete fOutputLists;
      fOutputLists = 0;
   }

   if (!sync) {
      gSystem->RedirectOutput(fProof->fLogFileName);
      Printf(" ");
      Info("Process","starting new query");
   }

   if (fCreateSelObj) {
      if (MakeSelector(selector_file) != 0) {
         if (!sync)
            gSystem->RedirectOutput(0);
         return -1;
      }
   }

   fSelectorClass = fSelector->IsA();
   // Add fSelector to inputlist if processing with object
   TList *inputtmp = 0;  // List of temporary input objects
   if (!fCreateSelObj) {
      // In any input list was set into the selector move it to the PROOF
      // input list, because we do not want to stream the selector one
      if (fSelector->GetInputList() && fSelector->GetInputList()->GetSize() > 0) {
         TIter nxi(fSelector->GetInputList());
         TObject *o = 0;
         while ((o = nxi())) {
            if (!fInput->FindObject(o)) {
               fInput->Add(o);
               if (!inputtmp) {
                  inputtmp = new TList;
                  inputtmp->SetOwner(kFALSE);
               }
               inputtmp->Add(o);
            }
         }
      }
      fInput->Add(fSelector);
   }
   // Set the input list for initialization
   fSelector->SetInputList(fInput);
   fSelector->SetOption(option);
   if (fSelector->GetOutputList()) fSelector->GetOutputList()->Clear();

   PDB(kLoop,1) Info("Process","Call Begin(0)");
   fSelector->Begin(0);

   // Send large input data objects, if any
   gProof->SendInputDataFile();

   // Attach to the transient histogram with the assigned packets, if required
   if (fInput->FindObject("PROOF_StatsHist") != 0) {
      if (!(fProcPackets = (TH1 *) fOutput->FindObject("PROOF_ProcPcktHist"))) {
         Warning("Process", "could not attach to histogram 'PROOF_ProcPcktHist'");
      } else {
         PDB(kLoop,1)
            Info("Process", "attached to histogram 'PROOF_ProcPcktHist' to record"
                            " packets being processed");
      }
   }

   PDB(kPacketizer,1) Info("Process","Create Proxy TDSet");
   TDSet *set = new TDSetProxy(dset->GetType(), dset->GetObjName(),
                               dset->GetDirectory());
   if (dset->TestBit(TDSet::kEmpty))
      set->SetBit(TDSet::kEmpty);
   fProof->SetParameter("PROOF_MaxSlavesPerNode", (Long_t) ((TProofLite *)fProof)->fNWorkers);
   if (InitPacketizer(dset, nentries, first, "TPacketizerUnit", "TPacketizerAdaptive") != 0) {
      Error("Process", "cannot init the packetizer");
      fExitStatus = kAborted;
      return -1;
   }
   // reset start, this is now managed by the packetizer
   first = 0;

   // Negative memlogfreq disable checks.
   // If 0 is passed we try to have 100 messages about memory
   // Otherwise we use the frequency passed.
   Int_t mrc = -1;
   Long64_t memlogfreq = -1, mlf;
   if ((mrc = TProof::GetParameter(fProof->GetInputList(), "PROOF_MemLogFreq", mlf)) == 0) memlogfreq = mlf;
   if (mrc != 0 && gSystem->Getenv("PROOF_MEMLOGFREQ")) {
      TString clf(gSystem->Getenv("PROOF_MEMLOGFREQ"));
      if (clf.IsDigit()) { memlogfreq = clf.Atoi(); mrc = 0; }
   }
   if (memlogfreq == 0) {
      memlogfreq = fPacketizer->GetTotalEntries()/(fProof->GetParallel()*100);
      if (memlogfreq <= 0) memlogfreq = 1;
   }
   if (mrc == 0) fProof->SetParameter("PROOF_MemLogFreq", memlogfreq);

   // Add the unique query tag as TNamed object to the input list
   // so that it is available in TSelectors for monitoring
   fProof->SetParameter("PROOF_QueryTag", fProof->GetName());
   //  ... and the sequential number
   fProof->SetParameter("PROOF_QuerySeqNum", fProof->fSeqNum);

   if (!sync)
      gSystem->RedirectOutput(0);

   TCleanup clean(this);
   SetupFeedback();

   TString opt = option;

   // Workers will get the entry ranges from the packetizer
   Long64_t num = (fProof->IsParallel()) ? -1 : nentries;
   Long64_t fst = (fProof->IsParallel()) ? -1 : first;

   // Entry- or Event- list ?
   TEntryList *enl = (!fProof->IsMaster()) ? dynamic_cast<TEntryList *>(set->GetEntryList())
                                           : (TEntryList *)0;
   TEventList *evl = (!fProof->IsMaster() && !enl) ? dynamic_cast<TEventList *>(set->GetEntryList())
                                           : (TEventList *)0;
   // Reset the merging progress information
   fProof->ResetMergePrg();

   // Broadcast main message
   mesg << set << fn << fInput << opt << num << fst << evl << sync << enl;
   Int_t nb = fProof->Broadcast(mesg);
   PDB(kGlobal,1) Info("Process", "Broadcast called: %d workers notified", nb);
   fProof->fNotIdle += nb;

   // Redirect logs from master to special log frame
   fProof->fRedirLog = kTRUE;

   if (!sync) {

      // Asynchronous query: just make sure that asynchronous input
      // is enabled and return the prompt
      PDB(kGlobal,1) Info("Process","Asynchronous processing:"
                                    " activating CollectInputFrom");
      fProof->Activate();

      // Return the query sequential number
      return fProof->fSeqNum;

   } else {

      // Wait for processing
      PDB(kGlobal,1) Info("Process","Synchronous processing: calling Collect");
      fProof->Collect();

      // Restore prompt logging (Collect leaves things as they were
      // at the time it was called)
      fProof->fRedirLog = kFALSE;

      if (!TSelector::IsStandardDraw(fn))
         HandleTimer(0); // force an update of final result
      if (fPacketizer) {
         fPacketizer->StopProcess(kFALSE, kTRUE);
         // The progress timer will now stop itself at the next call
         fPacketizer->SetBit(TVirtualPacketizer::kIsDone);
         // Store process info
         elapsed.Stop();
         if (fQuery)
            fQuery->SetProcessInfo(0, 0., fPacketizer->GetBytesRead(),
                                          fPacketizer->GetInitTime(),
                                          elapsed.RealTime());
      }
      StopFeedback();

      Long64_t rc = -1;
      if (GetExitStatus() != TProofPlayer::kAborted)
         rc = Finalize(kFALSE, sync);

      // Remove temporary input objects, if any
      if (inputtmp) {
         TIter nxi(inputtmp);
         TObject *o = 0;
         while ((o = nxi())) fInput->Remove(o);
         SafeDelete(inputtmp);
      }

       // Done
      return rc;
   }
}

//______________________________________________________________________________
Long64_t TProofPlayerLite::Finalize(Bool_t force, Bool_t sync)
{
   // Finalize a query.
   // Returns -1 in case error, 0 otherwise.

   if (fOutputLists == 0) {
      if (force && fQuery)
         return fProof->Finalize(Form("%s:%s", fQuery->GetTitle(),
                                               fQuery->GetName()), force);
   }

   Long64_t rv = 0;

   TPerfStats::Stop();

   if (!fQuery) {
      Info("Finalize", "query is undefined!");
      return -1;
   }

   // Some objects (e.g. histos in autobin) may not have been merged yet
   // do it now
   MergeOutput();

   if (fExitStatus != kAborted) {

      if (!sync) {
         // Reinit selector (with multi-sessioning we must do this until
         // TSelector::GetSelector() is optimized to i) avoid reloading of an
         // unchanged selector and ii) invalidate existing instances of
         // reloaded selector)
         if (ReinitSelector(fQuery) == -1) {
            Info("Finalize", "problems reinitializing selector \"%s\"",
                  fQuery->GetSelecImp()->GetName());
            return -1;
         }
      }

      // Some input parameters may be needed in Terminate
      fSelector->SetInputList(fInput);

      TList *output = fSelector->GetOutputList();
      if (output) {
         TIter next(fOutput);
         while(TObject* obj = next()) {
            if (fProof->IsParallel() || DrawCanvas(obj) == 1)
               // Either parallel or not a canvas or not able to display it:
               // just add to the list
               output->Add(obj);
         }
      } else {
         Warning("Finalize", "undefined output list in the selector! Protocol error?");
      }

      SetSelectorDataMembersFromOutputList();

      PDB(kLoop,1) Info("Finalize","Call Terminate()");
      fOutput->Clear("nodelete");
      fSelector->Terminate();

      rv = fSelector->GetStatus();

      // copy the output list back and clean the selector's list
      TIter it(output);
      while(TObject* o = it()) {
         fOutput->Add(o);
      }

      // Save the output list in the current query, if any
      if (fQuery) {
         fQuery->SetOutputList(fOutput);
         // Set in finalized state (cannot be done twice)
         fQuery->SetFinalized();
      } else {
         Warning("Finalize","current TQueryResult object is undefined!");
      }

      if (!fCreateSelObj) {
         fInput->Remove(fSelector);
         fOutput->Remove(fSelector);
         if (output) output->Remove(fSelector);
         fSelector = 0;
      }

      // We have transferred copy of the output objects in TQueryResult,
      // so now we can cleanup the selector, making sure that we do not
      // touch the output objects
      if (output) output->SetOwner(kFALSE);
      if (fCreateSelObj) SafeDelete(fSelector);

      // Delete fOutput (not needed anymore, cannot be finalized twice),
      // making sure that the objects saved in TQueryResult are not deleted
      fOutput->SetOwner(kFALSE);
      SafeDelete(fOutput);
   } else {

      // Cleanup
      fOutput->SetOwner();
      SafeDelete(fSelector);
      if (!fCreateSelObj) fSelector = 0;
   }

   PDB(kGlobal,1) Info("Finalize","exit");
   return rv;
}

//______________________________________________________________________________
Bool_t TProofPlayerLite::HandleTimer(TTimer *)
{
   // Send feedback objects to client.

   PDB(kFeedback,2)
      Info("HandleTimer","Entry: %p", fFeedbackTimer);

   if (fFeedbackTimer == 0) return kFALSE; // timer already switched off


   // process local feedback objects

   TList *fb = new TList;
   fb->SetOwner();

   TIter next(fFeedback);
   while( TObjString *name = (TObjString*) next() ) {
      TObject *o = fOutput->FindObject(name->GetName());
      if (o != 0) fb->Add(o->Clone());
   }

   if (fb->GetSize() > 0)
      StoreFeedback(this, fb); // adopts fb
   else
      delete fb;

   if (fFeedbackLists == 0) {
      fFeedbackTimer->Start(fFeedbackPeriod, kTRUE);   // maybe next time
      return kFALSE;
   }

   fb = MergeFeedback();

   Feedback(fb);
   fb->SetOwner();
   delete fb;

   fFeedbackTimer->Start(fFeedbackPeriod, kTRUE);

   return kFALSE; // ignored?
}

//______________________________________________________________________________
void TProofPlayerLite::SetupFeedback()
{
   // Setup reporting of feedback objects.

   fFeedback = (TList*) fInput->FindObject("FeedbackList");

   if (fFeedback) {
      PDB(kFeedback,1)
         Info("SetupFeedback","\"FeedbackList\" found: %d objects", fFeedback->GetSize());
   } else {
      PDB(kFeedback,1)
         Info("SetupFeedback","\"FeedbackList\" NOT found");
   }

   if (fFeedback == 0 || fFeedback->GetSize() == 0) return;

   // OK, feedback was requested, setup the timer
   SafeDelete(fFeedbackTimer);
   fFeedbackPeriod = 2000;
   TProof::GetParameter(fInput, "PROOF_FeedbackPeriod", fFeedbackPeriod);
   fFeedbackTimer = new TTimer;
   fFeedbackTimer->SetObject(this);
   fFeedbackTimer->Start(fFeedbackPeriod, kTRUE);
}

//______________________________________________________________________________
void TProofPlayerLite::StoreFeedback(TObject *slave, TList *out)
{
   // Store feedback results from the specified slave.

   PDB(kFeedback,1)
      Info("StoreFeedback","Enter (%p,%p,%d)", fFeedbackLists, out, (out ? out->GetSize() : -1));

   if ( out == 0 ) {
      PDB(kFeedback,1)
         Info("StoreFeedback","Leave (empty)");
      return;
   }

   if (fFeedbackLists == 0) {
      PDB(kFeedback,2) Info("StoreFeedback","Create fFeedbackLists");
      fFeedbackLists = new TList;
      fFeedbackLists->SetOwner();
   }

   TIter next(out);
   out->SetOwner(kFALSE);  // take ownership of the contents

   TObject *obj;
   while( (obj = next()) ) {
      PDB(kFeedback,2)
         Info("StoreFeedback","Find '%s'", obj->GetName() );

      TMap *map = (TMap*) fFeedbackLists->FindObject(obj->GetName());
      if ( map == 0 ) {
         PDB(kFeedback,2)
            Info("StoreFeedback", "map for '%s' not found (creating)", obj->GetName());
         // map must not be owner (ownership is with regards to the keys (only))
         map = new TMap;
         map->SetName(obj->GetName());
         fFeedbackLists->Add(map);
      } else {
         PDB(kFeedback,2)
            Info("StoreFeedback","removing previous value");
         if (map->GetValue(slave))
            delete map->GetValue(slave);
         map->Remove(slave);
      }
      map->Add(slave, obj);
   }

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