ROOT logo
#include "hsuexemacro.h"
#include "hcategory.h"
#include "iostream"
#include "TMath.h"

#include <getopt.h>

// -----------------------------------------------------------------------------
// $Id: hsuexemacro.cc,v 1.8 2008-05-16 16:25:12 halo Exp $
// -----------------------------------------------------------------------------

// -----------------------------------------------------------------------------
// *-- Author : Marcin Jaskula
// *-- Modified : Jacek Otwinowski 06/02/2006
// -----------------------------------------------------------------------------

using namespace std; 

HSUBranchElement::HSUBranchElement(const Char_t* pBranchName, EBranchType eType)
{
    if((eType < 0) || (eType >= kMax))
    {
        Error("HSUBranchElement", "Unknown type %d\n", eType);
        gSystem->Exit(-1);
    }

    m_pArray  = NULL;
    m_pBranch = NULL;

    m_eType = eType;
    m_pName = new TString(pBranchName);
}

// -----------------------------------------------------------------------------

HSUBranchElement::~HSUBranchElement(void)
{
    SAFE_DELETE_ROOT(m_pArray);
    SAFE_DELETE(m_pName);
}

// -----------------------------------------------------------------------------

const Char_t* HSUBranchElement::getBranchNameSufix(void)
{
static const Char_t* asHSUBranchElementBranchesSufix[HSUBranchElement::kMax]
        = {".fData","."};

    return asHSUBranchElementBranchesSufix[m_eType];
}

//______________________________________________________________________________
// A class to make live easier with chains and branches in an executive macro.
// It is dedicated for making complicate correlation between branches.
//
// It supports:
// - TChain with files consists of HADES 'T' Tree
// - automatic access to branches' data by HCategory or TClonesArray
// - easy access to program arguments
// - easy access to parameters in a parameter files
//
// A simple program which shows possibility may looks like:
//
// Int_t main(Int_t iArg, Char_t* vArg[])
// {
// HSUExeMacro eEM;
//
//     eEM.loadArgs(iArg, vArg);
//     eEM.openInput();
//     eEM.openParamFile();
//     eEM.openOutput();
//
// HCategory *pMdcCategory;
// TCutG     *pCut = NULL;
// HMdcSeg   *pSeg;
//
//     if(eEM.getOptBool())
//         pCut = (TCutG *)eEM.getParamObject("some_cut");
//
//     pMdcCategory = eEM.getHCategory("HMdcSeg");
//
//     while(eEM.nextEvent() >= 0)
//     {
//         for(i = 0; i < pMdcCategory->getEntries(); i++)
//         {
//             if((pSeg = (HMdcSeg * )pMdcCategory->getObject(i)) == NULL)
//                 continue;
//
//             ...
//         }
//     }
//
//     eEM.writeOutput();
//
//     return 0;
// }
//
// Arguments of the program supported by the class:
// -i file_name - (may appear many times) define a list of input files.
//                If the file is *.root it is added to the chain.
//                Otherwise it is taken as a text file with a list of root files
//                all empty lines and lines starting with # are skipped
// -o file_name - a name of an output file
// -e number    - maximum number of events to process
// -p file_name - a name of an optional file with some object for the program;
//                they are easy to get by getParamObject() method
// -h           - prints a help message
//
// Other program arguments which may be used by the program:
// -s string    - string can be get by getOptString() method
// -n Int_t       - can be get by getOptInt()
// -f Float_t     - can be get by getOptFloat()
// -b           - existence of the parameter can be get by getOptBool()
//
//______________________________________________________________________________

ClassImp(HSUExeMacro)

// -----------------------------------------------------------------------------

HSUExeMacro::HSUExeMacro(void)
{
// A constructor of the class

    m_pChain       = new TChain("T");
    m_pProgress    = NULL;
    m_iEvents      = -1;
    m_pOutputFile  = NULL;
    m_iCurrentFile = -1;
    m_iEvent       = -1;
    m_bExitOnError = kTRUE;

    m_pInputArray  = new TObjArray();
    m_pInputArray->SetOwner();

    m_pActiveBranches = new TObjArray();
    m_pActiveBranches->SetOwner();

    m_pParamFile   = NULL;

    m_iOptInt      = 0;
    m_fOptFloat    = 0.0f;
    m_bOptBool     = kFALSE;

    m_bNotFileChange = kFALSE;
}

// -----------------------------------------------------------------------------

HSUExeMacro::~HSUExeMacro()
{
// Destructor.
// Close all input and output files opened by the class and delete what was used

    SAFE_DELETE_ROOT(m_pChain);
    SAFE_DELETE_ROOT(m_pInputArray);
    SAFE_DELETE_ROOT(m_pOutputFile);
    SAFE_DELETE_ROOT(m_pActiveBranches);
    SAFE_DELETE(m_pProgress);
    SAFE_DELETE_ROOT(m_pParamFile);
}

// -----------------------------------------------------------------------------

void HSUExeMacro::setProgress(HSUProgress *pProgress)
{
// Set a progress bar used by the class during the events loop

    deleteProgress();
    m_pProgress = pProgress;
}

// -----------------------------------------------------------------------------

void HSUExeMacro::setProgress(Bool_t bSet)
{
// Set a default progress bar used by the class during the events loop.
// If bSet == kFALSE - removes the progress bar

    deleteProgress();

    if(bSet)
    {
        m_pProgress = new HSUProgress();
        m_pProgress->SetSpinEvents(1000);
    }
}

// -----------------------------------------------------------------------------

HSUProgress* HSUExeMacro::getProgress(void) const
{
// Return the progress bar used by the class

    return m_pProgress;
}

// -----------------------------------------------------------------------------

void HSUExeMacro::deleteProgress(void)
{
// Delete the progress bar used by the class

    SAFE_DELETE(m_pProgress);
}

// -----------------------------------------------------------------------------

Int_t HSUExeMacro::loadArgs(Int_t iArg, Char_t* vArg[])
{
// Load all arguments from the program arguments given as the parameters.
// All parameters supported by the class are listed in the class description.
Int_t   option;
Int_t   i, iError;
Float_t f;

    opterr = 0;
    iError = 0;
    while((option = getopt(iArg, vArg, "n:p:f:s:i:c:o:e:hb")) != -1)
    {
        switch(option)
        {
            case 'i':
                m_pInputArray->Add(new TObjString(optarg));
                break;

            case 'o':
                m_sOutputName = optarg;
                break;

            case 'e':
                if(sscanf(optarg, "%d", &i) != 1)
                    iError++;
                else
                    m_iEvents = i;

                break;

            case 'h':
                iError = -1000000;
                break;

            case 'p':
                m_sParamFileName = optarg;
                break;

            case 's':
                m_sOptString = optarg;
                break;

            case 'n':
                if(sscanf(optarg, "%d", &i) != 1)
                    iError++;
                else
                    m_iOptInt = i;
                break;

            case 'f':
                if(sscanf(optarg, "%f", &f) != 1)
                    iError++;
                else
                    m_fOptFloat = f;
                break;

            case 'b':
                m_bOptBool = kTRUE;
                break;

            case '?':
                break;

            default:
                Error("loadArgs", "Unknown option %c\n", optopt);
                iError++;
                break;
        }
    }

    if(iError != 0)
        printInfo(vArg[0]);

    return ((iError < 0) || ((iError > 0) && (m_bExitOnError))) ? -1 : 0;
}

// -----------------------------------------------------------------------------

void HSUExeMacro::printInfo(const Char_t *pProgramName) const
{
// Print info about all standard options. Used when `-h' is in the arguments.
    printf("Use:\n\n%s -i file -o file [-e events] [-p param_file]\n\n"
            "\t-i file - a root file (*.root) or text file with "
                    "list of files\n"
            "\t-o file - output file\n"
            "\t-e num  - number of events to process\n"
            "\t-p param_file - a root file with parameters\n\n",
            pProgramName);
}

// -----------------------------------------------------------------------------

Bool_t HSUExeMacro::openInput(void)
{
// Create the chain from all files given as the arguments of the program
Int_t    iMax = m_pInputArray->GetEntries();
Int_t    i;
TString  rStr;

    if(iMax <= 0)
    {
        Error("openInput", "No input files");
        if(m_bExitOnError)
            gSystem->Exit(-1);

        return kFALSE;
    }

    for(i = 0; i < iMax; i++)
    {
        rStr = ((TObjString *)m_pInputArray->At(i))->GetString();

        if(rStr.EndsWith(".root", TString::kIgnoreCase))
        {
            if( ! addInputFile(rStr.Data()))
                return kFALSE;

            continue;
        }

        if( ! addFilesFromList(rStr.Data()))
            return kFALSE;
    }

    return kTRUE;
}

// -----------------------------------------------------------------------------

Bool_t HSUExeMacro::addInputFile(const Char_t* pStr)
{
// Add a root file to the chain
Int_t iRet;

    if((iRet = m_pChain->Add(pStr, -1)) <= 0)
    {
        Error("addInputFile", "Cannot open file: `%s'", pStr);
        if(m_bExitOnError)
            gSystem->Exit(-1);

        return kFALSE;
    }

    printf("Input file: %-50s %8d evts \n", pStr,
            (int)(m_pChain->GetTreeOffset()[m_pChain->GetNtrees()]
            -m_pChain->GetTreeOffset()[m_pChain->GetNtrees() - 1]));

    return kTRUE;
}

// -----------------------------------------------------------------------------

Bool_t HSUExeMacro::addFilesFromList(const Char_t *pStr)
{
// Add all root files listed in a text file given as the argument.
// All empty lines or lines starting with `#' are skipped.
// File names are trimmed before use
// (all start and tail white characters are removed)
FILE *pFile;
Char_t  s[1000];
Char_t *p1, *p2;

    if((pFile = fopen(pStr, "r")) == NULL)
    {
        Error("addFilesFromList", "Cannot open file: %s", pStr);
        if(m_bExitOnError)
            gSystem->Exit(-1);

        return kFALSE;
    }

    while(fgets(s, 1000, pFile))
    {
        for(p1 = s; isspace(*p1); p1++)
            ;

        for(p2 = p1 + strlen(p1) - 1; (p2 > p1) && (isspace(*p2)); p2--)
            ;

        *(p2 + 1) = '\0';

        if((*p1 == '#') || (p2 <= p1))
            continue;

        if( ! addInputFile(p1))
            return kFALSE;
    }

    fclose(pFile);

    return kTRUE;
}

// -----------------------------------------------------------------------------

Bool_t HSUExeMacro::openOutput(void)
{
// Open the output file
    if(m_sOutputName.Length() <= 0)
    {
        Error("openOutput", "No output file name");

        if(m_bExitOnError)
            gSystem->Exit(-1);

        return kFALSE;
    }

    if(((m_pOutputFile = new TFile(m_sOutputName, "RECREATE")) == NULL)
            || ( ! m_pOutputFile->IsOpen()))
    {
        Error("openOutput", "Cannot open file: %s", m_sOutputName.Data());

        if(m_bExitOnError)
            gSystem->Exit(-1);

        return kFALSE;
    }

    printf("Output file: %s opened\n", m_sOutputName.Data());

    return kTRUE;
}

// -----------------------------------------------------------------------------

Bool_t HSUExeMacro::writeOutput(void)
{
// Simple close the output file. All root objects created since the openOutput
// are written to the file
    if((m_pOutputFile != NULL) && (m_pOutputFile->IsOpen()))
        return m_pOutputFile->Write();

    Error("writeOutput", "Output file not opened");

    return kFALSE;
}

// -----------------------------------------------------------------------------

TClonesArray* HSUExeMacro::getTClonesArray(const Char_t *pBranchName)
{
// Get the TClonesArray from the file.
// To get a proper branch a `.fData' suffix is added to `pBranchName'
HSUBranchElement *pBE;

    if((pBE = findAciveBranch(pBranchName)) == NULL)
        return getNewArrayFromBranch(pBranchName);

    if(pBE->m_eType == HSUBranchElement::kArray)
        return (TClonesArray *)pBE->m_pArray;

    Error("getTClonesArray", "Branch %s has no array", pBranchName);

    if(m_bExitOnError)
        gSystem->Exit(-1);

    return NULL;
}

// -----------------------------------------------------------------------------

HCategory* HSUExeMacro::getHCategory(const Char_t *pCategoryName)
{
// Get the HCategory from the file.
// To get a proper branch a `.' suffix is added to `pCategoryName'
HSUBranchElement *pBE;

    if((pBE = findAciveBranch(pCategoryName)) == NULL)
        return getNewHCategoryFromBranch(pCategoryName);

    if(pBE->m_eType == HSUBranchElement::kCategory)
        return (HCategory *)pBE->m_pArray;

    Error("getTClonesArray", "Branch %s has no HCategory", pCategoryName);

    if(m_bExitOnError)
        gSystem->Exit(-1);

    return NULL;
}

// -----------------------------------------------------------------------------

TBranch* HSUExeMacro::getBranch(const Char_t *pBranchName)
{
// Get the brach from the `T'
// if was activated by getHCategory or getTClonesArray
HSUBranchElement *pBE;

    return ((pBE = findAciveBranch(pBranchName)) == NULL)
            ? NULL : pBE->m_pBranch;
}

// -----------------------------------------------------------------------------

TClonesArray* HSUExeMacro::getNewArrayFromBranch(const Char_t *pBranchName)
{
// Create new branch and a TClonesArray for it
HSUBranchElement *pBE;
TObjString        str(pBranchName);
TBranch          *pBranch;

    pBE = new HSUBranchElement(pBranchName, HSUBranchElement::kArray);

TString strDataBranch = str.GetString() + pBE->getBranchNameSufix();

    if((pBranch = m_pChain->GetBranch(strDataBranch.Data())) == NULL)
    {
        delete pBE;

        Error("getNewArrayFromBranch", "No branch %s in Tree",
                strDataBranch.Data());

        if(m_bExitOnError)
            gSystem->Exit(-1);

        return NULL;
    }

    pBE->m_pBranch = pBranch;
    pBE->m_pArray  = new TClonesArray(pBranchName);

    m_pActiveBranches->Add(pBE);

    m_pChain->SetBranchStatus(strDataBranch.Data(), 1);

    pBE->m_pBranch->SetAddress(&(pBE->m_pArray));

    return (TClonesArray *)pBE->m_pArray;
}

// -----------------------------------------------------------------------------

HCategory* HSUExeMacro::getNewHCategoryFromBranch(const Char_t *pBranchName)
{
// Create new branch and a HCategory for it
HSUBranchElement *pBE;
TObjString        str(pBranchName);
TBranch          *pBranch;
HCategory        *pCat;

    pBE = new HSUBranchElement(pBranchName, HSUBranchElement::kCategory);

TString strDataBranch = str.GetString() + pBE->getBranchNameSufix();

    if((pBranch = m_pChain->GetBranch(strDataBranch.Data())) == NULL)
    {
        delete pBE;

        Error("getNewArrayFromBranch", "No branch %s in Tree",
                strDataBranch.Data());

        if(m_bExitOnError)
            gSystem->Exit(-1);

        return NULL;
    }

TDirectory *pDirSav = gDirectory;
    m_pChain->GetDirectory()->cd();

    if((pCat = (HCategory *)gDirectory->FindObjectAny(pBranchName))
            == NULL)
    {
        pDirSav->cd();

        delete pBE;

        Error("getNewArrayFromBranch", "No HCategory %s in Tree", pBranchName);

        if(m_bExitOnError)
            gSystem->Exit(-1);

        return NULL;
    }

    pDirSav->cd();

    pBE->m_pBranch = pBranch;
    pBE->m_pArray  = pCat->Clone();

    m_pActiveBranches->Add(pBE);

    m_pChain->SetBranchStatus(strDataBranch.Data(), 1);

    pBE->m_pBranch->SetAddress(&(pBE->m_pArray));

    return (HCategory *)pBE->m_pArray;
}

// -----------------------------------------------------------------------------

HSUBranchElement* HSUExeMacro::findAciveBranch(const Char_t *pBranchName)
{
// Find an active branch by name
Int_t             i, iMax;
HSUBranchElement *pBE;

    iMax = m_pActiveBranches->GetEntries();
    for(i = 0; i < iMax; i++)
    {
        if((pBE = (HSUBranchElement *)m_pActiveBranches->At(i)) == NULL)
            continue;

        if(pBE->m_pName->CompareTo(pBranchName) == 0)
            return pBE;
    }

    return NULL;
}

// -----------------------------------------------------------------------------

Int_t HSUExeMacro::loadTree(Int_t iEvent)
{
// Load the event from tree.
// All active categories and array are filled with the new data.
// If switch of the files is needed then new branches are created automatically.
Int_t iE;

    if((iE = m_pChain->LoadTree(iEvent)) < 0)
        return iE;

    if(m_pChain->IsA() != TChain::Class())
        return iE;

    if(m_pChain->GetTreeNumber() != m_iCurrentFile)
    {
        m_iCurrentFile = m_pChain->GetTreeNumber();

        if( ! notifyBranches())
            iE = -1;

        if(m_bNotFileChange)
        {
            Warning("loadTree", "File changed to: %s\n",
                    m_pChain->GetFile()->GetName());
        }
    }

    return iE;
}

// -----------------------------------------------------------------------------

Bool_t HSUExeMacro::notifyBranches(void)
{
// Get branches from a new file in the chain.
// Called by loadTree if needed
Int_t             i, iMax;
HSUBranchElement *pBE;
TString           str;
Bool_t            bReturn = kTRUE;

    iMax = m_pActiveBranches->GetEntries();
    for(i = 0; i < iMax; i++)
    {
        if((pBE = (HSUBranchElement *)m_pActiveBranches->At(i)) == NULL)
            continue;

        str = *pBE->m_pName;
        str += pBE->getBranchNameSufix();

        if((pBE->m_pBranch = m_pChain->GetBranch(str.Data())) == NULL)
        {
            Error("notifyBranches", "No branch `%s'\n\tin file: `%s'",
                    str.Data(), m_pChain->GetFile()->GetName());

            if(m_bExitOnError)
                gSystem->Exit(-1);

            bReturn = kFALSE;
        }

        pBE->m_pBranch->SetAddress(&(pBE->m_pArray));
    }

    return bReturn;
}

// -----------------------------------------------------------------------------

void HSUExeMacro::clear(void)
{
// Clear all arrays and categories before next event
HSUBranchElement *pBE;
Int_t             i, iMax;

    iMax = m_pActiveBranches->GetEntries();
    for(i = 0; i < iMax; i++)
    {
        if((pBE = (HSUBranchElement *)m_pActiveBranches->At(i)) == NULL)
            continue;

        pBE->m_pArray->Clear();
    }
}

// -----------------------------------------------------------------------------

void HSUExeMacro::getBranchesEntry(Int_t iEntry)
{
// Fill the array or category with the data of the current event
HSUBranchElement *pBE;
Int_t             i, iMax;

    iMax = m_pActiveBranches->GetEntries();
    for(i = 0; i < iMax; i++)
    {
        if((pBE = (HSUBranchElement *)m_pActiveBranches->At(i)) != NULL)
            pBE->m_pBranch->GetEntry(iEntry);
    }
}

// -----------------------------------------------------------------------------

Int_t HSUExeMacro::getEvent(Int_t iEvent)
{
// Get all data for the event.
// If no events left return value < 0
Int_t iE;

    clear();
    if((iE = loadTree(iEvent)) >= 0)
        getBranchesEntry(iE);

    return iE;
}

// -----------------------------------------------------------------------------

Bool_t HSUExeMacro::checkBranches(void)
{
// Check if all activated branches exist in the every file in the chain
Int_t  i, iMax;
Bool_t bReturn = kTRUE;

    iMax = m_pChain->GetNtrees();

    for(i = 0; i < iMax; i++)
    {
        if(getEvent(m_pChain->GetTreeOffset()[i]) < 0)
            bReturn = kFALSE;
    }

    m_iCurrentFile = -1;

    return bReturn;
}

// -----------------------------------------------------------------------------

Int_t HSUExeMacro::nextEvent(void)
{
// Get next event
// Return >= 0 if ok, or < 0 when at the end of the events list
    if(m_iEvent < 0)
    {
    Int_t iE;

        if(((iE = (Int_t)m_pChain->GetEntries()) < m_iEvents)
                || (m_iEvents < 0))
        {
            m_iEvents = iE;
        }

        if(m_pProgress != NULL)
            m_pProgress->SetMaxValue(m_iEvents);
    }

    if(++m_iEvent >= m_iEvents)
        return -1;

    if(m_pProgress != NULL)
        m_pProgress->Next();

    if(getEvent(m_iEvent) < 0)
        return -2;

    return m_iEvent;
}

// -----------------------------------------------------------------------------

Bool_t HSUExeMacro::openParamFile(const Char_t *pParamFileName)
{
// Open a file with parameters. The parameters from the file may be get by:
// HSUExeMacro::getParamObject method
    if(m_pParamFile != NULL)
    {
        m_pParamFile->Close();
        m_pParamFile->Delete();
    }

    if(pParamFileName != NULL)
        m_sParamFileName = pParamFileName;

    if(m_sParamFileName.Length() <= 0)
    {
        Error("openParamFile", "No param file name !");

        if(m_bExitOnError)
            gSystem->Exit(-1);

        return kFALSE;
    }

    if(((m_pParamFile = new TFile(m_sParamFileName, "READ")) == NULL)
            || ( ! m_pParamFile->IsOpen()))
    {
        Error("openParamFile", "Cannot open param file: %s",
                m_sParamFileName.Data());

        if(m_pParamFile != NULL)
        {
            m_pParamFile->Close();
            m_pParamFile->Delete();

            m_pParamFile = NULL;
        }

        if(m_bExitOnError)
            gSystem->Exit(-1);

        return kFALSE;
    }

    return kTRUE;
}

// -----------------------------------------------------------------------------

TObject* HSUExeMacro::getParamObject(const Char_t *pName)
{
// Get an object from the parameter file (if opened)
    if(m_pParamFile == NULL)
    {
        Error("getParamObject", "Param file not opened");

        if(m_bExitOnError)
            gSystem->Exit(-1);

        return NULL;
    }

    return m_pParamFile->Get(pName);
}

// -----------------------------------------------------------------------------

const TString& HSUExeMacro::getParamFileName(void) const
{
// Return param file name or empty string if the name not set
    return m_sParamFileName;
}

// -----------------------------------------------------------------------------

Float_t HSUExeMacro::getMdcPhi(Int_t iSector, Float_t fPhiMdc) const
{
// Convert MDC's phi angle to the coordinate system used in other detectors
static Float_t R2D = 180.0 / TMath::Pi();
Float_t fPhi;

    fPhi = R2D * fPhiMdc;

    switch(iSector)
    {
        case 0:
            break;

        case 1:
        case 2:
        case 3:
        case 4:
            fPhi += 60.0f * iSector;
            break;

        default:
            fPhi -= 60.0f;
            break;
    }

    return fPhi;
}

// -----------------------------------------------------------------------------

Float_t HSUExeMacro::getMdcTheta(Float_t fThetaMdc) const
{
// Convert MDC's theta angle to the coordinate system used in other detectors
static Float_t R2D = 180.0 / TMath::Pi();

    return fThetaMdc * R2D;
}

 hsuexemacro.cc:1
 hsuexemacro.cc:2
 hsuexemacro.cc:3
 hsuexemacro.cc:4
 hsuexemacro.cc:5
 hsuexemacro.cc:6
 hsuexemacro.cc:7
 hsuexemacro.cc:8
 hsuexemacro.cc:9
 hsuexemacro.cc:10
 hsuexemacro.cc:11
 hsuexemacro.cc:12
 hsuexemacro.cc:13
 hsuexemacro.cc:14
 hsuexemacro.cc:15
 hsuexemacro.cc:16
 hsuexemacro.cc:17
 hsuexemacro.cc:18
 hsuexemacro.cc:19
 hsuexemacro.cc:20
 hsuexemacro.cc:21
 hsuexemacro.cc:22
 hsuexemacro.cc:23
 hsuexemacro.cc:24
 hsuexemacro.cc:25
 hsuexemacro.cc:26
 hsuexemacro.cc:27
 hsuexemacro.cc:28
 hsuexemacro.cc:29
 hsuexemacro.cc:30
 hsuexemacro.cc:31
 hsuexemacro.cc:32
 hsuexemacro.cc:33
 hsuexemacro.cc:34
 hsuexemacro.cc:35
 hsuexemacro.cc:36
 hsuexemacro.cc:37
 hsuexemacro.cc:38
 hsuexemacro.cc:39
 hsuexemacro.cc:40
 hsuexemacro.cc:41
 hsuexemacro.cc:42
 hsuexemacro.cc:43
 hsuexemacro.cc:44
 hsuexemacro.cc:45
 hsuexemacro.cc:46
 hsuexemacro.cc:47
 hsuexemacro.cc:48
 hsuexemacro.cc:49
 hsuexemacro.cc:50
 hsuexemacro.cc:51
 hsuexemacro.cc:52
 hsuexemacro.cc:53
 hsuexemacro.cc:54
 hsuexemacro.cc:55
 hsuexemacro.cc:56
 hsuexemacro.cc:57
 hsuexemacro.cc:58
 hsuexemacro.cc:59
 hsuexemacro.cc:60
 hsuexemacro.cc:61
 hsuexemacro.cc:62
 hsuexemacro.cc:63
 hsuexemacro.cc:64
 hsuexemacro.cc:65
 hsuexemacro.cc:66
 hsuexemacro.cc:67
 hsuexemacro.cc:68
 hsuexemacro.cc:69
 hsuexemacro.cc:70
 hsuexemacro.cc:71
 hsuexemacro.cc:72
 hsuexemacro.cc:73
 hsuexemacro.cc:74
 hsuexemacro.cc:75
 hsuexemacro.cc:76
 hsuexemacro.cc:77
 hsuexemacro.cc:78
 hsuexemacro.cc:79
 hsuexemacro.cc:80
 hsuexemacro.cc:81
 hsuexemacro.cc:82
 hsuexemacro.cc:83
 hsuexemacro.cc:84
 hsuexemacro.cc:85
 hsuexemacro.cc:86
 hsuexemacro.cc:87
 hsuexemacro.cc:88
 hsuexemacro.cc:89
 hsuexemacro.cc:90
 hsuexemacro.cc:91
 hsuexemacro.cc:92
 hsuexemacro.cc:93
 hsuexemacro.cc:94
 hsuexemacro.cc:95
 hsuexemacro.cc:96
 hsuexemacro.cc:97
 hsuexemacro.cc:98
 hsuexemacro.cc:99
 hsuexemacro.cc:100
 hsuexemacro.cc:101
 hsuexemacro.cc:102
 hsuexemacro.cc:103
 hsuexemacro.cc:104
 hsuexemacro.cc:105
 hsuexemacro.cc:106
 hsuexemacro.cc:107
 hsuexemacro.cc:108
 hsuexemacro.cc:109
 hsuexemacro.cc:110
 hsuexemacro.cc:111
 hsuexemacro.cc:112
 hsuexemacro.cc:113
 hsuexemacro.cc:114
 hsuexemacro.cc:115
 hsuexemacro.cc:116
 hsuexemacro.cc:117
 hsuexemacro.cc:118
 hsuexemacro.cc:119
 hsuexemacro.cc:120
 hsuexemacro.cc:121
 hsuexemacro.cc:122
 hsuexemacro.cc:123
 hsuexemacro.cc:124
 hsuexemacro.cc:125
 hsuexemacro.cc:126
 hsuexemacro.cc:127
 hsuexemacro.cc:128
 hsuexemacro.cc:129
 hsuexemacro.cc:130
 hsuexemacro.cc:131
 hsuexemacro.cc:132
 hsuexemacro.cc:133
 hsuexemacro.cc:134
 hsuexemacro.cc:135
 hsuexemacro.cc:136
 hsuexemacro.cc:137
 hsuexemacro.cc:138
 hsuexemacro.cc:139
 hsuexemacro.cc:140
 hsuexemacro.cc:141
 hsuexemacro.cc:142
 hsuexemacro.cc:143
 hsuexemacro.cc:144
 hsuexemacro.cc:145
 hsuexemacro.cc:146
 hsuexemacro.cc:147
 hsuexemacro.cc:148
 hsuexemacro.cc:149
 hsuexemacro.cc:150
 hsuexemacro.cc:151
 hsuexemacro.cc:152
 hsuexemacro.cc:153
 hsuexemacro.cc:154
 hsuexemacro.cc:155
 hsuexemacro.cc:156
 hsuexemacro.cc:157
 hsuexemacro.cc:158
 hsuexemacro.cc:159
 hsuexemacro.cc:160
 hsuexemacro.cc:161
 hsuexemacro.cc:162
 hsuexemacro.cc:163
 hsuexemacro.cc:164
 hsuexemacro.cc:165
 hsuexemacro.cc:166
 hsuexemacro.cc:167
 hsuexemacro.cc:168
 hsuexemacro.cc:169
 hsuexemacro.cc:170
 hsuexemacro.cc:171
 hsuexemacro.cc:172
 hsuexemacro.cc:173
 hsuexemacro.cc:174
 hsuexemacro.cc:175
 hsuexemacro.cc:176
 hsuexemacro.cc:177
 hsuexemacro.cc:178
 hsuexemacro.cc:179
 hsuexemacro.cc:180
 hsuexemacro.cc:181
 hsuexemacro.cc:182
 hsuexemacro.cc:183
 hsuexemacro.cc:184
 hsuexemacro.cc:185
 hsuexemacro.cc:186
 hsuexemacro.cc:187
 hsuexemacro.cc:188
 hsuexemacro.cc:189
 hsuexemacro.cc:190
 hsuexemacro.cc:191
 hsuexemacro.cc:192
 hsuexemacro.cc:193
 hsuexemacro.cc:194
 hsuexemacro.cc:195
 hsuexemacro.cc:196
 hsuexemacro.cc:197
 hsuexemacro.cc:198
 hsuexemacro.cc:199
 hsuexemacro.cc:200
 hsuexemacro.cc:201
 hsuexemacro.cc:202
 hsuexemacro.cc:203
 hsuexemacro.cc:204
 hsuexemacro.cc:205
 hsuexemacro.cc:206
 hsuexemacro.cc:207
 hsuexemacro.cc:208
 hsuexemacro.cc:209
 hsuexemacro.cc:210
 hsuexemacro.cc:211
 hsuexemacro.cc:212
 hsuexemacro.cc:213
 hsuexemacro.cc:214
 hsuexemacro.cc:215
 hsuexemacro.cc:216
 hsuexemacro.cc:217
 hsuexemacro.cc:218
 hsuexemacro.cc:219
 hsuexemacro.cc:220
 hsuexemacro.cc:221
 hsuexemacro.cc:222
 hsuexemacro.cc:223
 hsuexemacro.cc:224
 hsuexemacro.cc:225
 hsuexemacro.cc:226
 hsuexemacro.cc:227
 hsuexemacro.cc:228
 hsuexemacro.cc:229
 hsuexemacro.cc:230
 hsuexemacro.cc:231
 hsuexemacro.cc:232
 hsuexemacro.cc:233
 hsuexemacro.cc:234
 hsuexemacro.cc:235
 hsuexemacro.cc:236
 hsuexemacro.cc:237
 hsuexemacro.cc:238
 hsuexemacro.cc:239
 hsuexemacro.cc:240
 hsuexemacro.cc:241
 hsuexemacro.cc:242
 hsuexemacro.cc:243
 hsuexemacro.cc:244
 hsuexemacro.cc:245
 hsuexemacro.cc:246
 hsuexemacro.cc:247
 hsuexemacro.cc:248
 hsuexemacro.cc:249
 hsuexemacro.cc:250
 hsuexemacro.cc:251
 hsuexemacro.cc:252
 hsuexemacro.cc:253
 hsuexemacro.cc:254
 hsuexemacro.cc:255
 hsuexemacro.cc:256
 hsuexemacro.cc:257
 hsuexemacro.cc:258
 hsuexemacro.cc:259
 hsuexemacro.cc:260
 hsuexemacro.cc:261
 hsuexemacro.cc:262
 hsuexemacro.cc:263
 hsuexemacro.cc:264
 hsuexemacro.cc:265
 hsuexemacro.cc:266
 hsuexemacro.cc:267
 hsuexemacro.cc:268
 hsuexemacro.cc:269
 hsuexemacro.cc:270
 hsuexemacro.cc:271
 hsuexemacro.cc:272
 hsuexemacro.cc:273
 hsuexemacro.cc:274
 hsuexemacro.cc:275
 hsuexemacro.cc:276
 hsuexemacro.cc:277
 hsuexemacro.cc:278
 hsuexemacro.cc:279
 hsuexemacro.cc:280
 hsuexemacro.cc:281
 hsuexemacro.cc:282
 hsuexemacro.cc:283
 hsuexemacro.cc:284
 hsuexemacro.cc:285
 hsuexemacro.cc:286
 hsuexemacro.cc:287
 hsuexemacro.cc:288
 hsuexemacro.cc:289
 hsuexemacro.cc:290
 hsuexemacro.cc:291
 hsuexemacro.cc:292
 hsuexemacro.cc:293
 hsuexemacro.cc:294
 hsuexemacro.cc:295
 hsuexemacro.cc:296
 hsuexemacro.cc:297
 hsuexemacro.cc:298
 hsuexemacro.cc:299
 hsuexemacro.cc:300
 hsuexemacro.cc:301
 hsuexemacro.cc:302
 hsuexemacro.cc:303
 hsuexemacro.cc:304
 hsuexemacro.cc:305
 hsuexemacro.cc:306
 hsuexemacro.cc:307
 hsuexemacro.cc:308
 hsuexemacro.cc:309
 hsuexemacro.cc:310
 hsuexemacro.cc:311
 hsuexemacro.cc:312
 hsuexemacro.cc:313
 hsuexemacro.cc:314
 hsuexemacro.cc:315
 hsuexemacro.cc:316
 hsuexemacro.cc:317
 hsuexemacro.cc:318
 hsuexemacro.cc:319
 hsuexemacro.cc:320
 hsuexemacro.cc:321
 hsuexemacro.cc:322
 hsuexemacro.cc:323
 hsuexemacro.cc:324
 hsuexemacro.cc:325
 hsuexemacro.cc:326
 hsuexemacro.cc:327
 hsuexemacro.cc:328
 hsuexemacro.cc:329
 hsuexemacro.cc:330
 hsuexemacro.cc:331
 hsuexemacro.cc:332
 hsuexemacro.cc:333
 hsuexemacro.cc:334
 hsuexemacro.cc:335
 hsuexemacro.cc:336
 hsuexemacro.cc:337
 hsuexemacro.cc:338
 hsuexemacro.cc:339
 hsuexemacro.cc:340
 hsuexemacro.cc:341
 hsuexemacro.cc:342
 hsuexemacro.cc:343
 hsuexemacro.cc:344
 hsuexemacro.cc:345
 hsuexemacro.cc:346
 hsuexemacro.cc:347
 hsuexemacro.cc:348
 hsuexemacro.cc:349
 hsuexemacro.cc:350
 hsuexemacro.cc:351
 hsuexemacro.cc:352
 hsuexemacro.cc:353
 hsuexemacro.cc:354
 hsuexemacro.cc:355
 hsuexemacro.cc:356
 hsuexemacro.cc:357
 hsuexemacro.cc:358
 hsuexemacro.cc:359
 hsuexemacro.cc:360
 hsuexemacro.cc:361
 hsuexemacro.cc:362
 hsuexemacro.cc:363
 hsuexemacro.cc:364
 hsuexemacro.cc:365
 hsuexemacro.cc:366
 hsuexemacro.cc:367
 hsuexemacro.cc:368
 hsuexemacro.cc:369
 hsuexemacro.cc:370
 hsuexemacro.cc:371
 hsuexemacro.cc:372
 hsuexemacro.cc:373
 hsuexemacro.cc:374
 hsuexemacro.cc:375
 hsuexemacro.cc:376
 hsuexemacro.cc:377
 hsuexemacro.cc:378
 hsuexemacro.cc:379
 hsuexemacro.cc:380
 hsuexemacro.cc:381
 hsuexemacro.cc:382
 hsuexemacro.cc:383
 hsuexemacro.cc:384
 hsuexemacro.cc:385
 hsuexemacro.cc:386
 hsuexemacro.cc:387
 hsuexemacro.cc:388
 hsuexemacro.cc:389
 hsuexemacro.cc:390
 hsuexemacro.cc:391
 hsuexemacro.cc:392
 hsuexemacro.cc:393
 hsuexemacro.cc:394
 hsuexemacro.cc:395
 hsuexemacro.cc:396
 hsuexemacro.cc:397
 hsuexemacro.cc:398
 hsuexemacro.cc:399
 hsuexemacro.cc:400
 hsuexemacro.cc:401
 hsuexemacro.cc:402
 hsuexemacro.cc:403
 hsuexemacro.cc:404
 hsuexemacro.cc:405
 hsuexemacro.cc:406
 hsuexemacro.cc:407
 hsuexemacro.cc:408
 hsuexemacro.cc:409
 hsuexemacro.cc:410
 hsuexemacro.cc:411
 hsuexemacro.cc:412
 hsuexemacro.cc:413
 hsuexemacro.cc:414
 hsuexemacro.cc:415
 hsuexemacro.cc:416
 hsuexemacro.cc:417
 hsuexemacro.cc:418
 hsuexemacro.cc:419
 hsuexemacro.cc:420
 hsuexemacro.cc:421
 hsuexemacro.cc:422
 hsuexemacro.cc:423
 hsuexemacro.cc:424
 hsuexemacro.cc:425
 hsuexemacro.cc:426
 hsuexemacro.cc:427
 hsuexemacro.cc:428
 hsuexemacro.cc:429
 hsuexemacro.cc:430
 hsuexemacro.cc:431
 hsuexemacro.cc:432
 hsuexemacro.cc:433
 hsuexemacro.cc:434
 hsuexemacro.cc:435
 hsuexemacro.cc:436
 hsuexemacro.cc:437
 hsuexemacro.cc:438
 hsuexemacro.cc:439
 hsuexemacro.cc:440
 hsuexemacro.cc:441
 hsuexemacro.cc:442
 hsuexemacro.cc:443
 hsuexemacro.cc:444
 hsuexemacro.cc:445
 hsuexemacro.cc:446
 hsuexemacro.cc:447
 hsuexemacro.cc:448
 hsuexemacro.cc:449
 hsuexemacro.cc:450
 hsuexemacro.cc:451
 hsuexemacro.cc:452
 hsuexemacro.cc:453
 hsuexemacro.cc:454
 hsuexemacro.cc:455
 hsuexemacro.cc:456
 hsuexemacro.cc:457
 hsuexemacro.cc:458
 hsuexemacro.cc:459
 hsuexemacro.cc:460
 hsuexemacro.cc:461
 hsuexemacro.cc:462
 hsuexemacro.cc:463
 hsuexemacro.cc:464
 hsuexemacro.cc:465
 hsuexemacro.cc:466
 hsuexemacro.cc:467
 hsuexemacro.cc:468
 hsuexemacro.cc:469
 hsuexemacro.cc:470
 hsuexemacro.cc:471
 hsuexemacro.cc:472
 hsuexemacro.cc:473
 hsuexemacro.cc:474
 hsuexemacro.cc:475
 hsuexemacro.cc:476
 hsuexemacro.cc:477
 hsuexemacro.cc:478
 hsuexemacro.cc:479
 hsuexemacro.cc:480
 hsuexemacro.cc:481
 hsuexemacro.cc:482
 hsuexemacro.cc:483
 hsuexemacro.cc:484
 hsuexemacro.cc:485
 hsuexemacro.cc:486
 hsuexemacro.cc:487
 hsuexemacro.cc:488
 hsuexemacro.cc:489
 hsuexemacro.cc:490
 hsuexemacro.cc:491
 hsuexemacro.cc:492
 hsuexemacro.cc:493
 hsuexemacro.cc:494
 hsuexemacro.cc:495
 hsuexemacro.cc:496
 hsuexemacro.cc:497
 hsuexemacro.cc:498
 hsuexemacro.cc:499
 hsuexemacro.cc:500
 hsuexemacro.cc:501
 hsuexemacro.cc:502
 hsuexemacro.cc:503
 hsuexemacro.cc:504
 hsuexemacro.cc:505
 hsuexemacro.cc:506
 hsuexemacro.cc:507
 hsuexemacro.cc:508
 hsuexemacro.cc:509
 hsuexemacro.cc:510
 hsuexemacro.cc:511
 hsuexemacro.cc:512
 hsuexemacro.cc:513
 hsuexemacro.cc:514
 hsuexemacro.cc:515
 hsuexemacro.cc:516
 hsuexemacro.cc:517
 hsuexemacro.cc:518
 hsuexemacro.cc:519
 hsuexemacro.cc:520
 hsuexemacro.cc:521
 hsuexemacro.cc:522
 hsuexemacro.cc:523
 hsuexemacro.cc:524
 hsuexemacro.cc:525
 hsuexemacro.cc:526
 hsuexemacro.cc:527
 hsuexemacro.cc:528
 hsuexemacro.cc:529
 hsuexemacro.cc:530
 hsuexemacro.cc:531
 hsuexemacro.cc:532
 hsuexemacro.cc:533
 hsuexemacro.cc:534
 hsuexemacro.cc:535
 hsuexemacro.cc:536
 hsuexemacro.cc:537
 hsuexemacro.cc:538
 hsuexemacro.cc:539
 hsuexemacro.cc:540
 hsuexemacro.cc:541
 hsuexemacro.cc:542
 hsuexemacro.cc:543
 hsuexemacro.cc:544
 hsuexemacro.cc:545
 hsuexemacro.cc:546
 hsuexemacro.cc:547
 hsuexemacro.cc:548
 hsuexemacro.cc:549
 hsuexemacro.cc:550
 hsuexemacro.cc:551
 hsuexemacro.cc:552
 hsuexemacro.cc:553
 hsuexemacro.cc:554
 hsuexemacro.cc:555
 hsuexemacro.cc:556
 hsuexemacro.cc:557
 hsuexemacro.cc:558
 hsuexemacro.cc:559
 hsuexemacro.cc:560
 hsuexemacro.cc:561
 hsuexemacro.cc:562
 hsuexemacro.cc:563
 hsuexemacro.cc:564
 hsuexemacro.cc:565
 hsuexemacro.cc:566
 hsuexemacro.cc:567
 hsuexemacro.cc:568
 hsuexemacro.cc:569
 hsuexemacro.cc:570
 hsuexemacro.cc:571
 hsuexemacro.cc:572
 hsuexemacro.cc:573
 hsuexemacro.cc:574
 hsuexemacro.cc:575
 hsuexemacro.cc:576
 hsuexemacro.cc:577
 hsuexemacro.cc:578
 hsuexemacro.cc:579
 hsuexemacro.cc:580
 hsuexemacro.cc:581
 hsuexemacro.cc:582
 hsuexemacro.cc:583
 hsuexemacro.cc:584
 hsuexemacro.cc:585
 hsuexemacro.cc:586
 hsuexemacro.cc:587
 hsuexemacro.cc:588
 hsuexemacro.cc:589
 hsuexemacro.cc:590
 hsuexemacro.cc:591
 hsuexemacro.cc:592
 hsuexemacro.cc:593
 hsuexemacro.cc:594
 hsuexemacro.cc:595
 hsuexemacro.cc:596
 hsuexemacro.cc:597
 hsuexemacro.cc:598
 hsuexemacro.cc:599
 hsuexemacro.cc:600
 hsuexemacro.cc:601
 hsuexemacro.cc:602
 hsuexemacro.cc:603
 hsuexemacro.cc:604
 hsuexemacro.cc:605
 hsuexemacro.cc:606
 hsuexemacro.cc:607
 hsuexemacro.cc:608
 hsuexemacro.cc:609
 hsuexemacro.cc:610
 hsuexemacro.cc:611
 hsuexemacro.cc:612
 hsuexemacro.cc:613
 hsuexemacro.cc:614
 hsuexemacro.cc:615
 hsuexemacro.cc:616
 hsuexemacro.cc:617
 hsuexemacro.cc:618
 hsuexemacro.cc:619
 hsuexemacro.cc:620
 hsuexemacro.cc:621
 hsuexemacro.cc:622
 hsuexemacro.cc:623
 hsuexemacro.cc:624
 hsuexemacro.cc:625
 hsuexemacro.cc:626
 hsuexemacro.cc:627
 hsuexemacro.cc:628
 hsuexemacro.cc:629
 hsuexemacro.cc:630
 hsuexemacro.cc:631
 hsuexemacro.cc:632
 hsuexemacro.cc:633
 hsuexemacro.cc:634
 hsuexemacro.cc:635
 hsuexemacro.cc:636
 hsuexemacro.cc:637
 hsuexemacro.cc:638
 hsuexemacro.cc:639
 hsuexemacro.cc:640
 hsuexemacro.cc:641
 hsuexemacro.cc:642
 hsuexemacro.cc:643
 hsuexemacro.cc:644
 hsuexemacro.cc:645
 hsuexemacro.cc:646
 hsuexemacro.cc:647
 hsuexemacro.cc:648
 hsuexemacro.cc:649
 hsuexemacro.cc:650
 hsuexemacro.cc:651
 hsuexemacro.cc:652
 hsuexemacro.cc:653
 hsuexemacro.cc:654
 hsuexemacro.cc:655
 hsuexemacro.cc:656
 hsuexemacro.cc:657
 hsuexemacro.cc:658
 hsuexemacro.cc:659
 hsuexemacro.cc:660
 hsuexemacro.cc:661
 hsuexemacro.cc:662
 hsuexemacro.cc:663
 hsuexemacro.cc:664
 hsuexemacro.cc:665
 hsuexemacro.cc:666
 hsuexemacro.cc:667
 hsuexemacro.cc:668
 hsuexemacro.cc:669
 hsuexemacro.cc:670
 hsuexemacro.cc:671
 hsuexemacro.cc:672
 hsuexemacro.cc:673
 hsuexemacro.cc:674
 hsuexemacro.cc:675
 hsuexemacro.cc:676
 hsuexemacro.cc:677
 hsuexemacro.cc:678
 hsuexemacro.cc:679
 hsuexemacro.cc:680
 hsuexemacro.cc:681
 hsuexemacro.cc:682
 hsuexemacro.cc:683
 hsuexemacro.cc:684
 hsuexemacro.cc:685
 hsuexemacro.cc:686
 hsuexemacro.cc:687
 hsuexemacro.cc:688
 hsuexemacro.cc:689
 hsuexemacro.cc:690
 hsuexemacro.cc:691
 hsuexemacro.cc:692
 hsuexemacro.cc:693
 hsuexemacro.cc:694
 hsuexemacro.cc:695
 hsuexemacro.cc:696
 hsuexemacro.cc:697
 hsuexemacro.cc:698
 hsuexemacro.cc:699
 hsuexemacro.cc:700
 hsuexemacro.cc:701
 hsuexemacro.cc:702
 hsuexemacro.cc:703
 hsuexemacro.cc:704
 hsuexemacro.cc:705
 hsuexemacro.cc:706
 hsuexemacro.cc:707
 hsuexemacro.cc:708
 hsuexemacro.cc:709
 hsuexemacro.cc:710
 hsuexemacro.cc:711
 hsuexemacro.cc:712
 hsuexemacro.cc:713
 hsuexemacro.cc:714
 hsuexemacro.cc:715
 hsuexemacro.cc:716
 hsuexemacro.cc:717
 hsuexemacro.cc:718
 hsuexemacro.cc:719
 hsuexemacro.cc:720
 hsuexemacro.cc:721
 hsuexemacro.cc:722
 hsuexemacro.cc:723
 hsuexemacro.cc:724
 hsuexemacro.cc:725
 hsuexemacro.cc:726
 hsuexemacro.cc:727
 hsuexemacro.cc:728
 hsuexemacro.cc:729
 hsuexemacro.cc:730
 hsuexemacro.cc:731
 hsuexemacro.cc:732
 hsuexemacro.cc:733
 hsuexemacro.cc:734
 hsuexemacro.cc:735
 hsuexemacro.cc:736
 hsuexemacro.cc:737
 hsuexemacro.cc:738
 hsuexemacro.cc:739
 hsuexemacro.cc:740
 hsuexemacro.cc:741
 hsuexemacro.cc:742
 hsuexemacro.cc:743
 hsuexemacro.cc:744
 hsuexemacro.cc:745
 hsuexemacro.cc:746
 hsuexemacro.cc:747
 hsuexemacro.cc:748
 hsuexemacro.cc:749
 hsuexemacro.cc:750
 hsuexemacro.cc:751
 hsuexemacro.cc:752
 hsuexemacro.cc:753
 hsuexemacro.cc:754
 hsuexemacro.cc:755
 hsuexemacro.cc:756
 hsuexemacro.cc:757
 hsuexemacro.cc:758
 hsuexemacro.cc:759
 hsuexemacro.cc:760
 hsuexemacro.cc:761
 hsuexemacro.cc:762
 hsuexemacro.cc:763
 hsuexemacro.cc:764
 hsuexemacro.cc:765
 hsuexemacro.cc:766
 hsuexemacro.cc:767
 hsuexemacro.cc:768
 hsuexemacro.cc:769
 hsuexemacro.cc:770
 hsuexemacro.cc:771
 hsuexemacro.cc:772
 hsuexemacro.cc:773
 hsuexemacro.cc:774
 hsuexemacro.cc:775
 hsuexemacro.cc:776
 hsuexemacro.cc:777
 hsuexemacro.cc:778
 hsuexemacro.cc:779
 hsuexemacro.cc:780
 hsuexemacro.cc:781
 hsuexemacro.cc:782
 hsuexemacro.cc:783
 hsuexemacro.cc:784
 hsuexemacro.cc:785
 hsuexemacro.cc:786
 hsuexemacro.cc:787
 hsuexemacro.cc:788
 hsuexemacro.cc:789
 hsuexemacro.cc:790
 hsuexemacro.cc:791
 hsuexemacro.cc:792
 hsuexemacro.cc:793
 hsuexemacro.cc:794
 hsuexemacro.cc:795
 hsuexemacro.cc:796
 hsuexemacro.cc:797
 hsuexemacro.cc:798
 hsuexemacro.cc:799
 hsuexemacro.cc:800
 hsuexemacro.cc:801
 hsuexemacro.cc:802
 hsuexemacro.cc:803
 hsuexemacro.cc:804
 hsuexemacro.cc:805
 hsuexemacro.cc:806
 hsuexemacro.cc:807
 hsuexemacro.cc:808
 hsuexemacro.cc:809
 hsuexemacro.cc:810
 hsuexemacro.cc:811
 hsuexemacro.cc:812
 hsuexemacro.cc:813
 hsuexemacro.cc:814
 hsuexemacro.cc:815
 hsuexemacro.cc:816
 hsuexemacro.cc:817
 hsuexemacro.cc:818
 hsuexemacro.cc:819
 hsuexemacro.cc:820
 hsuexemacro.cc:821
 hsuexemacro.cc:822
 hsuexemacro.cc:823
 hsuexemacro.cc:824
 hsuexemacro.cc:825
 hsuexemacro.cc:826
 hsuexemacro.cc:827
 hsuexemacro.cc:828
 hsuexemacro.cc:829
 hsuexemacro.cc:830
 hsuexemacro.cc:831
 hsuexemacro.cc:832
 hsuexemacro.cc:833
 hsuexemacro.cc:834
 hsuexemacro.cc:835
 hsuexemacro.cc:836
 hsuexemacro.cc:837
 hsuexemacro.cc:838
 hsuexemacro.cc:839
 hsuexemacro.cc:840
 hsuexemacro.cc:841
 hsuexemacro.cc:842
 hsuexemacro.cc:843
 hsuexemacro.cc:844
 hsuexemacro.cc:845
 hsuexemacro.cc:846
 hsuexemacro.cc:847
 hsuexemacro.cc:848
 hsuexemacro.cc:849
 hsuexemacro.cc:850
 hsuexemacro.cc:851
 hsuexemacro.cc:852
 hsuexemacro.cc:853
 hsuexemacro.cc:854
 hsuexemacro.cc:855
 hsuexemacro.cc:856
 hsuexemacro.cc:857
 hsuexemacro.cc:858
 hsuexemacro.cc:859
 hsuexemacro.cc:860
 hsuexemacro.cc:861
 hsuexemacro.cc:862
 hsuexemacro.cc:863
 hsuexemacro.cc:864
 hsuexemacro.cc:865
 hsuexemacro.cc:866
 hsuexemacro.cc:867
 hsuexemacro.cc:868
 hsuexemacro.cc:869
 hsuexemacro.cc:870
 hsuexemacro.cc:871
 hsuexemacro.cc:872
 hsuexemacro.cc:873
 hsuexemacro.cc:874
 hsuexemacro.cc:875
 hsuexemacro.cc:876
 hsuexemacro.cc:877
 hsuexemacro.cc:878
 hsuexemacro.cc:879
 hsuexemacro.cc:880
 hsuexemacro.cc:881
 hsuexemacro.cc:882
 hsuexemacro.cc:883
 hsuexemacro.cc:884
 hsuexemacro.cc:885
 hsuexemacro.cc:886
 hsuexemacro.cc:887
 hsuexemacro.cc:888
 hsuexemacro.cc:889
 hsuexemacro.cc:890
 hsuexemacro.cc:891
 hsuexemacro.cc:892
 hsuexemacro.cc:893
 hsuexemacro.cc:894
 hsuexemacro.cc:895
 hsuexemacro.cc:896
 hsuexemacro.cc:897
 hsuexemacro.cc:898
 hsuexemacro.cc:899
 hsuexemacro.cc:900
 hsuexemacro.cc:901
 hsuexemacro.cc:902
 hsuexemacro.cc:903
 hsuexemacro.cc:904
 hsuexemacro.cc:905