ROOT logo
//
//
// Last change: 30.9.10  M. Weber

#include "htrb2unpacker.h"
#include "hdatasource.h"
#include "hdebug.h"
#include "hades.h"
#include "hevent.h"
#include "hldsubevt.h"
#include "heventheader.h"
#include "htrbnetaddressmapping.h"
#include "htrb2correction.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
using namespace std;

#define REF_DIFF 100

//_HADES_CLASS_DESCRIPTION 
////////////////////////////////////////////////////////////////////////////////
//                     HTrb2Unpacker
//            Base class for TRB data unpacking.
//  Any detector connected to TRB board should use this class to decode the subevent. 
//  Decode() method fills the arrays with information about: 
//  channel number (0-127), 
//  measured time, 
//  measured width.
//
//  The goal is to provide data which can be directly used by subsystems 
//  (tof, start, hodo, wall) in order to directly fill raw categories.
//
//  The most important information is stored in:	   
//  trbLeadingTime[ TrbChanNb ][ hitNb ],
//  trbADC[ TrbChanNb ][ hitNb ]. 
//  trbLeadingMult[ TrbChanNb ]
//
//  In case of Leading and Trailing mode the leading time and trailing time 
//  are delivered in separate data words. In this mode it can happen that 
//  a trailing time is missing. In such case trailing time is set to -1000000 
//  and width is set to -1. 
//
//  The information in Arrays is ordered in following way:
//  1. Leading Time has to exist -> fill trbLeadingTime[ TrbChanNb ][ hitNb ];
//  2. If Trailing time is found we try to marge it with last Leading Time.
//     If Trailing time does not exist trbLeadingTime[ TrbChanNb ][ hitNb ] = -1000000
//     If more than 1 Trailing time exist for one Leading Time the last one is used.
//  3. Width is calculated only if Trailing time exist. 
//
//  Max. number of hits per channel is currently set to 10. 
//
//  Decode:
//  The decode function returns dfferent values for different cases:
//    100  - end of subevent, stop decoding by purpose
//     10  - CTS information -> go to next subsubevt
//      0  - error, decoding failed
//      1  - data  decode 
//
//
//  Special :
//
//  Try recover wrong blocksize information ( like corrupted data beam apr12, day 116)
//  To fixes are implemented and active by default.
//  The fixes (tryRecover_1,tryRecover_2, see decode())
//  can be enabled/disabled by  :   void tryRecover(Bool_t case1=kTRUE,Bool_t case2=kTRUE);
//
//
//  In addition this class should perform basic data corrections and error handling.
//  (in preparation)
/////////////////////////////////////////////////////////////////////////////////


ClassImp(HTrb2Unpacker)

HTrb2Unpacker::HTrb2Unpacker(UInt_t id)  {

  subEvtId=id;

  debugFlag       = 0;
  uTrbNetAdress   = 0;
  trbDataVer      = 0;
  trbinlcorr      = 0;
  trbaddressmap   = 0;
  uStartPosition  = 0;
  uSubBlockSize   = 0;
  nCountWords     = 0;

  correctINL      = kFALSE;
  correctINLboard = kFALSE;
  highResModeOn   = kFALSE;
  quietMode       = kFALSE;
  reportCritical  = kFALSE;
  trbDataPairFlag = kFALSE;

  tryRecover_1=kTRUE;
  tryRecover_2=kTRUE;

  clearAll();
}

void HTrb2Unpacker::clearAll(void) {

  for(Int_t i=0; i<128; i++){
    for(Int_t k=0; k<10; k++){
      
      trbLeadingTime[i][k]     = -1000000;
      trbTrailingTime[i][k]    = -1000000;
      trbADC[i][k]           = -1; 
      
     }  
    
    trbDataExtension[i]     = 0;
    trbLeadingMult[i]       = 0;  
    trbTrailingMult[i]      = 0;  
    trbTrailingTotalMult[i] = 0;
  }
  
  highResModeOn    = kFALSE;
  correctINLboard  = kFALSE;

}

Int_t HTrb2Unpacker::correctRefTimeCh(Int_t refChan) {

  ///////////////////////////////////////////
  // Reference signal from channel <refCh> of TDC chip
  // is used for correction of corresponding TDC chns 
  //
  // Example:
  // for <refChan> = 32 (low resolution mode)
  // correct chns 0-31   with chn 31
  // correct chns 31-63  with chn 63
  // correct chns 64-95  with chn 95
  // correct chns 96-127 with chn 127
  //
  //
  // for <refChan> = 8 (high resolution mode)
  // correct chns 0-7   with chn 7
  // correct chns 8-15  with chn 15
  // correct chns 16-23 with chn 23
  // correct chns 24-31 with chn 31
  //  
  //
  // Also physical timing signal on reference channel
  // --> compare all 4 reference channels and get 
  // timing signal which is in all channels (+- <REF_DIFF> bins)
  //
  // Call this function only if channel <refCh> contains
  // reference time.
  //
  // If now refernce time is found all arrays will be set to default
  ///////////////////////////////////////////

  Int_t nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();

  Float_t corrTime[4][10];
  Float_t refTime[4] = {- 1000000,- 1000000,- 1000000,- 1000000};

  Int_t refCh        = -1;
  Int_t jo           = -1; 

  Bool_t bRefTime    = kFALSE;
  Bool_t flag        = kFALSE;

  Int_t refDiff      = REF_DIFF;
  
  // veto needs bigger window
  // --> Parameter container ???
  if(refChan==8) refDiff = 1000;

  // scan all arrays which contain time data and do correction
  for(Int_t jj=0; jj<4; jj++) {  

    // First check if there is ANY data on a TDC, if not, skip it
    flag   = kFALSE;
    jo     = jj*refChan;
    for(Int_t ll=0; ll<refChan; ll++) { 
      if( trbLeadingMult[jo+ll]>0){
	flag = kTRUE; 
	break;
      }
    }
    if(!flag) continue;

    //If there is data, check reference channel
    flag  = kFALSE;
    refCh = jo + refChan-1;

    for(Int_t kk=0; kk<trbLeadingMult[refCh]; kk++) {

	corrTime[jj][kk] = trbLeadingTime[refCh][kk];

      // Now find the common correction time (only for j > 0)
      //
      // first we have to compare all leading times of TDC chip 0 
      // with TDC chip 1 to get the reference in 0
      if(jj == 1 ){
	for(Int_t mm=0; mm<trbLeadingMult[refChan-1]; mm++) {
	  
	  refTime[0] = corrTime[0][mm];

	  // same time if inside +- <REF_DIFF> bins
	  if( refTime[0] - corrTime[jj][kk] > -refDiff &&
	      refTime[0] - corrTime[jj][kk] < refDiff){
	    
	    refTime[jj]   =  corrTime[jj][kk];
	    
	    flag = kTRUE;
	    break;
	  }
	}
      }
      
      // for TDC chip 2 and 3 we compare to found reference time in chip 0
      else if(jj > 1){
	if( refTime[0] - corrTime[jj][kk] > -refDiff &&
	    refTime[0] - corrTime[jj][kk] < refDiff){
	
	  refTime[jj]   =  corrTime[jj][kk];
	  flag = kTRUE;
	}
      }
    }
  


    // if one TDC chip fails, there is no reference time for this event
    if(jj > 0 ){ 
      if(flag) bRefTime = kTRUE;
      else{
	bRefTime = kFALSE;
	break;
      }
    }
    
  }


  // If NO reference time -> set all to default values
  if(bRefTime == kFALSE ){
      if(!quietMode) {
	  if( !gHades->isCalibration() ){
	      Warning("correctRefTimeCh","Event %d --> No Ref Time! SubEvtID 0x%x, TRBid 0x%x",nEvt,subEvtId,uTrbNetAdress);
	      Warning("reference times:","%f %f %f %f",refTime[0],refTime[1],refTime[2],refTime[3]);
	  }
      }
    clearAll();
  }

  // ELSE do the correction 
  else{
    for(Int_t jj=0; jj<4; jj++) {  
      jo=jj*refChan;
      for(Int_t ll=0; ll<refChan; ll++) {  
	Int_t ii;
	ii=jo+ll;
	for(Int_t kk=0; kk<trbLeadingMult[ii]; kk++) {

	  trbLeadingTime[ii][kk]  = trbLeadingTime[ii][kk] - refTime[jj];   
	  trbTrailingTime[ii][kk] = trbTrailingTime[ii][kk] - refTime[jj];  

	}
      }
    }
  }

  return 0;
}

Int_t HTrb2Unpacker::correctRefTimeCh31(void) {

  ///////////////////////////////////////////
  // Reference signal from channel 31 of TDC
  // is used for correction of corresponding TDC chns
  // this is not the final version of
  // hardware design
  // call this function only if channel 31 contains
  // reference time
  ///////////////////////////////////////////

  Bool_t flag      = kFALSE;
  Int_t refCh      = -1; 
  Int_t jo         = -1;
  Float_t corrTime = 0.;


  // scan all arrays which contain time data and do correction
  for(Int_t jj=0; jj<4; jj++) {      

    // First check if there is ANY data on a TDC, if not, skip it
    flag  = kFALSE;
    jo    = jj*32;
    for(Int_t ll=0; ll<32; ll++) {  
      if( trbLeadingMult[jo+ll]>0){
	flag = kTRUE;
	break;
      }
    }
    if(!flag) continue;

    //If there is data, check reference channel
    refCh    = jo + 31;
    corrTime = trbLeadingTime[refCh][0];


    // If NO reference time -> set all to default values
    if(corrTime <= -1000000 ){
      if(!quietMode ) {
	if( !gHades->isCalibration() )Info("correctRefTimeCh","No Ref Time! SubEvtID 0x%x, TRBid 0x%x",subEvtId,uTrbNetAdress);
      }
      clearAll();
    }
    
    // ELSE do the correction 
    else{
      for(Int_t ll=0; ll<32; ll++) {  // For all TDC channels
	Int_t ii;
	ii=jo+ll;
	for(Int_t kk=0; kk<10; kk++) {
	  trbLeadingTime[ii][kk]  = trbLeadingTime[ii][kk]  - corrTime + 40000;// We want poitive times here; 20000 ~ 2us
	  trbTrailingTime[ii][kk] = trbTrailingTime[ii][kk] - corrTime + 40000;// thats bigger than max time window of TDC
	}
      }
    }
  }
  
  return 0;
}

Int_t HTrb2Unpacker::correctRefTimeCh127(void) {

  ///////////////////////////////////////////
  // Reference signal from channel 127 (last in TRB)
  // ist used for correction of ALL TDCs
  // this is not the final version of
  // hardware design
  // call this function only if channel 127 contains
  // reference time
  ///////////////////////////////////////////

  Float_t corrTime = 0.;;

  corrTime = trbLeadingTime[127][0];

  // If NO reference time -> set all to default values
  if(corrTime <= -1000000 ){
    if(!quietMode) {
      if( !gHades->isCalibration() )Info("correctRefTimeCh","No Ref Time! SubEvtID 0x%x, TRBid 0x%x",subEvtId,uTrbNetAdress);
    }
    clearAll();
  }
  
  // ELSE do the correction 
  else{
    for(Int_t jj=0; jj<128; jj++) {  // For all channels
      for(Int_t kk=0; kk<10; kk++) {
	trbLeadingTime[jj][kk]  = trbLeadingTime[jj][kk] - corrTime + 40000;// We want poitive times here; 20000 ~ 2us
	trbTrailingTime[jj][kk] = trbTrailingTime[jj][kk] - corrTime + 40000;// thats bigger than max time window of TDC
      }
    }
  }
  return 0;
}

Int_t HTrb2Unpacker::correctRefTimeStartDet23(void) {

  ///////////////////////////////////////////
  // Reference signal from channel 23 of TDC chip
  // is used for correction of corresponding TDC chns 
  //
  ///////////////////////////////////////////

  Float_t corrTime = trbLeadingTime[23][0];
  
  // If NO reference time -> set all to default values
  if(corrTime <= -1000000 ){
    if(!quietMode) {
      if( !gHades->isCalibration() )Info("correctRefTimeStartDet23","No Ref Time! SubEvtID 0x%x, TRBid 0x%x",subEvtId,uTrbNetAdress);
    }
    clearAll();
  }
  
  // ELSE do the correction 
  else{
    for(Int_t ii=0; ii<32; ii++) {  
      for(Int_t kk=0; kk<trbLeadingMult[ii]; kk++) {
	trbLeadingTime[ii][kk]  = trbLeadingTime[ii][kk] - corrTime;   
	trbTrailingTime[ii][kk] = trbTrailingTime[ii][kk] - corrTime;  
      }
    }
  }
  
  return 0;
}

Int_t HTrb2Unpacker::correctOverflow(void) {

  ///////////////////////////////////////////
  // TDC overflow has to be corrected
  ///////////////////////////////////////////

  // This is not necessary if the substract window bit is set in the TDCs

  return 0;
}


Bool_t HTrb2Unpacker::fill_pair(Int_t ch,Float_t time,Float_t length) {

  ///////////////////////////////////////////
  // Stores the given time in the next data element
  // and sets the multiplicity.
  // Return kFALSE if 10 hits are already stored.
  ///////////////////////////////////////////

  if( trbLeadingMult[ch]<10) {
    trbLeadingTime[ch][trbLeadingMult[ch]]=time;
    trbTrailingTime[ch][trbLeadingMult[ch]]=time+length;
  }
  trbLeadingMult[ch]++;
  trbTrailingMult[ch]=trbLeadingMult[ch];
  return (trbLeadingMult[ch]<=10);

}

Bool_t HTrb2Unpacker::fill_lead(Int_t ch, Float_t time) {

  ///////////////////////////////////////////
  // Stores the given time in the next data element
  // and sets the multiplicity.
  // Return kFALSE if 10 hits are already stored.
  ///////////////////////////////////////////

  if( trbLeadingMult[ch]<10){
    trbLeadingTime[ch][trbLeadingMult[ch]]=time;
  }
  trbLeadingMult[ch]++;
  return(trbLeadingMult[ch]<=10);
}


Bool_t HTrb2Unpacker::fill_trail(Int_t ch, Float_t time) {

  ///////////////////////////////////////////
  // Calculates the time between trailing and LAST(!) leading hit.
  // No other check if its really the right one,
  // i am depending on the TDC to deliver the right order
  // Return kFALSE if no leading yet or more than 4 Hits
  ///////////////////////////////////////////

  trbTrailingTotalMult[ch]++;
   
  Int_t m = -1;     // Leading Multiplicity
  m=trbLeadingMult[ch];
  if(m==0) return kFALSE;

  if( m<=10) {
    if( trbTrailingMult[ch]!=m) {
      trbTrailingTime[ch][m-1]=time;
      trbADC[ch][m-1] = time - trbLeadingTime[ch][m-1];
      if(trbADC[ch][m-1]<0) { // either a big error or an overflow because off too big time windows
	trbADC[ch][m-1]+=0x80000; // correct for overflow
      }
    } else {
      return kFALSE; // In this case we already have one trailing
    }
  }
  trbTrailingMult[ch]=m;

  return(trbTrailingMult[ch]<=10);
}


// correct INL of HPTDC for a single DATA word  
Float_t HTrb2Unpacker::doINLCorrection(Int_t nTrbCh, Int_t nRawTime)
{  
  Int_t nTimeHigh, nTimeLow;
  Float_t fCorrectedTime;

  if(correctINL == kTRUE  && correctINLboard == kTRUE ){
    if( highResModeOn == kTRUE ){            //correct INL for 25ps/channel
      
      nTimeHigh = ( nRawTime & 0x1FFC00);  // 11 MSB
      nTimeLow  = ( nRawTime & 0x003ff );  // 10 LSB 
      
      fCorrectedTime = (Float_t)( (Float_t)nTimeLow  +
				  ( trbinlcorr->getCorrection( (nTrbCh*4)+(Int_t)(nTimeLow / 256.0), (nTimeLow % 256) ) ));
      fCorrectedTime = (Float_t)( (Float_t)nTimeHigh + fCorrectedTime);
      
      if(debugFlag > 0){
	cout<<"==TRB_Res_25ps, chan: "<<nTrbCh<<", measured time: "<<nRawTime<<", corrected:"<<fCorrectedTime<<
	  ", correction:"<<( trbinlcorr->getCorrection( (nTrbCh*4)+(Int_t)(nTimeLow / 256.0), (nTimeLow % 256) ) )
	    <<"  --BIN: "<<nTimeLow<<" newCh: "<<(nTrbCh*4)+(Int_t)(nTimeLow / 256.0)<<" binInParHist: "<<( (nTimeLow % 256)  )<< endl;
      }
    } 
    
    else{      //correct INL for 100ps/channel
      
      nTimeHigh = ( nRawTime & 0x7ff00 );
      nTimeLow  = ( nRawTime & 0x000ff );  
      fCorrectedTime = (Float_t)( (Float_t)nTimeLow  +
				  ( trbinlcorr->getCorrection( nTrbCh , nTimeLow ) ));
      fCorrectedTime = (Float_t)( (Float_t)nTimeHigh + fCorrectedTime);
      
      if(debugFlag > 0){
	cout<<"==chan: "<<nTrbCh<<", measured time: "<<nRawTime<<", corrected:"<<fCorrectedTime<<
	  ", correction:"<<( trbinlcorr->getCorrection( nTrbCh , nTimeLow ) )<<endl;
      }
    }
  }
  
  //no INL correction will be done
  else{  
    fCorrectedTime = (Float_t)nRawTime;
  }
  
  return fCorrectedTime;
}



void HTrb2Unpacker::printTdcError(UInt_t e, UInt_t subEvntId) {
  const Char_t *e_str[15]={
      "Hit lost in group 0 from read-out FIFO overflow",
      "Hit lost in group 0 from L1 buffer overflow",
      "Hit error have been detected in group 0",
      "Hit lost in group 1 from read-out FIFO overflow",
      "Hit lost in group 1 from L1 buffer overflow",
      "Hit error have been detected in group 1",
      "Hit lost in group 2 from read-out FIFO overflow",
      "Hit lost in group 2 from L1 buffer overflow",
      "Hit error have been detected in group 2",
      "Hit lost in group 3 from read-out FIFO overflow",
      "Hit lost in group 3 from L1 buffer overflow",
      "Hit error have been detected in group 3",
      "Hits rejected because of programmed event size limit",
      "Event lost (trigger FIFO overflow)",
      "Internal fatal chip error has been detected"
  };

  if(e==0) return;// No Error

  cout << "=== TRB/TDC Error analysis: TRB id = " <<subEvntId<< endl;
  for(Int_t i=0; i<15; i++){
    if( e&0x1){
      cout << e_str[i] << endl;
    }
    e>>=1;
  }
  cout << "===" << endl;
}

Int_t HTrb2Unpacker::decode(void) {

  clearAll();

  UInt_t nEvt         = 0;  // Evt SeqNumber
  UInt_t nSizeCounter = 0;  // should go to the class member !!!!!
  UInt_t nTdcEvtId    = 0;
  UInt_t TdcDataLen   = 0;

  Int_t TdcId         = 0;

  uSubBlockSize    = 0;
  uTrbNetAdress    = 0;
  trbDataVer       = 0;
  trbExtensionSize = 0;
  trbDataPairFlag  = kFALSE;

  Bool_t wasRecovered=kFALSE;


  UInt_t* data = pSubEvt->getData();
  UInt_t* end  = pSubEvt->getEnd();
  nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();


  if(debugFlag > 0) {
    cout<<"-0-EvNb "<<nEvt<<" -nSizeCounter: "<<nSizeCounter<<", "<<hex<<"data word: "<<*data<<dec<<"  --NetSubevent(TRB) Header"<<endl;
  }

  // jump to current SubSubEvent
  data = data + uStartPosition; 
  UInt_t* data_c1 = data; // copy for TRB extension loop
  UInt_t* data_c2 = data; // copy for TDC loop

  if(debugFlag > 0){
    cout<<"-0a-EvNb "<<nEvt<<" -uStartPosition: "<<uStartPosition<<", "<<hex<<"data word: "<<*data<<dec<<"  --"<<endl;
  }

  uSubBlockSize=(*data>>16)&0xFFFF;   // No. of the data words from one TRB board
  uTrbNetAdress=*data&0xFFFF;         // TRB net Adddress (Old TRB subevent id)

  if(uSubBlockSize > (UInt_t)(end-data)){
      if(tryRecover_1)Error("decode()","Event %d --> SubBlkSize out of subevt. Blksize=%d. Try to recover.",nEvt,uSubBlockSize);
      else            Error("decode()","Event %d --> SubBlkSize out of subevt. Blksize=%d.",nEvt,uSubBlockSize);

      if(!tryRecover_1) {
	  uStartPosition=0;
	  return 0;
      }

      //-----------------------------------------------------------------------------
      // try to recover the data by looping forward until next
      // valid address is found. (apr12 beam, day 116)
      Int_t        ct= 0;
      Bool_t reCover = kFALSE;

      while(data<end){ // still inside subevent
	  ct++;
          data +=1;
	  uSubBlockSize=(*data>>16)&0xFFFF;   // No. of the data words from one TRB board
          uTrbNetAdress=*data&0xFFFF;         // TRB net Adddress (Old TRB subevent id)
	  uStartPosition+=1;

	  if( ((   uTrbNetAdress>=0x4000
	        && uTrbNetAdress<=0x5000 )
                || uTrbNetAdress==0x5555)
	     && uSubBlockSize>0
	     && uSubBlockSize<200){

	      data_c1 = data;
              data_c2 = data;
	      reCover = kTRUE;
              wasRecovered=kTRUE;
	      break;
	  }
      }
      if(!reCover) { // bad luck
	  cout<<"Recover failed."<<endl;
	  uStartPosition = 0;
	  return 0;
      }
      //-----------------------------------------------------------------------------

    }


  // check TRBNetAdress
  // IF TRBNet debug information
  if ( uTrbNetAdress == 0x5555 ) {
    decodeTrbNet(data,subEvtId);
    data+=(uSubBlockSize)+1;

    uStartPosition = 0; // reset the Start position for the next Event
    if( debugFlag > 0){
      cout << "++++> stopping decode(), dataword: " << hex << *data << dec << endl;
    }
    return 100;
  }

  // IF CTS -> skip & 
  // skip if its a hub in the 0x8000 range (added by JanM 20140430
  if(uTrbNetAdress <= 0x00FF || ((uTrbNetAdress & 0xF000) == 0x8000)){
    return 10;
  }

  // ELSE unpack TRB - TDC data
  // ------------------------- 
  // 1. Should INL correction be done ?
  // -------------------------
  if (correctINL == kTRUE){

    trbinlcorr = trbaddressmap->getBoard(uTrbNetAdress);
    
    // if there is no mapping table it is not possible to decide if the INL correction should be done
    if(trbinlcorr == NULL ){
      Error("decode()","Event %d -->  No mapping table data for TRB net adress 0x%x",nEvt,uTrbNetAdress);
      return kFALSE;
    }
    
    else{
      
      // decide if INL correction should be done for this board
      if (trbinlcorr->getNChannels() > 0  ){
	correctINLboard = kTRUE;
      }
      else{
	if( debugFlag > 0) Warning("decode()","Event %d -->  No INL corr data for TRB net adress 0x%x",nEvt,uTrbNetAdress);
	correctINLboard = kFALSE;
      }
    }
  }

  // ------------------------- 
  // 2. control the SubSubEvent size
  // -------------------------
  UInt_t uSubBlockSizeTest = (*(data+1)&0xFFFF);
  if(uSubBlockSize != uSubBlockSizeTest){
    if(tryRecover_2)Error("decode","Event %d -->  SubBlkSize from TRBnet ( %04x ) != SubBlkSize from subsubevt ( %04x ). Try to recover.",nEvt,uSubBlockSize,*(data+1)&0xFFFF);
    else            Error("decode","Event %d -->  SubBlkSize from TRBnet ( %04x ) != SubBlkSize from subsubevt ( %04x )",nEvt,uSubBlockSize,*(data+1)&0xFFFF);

    if(!tryRecover_2) {
	uStartPosition=0;
	return 0;
    }


    //-----------------------------------------------------------------------------
    // try to recover the data by looping forward until next
    // valid address is found and correct the uSubBlockSize  (apr12 beam, day 116)
    UInt_t        ct= 0;
    Bool_t reCover = kFALSE;

    UInt_t* data2=data;
    UInt_t  uSubBlockSize2;
    UInt_t  uTrbNetAdress2;
    UInt_t  uStartPosition2=uStartPosition;
    while(data2<end){ // still inside subevent
	ct++;
	data2 +=1;
	uSubBlockSize2=(*data2>>16)&0xFFFF;   // No. of the data words from one TRB board
	uTrbNetAdress2=*data2&0xFFFF;         // TRB net Adddress (Old TRB subevent id)
	uStartPosition2+=1;

	if( ((   uTrbNetAdress2>=0x4000
	      && uTrbNetAdress2<=0x5000 )
	     || uTrbNetAdress2==0x5555)
	   && uSubBlockSize2>0
	   && uSubBlockSize2<200){

	    if(ct == uSubBlockSizeTest+1) {

		uSubBlockSize =uSubBlockSizeTest;
		reCover = kTRUE;
		wasRecovered=kTRUE;
                break;
	    }
	    if(ct == uSubBlockSize+1) {

		reCover = kTRUE;
		wasRecovered=kTRUE;
                break;
	    }
	}
    }
    if(!reCover) {
	cout<<"Recover failed."<<endl;
	uStartPosition = 0;
	return 0;
    }
    //-----------------------------------------------------------------------------
  }
  
  if( debugFlag > 0){
    cout<<"-1a-EvNb "<<nEvt<<" -nSizeCounter: "<<nSizeCounter<<", "<<hex<<"data word: "<<*data<<dec
	<<" SubSize: "<<uSubBlockSize<< hex << " TrbNetAdress "<<uTrbNetAdress<<dec<<endl;
  }
  
  // ------------------------- 
  // 3. Loop over the TRB extension
  // ------------------------- 
  data_c1+=2;// go to the dataword where TRB extension is defined
  trbDataVer = (*data_c1>>24)&0xFF;
  trbDataPairFlag = (*data_c1>>16)&0x1;
  trbExtensionSize = *data_c1&0x0000FFFF;

  if((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode)) {
    Info("decode()","Event %d -->  Unpacker TrbHeader: %08x  Ver:%d  Ext:%d Pair:%d \n",nEvt,*data_c1,trbDataVer,trbExtensionSize,(Int_t)trbDataPairFlag);
  }
  if( trbExtensionSize != 0 ) {
    for ( UInt_t ii = 0; ii < trbExtensionSize; ii++ ) {

      data_c1++;    
      if(trbExtensionSize < 128) {
	trbDataExtension[ii] = *data_c1; 
      } else{
	Error("decode()","Event %d -->  SubEventId = 0x%x (TRB ID 0x%x ) too many data words (%d), limit is 128",nEvt,subEvtId,uTrbNetAdress,trbExtensionSize);
	return 0;
      }
    }
  }
  
  // ------------------------- 
  // 4. set resolution mode 
  // data_c1 =  AATTXXX
  // AA = 0   high resolution (100 ps)
  // AA = 1   very  high resolution (25 ps)
  // AA = 2   very  high resolution (25 ps) - calibration
  // ------------------------- 
  if( trbDataVer == 0 ){
    highResModeOn = kFALSE;
  }
  else if( trbDataVer == 1 ){
    highResModeOn = kTRUE;
  }    
  else{
    Warning("decode()","Event %d -->  Unknown trbDataVer ( 0x%x ) for TRB net adress 0x%x",nEvt,trbDataVer,uTrbNetAdress);
  }
  
  if( debugFlag > 0 ) cout<<" High Resolution mode: "<<highResModeOn<< hex << " for TRB net adress: "<<uTrbNetAdress<<dec<<endl;



  // ------------------------- 
  // 5. Loop over TDCs
  // ------------------------- 
  data_c2+=(2+trbExtensionSize);// jump to last TrbHeader dataword
  for ( UInt_t ii = 0; ii < uSubBlockSize-trbExtensionSize-2; ii++ ) { 
    data_c2++;// start decoding after TRB extension datawords
    nSizeCounter++;

    UInt_t dataword = *data_c2;
    if(debugFlag > 0) cout<<"--EvNb "<<nEvt<<" data_"<<nSizeCounter<<": "<<hex<<dataword<<dec<<endl;

    if(dataword==0xDEADFACE) {
      if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
        Info("decode()","Event %d -->  Found DEADFACE -> break %08X %08X\n",nEvt,*data,*end);
      }
      break;
    }

    TdcId=(dataword>>24)&0xF;      // might be wrong for TRB board

    if(TdcDataLen>0) TdcDataLen++;
    
    // ------------------------- 
    // 6. check data word TYPE
    // ------------------------- 
    switch(dataword>>28) { 
      case 0: { // Group Header
        if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
          Info("decode()","Event %d --> Found GLOBAL Header $%08X\n",nEvt,dataword);
        } 
        if(!quietMode) Error("decode()","Event %d --> Global Header not expected!",nEvt);
        if(wasRecovered) return kDsSkip; // in case of a repaired event we skip if data are problematic

	break;
      }

      case 1: { // Group Trailer
        if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
          Info("decode()","Event %d -->  Found GLOBAL Trailer $%08X\n",nEvt,dataword);
        }
	if(!quietMode) Error("decode()","Event %d --> Global Trailer not expected!",nEvt);
	if(wasRecovered) return kDsSkip; // in case of a repaired event we skip if data are problematic
        break;
      }

      case 2: { // TDC Header
        if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
          Info("decode()","Event %d -->  Found TDC %d Header $%04X $%04X\n",nEvt,TdcId,(dataword>>12)&0xFFF,dataword&0xFFF);
        }
        if( TdcId>0 && nTdcEvtId!=((dataword>>12)&0xFFF)) {
          if(!quietMode) {
            Error("TRB unpack","Event %d -->  TDCs have different EventIds ******* Event Mixing *******",nEvt);
            printf("nTdcEvtId: %06X   dataword:  %06X  nEvt: %02X\n" , nTdcEvtId ,((dataword>>12)&0xFFF),nEvt);
	  }
          if(wasRecovered) return kDsSkip; // in case of a repaired event we skip if data are problematic
	}
        if( nEvt!=((dataword>>12)&0xFF)) {
          if(!quietMode) {
	    //      TDC Trigger TAG problem, To be checked !!!!
	    //      Error("TRB unpack","Event %d -->  TDC EventIds != Main EventId ******* Event Mixing *******");
	    //      printf("SubEvtId: %06X nTdcEvtId: %06X   dataword:  %06X  nEvt: %02X\n" ,subEvtId, nTdcEvtId ,((dataword>>12)&0xFFF),nEvt);
          }
	  //          exit();
	  //          return(kFALSE);
        }
        if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
          Info("decode()","nTdcEvtId: %06X   dataword:  %06X  nEvt: %02X\n" , nTdcEvtId ,((dataword>>12)&0xFFF),nEvt);
        }
        nTdcEvtId=(dataword>>12)&0xFFF;

        TdcDataLen=1;
        break;
      }

      case 3: { // TDC Trailer
        if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
          Info("decode()","Found TDC %d Trailer $%04X $%04X\n",TdcId,(dataword>>12)&0xFFF,dataword&0xFFF);
        }
        if(TdcDataLen!=(dataword&0xFFF)) {
	    if(!quietMode) Error("decode()","Event %d -->  TRB unpack : TdcDataLen!= length in Trailer!",nEvt);
           if(!quietMode) printf("TRB unpack: TdcDataLen %d != %d ",TdcDataLen,dataword&0xFFF);
           if(wasRecovered) return kDsSkip; // in case of a repaired event we skip if data are problematic
	}
        TdcDataLen=0;
        if(nTdcEvtId!=((dataword>>12)&0xFFF)) {
          if(!quietMode) Error("TRB unpack","Event %d -->  TDC Header and Trailer have different EventIds",nEvt);
//          exit();
//          return(kFALSE);
        }
        break;
      }

      case 4: { // TDC DATA Leading
        if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
          Info("decode()","Event %d -->  Found TDC %d Lead Data $%08X\n",nEvt,TdcId,dataword);
        }
        Int_t nData, nChannel;
        Int_t nDataLow, nDataHigh;            

        if(!highResModeOn) { // 100ps binning
          nChannel=(dataword>>19)&0x1f; // decode channel
          nChannel+=TdcId*32;
          nData=dataword&0x7ffff;   // decode 19bit data
          if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
            Info("decode()","Event %d --> (Chan,Data,InlCorrData) %3d, %d, %f \n",nEvt,nChannel,nData, doINLCorrection(nChannel, nData));
	  }
	  if(nChannel > 127){
	      Error("decode","Event %d -->  channel number bigger than 128",nEvt);
	      if(wasRecovered) return kDsSkip; // in case of a repaired event we skip if data are problematic
	      return 0;
	  }
        } 
	else {  // 25ps binning mode
          nChannel=(dataword>>21)&0x7; // decode channel
          nChannel+=TdcId*8;
          nDataHigh = (dataword&0x7ffff)<<2;
          nDataLow  = (dataword>>19)&0x3;
          nData     = nDataHigh + nDataLow;  
	  
          if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
            Info("decode()","Event %d -->  (Chan,Data) %3d, %d\n",nEvt,nChannel,nData);
          }
	  if(nChannel > 31){
	      Error("decode","Event %d -->  channel number bigger than 31",nEvt);
	      if(wasRecovered) return kDsSkip; // in case of a repaired event we skip if data are problematic
	      return 0;
	  }
        }
	
        // this is for SINGLE LEADING/TRAILING EDGE measurements only!!!
        // No check if the order is correct!!!
        // i am depending on the TDC to deliver the right order
        if(trbDataPairFlag) {
          if(!fill_pair(nChannel,(Float_t)(nData&0xFFFF),(Float_t)((nData>>12)&0x7F))) {
	  }
        } 
	else { // Leading as usual
          // fill INL corrected time 
          if(!fill_lead(nChannel, doINLCorrection(nChannel, nData))) {
          }
        }
        break;
      }
    case 5: { // TDC DATA Trailing
        if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
          Info("decode()","Event %d --> Found TDC %d Trail Data $%08X\n",nEvt,TdcId,dataword);
        } 
        Int_t nData, nChannel;
        Int_t nDataLow, nDataHigh;
        if(!highResModeOn){ //100ps binning
          nChannel=(dataword>>19)&0x1f; // decode channel
          nChannel+=TdcId*32;
          nData=dataword&0x7ffff;   // decode 19bit data
          if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
            Info("decode()","Event %d --> (Chan,Data,InlCorrData) %3d, %d, %f \n",nEvt,nChannel,nData, doINLCorrection(nChannel, nData));
          }
        } else {  // 25ps binning mode
          nChannel=(dataword>>21)&0x7; // decode channel
          nChannel+=TdcId*8;
          nDataHigh = (dataword&0x7ffff)<<2;
          nDataLow  = (dataword>>19)&0x3;
          nData     = nDataHigh + nDataLow;
          if( ((debugFlag > 0 || DEBUG_LEVEL>4) && (!quietMode))) {
            Info("decode()","Event %d --> (Chan,Data) %3d, %d\n",nEvt,nChannel,nData);
          }
        }
	
        // this is for SINGLE LEADING/TRAILING EDGE measurements only!!!
        // No check if the order is correct!!!
        // i am depending on the TDC to deliver the right order
	
        // fill INL corrected time 
        if(!fill_trail(nChannel, doINLCorrection(nChannel, nData) )) {
	  
        }
        break;
    }
    case 6:{// TDC ERROR
        if((dataword&0x7FFF)==0x1000) {// special case for non fatal errors
          if(!quietMode)Error("TRB unpack","Event %d -->  TDC Event Size Limit exceeded!\n",nEvt);
          if(!quietMode)printf("(TDC %d Error Event Size Limit: $%08X)\n",TdcId,dataword);
        } else {
          if(!quietMode) {
            Error("TRB unpack","Event %d -->  Found TDC Error(s)!\n",nEvt);
            printf("TDC %d Error $%04X ($%08X)\n",TdcId,dataword&0x7FFF,dataword);
            printTdcError(dataword&0x7FFF,subEvtId);
          } else if(reportCritical && (dataword&0x6000)!=0) {
            Error("TRB unpack","Event %d -->  Found CRITICAL error",nEvt);
            if((dataword&0x2000)!=0) {
              Error("TRB unpack","Event %d -->  Event lost (trigger FIFO overflow)",nEvt);
              printf("TDC %d Error $%04X ($%08X)\n",TdcId,dataword&0x7FFF,dataword);
            } else if((dataword&0x4000)!=0) {
              Error("TRB unpack","Event %d -->  Internal fatal chip error has been detected",nEvt);  
              printf("TDC %d Error $%04X ($%08X)\n",TdcId,dataword&0x7FFF,dataword);
            }
          }
        }
        break;
    }
    case 7: { // Debug Info
      if(!quietMode)Error("TRB unpack","Event %d -->  Found DEBUG Info",nEvt);
      if(!quietMode)printf("TRB unpack: TDC %d: Found Debug Info $%08X",TdcId,dataword);
      break;
    }
    default: {// not defined!
      if(!quietMode) Error("TRB unpack","Event %d -->  Found UNDEFINED data",nEvt);
      if(!quietMode) printf("TRB unpack: TDC %d: Found undefined $%08X",TdcId,dataword);
      break;
    }
    }
  }// end of for-loop over TRB datawords


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