ROOT logo
// @(#)root/base:$Id$
// Author: Rene Brun   02/09/2000

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


//______________________________________________________________________________
//
// A TFolder object is a collection of objects and folders.
// Folders have a name and a title and are identified in the folder hierarchy
// by a "Unix-like" naming mechanism. The root of all folders is //root.
// New folders can be dynamically added or removed to/from a folder.
// The folder hierarchy can be visualized via the TBrowser.
//
// The Root folders hierarchy can be seen as a whiteboard where objects
// are posted. Other classes/tasks can access these objects by specifying
// only a string pathname. This whiteboard facility greatly improves the
// modularity of an application, minimizing the class relationship problem
// that penalizes large applications.
//
// Pointers are efficient to communicate between classes.
// However, one has interest to minimize direct coupling between classes
// in the form of direct pointers. One better uses the naming and search
// service provided by the Root folders hierarchy. This makes the classes
// loosely coupled and also greatly facilitates I/O operations.
// In a client/server environment, this mechanism facilitates the access
// to any kind of object in //root stores running on different processes.
//
// A TFolder is created by invoking the TFolder constructor. It is placed
// inside an existing folder via the TFolder::AddFolder method.
// One can search for a folder or an object in a folder using the FindObject
// method. FindObject analyzes the string passed as its argument and searches
// in the hierarchy until it finds an object or folder matching the name.
//
// When a folder is deleted, its reference from the parent folder and
// possible other folders is deleted.
//
// If a folder has been declared the owner of its objects/folders via
// TFolder::SetOwner, then the contained objects are deleted when the
// folder is deleted. By default, a folder does not own its contained objects.
// NOTE that folder ownership can be set
//   - via TFolder::SetOwner
//   - or via TCollection::SetOwner on the collection specified to TFolder::AddFolder
//
// Standard Root objects are automatically added to the folder hierarchy.
// For example, the following folders exist:
//   //root/Files      with the list of currently connected Root files
//   //root/Classes    with the list of active classes
//   //root/Geometries with active geometries
//   //root/Canvases   with the list of active canvases
//   //root/Styles     with the list of graphics styles
//   //root/Colors     with the list of active colors
//
// For example, if a file "myFile.root" is added to the list of files, one can
// retrieve a pointer to the corresponding TFile object with a statement like:
//   TFile *myFile = (TFile*)gROOT->FindObject("//root/Files/myFile.root");
// The above statement can be abbreviated to:
//   TFile *myFile = (TFile*)gROOT->FindObject("/Files/myFile.root");
// or even to:
//   TFile *myFile = (TFile*)gROOT->FindObjectAny("myFile.root");
// In this last case, the TROOT::FindObjectAny function will scan the folder hierarchy
// starting at //root and will return the first object named "myFile.root".
//
// Because a string-based search mechanism is expensive, it is recommended
// to save the pointer to the object as a class member or local variable
// if this pointer is used frequently or inside loops.
//
//Begin_Html
/*
<img src="gif/folder.gif">
*/
//End_Html

#include "Riostream.h"
#include "Strlen.h"
#include "TFolder.h"
#include "TBrowser.h"
#include "TROOT.h"
#include "TClass.h"
#include "TError.h"
#include "TRegexp.h"

static const char *gFolderD[64];
static Int_t gFolderLevel = -1;
static char  gFolderPath[512];

enum { kOwnFolderList = BIT(15) };

ClassImp(TFolder)

//______________________________________________________________________________
TFolder::TFolder() : TNamed()
{
   // Default constructor used by the Input functions.
   //
   // This constructor should not be called by a user directly.
   // The normal way to create a folder is by calling TFolder::AddFolder.

   fFolders = 0;
   fIsOwner = kFALSE;
}

//______________________________________________________________________________
TFolder::TFolder(const char *name, const char *title) : TNamed(name,title)
{
   // Create a normal folder.
   // Use Add or AddFolder to add objects or folders to this folder.

   fFolders = new TList();
   SetBit(kOwnFolderList);
   fIsOwner = kFALSE;
}

//______________________________________________________________________________
TFolder::TFolder(const TFolder &folder) : TNamed(folder),fFolders(0),fIsOwner(kFALSE)
{
   // Copy constructor.

   ((TFolder&)folder).Copy(*this);
}

//______________________________________________________________________________
TFolder::~TFolder()
{
   // Folder destructor. Remove all objects from its lists and delete
   // all its sub folders.

   TCollection::StartGarbageCollection();
   
   if (fFolders) {
      if (fFolders->IsOwner()) {
         fFolders->Delete();
      }
      if (TestBit(kOwnFolderList)) {
         TObjLink *iter = ((TList*)fFolders)->FirstLink();
         while (iter) {
            TObject *obj = iter->GetObject();
            TObjLink *next = iter->Next();
            if (obj && obj->IsA() == TFolder::Class()) {
               ((TList*)fFolders)->Remove(iter);
               delete obj;
            }
            iter = next;
         }
         fFolders->Clear("nodelete");
         SafeDelete(fFolders);
      }
   }

   TCollection::EmptyGarbageCollection();
   
   if (gDebug)
      cerr << "TFolder dtor called for "<< GetName() << endl;
}

//______________________________________________________________________________
void TFolder::Add(TObject *obj)
{
   // Add object to this folder. obj must be a TObject or a TFolder.

   if (obj == 0 || fFolders == 0) return;
   obj->SetBit(kMustCleanup);
   fFolders->Add(obj);
}

//______________________________________________________________________________
TFolder *TFolder::AddFolder(const char *name, const char *title, TCollection *collection)
{
   // Create a new folder and add it to the list of folders of this folder,
   // return a pointer to the created folder.
   // Note that a folder can be added to several folders.
   //
   // If collection is non NULL, the pointer fFolders is set to the existing
   // collection, otherwise a default collection (Tlist) is created.
   // Note that the folder name cannot contain slashes.

   if (strchr(name,'/')) {
      ::Error("TFolder::TFolder","folder name cannot contain a slash: %s", name);
      return 0;
   }
   if (strlen(GetName()) == 0) {
      ::Error("TFolder::TFolder","folder name cannot be \"\"");
      return 0;
   }
   TFolder *folder = new TFolder();
   folder->SetName(name);
   folder->SetTitle(title);
   if (!fFolders) {
      fFolders = new TList(); //only true when gROOT creates its 1st folder
      SetBit(kOwnFolderList);
   }
   fFolders->Add(folder);

   if (collection) {
      folder->fFolders = collection;
   } else {
      folder->fFolders = new TList();
      folder->SetBit(kOwnFolderList);
   }
   return folder;
}

//______________________________________________________________________________
void TFolder::Browse(TBrowser *b)
{
   // Browse this folder.

   if (fFolders) fFolders->Browse(b);
}

//______________________________________________________________________________
void TFolder::Clear(Option_t *option)
{
   // Delete all objects from a folder list.

   if (fFolders) fFolders->Clear(option);
}

//______________________________________________________________________________
const char *TFolder::FindFullPathName(const char *name) const
{
   // Return the full pathname corresponding to subpath name if the node is 
   // gROOT->GetRootFolder() and return a relative path otherwise.
   // The returned path will be re-used by the next call to FindFullPathName().

   TObject *obj = FindObject(name);
   if (obj || !fFolders) {
      gFolderLevel++;
      gFolderD[gFolderLevel] = GetName();
      if (strcmp(gFolderD[0],"root")==0) {
         strlcpy(gFolderPath,"//root/", sizeof(gFolderPath));
      } else {
         gFolderPath[0] = '\0';
      }
      for (Int_t l = 1; l<=gFolderLevel;l++) {
         strlcat(gFolderPath, gFolderD[l], sizeof(gFolderPath));
         strlcat(gFolderPath, "/", sizeof(gFolderPath));
      }
      strlcat(gFolderPath,name, sizeof(gFolderPath));
      gFolderLevel = -1;
      return gFolderPath;
   }
   if (name[0] == '/') return 0;
   TIter next(fFolders);
   TFolder *folder;
   const char *found;
   gFolderLevel++;
   gFolderD[gFolderLevel] = GetName();
   while ((obj=next())) {
      // For a TClass object, InheritsFrom does not check the inheritance of
      // the object but the inheritance of the class described by the object,
      // so we need to explicitly call IsA
      if (obj->IsA()->InheritsFrom(TClass::Class())) continue;
      // For any other object IsA is called by InheritsFrom
      if (!obj->InheritsFrom(TFolder::Class())) continue;
      folder = (TFolder*)obj;
      found = folder->FindFullPathName(name);
      if (found) return found;
   }
   gFolderLevel--;
   return 0;
}


//______________________________________________________________________________
const char *TFolder::FindFullPathName(const TObject *) const
{
   // Return the full pathname corresponding to subpath name.
   // The returned path will be re-used by the next call to FindFullPathName().

   Error("FindFullPathname","Not yet implemented");
   return 0;
}

//______________________________________________________________________________
TObject *TFolder::FindObject(const TObject *) const
{
   // Find object in an folder.

   Error("FindObject","Not yet implemented");
   return 0;
}

//______________________________________________________________________________
TObject *TFolder::FindObject(const char *name) const
{
   // Search object identified by name in the tree of folders inside
   // this folder.
   // Name may be of the forms:
   //   A, Specify a full pathname starting at the top ROOT folder
   //     //root/xxx/yyy/name
   //
   //   B, Specify a pathname starting with a single slash. //root is assumed
   //     /xxx/yyy/name
   //
   //   C, Specify a pathname relative to this folder
   //     xxx/yyy/name
   //     name

   if (!fFolders) return 0;
   if (name == 0) return 0;
   if (name[0] == '/') {
      if (name[1] == '/') {
         if (!strstr(name,"//root/")) return 0;
         return gROOT->GetRootFolder()->FindObject(name+7);
      } else {
         return gROOT->GetRootFolder()->FindObject(name+1);
      }
   }
   Int_t nch = strlen(name);
   char *cname;
   char csname[128];
   if (nch < (int)sizeof(csname))
      cname = csname;
   else
      cname = new char[nch+1];
   strcpy(cname, name);
   TObject *obj;
   char *slash = strchr(cname,'/');
   if (slash) {
      *slash = 0;
      obj = fFolders->FindObject(cname);
      if (!obj) {
         if (nch >= (int)sizeof(csname)) delete [] cname;
         return 0;
      }
      TObject *ret = obj->FindObject(slash+1);
      if (nch >= (int)sizeof(csname)) delete [] cname;
      return ret;
   } else {
      TObject *ret = fFolders->FindObject(cname);
      if (nch >= (int)sizeof(csname)) delete [] cname;
      return ret;
   }
}

//______________________________________________________________________________
TObject *TFolder::FindObjectAny(const char *name) const
{
   // Return a pointer to the first object with name starting at this folder.

   TObject *obj = FindObject(name);
   if (obj || !fFolders) return obj;

   //if (!obj->InheritsFrom(TFolder::Class())) continue;
   if (name[0] == '/') return 0;
   TIter next(fFolders);
   TFolder *folder;
   TObject *found;
   if (gFolderLevel >= 0) gFolderD[gFolderLevel] = GetName();
   while ((obj=next())) {
      if (!obj->InheritsFrom(TFolder::Class())) continue;
      if (obj->IsA() == TClass::Class()) continue;
      folder = (TFolder*)obj;
      found = folder->FindObjectAny(name);
      if (found) return found;
   }
   return 0;
}

//______________________________________________________________________________
Bool_t TFolder::IsOwner()  const
{
   // Folder ownership has been set via
   //   - TFolder::SetOwner
   //   - TCollection::SetOwner on the collection specified to TFolder::AddFolder

   if (!fFolders) return kFALSE;
   return fFolders->IsOwner();
}

//______________________________________________________________________________
void TFolder::ls(Option_t *option) const
{
   // List folder contents
   //   If option contains "dump",  the Dump function of contained objects is called.
   //   If option contains "print", the Print function of contained objects is called.
   //   By default the ls function of contained objects is called.
   // Indentation is used to identify the folder tree.
   //
   // The if option contains a <regexp> it be used to match the name of the objects.

   if (!fFolders) return;
   TROOT::IndentLevel();
   cout <<ClassName()<<"*\t\t"<<GetName()<<"\t"<<GetTitle()<<endl;
   TROOT::IncreaseDirLevel();

   TString opt = option;
   Ssiz_t dump = opt.Index("dump", 0, TString::kIgnoreCase);
   if (dump != kNPOS)
      opt.Remove(dump, 4);
   Ssiz_t print = opt.Index("print", 0, TString::kIgnoreCase);
   if (print != kNPOS)
      opt.Remove(print, 5);
   opt = opt.Strip(TString::kBoth);
   if (opt == "")
      opt = "*";
   TRegexp re(opt, kTRUE);

   TObject *obj;
   TIter nextobj(fFolders);
   while ((obj = (TObject *) nextobj())) {
      TString s = obj->GetName();
      if (s.Index(re) == kNPOS) continue;
      if (dump != kNPOS)
         obj->Dump();
      if (print != kNPOS)
         obj->Print(option);
      obj->ls(option);
   }
   TROOT::DecreaseDirLevel();
}

//______________________________________________________________________________
Int_t TFolder::Occurence(const TObject *object) const
{
   // Return occurence number of object in the list of objects of this folder.
   // The function returns the number of objects with the same name as object
   // found in the list of objects in this folder before object itself.
   // If only one object is found, return 0.

   Int_t n = 0;
   if (!fFolders) return 0;
   TIter next(fFolders);
   TObject *obj;
   while ((obj=next())) {
      if (strcmp(obj->GetName(),object->GetName()) == 0) n++;
   }
   if (n <=1) return n-1;
   n = 0;
   next.Reset();
   while ((obj=next())) {
      if (strcmp(obj->GetName(),object->GetName()) == 0) n++;
      if (obj == object) return n;
   }
   return 0;
}

//______________________________________________________________________________
void TFolder::RecursiveRemove(TObject *obj)
{
   // Recursively remove object from a folder.

   if (fFolders) fFolders->RecursiveRemove(obj);
}

//______________________________________________________________________________
void TFolder::Remove(TObject *obj)
{
   // Remove object from this folder. obj must be a TObject or a TFolder.

   if (obj == 0 || fFolders == 0) return;
   fFolders->Remove(obj);
}

//______________________________________________________________________________
void TFolder::SaveAs(const char *filename, Option_t *option) const
{
   // Save all objects in this folder in filename.
   // Each object in this folder will have a key in the file where the name of
   // the key will be the name of the object.

   if (gDirectory) gDirectory->SaveObjectAs(this,filename,option);
}

//______________________________________________________________________________
void TFolder::SetOwner(Bool_t owner)
{
   // Set ownership.
   // If the folder is declared owner, when the folder is deleted, all
   // the objects added via TFolder::Add are deleted via TObject::Delete,
   // otherwise TObject::Clear is called.
   //
   // NOTE that folder ownership can be set:
   //   - via TFolder::SetOwner
   //   - or via TCollection::SetOwner on the collection specified to TFolder::AddFolder

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