ROOT logo
#ifndef __CINT__
#include <TSystem.h>
#include <TSystemDirectory.h>
#include <TError.h>
#include <TString.h>
#include <TList.h>
#include <TFile.h>
#include <TROOT.h>
#include <TH1.h>
#include <TParameter.h>
#include "AliOADBForward.h"
#include <AliForwardCorrectionManager.h>
#include <AliCentralCorrectionManager.h>
#include <AliCorrectionManagerBase.h>
#else
class AliOADBForward;
class TSystemDirectory;
class AliCorrectionManagerBase;
class AliForwardCorrectionManager;
class AliCentralCorrectionManager;
class TFile;
#endif

struct Scanner
{
  /** 
   * Check if a path points to a file 
   * 
   * @param path Path
   * 
   * @return True if the path points to a regular file 
   *
   * @ingroup pwglf_forward_scripts
   */
  static Bool_t IsFile(const char* path)
  {
    FileStat_t stat; 
    gSystem->GetPathInfo(path, stat);
    if (stat.fIsLink || 
	R_ISDIR(stat.fMode) || 
	!R_ISREG(stat.fMode)) return false;
    return true;
    
#if 0
    Long_t id;
    Long_t size;
    Long_t flags;
    Long_t modtime;
    gSystem->GetPathInfo(path, &id, &size, &flags, &modtime);
    return !((flags & 0x2) == 0x2);
#endif
  }
  /** 
   * Test if we can open a file 
   * 
   * @param name    Name of file 
   * @param pattern Pattern to check against 
   * 
   * @return True on success
   */
  static Bool_t TestFile(const TString& name, const char* pattern=0)
  {
    // If this is not a root file, ignore 
    if (!name.EndsWith(".root")) return false;
    
    // If this file does not contain the pattern, ignore 
    if (pattern && pattern[0] != '\0' && !name.Contains(pattern)) return false;
    
    Bool_t ret  = true;
    TFile* test = TFile::Open(name.Data(), "READ");
    if (!test || test->IsZombie()) { 
      ::Warning("TestFile", "Failed to open file %s", name.Data());
      ret = false;
    }
    else 
      test->Close();
    return ret;
  }
  /** 
   * Scan a directory (optionally recursive) for data files to add to
   * the chain.  Only ROOT files, and files which name contain the
   * passed pattern are considered.
   * 
   * @param dir        Directory to scan
   * @param list       List to add data to 
   * @param pattern    Pattern that the file name must contain
   * @param recursive  Whether to scan recursively 
   *
   * @ingroup pwglf_forward_scripts
   */
  void
  ScanDirectory(TSystemDirectory* dir, TList* list, 
		const char* pattern, bool recursive)
  {
    // Get list of files, and go back to old working directory
    TString oldDir(gSystem->WorkingDirectory());
    TList* files = dir->GetListOfFiles();
    if (!files) return;
    gSystem->ChangeDirectory(oldDir);

    // Sort list of files and check if we should add it 
    files->Sort();
    TIter next(files);
    TSystemFile* file = 0;
    while ((file = static_cast<TSystemFile*>(next()))) {
      TString name(file->GetName());
    
      // Ignore special links 
      if (name == "." || name == "..") continue;

      // Check if this is a directory 
      if (file->IsDirectory()) { 
	if (recursive) 
	  ScanDirectory(static_cast<TSystemDirectory*>(file),list,
			pattern,recursive);
	continue;
      }
    
      // Get the path 
      TString data(Form("%s/%s", file->GetTitle(), name.Data()));

      // Check the fuile 
      if (!TestFile(data, pattern)) continue;
      list->Add(new TObjString(data));
    }
  }
  /** 
   * Scan data directory for files matching pattern 
   * 
   * @param datadir   Path to data directory 
   * @param pattern   File name match pattern 
   * @param recursive Recurse flag
   * 
   * @return List of file names
   */
  TList* Scan(const char* datadir, const char* pattern, bool recursive=false) 
  {
    // --- Get list of files --------------------------------------------
    // Open source directory, and make sure we go back to were we were 
    TString oldDir(gSystem->WorkingDirectory());
    TString path(gSystem->ExpandPathName(datadir));
    if (IsFile(path)) {
      Error("Scan", "%s is a file", datadir);
      return 0;
    }
    Info("Scan", "Scanning %s", path.Data());

    TList* ret = new TList;
    ret->SetOwner();
    TSystemDirectory d(datadir, path.Data());
    ScanDirectory(&d, ret, pattern, recursive);

    // Make sure we do not make an empty chain 
    if (ret->GetEntries() <= 0) { 
      Warning("Scane", "list is empty for input %s, %s", 
	      datadir, pattern);
      delete ret;
      ret = 0;
    }
    return ret;
  }
};


struct Extractor
{
  /** 
   * Constructor 
   * 
   * @param dirName   Directory name 
   * @param corrName  Correction name 
   * @param methName  Run number mode to set as default  
   * @param outFile   Output file 
   * @param cm        Correction manager to use 
   */
  Extractor(const char* dirName, 
	    const char* corrName,
	    const char* methName,
	    const char* outFile,
	    AliCorrectionManagerBase* cm)
    : fDirName(dirName), fCorrName(corrName), fMethName(methName), 
      fFile(outFile), fCM(cm)
  {
  }
  virtual ~Extractor() {}
  /** 
   * Extract files 
   * 
   * @return number of converted objects 
   */
  virtual Int_t Extract(const char* prefix="$ALICE_ROOT/PWGLF/FORWARD/corrections")
  {
    Scanner s;
    TString dir = TString::Format("%s/%s",
				  prefix, fDirName.Data());
    TList* l = s.Scan(dir, fCorrName);
    if (!l) {
      Warning("Extract", "No files matching %s found in %s",  
	      fCorrName.Data(), dir.Data()); 
      return 0;
    }

    TIter next(l);
    TObjString* os = 0;
    Int_t ret = 0;
    while ((os = static_cast<TObjString*>(next()))) { 
      TString& fn  = os->String();
      if (ExtractFile(fn)) ret++;
    }
    return ret;
  }
  /** 
   * Extract from a file 
   * 
   * @param fn File name 
   * 
   * @return true on success 
   */      
  virtual Bool_t ExtractFile(const TString& fn) 
  {
    UShort_t sys = 0;
    UShort_t sNN = 0;
    Short_t  fld = 0;
    Bool_t   mc  = false;
    
    ExtractFields(fn, sys, sNN, fld, mc);
    if (sNN == 2750) sNN = 2760;

    ULong_t runNo = ExtractRunNo(sys, sNN);
    if (runNo == 0xFFFFFFFF || runNo <= 0) return false;

    TObject* obj = ExtractObject(fn.Data());
    if (!obj) return false;

    // Run, sys, sNN, fld, mc, sat, obj, full, meth
    Info("", "File %s to be stored: run=%d sys=%d sNN=%d fld=%d mc=%d", 
	 fn.Data(), runNo, sys, sNN, fld, mc);
    return fCM->Store(obj, runNo, sys, sNN, fld, mc, 
		      false, fFile, fMethName);
  }
  /** 
   * Extract fields from file name 
   * 
   * @param s    File name 
   * @param sys  System 
   * @param sNN  Energy 
   * @param fld  Field 
   * @param mc   MC flag
   */    
  virtual void ExtractFields(const TString& s, 
			     UShort_t& sys, 
			     UShort_t& sNN, 
			     Short_t&  fld, 
			     Bool_t&   mc) 
  {
    TString    str    = gSystem->BaseName(s.Data());
    str.ReplaceAll(".root", "");
    TObjArray* tokens = str.Tokenize("_");
    // tokens->ls();

    TString&   sSys   = ((TObjString*)(tokens->At(1)))->String();
    TString&   sSNN   = ((TObjString*)(tokens->At(2)))->String();

    if      (sSys.EqualTo("pbpb", TString::kIgnoreCase))     sys = 2;
    else if (sSys.EqualTo("ppb",  TString::kIgnoreCase))     sys = 3;
    else if (sSys.EqualTo("pp",   TString::kIgnoreCase))     sys = 1;
    
    sSNN.ReplaceAll("GeV", "");
    Info("", "sSNN=%s -> ", sSNN.Data());
    while (sSNN[0] == '0' && sSNN.Length() > 1) sSNN.Remove(0, 1);
    sNN = sSNN.Atoi();
    Info("", "sSNN=%s sNN=%d", sSNN.Data(), sNN);

    if (tokens->GetEntries() > 3) {
      TString&   sFld   = ((TObjString*)(tokens->At(3)))->String();
      sFld.ReplaceAll("kG", "");
      while (sFld[0] == '0' && sFld.Length() > 1) sFld.Remove(0, 1);
      sFld.ReplaceAll("p", "+");
      sFld.ReplaceAll("m", "-");
      fld = sFld.Atoi();
    }

    if (tokens->GetEntries() > 4) { 
      TString& sMC = ((TObjString*)(tokens->At(4)))->String();
      mc = sMC.EqualTo("mc", TString::kIgnoreCase);
    }
    tokens->Delete();
    // Info("Extract", "%s -> %d %d %d %d", str.Data(), sys, sNN, fld, mc);
  }
  /** 
   * Get run number corresponding to arguments 
   * 
   * @param sys  System
   * @param sNN  Energy
   * 
   * @return run number 
   */
  virtual ULong_t ExtractRunNo(UShort_t sys, UShort_t sNN)
  {
    ULong_t run = 0;
    switch (sys) { 
    case 1: // pp 
      switch (sNN) { 
      case 900:   run = 118502; break;
      case 2760:  run = 146686; break;
      case 7000:  run = 114747; break;
      case 14000: run = 0xFFFFFFFF; break;
      }
      break;
    case 2: // PbPb 
      switch (sNN) { 
      case 2760: run = 137123; break;
      }
      break;
    case 3: // pPb 
      switch (sNN) {
      case 5023: run = 188246; break;
      }
      break;
    }
    if (run == 0) 
      Warning("ExtractRunNo", 
	      "Unknown energy %d for collision system %d", sNN, sys);
    return run;
  }
  /** 
   * Extract a single object from the file 
   * 
   * @param fn  File name 
   * 
   * @return Object or null
   */
  virtual TObject* ExtractObject(const TString& fn)
  {
    TFile* file = TFile::Open(fn.Data(), "READ");
    if (!file) { 
      Error("ExtractObject", "Failed to open %s", fn.Data());
      return 0;
    }
    // file->ls();
    
    TObject* obj =  file->Get(fCorrName);
    if (!obj) { 
      Error("ExtractObject", "Failed to get %s from %s", 
	    fCorrName.Data(), fn.Data());
      return 0;
    }
    file->Close();
    return obj;
  }
  TString fDirName;
  TString fCorrName;
  TString fMethName;
  TString fFile;
  AliCorrectionManagerBase* fCM;
};

//====================================================================
struct NormExtractor : public Extractor
{
  enum { 
    kINEL, 
    kNSD, 
    kINELGT0
  };
  TString fFileName;
  /** 
   * Constructor 
   * 
   * @param dirName 
   * @param corrName 
   * @param methName 
   * 
   * @return 
   */
  NormExtractor(const char* dirName, 
		const char* corrName,
		const char* methName)
    : Extractor(dirName,corrName,methName,"",0),
      fFileName("")
  {
  }
  /** 
   * Extract 
   * 
   * 
   * @return Number of converted oject
   */
  virtual Int_t Extract()
  {
    Fatal("Extract", "Cannot use this");
    return -1;
  }
  /** 
   * Extract 
   * 
   * @param s Source 
   *
   * @return Number of converted oject
   */
  virtual Bool_t ExtractFile(const TString& s)
  {
    Fatal("ExtractFile", "Cannot use this (%s)", s.Data());
    return -1;
  }
  /** 
   * Extract files 
   * 
   * @param db        Database manager 
   * @param fileName  File to store in 
   * 
   * @return number of converted objects 
   */
  virtual Int_t ExtractNorm(AliOADBForward& db, const char* fileName)
  {
    Scanner s;
    TString dir = TString::Format("$ALICE_ROOT/PWGLF/FORWARD/corrections/%s",
				  fDirName.Data());
    TList* l = s.Scan(dir, fCorrName);
    if (!l) {
      Warning("ExtractNorm", "No files matching %s found in %s",  
	      fCorrName.Data(), dir.Data()); 
      return 0;
    }

    fFileName = fileName;
    // if (!Open(db, fileName)) return 0;
    TIter next(l);
    TObjString* os = 0;
    Int_t ret = 0;
    while ((os = static_cast<TObjString*>(next()))) { 
      TString& fn  = os->String();
      if (ExtractNormFile(fn, db)) ret++;
    }
    return ret;
  }
  /** 
   * Overload to store file name 
   * 
   * @return true
   */
#if 0
  virtual Bool_t Open(AliOADBForward& db, 
		      const Char_t* fileName) 
  { 
    fFileName = fileName; 
    Info("Open", "file name set to %s", fFileName.Data());
    return true;
  }
#endif
  /** 
   * Store object in DB
   * 
   * @param db     Database manager
   * @param tab    Table name 
   * @param o      Object to stire 
   * @param runNo  Run number
   * @param sys    System
   * @param sNN    Energy
   * 
   * @return true on success
   */
  virtual Bool_t Store(AliOADBForward& db, const TString& tab, TObject* o, 
		       ULong_t runNo, UShort_t sys, UShort_t sNN)
  {
    Info("Store", "file name to store in %s", fFileName.Data());
    if (!db.Open(fFileName, Form("%s/%s", tab.Data(), fMethName.Data()), 
		 true, true)) { 
      Warning("Store", "Failed to open for %s/%s", tab.Data(), 
	      fMethName.Data());
      return false;
    }
    return db.Insert(tab, o, runNo, sys, sNN, 0, false, false);
  }
  /** 
   * Extract a histogram 
   * 
   * @param what  Name part
   * @param runNo Run number
   * @param sys   System
   * @param sNN   Energy 
   * @param f     File to read from 
   * @param db    Database manager 
   * 
   * @return true on success
   */    
  virtual Bool_t ExtractHist(Int_t what, ULong_t runNo, 
			     UShort_t sys, UShort_t sNN,
			     TFile& f, AliOADBForward& db)
  {
    TString oName;
    switch (what) { 
    case kINEL:    oName = "hInelNormalization";    break;
    case kNSD:     oName = "hNSDNormalization";     break;
    case kINELGT0: oName = "hINELGT0Normalization"; break;
    }                       
    TObject* obj = f.Get(oName);
    if (!obj) {
      Warning("ExtractHist", "Object %s not found", oName.Data());
      return false;
    }
    
    TString tName;
    TString ttName;
    switch (what) { 
    case kINEL:     tName = "normalizationINEL";    ttName = "INEL";   break;
    case kNSD:      tName = "normalizationNSD";     ttName = "NSD";    break;
    case kINELGT0:  tName = "normalizationINELGT0"; ttName = "INEL>0"; break;
    }
    TH1* hist = static_cast<TH1*>(obj->Clone(tName));
    hist->SetDirectory(0);
    hist->SetTitle(Form("Normalization for %s", ttName.Data()));
    // obj->SetName(tName.Data());

    return Store(db, tName, hist, runNo, sys, sNN);
  }
  /** 
   * Extract a number 
   * 
   * @param what  Name part
   * @param runNo Run number
   * @param sys   System
   * @param sNN   Energy 
   * @param f     File to read from 
   * @param db    Database manager 
   * 
   * @return true on success
   */    
  virtual Bool_t ExtractNum(Int_t what, ULong_t runNo, 
			    UShort_t sys, UShort_t sNN,
			    TFile& f, AliOADBForward& db)
  {
    TString oName;
    switch (what) { 
    case kINEL:    oName = "inelTriggerEff";    break;
    case kNSD:     oName = "nsdTriggerEff";     break;
    case kINELGT0: oName = "inelgt0TriggerEff"; break;
    }
    TObject* obj = f.Get(oName);
    if (!obj) {
      Warning("ExtractHist", "Object %s not found", oName.Data());
      return false;
    }
    
    TString tName;
    switch (what) { 
    case kINEL:     tName = "triggerEffINEL";    break;
    case kNSD:      tName = "triggerEffNSD";     break;
    case kINELGT0:  tName = "triggerEffINELGT0"; break;
    }
    TParameter<float>* p = static_cast<TParameter<float>*>(obj->Clone(tName));
    
    return Store(db, tName, p, runNo, sys, sNN); 
  }
  /** 
   * Extract from a file 
   * 
   * @param fn File name 
   * @param db database manager 
   * 
   * @return true on success 
   */      
  virtual Bool_t ExtractNormFile(const TString& fn, AliOADBForward& db) 
  {
    UShort_t sys = 0;
    UShort_t sNN = 0;
    Short_t  fld = 0;
    Bool_t   mc  = false;
    
    ExtractFields(fn, sys, sNN, fld, mc);
    if (sNN == 2750) sNN = 2760;

    ULong_t runNo = ExtractRunNo(sys, sNN);
    if (runNo == 0xFFFFFFFF || runNo <= 0) return false;


    TFile* f = TFile::Open(fn, "READ");
    if (!f) { 
      Error("ExtractFile", "Failed to open %s", fn.Data());
      return false;
    }
    ExtractHist(kINEL,   runNo, sys, sNN, *f, db);
    ExtractHist(kNSD,    runNo, sys, sNN, *f, db);
    ExtractHist(kINELGT0,runNo, sys, sNN, *f, db);
    ExtractNum(kINEL,    runNo, sys, sNN, *f, db);
    ExtractNum(kNSD,     runNo, sys, sNN, *f, db);
    ExtractNum(kINELGT0, runNo, sys, sNN, *f, db);
    return true;
  }
};

//====================================================================
Extractor*
MakeFMDExtractor(const char* dir, const char* name)
{
  return new Extractor(dir, name, "NEAR", "fmd_corrections.root", 
		       &(AliForwardCorrectionManager::Instance()));
}
Extractor*
MakeSPDExtractor(const char* dir, const char* name)
{
  return new Extractor(dir, name, "NEAR", "spd_corrections.root", 
		       &(AliCentralCorrectionManager::Instance()));
}

void
MigrateOADB(Int_t what=0x3)
{
  gROOT->Macro("$ALICE_ROOT/PWGLF/FORWARD/analysis2/scripts/LoadLibs.C");

  if (what & 0x1) {
    Extractor*  ee[] = {
      MakeFMDExtractor("Acceptance",        "acceptance"),
      MakeFMDExtractor("CentralAcceptance", "centralacceptance"),
      MakeFMDExtractor("CentralSecMap",     "centralsecmap"),
      MakeFMDExtractor("DoubleHit",         "doublehit"),
      MakeFMDExtractor("ELossFits",         "elossfits"),
      MakeFMDExtractor("MergingEfficiency", "merging"),
      MakeFMDExtractor("SecondaryMap",      "secondary"),
      MakeFMDExtractor("VertexBias",        "vertexbias"),
      MakeSPDExtractor("CentralSecMap",    "centralsecmap"),
      MakeSPDExtractor("CentralAcceptance","centralacceptance"),
      0 };

    gSystem->Unlink("fmd_corrections.root");
    gSystem->Unlink("spd_corrections.root");
    
    Extractor** ep   = ee;
    while (*ep) { 
      (*ep)->Extract();
      ep++;
    }
  }

  if (what & 0x2) {
    gSystem->Unlink("normalization.root");
    
    NormExtractor e7("Normalization",
		     "normalizationHists", 
		     "NEAR");
    AliOADBForward ndb;
    TString ntables;
    e7.ExtractNorm(ndb,"normalization.root");
  }
}

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