ROOT logo
//*-- Author : Jochen Markert
//_HADES_CLASS_DESCRIPTION 
///////////////////////////////////////////////////////////////////////////////
// HldGrepFileSource
//
//  This "data source" reads the HLD data from files on disk.
//  The user provides a directory name and the source will grep
//  the newest files from the disk. If after a given check interval
//  a new file is found, the current one will be closed and the reading
//  continues with the new one. The source will run in an endless loop
//  and wait for new files. The user has to stop the source by calling
//  source->stop().
//-----------------------------------------------------------------------------
//  There are several options to setup the source:
//
//  HldGrepFileSource(TString dir,TString opt,Int_t grepInterval,Int_t refId,Int_t off, Int_t fileoffset)
//
//  dir          : directory where the hld files are located
//  opt          : select between the 2 possible modes of the source
//                 1. "Grep" (default) : search for the newest files in intervals
//                    of grepInterval seconds
//                 2. "Date: 02/05/2005 22:00:00" select all files newer than date
//                    and read them sequentional
//                 3. "File: myname.hld" select all files newer than this file and
//                    read them sequentional
//  grepInterval : time interval for checking for new files
//  refId        : -1 (default) reference run for init procedure
//  off          : 5 s (default) selected files have to be older than off seconds
//  fileoffset   :  distance to last file : last - distanceToLast (0 - n , default 1)
//
///////////////////////////////////////////////////////////////////////////////

#include "hldgrepfilesource.h"
#include "hrecevent.h"
#include "hldfilevt.h"
#include "hades.h"
#include "hruntimedb.h"
#include "TSystem.h"

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>


#include <limits.h>
#include <unistd.h>
#include <sstream>

ClassImp(HldGrepFileSource)

time_t HldGrepFileSource::lastfile     =0;     //! last modification time of last used file
time_t HldGrepFileSource::timelimit    =0;     //! time stamp for the search of new files (files should be newer)
time_t HldGrepFileSource::tcurrent     =0;     //! current time stamp
Int_t  HldGrepFileSource::timeoffset   =0;     //! time offset to current time
TString HldGrepFileSource::fullname    ="";    //! full filename: path/file
TString HldGrepFileSource::fullnamesort="";    //! full filename for sorting: path/modtime_file
TString HldGrepFileSource::path        ="";    //! path to directory used for grep of new hld files

HldGrepFileSource::HldGrepFileSource(TString dir,TString opt,Int_t grepInterval,Int_t refId,Int_t off,Int_t fileoffset)
	: HldFileSourceBase()
{
    //  This "data source" reads the HLD data from files on disk.
    //  The user provides a directory name and the source will grep
    //  the newest files from the disk. If after a given check interval
    //  a new file is found, the current one will be closed and the reading
    //  continues with the new one. The source will run in an endless loop
    //  and wait for new files. The user has to exit the program by himself.
    //
    //  dir          : directory where the hld files are located
    //  opt          : select between the 2 possible modes of the source
    //                 1. "Grep" (default) : search for the newest files in intervals
    //                    of grepInterval seconds
    //                 2. "Date: 02/05/2005 22:00:00" select all files newer than date
    //                    and read them sequentional
    //                 3. "File: myname.hld" select all files newer than this file and
    //                    read them sequential
    //  grepInterval : time interval for checking for new files
    //  refId        : -1 (default) reference run for init procedure
    //  fileoffset   :  distance to last file : last - distanceToLast (0 - n , default 1)
    timeoffset=off;
    referenceId=refId;
    fCurrentFile=0;
    first=0;
    dostop=kFALSE;
    distanceToLast=fileoffset;
    if(distanceToLast < 0) distanceToLast = 0;
    //----------------------------------------
    // check input parameters
    if(grepInterval>0){

	interval=grepInterval;
    }
    else
    {
	Error("HldGrepFileSource()","time interval for directory is <=0 !");
        exit(1);
    }
    checkDir(dir);

    decodeOption(opt);
    //----------------------------------------

    // Default constructor for a Lmd file data source.
    fReadEvent=new HldFilEvt;
    iter=0;
    fCurrentFile=0;
    fEventNr = 0;
    fEventLimit = INT_MAX;

    //----------------------------------------
    // looking for first file on the disk
    // can be endless loop! Not very nice
    // in this place...but lets hope the best.
    loopForNewFile();
    //----------------------------------------
}


HldGrepFileSource::~HldGrepFileSource(void)
{
    // Destructor for a LMD file data source
    if (fReadEvent)
    {
	delete fReadEvent;
	fReadEvent = 0;
    }
    if (iter)
    {
	delete iter;
	iter = NULL;
    }
}

Int_t HldGrepFileSource::getRunId(const Text_t *fileName)
{
    // Get the run Id from the file filename
    // In case of failure returns -1
    TString locname=fileName;
    HldFilEvt evt;
    Int_t r=-1;
    if (fCurrentFile && locname.CompareTo(fCurrentFile->GetName())==0) {
	r=fCurrentFile->getRunId();
    } else {
	if (!evt.setFile(fileName)){r=-1;}
	else {
	    evt.read();
	    r=evt.getRunNr();
	}
    }

    return r;
}


EDsState HldGrepFileSource::getNextEvent(Bool_t doUnpack)
{
    // Tries to read a new event from the LMD file and put
    // the info into the HEvent structure.
    // The set directory is checked in interval seconds
    // for new files. If a new file is available
    // it is opened for reading. If the last event of
    // the current file is reached an endless loop
    // for new files on the disk is performed. The
    // loop ends only in case of success!


    //---------------------------------------------
    // check if reading should be stopped
    if(dostop)
    {
        fLastEventStatus = kDsEndData;
	return kDsEndData;
    }
    //---------------------------------------------

    fEventNr++;

    //---------------------------------------------
    // check if the end of file is reached
    // If so, look for new file on disk
    if ( !((HldFilEvt*)fReadEvent)->execute() )
    {
	//End of current file
	fEventNr = 0;
	loopForNewFile();
    }
    //---------------------------------------------

    //---------------------------------------------
    // if the set time interval has ellapsed, check
    // if a new file is on the disk. This is only
    // in "Grep" mode active.
    if(mode==1)
    {
	timer.Stop();
	if(timer.RealTime()>interval)
	{
	    getNewFile();
	}
	else timer.Continue();
    }
    //---------------------------------------------

    //---------------------------------------------
    // finally do the unpacking of the new event
    if(doUnpack)
    {
	decodeHeader((*fEventAddr)->getHeader());

	iter->Reset();
	HldUnpack *unpacker;
	while ( (unpacker=(HldUnpack *)iter->Next())!=NULL)
	{
	    Int_t ret=unpacker->execute();
	    if(!ret) {
		fLastEventStatus = kDsError;
		return kDsError;
	    }
	    if(ret==kDsSkip) {
		fLastEventStatus = kDsSkip;
		return kDsSkip;
	    }
	}
    }
    //---------------------------------------------
    fLastEventStatus = kDsOk;
    return kDsOk;
}
 
Int_t HldGrepFileSource::loopForNewFile()
{
    // check if a new file is on the disk.
    // performs endless loop until succes!
    // A sleep of the set time interval in seconds
    // is performed before next try.

    Int_t found=0;
    while(found==0)
    {
        // found=0 if no success otherwise =1
	found=getNewFile();
	if(found==0)
	{   // in case of no succes sleep
            // a moment before next try
	    sleep(interval);
	}
    }
    return 0;
}


Int_t HldGrepFileSource::checkDir(TString dir)
{
    // Checks the directory dir. In case of empty
    // strings (default) or not existing directory
    // this function exit the program. No chance
    // to go on for lazy users ...Strategy of breaking
    // as soon as possible. If the directory name does
    // not end with "/" the slash is added

    if(dir.CompareTo("")==0)
    {
	Error("HldGrepFileSource()","String for hld directory is empty!");
	exit(1);
    }
    else
    {
	if(gSystem->AccessPathName(dir))
	{
	    Error("HldGrepFileSource()","Directory : %s does not exist!",dir.Data());
	    exit(1);
	}
        if(!dir.EndsWith("/")) dir+="/";
	path=dir;
    }
    return 0;
}
Int_t HldGrepFileSource::decodeOption(TString opt)
{
    // Decodes the option string. In case of not known
    // option or wrong format this function exit the program.
    // No chance to go on for lazy users ...Strategy of breaking
    // as soon as possible. Depending on the decoded option
    // the mode (=1 for "Grep", =2 for sequential reading) switch
    // is set.
    //  opt  : select between the 2 possible modes of the source
    //         1. "Grep" (default) : search for the newest files in intervals
    //            of grepInterval seconds
    //         2. "Date: 02/05/2005 22:00:00" select all files newer than date
    //             and read them sequentional
    //         3. "File: myname.hld" select all files newer than this file and
    //            read them sequential

    mode=0;
    if(opt.Contains("Date:"))
    {   // Start of the file list which should be read
	// is selected by a give date/time. If the format
        // of the string is wrong the program exits.
	mode=2;

        TString option=opt;
	option.ReplaceAll("Date:","");
	//-----------handling date/time selection-----------------
	option.ReplaceAll("/"," ");
	option.ReplaceAll(":"," ");

	Int_t var[6]={-1};
	Int_t nVar=0;

	stringstream input;
	input.str("");
        input<<option.Data();

	while(input.good()&&nVar<10)
	{
	    if(nVar<6&&input>>var[nVar])
	    {
		nVar++;
	    }
	    else
	    {
		break;
	    }
	}

	if(nVar!=6)
	{
	    Error("HldGrepFileSource()","wrong number of arguments found ! \n "
		  "nVar=%i  => dd/mm/yyyy hh:mm:ss :: %02i/%02i/%i %02i:%02i:%02i  ! \n "
		  "input: %s ", nVar,var[0],var[1],var[2],var[3],var[4],var[5],opt.Data());
	    exit(1);
	}
	else {
	    struct tm time_limit;

	    time_limit.tm_mday=var[0];
	    time_limit.tm_mon =var[1]-1;
	    time_limit.tm_year=var[2]-1900;
	    time_limit.tm_hour=var[3];
	    time_limit.tm_min =var[4];
	    time_limit.tm_sec =var[5];

	    timelimit=mktime(&time_limit);
	    lastfile=timelimit;

	    cout<<"HldGrepFileSource(): You selected to start by DATE :"<<ctime(&timelimit)<<endl;
	}
	//--------------------------------------------------------

    }
    else if(opt.Contains("File:"))
    {
	// Start of the file list which should be read
	// is selected by a file name and therefore
	// by the last modification time of the selected
	// file. If the file does not exit the program exits.
	mode=2;
	opt.ReplaceAll("File:","");
	opt.ReplaceAll(" ","");

	if(gSystem->AccessPathName(Form("%s%s",path.Data(),opt.Data())))
	{
	    Error("HldGrepFileSource()","File does not exist!");
	    exit(1);
	}

	//-----------handling file selection----------------------
	struct stat statloc;
	stat(Form("%s%s",path.Data(),opt.Data()),&statloc);
	timelimit=statloc.st_mtime;
	lastfile=timelimit;

	cout<<"HldGrepFileSource(): You selected to start by DATE from File :"<<ctime(&timelimit)<<endl;
	//--------------------------------------------------------

    }
    else if(opt.Contains("Grep"))
    {
	mode=1;
    }
    else
    {
	Error("HldGrepFileSource()","Unknown option:%s!",opt.Data());
	exit(1);
    }
    return 0;
}
Int_t HldGrepFileSource::selectFiles(const struct dirent *entry)
{
    // This is the select function called with scandir(.....)
    // Selects files going to the list of files for sorting/selection.
    // Returns 1 if a file is selected otherwise 0.
    // Only hld files and files newer or equal than the time stamp
    // lastfile are taken into account. Files smaller 500k are
    // ignored.

    if(entry->d_type==DT_REG ||
       entry->d_type==DT_UNKNOWN)
    {   // only regular files are of interest.
        // Some systems return ONLY unknow!
	TString a=entry->d_name;
	if(!a.EndsWith(".hld")) return 0;

	// only files newer than last read files
        // should go to list. Improves sorting speed!
	struct stat statloc;
	fullname=Form("%s%s",path.Data(),entry->d_name);
	stat(fullname.Data(),&statloc);

	Double_t diff=difftime(tcurrent,statloc.st_mtime);

	if(diff<0)
	{
	    cout<<"HldGrepFileSource::selectFiles(): time difference t_current - t_lastmod < 0 ==> mod time in future!"<<endl;
            return 0;
	}

	if(statloc.st_mtime<lastfile
	   ||statloc.st_size<1024*500
	   ||diff<timeoffset
	  ) return 0;

	return 1;
    }
    else return 0;
}


Int_t HldGrepFileSource::getNewFile()
{
    // Loops on the set directory for new hld files.
    // the dir is scanned with scandir(). The selected
    // files newer or equal time stamp lastfile goes
    // to the list of candidates. The list will be sorted
    // by last modification of the files.
    // In "Grep" mode (mode=1) the second newest file
    // is opened (preventing from reading a file which is
    // in writing process). The time stamp lastfile is set
    // to the selected files last modification time.
    // In "File/Date" mode (mode=2) the list is sequential
    // read.

    struct dirent **namelist;
    Int_t n;
    struct stat status;

    fullname    ="";
    fullnamesort="";
    
    Int_t newFile=0;

    //----------------------------------------
    // get the current time
    time(&tcurrent);
    //----------------------------------------
    n = scandir(path.Data(), &namelist,selectFiles,alphasort);
    if (n < 0)
    {
	perror("scandir");
    }
    else
    {
	TList mylist;

 	//----------------------------------------
	// loop over the file list provided by
	// scandir() Strings with the format path/modtime_filename
	// are added to TList of files for later sorting
        // by last modification time
	while(n--)
	{
	    fullname=Form("%s%s",path.Data(),namelist[n]->d_name);
	    stat(fullname.Data(),&status);

	    fullnamesort=Form("%s%li_%s",path.Data(),(Long_t)status.st_mtime,namelist[n]->d_name);
	    mylist.AddLast(new TObjString(fullnamesort));

	    free(namelist[n]);
	}
	free(namelist);
	//----------------------------------------

	//----------------------------------------
	// The list will be sort by name of the files
	// As the file name contains the last modificaton time
	// they will be sorted by mod time. The newest file
	// will be the last in the list.
	mylist.Sort();
	//----------------------------------------

	//----------------------------------------
	// in mode=1 take the second newest file
	// to sure that the file is closed!
        // otherwise the first file in list
	Int_t index;
	Int_t lastindex=mylist.LastIndex();
	if(mode==1)                   {index=lastindex-distanceToLast;} // grep mode
	else if(mode==2&&lastindex>0) {index=1;}           // reading since a give date/time or file
        else                          {index=-1;}          // default
	//----------------------------------------

	if(index>0)
	{
	    cout<<"\n----------------------------------------------------------------"<<endl;
	    TString myselect=((TObjString*)(mylist.At(index)))->GetString();

	    //----------------------------------------
	    // removing mod time from name
	    TString temp  =myselect;
	    TString base  =gSystem->BaseName(temp.Data());
	    TString parent=temp.Remove(temp.Length()-base.Length());
  	    Ssiz_t last_  = base.First('_');
	    base.Replace(0,last_+1,"");
            myselect      =parent + base;
	    //----------------------------------------

	    //----------------------------------------
	    // getting mod time of file and current time
	    // for print out
	    stat(myselect.Data(),&status);
	    time_t tfile=status.st_mtime;
	    TString a=ctime(&tfile);
	    TString b=ctime(&tcurrent);
	    a.ReplaceAll("\n","");
	    b.ReplaceAll("\n","");
	    //----------------------------------------

	    //----------------------------------------
            // print infos about selected file
	    if(mode==2)
	    {
		cout<<mylist.LastIndex()<<" files in list."<<endl;
	    }
            Int_t diff=(Int_t)difftime(tcurrent,tfile);
	    cout<<myselect.Data()<<" last mod time : "<<diff<<" seconds ago." <<endl;
	    cout<<"mod time: "<<a.Data()<<" now: "<<b.Data()<<endl;
 	    //----------------------------------------


	    //----------------------------------------
	    // set the time stamp to the selected files
	    //last modification time
	    lastfile=tfile;
	    first   =1;  // now we know it is not anlylonger the first try to select a file
            newFile =1;  // file selection was succesful
	    //----------------------------------------


	    //----------------------------------------
	    // delete old filew descriptot, generate a new one
            // and open the new file for reading
	    if(fCurrentFile) delete fCurrentFile;
            fCurrentFile=0;
	    Int_t run=getRunId(myselect.Data());
	    fCurrentFile=new HldFileDesc(myselect.Data(),run,referenceId);
	    ((HldFilEvt *)fReadEvent)->setFile(fCurrentFile->GetName());
	    //----------------------------------------

	    cout<<"----------------------------------------------------------------"<<endl;
	}
	else
	{
	    if(first==0)
	    {   // if this is before the first valid file
		// was found. Otherwise it should be quiet!
		cout<<"----------------------------------------------------------------"<<endl;
		cout<<"No new File on Disk! trying again...."<<endl;
		cout<<"----------------------------------------------------------------"<<endl;
	    }
	    else
	    {   // Short_t notification that a scan of the
		// directory has been done with no result!
		cout <<"."<<flush;
	    }
	}

	//----------------------------------------
	// clean the working list from memory
	mylist.Delete();
 	//----------------------------------------

    }
    // time interval is taken after selection to keep
    // the interval independent of the number of files
    // in dir start resets the timer!
    timer.Start(kTRUE); 
    return newFile;
}





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