// @(#)root/metautils:$Id$
// Author: Victor Perev   04/10/2003
//         Philippe Canal 05/2004

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "TClassEdit.h"
#include <ctype.h>
#include "Rstrstream.h"
#include <set>
// for shared_ptr
#include <memory>
#include "RStringView.h"

namespace {
   static TClassEdit::TInterpreterLookupHelper *gInterpreterHelper = 0;
}

namespace std {} using namespace std;

//______________________________________________________________________________
static size_t StdLen(const std::string_view name)
{
   // Return the length, if any, taken by std:: and any
   // potential inline namespace (well compiler detail namespace).

   size_t len = 0;
   if (name.compare(0,5,"std::")==0) {
      len = 5;

      // TODO: This is likely to induce unwanted autoparsing, those are reduced
      // by the caching of the result.
      if (gInterpreterHelper) {
         for(size_t i = 5; i < name.length(); ++i) {
            if (name[i] == '<') break;
            if (name[i] == ':') {
               bool isInlined;
               std::string scope(name.data(),i);
               std::string scoperesult;
               // We assume that we are called in already serialized code.
               // Note: should we also cache the negative answers?
               static std::set<std::string> gInlined;

               if (gInlined.find(scope) != gInlined.end()) {
                  len = i;
                  if (i+1<name.length() && name[i+1]==':') {
                     len += 2;
                  }
               }
               if (!gInterpreterHelper->ExistingTypeCheck(scope, scoperesult)
                   && gInterpreterHelper->IsDeclaredScope(scope,isInlined)) {
                  if (isInlined) {
                     gInlined.insert(scope);
                     len = i;
                     if (i+1<name.length() && name[i+1]==':') {
                        len += 2;
                     }
                  }
               }
            }
         }
      }
   }

   return len;
}

//______________________________________________________________________________
static void RemoveStd(std::string &name, size_t pos = 0)
{
   // Remove std:: and any potential inline namespace (well compiler detail
   // namespace.

   size_t len = StdLen({name.data()+pos,name.length()-pos});
   if (len) {
      name.erase(pos,len);
   }
}

//______________________________________________________________________________
static void RemoveStd(std::string_view &name)
{
   // Remove std:: and any potential inline namespace (well compiler detail
   // namespace.

   size_t len = StdLen(name);
   if (len) {
      name.remove_prefix(len);
   }
}

//______________________________________________________________________________
TClassEdit::EComplexType TClassEdit::GetComplexType(const char* clName)
{
   if (0 == strncmp(clName, "complex<", 8)) {
      const char *clNamePlus8 = clName + 8;
      if (0 == strcmp("float>", clNamePlus8)) {
         return EComplexType::kFloat;
         }
      if (0 == strcmp("double>", clNamePlus8)) {
         return EComplexType::kDouble;
      }
      if (0 == strcmp("int>", clNamePlus8)) {
         return EComplexType::kInt;
      }
      if (0 == strcmp("long>", clNamePlus8)) {
         return EComplexType::kLong;
      }
   }
   return EComplexType::kNone;
}

//______________________________________________________________________________
void TClassEdit::Init(TClassEdit::TInterpreterLookupHelper *helper)
{
   gInterpreterHelper = helper;
}

//______________________________________________________________________________
TClassEdit::TSplitType::TSplitType(const char *type2split, EModType mode) : fName(type2split), fNestedLocation(0)
{
   // default constructor
   TClassEdit::GetSplit(type2split, fElements, fNestedLocation, mode);
}

//______________________________________________________________________________
ROOT::ESTLType TClassEdit::TSplitType::IsInSTL() const
{
   //  type     : type name: vector<list<classA,allocator>,allocator>[::iterator]
   //  result:    0          : not stl container and not declared inside an stl container.
   //             result: code of container that the type or is the scope of the type

   if (fElements[0].empty()) return ROOT::kNotSTL;
   return STLKind(fElements[0]);
}

//______________________________________________________________________________
int TClassEdit::TSplitType::IsSTLCont(int testAlloc) const
{
   //  type     : type name: vector<list<classA,allocator>,allocator>
   //  testAlloc: if true, we test allocator, if it is not default result is negative
   //  result:    0          : not stl container
   //             abs(result): code of container 1=vector,2=list,3=deque,4=map
   //                           5=multimap,6=set,7=multiset
   //             positive val: we have a vector or list with default allocator to any depth
   //                   like vector<list<vector<int>>>
   //             negative val: STL container other than vector or list, or non default allocator
   //                           For example: vector<deque<int>> has answer -1


   if (fElements[0].empty()) return 0;
   int numb = fElements.size();
   if (!fElements[numb-1].empty() && fElements[numb-1][0]=='*') --numb;

   if ( fNestedLocation ) {
      // The type has been defined inside another namespace and/or class
      // this couldn't possibly be an STL container
      return 0;
   }

   int kind = STLKind(fElements[0]);

   if (kind==ROOT::kSTLvector || kind==ROOT::kSTLlist || kind==ROOT::kSTLforwardlist) {

      int nargs = STLArgs(kind);
      if (testAlloc && (numb-1 > nargs) && !IsDefAlloc(fElements[numb-1].c_str(),fElements[1].c_str())) {

         // We have a non default allocator,
         // let's return a negative value.

         kind = -kind;

      } else {

         // We has a default allocator, let's continue to
         // look inside the argument list.
         int k = TClassEdit::IsSTLCont(fElements[1].c_str(),testAlloc);
         if (k<0) kind = -kind;

      }
   }

   // We return a negative value for anything which is not a vector or a list.
   if(kind>2) kind = - kind;
   return kind;
}
#include <iostream>
//______________________________________________________________________________
void TClassEdit::TSplitType::ShortType(std::string &answ, int mode)
{
   /////////////////////////////////////////////////////////////////////////////
   // Return the absolute type of typeDesc into the string answ.

   // E.g.: typeDesc = "class const volatile TNamed**", returns "TNamed**".
   // if (mode&1) remove last "*"s                     returns "TNamed"
   // if (mode&2) remove default allocators from STL containers
   // if (mode&4) remove all     allocators from STL containers
   // if (mode&8) return inner class of stl container. list<innerClass>
   // if (mode&16) return deepest class of stl container. vector<list<deepest>>
   // if (mode&kDropAllDefault) remove default template arguments
   /////////////////////////////////////////////////////////////////////////////

   answ.clear();
   int narg = fElements.size();
   int tailLoc = 0;

   if (narg == 0) {
      answ = fName;
      return ;
   }
   //      fprintf(stderr,"calling ShortType %d for %s with narg %d\n",mode,typeDesc,narg);
   //      {for (int i=0;i<narg;i++) fprintf(stderr,"calling ShortType %d for %s with %d %s \n",
   //                                        mode,typeDesc,i,arglist[i].c_str());
   //      }
   if (fElements[narg-1].empty() == false &&
       (fElements[narg-1][0]=='*'
        || fElements[narg-1][0]=='&'
        || fElements[narg-1][0]=='['
        || 0 == fElements[narg-1].compare(0,6,"const*")
        || 0 == fElements[narg-1].compare(0,6,"const&")
        || 0 == fElements[narg-1].compare(0,6,"const[")
        || 0 == fElements[narg-1].compare("const")
        )
       ) {
      if ((mode&1)==0) tailLoc = narg-1;
   }
   else { assert(fElements[narg-1].empty()); };
   narg--;
   mode &= (~1);

   if (fNestedLocation) narg--;

   //    fprintf(stderr,"calling ShortType %d for %s with narg %d tail %d\n",imode,typeDesc,narg,tailLoc);

   //kind of stl container
   const int kind = STLKind(fElements[0]);
   const int iall = STLArgs(kind);

   // Only class is needed
   if (mode&(8|16)) {
      while(narg-1>iall) { fElements.pop_back(); narg--;}
      if (!fElements[0].empty() && tailLoc) {
         tailLoc = 0;
      }
      fElements[0].clear();
      mode&=(~8);
   }

   if (mode & kDropAllDefault) mode |= kDropStlDefault;
   if (mode & kDropStlDefault) mode |= kDropDefaultAlloc;

   if (kind) {
      bool allocRemoved = false;

      if ( mode & (kDropDefaultAlloc|kDropAlloc) ) {
         // remove allocators


         if (narg-1 == iall+1) {
            // has an allocator specified
            bool dropAlloc = false;
            if (mode & kDropAlloc) {

               dropAlloc = true;

            } else if (mode & kDropDefaultAlloc) {
               switch (kind) {
                  case ROOT::kSTLvector:
                  case ROOT::kSTLlist:
                  case ROOT::kSTLforwardlist:
                  case ROOT::kSTLdeque:
                  case ROOT::kSTLset:
                  case ROOT::kSTLmultiset:
                  case ROOT::kSTLunorderedset:
                  case ROOT::kSTLunorderedmultiset:
                     dropAlloc = IsDefAlloc(fElements[iall+1].c_str(),fElements[1].c_str());
                     break;
                  case ROOT::kSTLmap:
                  case ROOT::kSTLmultimap:
                  case ROOT::kSTLunorderedmap:
                  case ROOT::kSTLunorderedmultimap:
                     dropAlloc = IsDefAlloc(fElements[iall+1].c_str(),fElements[1].c_str(),fElements[2].c_str());
                     break;
                  default:
                     dropAlloc = false;
               }

            }
            if (dropAlloc) {
               narg--;
               allocRemoved = true;
            }
         } else {
            // has no allocator specified (hence it is already removed!)
            allocRemoved = true;
         }
      }

      if ( allocRemoved && (mode & kDropStlDefault) && narg-1 == iall) { // remove default comparator
         if ( IsDefComp( fElements[iall].c_str(), fElements[1].c_str() ) ) {
            narg--;
         }
      } else if ( mode & kDropComparator ) {

         switch (kind) {
            case ROOT::kSTLvector:
            case ROOT::kSTLlist:
            case ROOT::kSTLforwardlist:
            case ROOT::kSTLdeque:
               break;
            case ROOT::kSTLset:
            case ROOT::kSTLmultiset:
            case ROOT::kSTLmap:
            case ROOT::kSTLmultimap:
               if (!allocRemoved && narg-1 == iall+1) {
                  narg--;
                  allocRemoved = true;
               }
               if (narg-1 == iall) narg--;
               break;
            default:
               break;
         }
      }

      // Treat now Pred and Hash for unordered set/map containers. Signature is:
      // template < class Key,
      //            class Hash = hash<Key>,
      //            class Pred = equal_to<Key>,
      //            class Alloc = allocator<Key>
      //          > class unordered_{set,multiset}
      // template < class Key,
      //            class Val,
      //            class Hash = hash<Key>,
      //            class Pred = equal_to<Key>,
      //            class Alloc = allocator<Key>
      //          > class unordered_{map,multimap}


      if (kind == ROOT::kSTLunorderedset || kind == ROOT::kSTLunorderedmultiset || kind == ROOT::kSTLunorderedmap || kind == ROOT::kSTLunorderedmultimap){

         bool predRemoved = false;

         if ( allocRemoved && (mode & kDropStlDefault) && narg-1 == iall) { // remove default predicate
            if ( IsDefPred( fElements[iall].c_str(), fElements[1].c_str() ) ) {
               predRemoved=true;
               narg--;
            }
         }

         if ( predRemoved && (mode & kDropStlDefault) && narg == iall) { // remove default hash
            if ( IsDefHash( fElements[iall-1].c_str(), fElements[1].c_str() ) ) {
               narg--;
            }
         }
      }
   } // End of treatment of stl containers
   else {
      if ( (mode & kDropStlDefault) && (narg >= 3)) {
         unsigned int offset = (0==strncmp("const ",fElements[0].c_str(),6)) ? 6 : 0;
         offset += (0==strncmp("std::",fElements[0].c_str()+offset,5)) ? 5 : 0;
         if (0 == strcmp(fElements[0].c_str()+offset,"__shared_ptr"))
         {
#ifdef _CONCURRENCE_H
            static const std::string sharedPtrDef = std::to_string(__gnu_cxx::__default_lock_policy); // to_string is C++11
#else
            static const std::string sharedPtrDef = std::to_string(2); // to_string is C++11
#endif
            if (fElements[2] == sharedPtrDef) {
               narg--;
            }
         }
      }
   }

   //   do the same for all inside
   for (int i=1;i<narg; i++) {
      if (strchr(fElements[i].c_str(),'<')==0) {
         if (mode&kDropStd) {
            unsigned int offset = (0==strncmp("const ",fElements[i].c_str(),6)) ? 6 : 0;
            RemoveStd( fElements[i], offset );
         }
         if (mode&kResolveTypedef) {
            fElements[i] = ResolveTypedef(fElements[i].c_str(),true);
         }
         continue;
      }
      fElements[i] = TClassEdit::ShortType(fElements[i].c_str(),mode | TClassEdit::kKeepOuterConst);
      if (mode&kResolveTypedef) {
         // We 'just' need to check whether the outer type is a typedef or not;
         // this also will add the default template parameter if any needs to
         // be added.
         string typeresult;
         if (gInterpreterHelper->ExistingTypeCheck(fElements[i], typeresult)
             || gInterpreterHelper->GetPartiallyDesugaredNameWithScopeHandling(fElements[i], typeresult)) {
            if (!typeresult.empty()) fElements[i] = typeresult;
         }
      }
   }

   unsigned int tailOffset = 0;
   if (tailLoc && fElements[tailLoc].compare(0,5,"const") == 0) {
      if (mode & kKeepOuterConst) answ += "const ";
      tailOffset = 5;
   }
   if (!fElements[0].empty()) {answ += fElements[0]; answ +="<";}

#if 0
   // This code is no longer use, the moral equivalent would be to get
   // the 'fixed' number of argument the user told us to ignore and drop those.
   // However, the name we get here might be (usually) normalized enough that
   // this is not necessary (at the very least nothing break in roottest without
   // the aforementioned new code or this old code).
   if (mode & kDropAllDefault) {
      int nargNonDefault = 0;
      std::string nonDefName = answ;
      // "superlong" because tLong might turn fName into an even longer name
      std::string nameSuperLong = fName;
      if (gInterpreterHelper)
         gInterpreterHelper->GetPartiallyDesugaredName(nameSuperLong);
      while (++nargNonDefault < narg) {
         // If T<a> is a "typedef" (aka default template params)
         // to T<a,b> then we can strip the "b".
         const char* closeTemplate = " >";
         if (nonDefName[nonDefName.length() - 1] != '>')
            ++closeTemplate;
         string nondef = nonDefName + closeTemplate;
         if (gInterpreterHelper &&
             gInterpreterHelper->IsAlreadyPartiallyDesugaredName(nondef, nameSuperLong))
            break;
         if (nargNonDefault>1) nonDefName += ",";
         nonDefName += fElements[nargNonDefault];
      }
      if (nargNonDefault < narg)
         narg = nargNonDefault;
   }
#endif

   { for (int i=1;i<narg-1; i++) { answ += fElements[i]; answ+=",";} }
   if (narg>1) { answ += fElements[narg-1]; }

   if (!fElements[0].empty()) {
      if ( answ.at(answ.size()-1) == '>') {
         answ += " >";
      } else {
         answ += '>';
      }
   }
   if (fNestedLocation) {
      // Treat X pf A<B>::X
      fElements[fNestedLocation] = TClassEdit::ShortType(fElements[fNestedLocation].c_str(),mode);
      answ += fElements[fNestedLocation];
   }
   // tail is not a type name, just [2], &, * etc.
   if (tailLoc) answ += fElements[tailLoc].c_str()+tailOffset;
}

//______________________________________________________________________________
ROOT::ESTLType TClassEdit::STLKind(std::string_view type)
{
   // Converts STL container name to number. vector -> 1, etc..
   // If len is greater than 0, only look at that many characters in the string.

   unsigned char offset = 0;
   if (type.compare(0,6,"const ")==0) { offset += 6; }
   offset += StdLen(type.substr(offset));

   //container names
   static const char *stls[] =
      { "any", "vector", "list", "deque", "map", "multimap", "set", "multiset", "bitset",
         "forward_list", "unordered_set", "unordered_multiset", "unordered_map", "unordered_multimap", 0};
   static const size_t stllen[] =
      { 3, 6, 4, 5, 3, 8, 3, 8, 6,
         12, 13, 18, 13, 18, 0};
   static const ROOT::ESTLType values[] =
      {  ROOT::kNotSTL, ROOT::kSTLvector,
         ROOT::kSTLlist, ROOT::kSTLdeque,
         ROOT::kSTLmap, ROOT::kSTLmultimap,
         ROOT::kSTLset, ROOT::kSTLmultiset,
         ROOT::kSTLbitset,
         // New C++11
         ROOT::kSTLforwardlist,
         ROOT::kSTLunorderedset, ROOT::kSTLunorderedmultiset,
         ROOT::kSTLunorderedmap, ROOT::kSTLunorderedmultimap,
         ROOT::kNotSTL
      };

   // kind of stl container
   auto len = type.length();
   if (len) {
      len -= offset;
      for(int k=1;stls[k];k++) {
         if (len == stllen[k]) {
            if (type.compare(offset,len,stls[k])==0) return values[k];
         }
      }
   } else {
      for(int k=1;stls[k];k++) {if (type.compare(offset,len,stls[k])==0) return values[k];}
   }
   return ROOT::kNotSTL;
}

//______________________________________________________________________________
int   TClassEdit::STLArgs(int kind)
{
//      Return number of arguments for STL container before allocator

   static const char  stln[] =// min number of container arguments
      //     vector, list, deque, map, multimap, set, multiset, bitset,
      {    1,     1,    1,     1,   3,        3,   2,        2,      1,
      // forward_list, unordered_set, unordered_multiset, unordered_map, unordered_multimap
                    1,             3,                  3,             4,                  4};

   return stln[kind];
}

//______________________________________________________________________________
static size_t findNameEnd(const std::string_view full)
{
   int level = 0;
   for(size_t i = 0; i < full.length(); ++i) {
      switch(full[i]) {
         case '<': { ++level; break; }
         case '>': {
            if (level == 0) return i;
            else --level;
            break;
         }
         case ',': {
            if (level == 0) return i;
            break;
         }
         default: break;
      }
   }
   return full.length();
}

//______________________________________________________________________________
static size_t findNameEnd(const std::string &full, size_t pos)
{
   return pos + findNameEnd( {full.data()+pos,full.length()-pos} );
}

//______________________________________________________________________________
bool TClassEdit::IsDefAlloc(const char *allocname, const char *classname)
{
   // return whether or not 'allocname' is the STL default allocator for type
   // 'classname'

   string_view a( allocname );
   RemoveStd(a);

   if (a=="alloc")                              return true;
   if (a=="__default_alloc_template<true,0>")   return true;
   if (a=="__malloc_alloc_template<0>")         return true;

   const static int alloclen = strlen("allocator<");
   if (a.compare(0,alloclen,"allocator<") != 0) {
      return false;
   }
   a.remove_prefix(alloclen);

   RemoveStd(a);

   string_view k = classname;
   RemoveStd(k);

   if (a.compare(0,k.length(),k) != 0) {
      // Now we need to compare the normalized name.
      size_t end = findNameEnd(a);

      std::string valuepart;
      GetNormalizedName(valuepart,std::string_view(a.data(),end));

      std::string norm_value;
      GetNormalizedName(norm_value,k);

      if (valuepart != norm_value) {
         return false;
      }
      a.remove_prefix(end);
   } else {
      a.remove_prefix(k.length());
   }

   if (a.compare(0,1,">")!=0 && a.compare(0,2," >")!=0) {
      return false;
   }

   return true;
}

//______________________________________________________________________________
bool TClassEdit::IsDefAlloc(const char *allocname,
                            const char *keyclassname,
                            const char *valueclassname)
{
   // return whether or not 'allocname' is the STL default allocator for a key
   // of type 'keyclassname' and a value of type 'valueclassname'

   if (IsDefAlloc(allocname,keyclassname)) return true;

   string_view a( allocname );
   RemoveStd(a);

   const static int alloclen = strlen("allocator<");
   if (a.compare(0,alloclen,"allocator<") != 0) {
      return false;
   }
   a.remove_prefix(alloclen);

   RemoveStd(a);

   const static int pairlen = strlen("pair<");
   if (a.compare(0,pairlen,"pair<") != 0) {
      return false;
   }
   a.remove_prefix(pairlen);

   const static int constlen = strlen("const ");
   if (a.compare(0,constlen,"const ") == 0) {
      a.remove_prefix(constlen);
   }

   RemoveStd(a);

   string_view k = keyclassname;
   RemoveStd(k);

   if (a.compare(0,k.length(),k) != 0) {
      // Now we need to compare the normalized name.
      size_t end = findNameEnd(a);

      std::string keypart;
      GetNormalizedName(keypart,std::string_view(a.data(),end));

      std::string norm_key;
      GetNormalizedName(norm_key,k);

      if (keypart != norm_key) {
         if ( k[k.length()-1] == '*' ) {
            // also check with a trailing 'const'.
            keypart += "const";
            if (keypart != norm_key) {
               return false;
            }
         } else {
            return false;
         }
      }
      a.remove_prefix(end);
   } else {
      a.remove_prefix(k.length());
   }

   if (a[0] != ',') {
      return false;
   }
   a.remove_prefix(1);
   RemoveStd(a);

   string_view v = valueclassname;
   RemoveStd(v);

   if (a.compare(0,v.length(),v) != 0) {
      // Now we need to compare the normalized name.
      size_t end = findNameEnd(a);

      std::string valuepart;
      GetNormalizedName(valuepart,std::string_view(a.data(),end));

      std::string norm_value;
      GetNormalizedName(norm_value,v);

      if (valuepart != norm_value) {
         return false;
      }
      a.remove_prefix(end);
   } else {
      a.remove_prefix(v.length());
   }

   if (a.compare(0,1,">")!=0 && a.compare(0,2," >")!=0) {
      return false;
   }

   return true;
}

//______________________________________________________________________________
static bool IsDefElement(const char *elementName, const char* defaultElementName, const char *classname)
{
   // return whether or not 'elementName' is the STL default Element for type
   // 'classname'
   string c = elementName;

   size_t pos = StdLen(c);

   const int elementlen = strlen(defaultElementName);
   if (c.compare(pos,elementlen,defaultElementName) != 0) {
      return false;
   }
   pos += elementlen;

   string k = classname;
   if (c.compare(pos,k.length(),k) != 0) {
      // Now we need to compare the normalized name.
      size_t end = findNameEnd(c,pos);

      std::string keypart;
      TClassEdit::GetNormalizedName(keypart,std::string_view(c.c_str()+pos,end-pos));

      std::string norm_key;
      TClassEdit::GetNormalizedName(norm_key,k.c_str());

      if (keypart != norm_key) {
         return false;
      }
      pos = end;
   } else {
      pos += k.length();
   }

   if (c.compare(pos,1,">")!=0 && c.compare(pos,2," >")!=0) {
      return false;
   }

   return true;
}

//______________________________________________________________________________
bool TClassEdit::IsDefComp(const char *compname, const char *classname)
{
   // return whether or not 'compare' is the STL default comparator for type
   // 'classname'

   return IsDefElement(compname, "less<", classname);
}

//______________________________________________________________________________
bool TClassEdit::IsDefPred(const char *predname, const char *classname)
{
   // return whether or not 'predname' is the STL default predicate for type
   // 'classname'
   return IsDefElement(predname, "equal_to<", classname);
}

//______________________________________________________________________________
bool TClassEdit::IsDefHash(const char *hashname, const char *classname)
{
   // return whether or not 'hashname' is the STL default hash for type
   // 'classname'

   return IsDefElement(hashname, "hash<", classname);
}

//______________________________________________________________________________
void TClassEdit::GetNormalizedName(std::string &norm_name, std::string_view name)
{
   // Return the normalized name.  See TMetaUtils::GetNormalizedName.
   //
   // Return the type name normalized for ROOT,
   // keeping only the ROOT opaque typedef (Double32_t, etc.) and
   // removing the STL collections default parameter if any.
   //
   // Compare to TMetaUtils::GetNormalizedName, this routines does not
   // and can not add default template parameters.

   norm_name = std::string(name); // NOTE: Is that the shortest version?

   // Remove the std:: and default template argument and insert the Long64_t and change basic_string to string.
   TClassEdit::TSplitType splitname(norm_name.c_str(),(TClassEdit::EModType)(TClassEdit::kLong64 | TClassEdit::kDropStd | TClassEdit::kDropStlDefault | TClassEdit::kKeepOuterConst));
   splitname.ShortType(norm_name,TClassEdit::kDropStd | TClassEdit::kDropStlDefault | TClassEdit::kResolveTypedef | TClassEdit::kKeepOuterConst);

   // Depending on how the user typed their code, in particular typedef
   // declarations, we may end up with an explicit '::' being
   // part of the result string.  For consistency, we must remove it.
   if (norm_name.length()>2 && norm_name[0]==':' && norm_name[1]==':') {
      norm_name.erase(0,2);
   }

   if (gInterpreterHelper) {
      // See if the expanded name itself is a typedef.
      std::string typeresult;
      if (gInterpreterHelper->ExistingTypeCheck(norm_name, typeresult)
          || gInterpreterHelper->GetPartiallyDesugaredNameWithScopeHandling(norm_name, typeresult)) {

         if (!typeresult.empty()) norm_name = typeresult;
      }
   }
}

//______________________________________________________________________________
string TClassEdit::GetLong64_Name(const char* original)
{
   // Replace 'long long' and 'unsigned long long' by 'Long64_t' and 'ULong64_t'

   if (original==0)
      return "";
   else
      return GetLong64_Name(string(original));
}

//______________________________________________________________________________
string TClassEdit::GetLong64_Name(const string& original)
{
   // Replace 'long long' and 'unsigned long long' by 'Long64_t' and 'ULong64_t'

   static const char* longlong_s  = "long long";
   static const char* ulonglong_s = "unsigned long long";
   static const unsigned int longlong_len  = strlen(longlong_s);
   static const unsigned int ulonglong_len = strlen(ulonglong_s);

   string result = original;

   int pos = 0;
   while( (pos = result.find(ulonglong_s,pos) ) >=0 ) {
      result.replace(pos, ulonglong_len, "ULong64_t");
   }
   pos = 0;
   while( (pos = result.find(longlong_s,pos) ) >=0 ) {
      result.replace(pos, longlong_len, "Long64_t");
   }
   return result;
}

//______________________________________________________________________________
const char *TClassEdit::GetUnqualifiedName(const char *original)
{
   // Return the start of the unqualified name include in 'original'.

   const char *lastPos = original;
   {
      long depth = 0;
      for(auto cursor = original; *cursor != '\0'; ++cursor) {
         if ( *cursor == '<' || *cursor == '(') ++depth;
         else if ( *cursor == '>' || *cursor == ')' ) --depth;
         else if ( *cursor == ':' ) {
            if (depth==0 && *(cursor+1) == ':' && *(cursor+2) != '\0') {
               lastPos = cursor+2;
            }
         }
      }
   }
   return lastPos;
}

//______________________________________________________________________________
static void R__FindTrailing(std::string &full,  /*modified*/
                            std::string &stars /* the literal output */
                            )
{
   const char *t = full.c_str();
   const unsigned int tlen( full.size() );

   const char *starloc = t + tlen - 1;
   bool hasconst = false;
   if ( (*starloc)=='t'
       && (starloc-t) > 4 && 0 == strncmp((starloc-4),"const",5)
       && ( (*(starloc-5)) == ' ' || (*(starloc-5)) == '*' || (*(starloc-5)) == '&'
           || (*(starloc-5)) == '>' || (*(starloc-5)) == ']') ) {
      // we are ending on a const.
      starloc -= 4;
      if ((*starloc-1)==' ') {
         // Take the space too.
         starloc--;
      }
      hasconst = true;
   }
   if ( hasconst || (*starloc)=='*' || (*starloc)=='&' || (*starloc)==']' ) {
      bool isArray = ( (*starloc)==']' );
      while( t<=(starloc-1) && ((*(starloc-1))=='*' || (*(starloc-1))=='&' || (*(starloc-1))=='t' || isArray)) {
         if (isArray) {
            starloc--;
            isArray = ! ( (*starloc)=='[' );
         } else if ( (*(starloc-1))=='t' ) {
            if ( (starloc-1-t) > 5 && 0 == strncmp((starloc-5),"const",5)
                && ( (*(starloc-6)) == ' ' || (*(starloc-6)) == '*' || (*(starloc-6)) == '&'
                    || (*(starloc-6)) == '>' || (*(starloc-6)) == ']')) {
               // we have a const.
               starloc -= 5;
            } else {
               break;
            }
         } else {
            starloc--;
         }
      }
      stars = starloc;
      if ((*(starloc-1))==' ') {
         // erase the space too.
         starloc--;
      }

      const unsigned int starlen = strlen(starloc);
      full.erase(tlen-starlen,starlen);
   } else if (hasconst) {
      stars = starloc;
      const unsigned int starlen = strlen(starloc);
      full.erase(tlen-starlen,starlen);
   }

}

//______________________________________________________________________________
int TClassEdit::GetSplit(const char *type, vector<string>& output, int &nestedLoc, EModType mode)
{
   ///////////////////////////////////////////////////////////////////////////
   //  Stores in output (after emptying it) the splited type.
   //  Stores the location of the tail (nested names) in nestedLoc (0 indicates no tail).
   //  Return the number of elements stored.
   //
   //  First in list is the template name or is empty
   //         "vector<list<int>,alloc>**" to "vector" "list<int>" "alloc" "**"
   //   or    "TNamed*" to "" "TNamed" "*"
   ///////////////////////////////////////////////////////////////////////////

   nestedLoc = 0;
   output.clear();
   if (strlen(type)==0) return 0;

   int cleantypeMode = 1 /* keepInnerConst */;
   if (mode & kKeepOuterConst) {
      cleantypeMode = 0; /* remove only the outer class keyword */
   }
   string full( mode & kLong64 ? TClassEdit::GetLong64_Name( CleanType(type, cleantypeMode) )
               : CleanType(type, cleantypeMode) );

   // We need to replace basic_string with string.
   {
      unsigned int const_offset = (0==strncmp("const ",full.c_str(),6)) ? 6 : 0;
      bool isString = false;
      bool isStdString = false;
      static const char* basic_string_std = "std::basic_string<char";
      static const unsigned int basic_string_std_len = strlen(basic_string_std);

      if (full.compare(const_offset,basic_string_std_len,basic_string_std) == 0
          && full.size() > basic_string_std_len) {
         isString = true;
         isStdString = true;
      } else if (full.compare(const_offset,basic_string_std_len-5,basic_string_std+5) == 0
                 && full.size() > (basic_string_std_len-5)) {
         // no std.
         isString = true;
      }
      if (isString) {
         size_t offset = isStdString ? basic_string_std_len : basic_string_std_len - 5;
         offset += const_offset;
         if ( full[offset] == '>' ) {
            // done.
         } else if (full[offset] == ',') {
            ++offset;
            if (full.compare(offset, 5, "std::") == 0) {
               offset += 5;
            }
            static const char* char_traits_s = "char_traits<char>";
            static const unsigned int char_traits_len = strlen(char_traits_s);
            if (full.compare(offset, char_traits_len, char_traits_s) == 0) {
               offset += char_traits_len;
               if ( full[offset] == '>') {
                  // done.
               } else if (full[offset] == ' ' && full[offset+1] == '>') {
                  ++offset;
                  // done.
               } else if (full[offset] == ',') {
                  ++offset;
                  if (full.compare(offset, 5, "std::") == 0) {
                     offset += 5;
                  }
                  static const char* allocator_s = "allocator<char>";
                  static const unsigned int allocator_len = strlen(allocator_s);
                  if (full.compare(offset, allocator_len, allocator_s) == 0) {
                     offset += allocator_len;
                     if ( full[offset] == '>') {
                        // done.
                     } else if (full[offset] == ' ' && full[offset+1] == '>') {
                        ++offset;
                        // done.
                     } else {
                        // Not std::string
                        isString = false;
                     }
                  }
               } else {
                  // Not std::string
                  isString = false;
               }
            } else {
               // Not std::string.
               isString = false;
            }
         } else {
            // Not std::string.
            isString = false;
         }
         if (isString) {
            output.push_back(string());
            if (const_offset && (mode & kKeepOuterConst)) {
               if (isStdString && !(mode & kDropStd)) {
                  output.push_back("const std::string");
               } else {
                  output.push_back("const string");
               }
            } else {
               if (isStdString && !(mode & kDropStd)) {
                  output.push_back("std::string");
               } else {
                  output.push_back("string");
               }
            }
            if (offset < full.length()) {
               // Copy the trailing text.
               // keep the '>' inside right for R__FindTrailing to work
               string right( full.substr(offset) );
               string stars;
               R__FindTrailing(right, stars);
               output.back().append(right.c_str()+1); // skip the '>'
               output.push_back(stars);
            } else {
               output.push_back("");
            }
            return output.size();
         }
      }
   }

   if ( mode & kDropStd) {
      unsigned int offset = (0==strncmp("const ",full.c_str(),6)) ? 6 : 0;
      RemoveStd( full, offset );
   }

   string stars;
   if ( !full.empty() ) {
      R__FindTrailing(full, stars);
   }

   const char *c = strchr(full.c_str(),'<');
   if (c) {
      //we have 'something<'
      output.push_back(string(full,0,c - full.c_str()));

      const char *cursor;
      int level = 0;
      for(cursor = c + 1; *cursor != '\0' && !(level==0 && *cursor == '>'); ++cursor) {
         switch (*cursor) {
            case '<': ++level; break;
            case '>': --level; break;
            case ',':
               if (level == 0) {
                  output.push_back(std::string(c+1,cursor));
                  c = cursor;
               }
               break;
         }
      }
      if (*cursor=='>') {
         if (*(cursor-1) == ' ') {
            output.push_back(std::string(c+1,cursor-1));
         } else {
            output.push_back(std::string(c+1,cursor));
         }
         // See what's next!
         if (*(cursor+1)==':') {
            // we have a name specified inside the class/namespace
            // For now we keep it in one piece
            nestedLoc = output.size();
            output.push_back((cursor+1));
         }
      } else if (level >= 0) {
         // Unterminated template
         output.push_back(std::string(c+1,cursor));
      }
   } else {
      //empty
      output.push_back(string());
      output.push_back(full);
   }

   if (!output.empty()) output.push_back(stars);
   return output.size();
}


//______________________________________________________________________________
string TClassEdit::CleanType(const char *typeDesc, int mode, const char **tail)
{
   ///////////////////////////////////////////////////////////////////////////
   //      Cleanup type description, redundant blanks removed
   //      and redundant tail ignored
   //      return *tail = pointer to last used character
   //      if (mode==0) keep keywords
   //      if (mode==1) remove keywords outside the template params
   //      if (mode>=2) remove the keywords everywhere.
   //      if (tail!=0) cut before the trailing *
   //
   //      The keywords currently are: "const" , "volatile" removed
   //
   //
   //      CleanType(" A<B, C< D, E> > *,F,G>") returns "A<B,C<D,E> >*"
   ///////////////////////////////////////////////////////////////////////////

   static const char* remove[] = {"class","const","volatile",0};
   static bool isinit = false;
   static std::vector<size_t> lengths;
   if (!isinit) {
      for (int k=0; remove[k]; ++k) {
         lengths.push_back(strlen(remove[k]));
      }
      isinit = true;
   }

   string result;
   result.reserve(strlen(typeDesc)*2);
   int lev=0,kbl=1;
   const char* c;

   for(c=typeDesc;*c;c++) {
      if (c[0]==' ') {
         if (kbl)       continue;
         if (!isalnum(c[ 1]) && c[ 1] !='_')    continue;
      }
      if (kbl && (mode>=2 || lev==0)) { //remove "const' etc...
         int done = 0;
         int n = (mode) ? 999 : 1;

         // loop on all the keywords we want to remove
         for (int k=0; k<n && remove[k]; k++) {
            int rlen = lengths[k];

            // Do we have a match
            if (strncmp(remove[k],c,rlen)) continue;

            // make sure that the 'keyword' is not part of a longer indentifier
            if (isalnum(c[rlen]) || c[rlen]=='_' ||  c[rlen]=='$') continue;

            c+=rlen-1; done = 1; break;
         }
         if (done) continue;
      }

      kbl = (!isalnum(c[ 0]) && c[ 0]!='_' && c[ 0]!='$' && c[0]!='[' && c[0]!=']' && c[0]!='-' && c[0]!='@');
      // '@' is special character used only the artifical class name used by ROOT to implement the
      // I/O customization rules that requires caching of the input data.

      if (*c == '<' || *c == '(')   lev++;
      if (lev==0 && !isalnum(*c)) {
         if (!strchr("*&:._$ []-@",*c)) break;
         // '.' is used as a module/namespace separator by PyROOT, see
         // TPyClassGenerator::GetClass.
      }
      if (c[0]=='>' && result.size() && result[result.size()-1]=='>') result+=" ";

      result += c[0];

      if (*c == '>' || *c == ')')    lev--;
   }
   if(tail) *tail=c;
   return result;
}

//______________________________________________________________________________
string TClassEdit::ShortType(const char *typeDesc, int mode)
{
   /////////////////////////////////////////////////////////////////////////////
   // Return the absolute type of typeDesc.
   // E.g.: typeDesc = "class const volatile TNamed**", returns "TNamed**".
   // if (mode&1) remove last "*"s                     returns "TNamed"
   // if (mode&2) remove default allocators from STL containers
   // if (mode&4) remove all     allocators from STL containers
   // if (mode&8) return inner class of stl container. list<innerClass>
   // if (mode&16) return deapest class of stl container. vector<list<deapest>>
   // if (mode&kDropAllDefault) remove default template arguments
   /////////////////////////////////////////////////////////////////////////////

   string answer;

   // get list of all arguments
   if (typeDesc) {
      TSplitType arglist(typeDesc, (EModType) mode);
      arglist.ShortType(answer, mode);
   }

   return answer;
}

//______________________________________________________________________________
bool TClassEdit::IsInterpreterDetail(const char *type)
{
   // Return true if the type is one the interpreter details which are
   // only forward declared (ClassInfo_t etc..)

   size_t len = strlen(type);
   if (len < 2 || strncmp(type+len-2,"_t",2) != 0) return false;

   unsigned char offset = 0;
   if (strncmp(type,"const ",6)==0) { offset += 6; }
   static const char *names[] = { "CallFunc_t","ClassInfo_t","BaseClassInfo_t",
      "DataMemberInfo_t","FuncTempInfo_t","MethodInfo_t","MethodArgInfo_t",
      "TypeInfo_t","TypedefInfo_t",0};

   for(int k=1;names[k];k++) {if (strcmp(type+offset,names[k])==0) return true;}
   return false;
}

//______________________________________________________________________________
bool TClassEdit::IsSTLBitset(const char *classname)
{
   // Return true is the name is std::bitset<number> or bitset<number>

   size_t offset = StdLen(classname);
   if ( strncmp(classname+offset,"bitset<",strlen("bitset<"))==0) return true;
   return false;
}

//______________________________________________________________________________
ROOT::ESTLType TClassEdit::UnderlyingIsSTLCont(std::string_view type)
{
   // Return the type of STL collection, if any, that is the underlying type
   // of the given type.   Namely return the value of IsSTLCont after stripping
   // pointer, reference and constness from the type.
   //    UnderlyingIsSTLCont("vector<int>*") == IsSTLCont("vector<int>")
   // See TClassEdit::IsSTLCont
   //
   //  type     : type name: vector<list<classA,allocator>,allocator>*
   //  result:    0          : not stl container
   //             code of container 1=vector,2=list,3=deque,4=map
   //                     5=multimap,6=set,7=multiset

   if (type.compare(0,6,"const ",6) == 0)
      type.remove_prefix(6);

   while(type[type.length()-1]=='*' ||
         type[type.length()-1]=='&' ||
         type[type.length()-1]==' ') {
      type.remove_suffix(1);
   }
   return IsSTLCont(type);
}

//______________________________________________________________________________
ROOT::ESTLType TClassEdit::IsSTLCont(std::string_view type)
{
   //  type     : type name: vector<list<classA,allocator>,allocator>
   //  result:    0          : not stl container
   //             code of container 1=vector,2=list,3=deque,4=map
   //                     5=multimap,6=set,7=multiset

   auto pos = type.find('<');
   if (pos==std::string_view::npos) return ROOT::kNotSTL;

   auto c = pos+1;
   for (decltype(type.length()) level = 1; c < type.length(); ++c) {
      if (type[c] == '<') ++level;
      if (type[c] == '>') --level;
      if (level == 0) break;
   }
   if (c != (type.length()-1) ) {
      return ROOT::kNotSTL;
   }

   return STLKind({type.data(),pos});
}

//______________________________________________________________________________
int TClassEdit::IsSTLCont(const char *type, int testAlloc)
{
   //  type     : type name: vector<list<classA,allocator>,allocator>
   //  testAlloc: if true, we test allocator, if it is not default result is negative
   //  result:    0          : not stl container
   //             abs(result): code of container 1=vector,2=list,3=deque,4=map
   //                           5=multimap,6=set,7=multiset
   //             positive val: we have a vector or list with default allocator to any depth
   //                   like vector<list<vector<int>>>
   //             negative val: STL container other than vector or list, or non default allocator
   //                           For example: vector<deque<int>> has answer -1

   if (strchr(type,'<')==0) return 0;

   TSplitType arglist( type );
   return arglist.IsSTLCont(testAlloc);
}

//______________________________________________________________________________
bool TClassEdit::IsStdClass(const char *classname)
{
   // return true if the class belongs to the std namespace

   classname += StdLen( classname );
   if ( strcmp(classname,"string")==0 ) return true;
   if ( strncmp(classname,"bitset<",strlen("bitset<"))==0) return true;
   if ( strncmp(classname,"pair<",strlen("pair<"))==0) return true;
   if ( strcmp(classname,"allocator")==0) return true;
   if ( strncmp(classname,"allocator<",strlen("allocator<"))==0) return true;
   if ( strncmp(classname,"greater<",strlen("greater<"))==0) return true;
   if ( strncmp(classname,"less<",strlen("less<"))==0) return true;
   if ( strncmp(classname,"equal_to<",strlen("equal_to<"))==0) return true;
   if ( strncmp(classname,"hash<",strlen("hash<"))==0) return true;
   if ( strncmp(classname,"auto_ptr<",strlen("auto_ptr<"))==0) return true;

   if ( strncmp(classname,"vector<",strlen("vector<"))==0) return true;
   if ( strncmp(classname,"list<",strlen("list<"))==0) return true;
   if ( strncmp(classname,"forward_list<",strlen("forward_list<"))==0) return true;
   if ( strncmp(classname,"deque<",strlen("deque<"))==0) return true;
   if ( strncmp(classname,"map<",strlen("map<"))==0) return true;
   if ( strncmp(classname,"multimap<",strlen("multimap<"))==0) return true;
   if ( strncmp(classname,"set<",strlen("set<"))==0) return true;
   if ( strncmp(classname,"multiset<",strlen("multiset<"))==0) return true;
   if ( strncmp(classname,"unordered_set<",strlen("unordered_set<"))==0) return true;
   if ( strncmp(classname,"unordered_multiset<",strlen("unordered_multiset<"))==0) return true;
   if ( strncmp(classname,"unordered_map<",strlen("unordered_map<"))==0) return true;
   if ( strncmp(classname,"unordered_multimap<",strlen("unordered_multimap<"))==0) return true;
   if ( strncmp(classname,"bitset<",strlen("bitset<"))==0) return true;

   return false;
}


//______________________________________________________________________________
bool TClassEdit::IsVectorBool(const char *name) {
   TSplitType splitname( name );

   return ( TClassEdit::STLKind( splitname.fElements[0] ) == ROOT::kSTLvector)
      && ( splitname.fElements[1] == "bool" || splitname.fElements[1]=="Bool_t");
}

//______________________________________________________________________________
static void ResolveTypedefProcessType(const char *tname,
                                      unsigned int /* len */,
                                      unsigned int cursor,
                                      bool constprefix,
                                      unsigned int start_of_type,
                                      unsigned int end_of_type,
                                      unsigned int mod_start_of_type,
                                      bool &modified,
                                      std::string &result)
{
   std::string type(modified && (mod_start_of_type < result.length()) ?
                    result.substr(mod_start_of_type, string::npos)
                    : string(tname, start_of_type, end_of_type == 0 ? cursor - start_of_type : end_of_type - start_of_type));  // we need to try to avoid this copy
   string typeresult;
   if (gInterpreterHelper->ExistingTypeCheck(type, typeresult)
       || gInterpreterHelper->GetPartiallyDesugaredNameWithScopeHandling(type, typeresult)) {
      // it is a known type
      if (!typeresult.empty()) {
         // and it is a typedef, we need to replace it in the output.
         if (modified) {
            result.replace(mod_start_of_type, string::npos,
                           typeresult);
         }
         else {
            modified = true;
            mod_start_of_type = start_of_type;
            result += string(tname,0,start_of_type);
            if (constprefix && typeresult.compare(0,6,"const ",6) == 0) {
               result += typeresult.substr(6,string::npos);
            } else {
               result += typeresult;
            }
         }
      } else if (modified) {
         result.replace(mod_start_of_type, string::npos,
                        type);
      }
      if (modified) {
         if (end_of_type != 0 && end_of_type!=cursor) {
            result += std::string(tname,end_of_type,cursor-end_of_type);
         }
      }
   } else {
      // no change needed.
      if (modified) {
         // result += type;
         if (end_of_type != 0 && end_of_type!=cursor) {
            result += std::string(tname,end_of_type,cursor-end_of_type);
         }
      }
   }
}

//______________________________________________________________________________
static void ResolveTypedefImpl(const char *tname,
                               unsigned int len,
                               unsigned int &cursor,
                               bool &modified,
                               std::string &result)
{

   // Need to parse and deal with
   // A::B::C< D, E::F, G::H<I,J>::K::L >::M
   // where E might be replace by N<O,P>
   // and G::H<I,J>::K or G might be a typedef.

   bool constprefix = false;

   if (tname[cursor]==' ') {
      if (!modified) {
         modified = true;
         result += string(tname,0,cursor);
      }
      while (tname[cursor]==' ') ++cursor;
   }

   if (tname[cursor]=='c' && (cursor+6<len)) {
      if (strncmp(tname+cursor,"const ",6) == 0) {
         cursor += 6;
         if (modified) result += "const ";
      }
      constprefix = true;

   }

   // When either of those two is true, we should probably go to modified
   // mode. (Otherwise we rely on somebody else to strip the std::)
   if (len > 5 && strncmp(tname+cursor,"std::",5) == 0) {
      cursor += 5;
   }
   if (len > 2 && strncmp(tname+cursor,"::",2) == 0) {
      cursor += 2;
      len -= 2;
   }

   unsigned int start_of_type = cursor;
   unsigned int end_of_type = 0;
   unsigned int mod_start_of_type = result.length();
   unsigned int prevScope = cursor;
   for ( ; cursor<len; ++cursor) {
      switch (tname[cursor]) {
         case ':': {
            if ((cursor+1)>=len || tname[cursor+1]!=':') {
               // we expected another ':', malformed, give up.
               if (modified) result += (tname+prevScope);
               return;
            }
            string scope;
            if (modified) {
               scope = result.substr(mod_start_of_type, string::npos);
               scope += std::string(tname+prevScope,cursor-prevScope);
            } else {
               scope = std::string(tname, start_of_type, cursor - start_of_type); // we need to try to avoid this copy
            }
            std::string scoperesult;
            bool isInlined = false;
            if (gInterpreterHelper->ExistingTypeCheck(scope, scoperesult)
                ||gInterpreterHelper->GetPartiallyDesugaredNameWithScopeHandling(scope, scoperesult)) {
               // it is a known type
               if (!scoperesult.empty()) {
                  // and it is a typedef
                  if (modified) {
                     if (constprefix && scoperesult.compare(0,6,"const ",6) != 0) mod_start_of_type -= 6;
                     result.replace(mod_start_of_type, string::npos,
                                    scoperesult);
                     result += "::";
                  } else {
                     modified = true;
                     mod_start_of_type = start_of_type;
                     result += string(tname,0,start_of_type);
                     //if (constprefix) result += "const ";
                     result += scoperesult;
                     result += "::";
                  }
               } else if (modified) {
                  result += std::string(tname+prevScope,cursor+1-prevScope);
               }
            } else if (!gInterpreterHelper->IsDeclaredScope(scope,isInlined)) {
               // the nesting namespace is not declared
               if (modified) result += (tname+prevScope);
               // Unfortunately, this is too harsh .. what about:
               //    unknown::wrapper<Int_t>
               return;
            } else if (isInlined) {
               // humm ... just skip it.
               if (!modified) {
                  modified = true;
                  mod_start_of_type = start_of_type;
                  result += string(tname,0,start_of_type);
                  //if (constprefix) result += "const ";
                  result += string(tname,start_of_type,prevScope - start_of_type);
               }
            } else if (modified) {
               result += std::string(tname+prevScope,cursor+1-prevScope);
            }
            // Consume the 1st semi colon, the 2nd will be consume by the for loop.
            ++cursor;
            prevScope = cursor+1;
            break;
         }
         case '<': {
            // push information on stack
            if (modified) {
               result += std::string(tname+prevScope,cursor+1-prevScope);
               // above includes the '<' .... result += '<';
            }
            do {
               ++cursor;
               ResolveTypedefImpl(tname,len,cursor,modified,result);
            } while( cursor<len && tname[cursor] == ',' );

            while (cursor<len && tname[cursor+1]==' ') ++cursor;

            // Since we already checked the type, skip the next section
            // (respective the scope section and final type processing section)
            // as they would re-do the same job.
            if (cursor+2<len && tname[cursor+1]==':' && tname[cursor+2]==':') {
               if (modified) result += "::";
               cursor += 2;
               prevScope = cursor+1;
            }
            if ( (cursor+1)<len && tname[cursor+1] == ',') {
               ++cursor;
               if (modified) result += ',';
               return;
            }
            if ( (cursor+1)<len && tname[cursor+1] == '>') {
               ++cursor;
               if (modified) result += " >";
               return;
            }
            if ( (cursor+1) >= len) {
               return;
            }
            if (tname[cursor] != ' ') break;
            if (modified) prevScope = cursor+1;
            // If the 'current' character is a space we need to treat it,
            // since this the next case statement, we can just fall through,
            // otherwise we should need to do:
            // --cursor; break;
         }
         case ' ': {
            end_of_type = cursor;
            // let's see if we have 'long long' or 'unsigned int' or 'signed char' or what not.
            while ((cursor+1)<len && tname[cursor+1] == ' ') ++cursor;

            auto next = cursor+1;
            if (strncmp(tname+next,"const",5) == 0 && ((next+5)==len || tname[next+5] == ' ' || tname[next+5] == '*' || tname[next+5] == '&' || tname[next+5] == ',' || tname[next+5] == '>' || tname[next+5] == ']'))
            {
               // A first const after the type needs to be move in the front.
               if (!modified) {
                  modified = true;
                  result += string(tname,0,start_of_type);
                  result += "const ";
                  mod_start_of_type = start_of_type + 6;
                  result += string(tname,start_of_type,end_of_type-start_of_type);
               } else if (mod_start_of_type < result.length()) {
                  result.insert(mod_start_of_type,"const ");
                  mod_start_of_type += 6;
               } else {
                  result += "const ";
                  mod_start_of_type += 6;
                  result += string(tname,start_of_type,end_of_type-start_of_type);
               }
               cursor += 5;
               end_of_type = cursor+1;
               prevScope = end_of_type;
               if (tname[next+5] == ',' || tname[next+5] == '>' || tname[next+5] == '[') {
                  break;
               }
            } else if (next!=len && tname[next] != '*' && tname[next] != '&') {
               // the type is not ended yet.
               end_of_type = 0;
               break;
            }
            ++cursor;
            // Intentional fall through;
         }
         case '*':
         case '&': {
            if (tname[cursor] != ' ') end_of_type = cursor;
            // check and skip const (followed by *,&, ,) ... what about followed by ':','['?
            auto next = cursor+1;
            if (strncmp(tname+next,"const",5) == 0) {
               if ((next+5)==len || tname[next+5] == ' ' || tname[next+5] == '*' || tname[next+5] == '&' || tname[next+5] == ',' || tname[next+5] == '>' || tname[next+5] == '[') {
                  next += 5;
               }
            }
            while (next<len &&
                   (tname[next] == ' ' || tname[next] == '*' || tname[next] == '&')) {
               ++next;
               // check and skip const (followed by *,&, ,) ... what about followed by ':','['?
               if (strncmp(tname+next,"const",5) == 0) {
                  if ((next+5)==len || tname[next+5] == ' ' || tname[next+5] == '*' || tname[next+5] == '&' || tname[next+5] == ',' || tname[next+5] == '>' || tname[next+5] == '[') {
                     next += 5;
                  }
               }
            }
            cursor = next-1;
//            if (modified && mod_start_of_type < result.length()) {
//               result += string(tname,end_of_type,cursor-end_of_type);
//            }
            break;
         }
         case ',': {
            if (modified && prevScope) {
               result += std::string(tname+prevScope,(end_of_type == 0 ? cursor : end_of_type)-prevScope);
            }
            ResolveTypedefProcessType(tname,len,cursor,constprefix,start_of_type,end_of_type,mod_start_of_type,
                                      modified, result);
            if (modified) result += ',';
            return;
         }
         case '>': {
            if (modified && prevScope) {
               result += std::string(tname+prevScope,(end_of_type == 0 ? cursor : end_of_type)-prevScope);
            }
            ResolveTypedefProcessType(tname,len,cursor,constprefix,start_of_type,end_of_type,mod_start_of_type,
                                      modified, result);
            if (modified) result += '>';
            return;
         }
         default:
            end_of_type = 0;
      }
   }

   if (prevScope && modified) result += std::string(tname+prevScope,(end_of_type == 0 ? cursor : end_of_type)-prevScope);

   ResolveTypedefProcessType(tname,len,cursor,constprefix,start_of_type,end_of_type,mod_start_of_type,
                             modified, result);
}


//______________________________________________________________________________
string TClassEdit::ResolveTypedef(const char *tname, bool /* resolveAll */)
{

   // Return the name of type 'tname' with all its typedef components replaced
   // by the actual type its points to
   // For example for "typedef MyObj MyObjTypedef;"
   //    vector<MyObjTypedef> return vector<MyObj>
   //

   if ( tname==0 || tname[0]==0 || !gInterpreterHelper) return "";

   std::string result;

   // Check if we already know it is a normalized typename or a registered
   // typedef (i.e. known to gROOT).
   if (gInterpreterHelper->ExistingTypeCheck(tname, result))
   {
      if (result.empty()) return tname;
      else return result;
   }

   unsigned int len = strlen(tname);

   unsigned int cursor = 0;
   bool modified = false;
   ResolveTypedefImpl(tname,len,cursor,modified,result);

   if (!modified) return tname;
   else return result;
}


//______________________________________________________________________________
string TClassEdit::InsertStd(const char *tname)
{

   // Return the name of type 'tname' with all STL classes prepended by "std::".
   // For example for "vector<set<auto_ptr<int*> > >" it returns
   //    "std::vector<std::set<std::auto_ptr<int*> > >"
   //

   static const char* sSTLtypes[] = {
      "allocator",
      "auto_ptr",
      "bad_alloc",
      "bad_cast",
      "bad_exception",
      "bad_typeid",
      "basic_filebuf",
      "basic_fstream",
      "basic_ifstream",
      "basic_ios",
      "basic_iostream",
      "basic_istream",
      "basic_istringstream",
      "basic_ofstream",
      "basic_ostream",
      "basic_ostringstream",
      "basic_streambuf",
      "basic_string",
      "basic_stringbuf",
      "basic_stringstream",
      "binary_function",
      "binary_negate",
      "bitset",
      "char_traits",
      "codecvt_byname",
      "codecvt",
      "collate",
      "collate_byname",
      "compare",
      "complex",
      "ctype_byname",
      "ctype",
      "deque",
      "divides",
      "domain_error",
      "equal_to",
      "exception",
      "forward_list",
      "fpos",
      "greater_equal",
      "greater",
      "gslice_array",
      "gslice",
      "hash",
      "indirect_array",
      "invalid_argument",
      "ios_base",
      "istream_iterator",
      "istreambuf_iterator",
      "istrstream",
      "iterator_traits",
      "iterator",
      "length_error",
      "less_equal",
      "less",
      "list",
      "locale",
      "localedef utility",
      "locale utility",
      "logic_error",
      "logical_and",
      "logical_not",
      "logical_or",
      "map",
      "mask_array",
      "mem_fun",
      "mem_fun_ref",
      "messages",
      "messages_byname",
      "minus",
      "modulus",
      "money_get",
      "money_put",
      "moneypunct",
      "moneypunct_byname",
      "multimap",
      "multiplies",
      "multiset",
      "negate",
      "not_equal_to",
      "num_get",
      "num_put",
      "numeric_limits",
      "numpunct",
      "numpunct_byname",
      "ostream_iterator",
      "ostreambuf_iterator",
      "ostrstream",
      "out_of_range",
      "overflow_error",
      "pair",
      "plus",
      "pointer_to_binary_function",
      "pointer_to_unary_function",
      "priority_queue",
      "queue",
      "range_error",
      "raw_storage_iterator",
      "reverse_iterator",
      "runtime_error",
      "set",
      "slice_array",
      "slice",
      "stack",
      "string",
      "strstream",
      "strstreambuf",
      "time_get_byname",
      "time_get",
      "time_put_byname",
      "time_put",
      "unary_function",
      "unary_negate",
      "underflow_error",
      "unordered_map",
      "unordered_multimap",
      "unordered_multiset",
      "unordered_set",
      "valarray",
      "vector",
      "wstring"
   };
   static set<string> sSetSTLtypes;

   if (tname==0 || tname[0]==0) return "";

   if (sSetSTLtypes.empty()) {
      // set up static set
      const size_t nSTLtypes = sizeof(sSTLtypes) / sizeof(const char*);
      for (size_t i = 0; i < nSTLtypes; ++i)
         sSetSTLtypes.insert(sSTLtypes[i]);
   }

   size_t b = 0;
   size_t len = strlen(tname);
   string ret;
   ret.reserve(len + 20); // expect up to 4 extra "std::" to insert
   string id;
   while (b < len) {
      // find beginning of next identifier
      bool precScope = false; // whether the identifier was preceded by "::"
      while (!(isalnum(tname[b]) || tname[b] == '_') && b < len) {
         precScope = (b < len - 2) && (tname[b] == ':') && (tname[b + 1] == ':');
         if (precScope) {
            ret += "::";
            b += 2;
         } else
            ret += tname[b++];
      }

      // now b is at the beginning of an identifier or len
      size_t e = b;
      // find end of identifier
      id.clear();
      while (e < len && (isalnum(tname[e]) || tname[e] == '_'))
         id += tname[e++];
      if (!id.empty()) {
         if (!precScope) {
            set<string>::const_iterator iSTLtype = sSetSTLtypes.find(id);
            if (iSTLtype != sSetSTLtypes.end())
               ret += "std::";
         }

         ret += id;
         b = e;
      }
   }
   return ret;
}

//______________________________________________________________________________
char* TClassEdit::DemangleTypeIdName(const std::type_info& ti, int& errorCode)
{
   // Demangle in a portable way the type id name.
   // IMPORTANT: The caller is responsible for freeing the returned const char*

   const char* mangled_name = ti.name();
   return DemangleName(mangled_name, errorCode);
}
 TClassEdit.cxx:1
 TClassEdit.cxx:2
 TClassEdit.cxx:3
 TClassEdit.cxx:4
 TClassEdit.cxx:5
 TClassEdit.cxx:6
 TClassEdit.cxx:7
 TClassEdit.cxx:8
 TClassEdit.cxx:9
 TClassEdit.cxx:10
 TClassEdit.cxx:11
 TClassEdit.cxx:12
 TClassEdit.cxx:13
 TClassEdit.cxx:14
 TClassEdit.cxx:15
 TClassEdit.cxx:16
 TClassEdit.cxx:17
 TClassEdit.cxx:18
 TClassEdit.cxx:19
 TClassEdit.cxx:20
 TClassEdit.cxx:21
 TClassEdit.cxx:22
 TClassEdit.cxx:23
 TClassEdit.cxx:24
 TClassEdit.cxx:25
 TClassEdit.cxx:26
 TClassEdit.cxx:27
 TClassEdit.cxx:28
 TClassEdit.cxx:29
 TClassEdit.cxx:30
 TClassEdit.cxx:31
 TClassEdit.cxx:32
 TClassEdit.cxx:33
 TClassEdit.cxx:34
 TClassEdit.cxx:35
 TClassEdit.cxx:36
 TClassEdit.cxx:37
 TClassEdit.cxx:38
 TClassEdit.cxx:39
 TClassEdit.cxx:40
 TClassEdit.cxx:41
 TClassEdit.cxx:42
 TClassEdit.cxx:43
 TClassEdit.cxx:44
 TClassEdit.cxx:45
 TClassEdit.cxx:46
 TClassEdit.cxx:47
 TClassEdit.cxx:48
 TClassEdit.cxx:49
 TClassEdit.cxx:50
 TClassEdit.cxx:51
 TClassEdit.cxx:52
 TClassEdit.cxx:53
 TClassEdit.cxx:54
 TClassEdit.cxx:55
 TClassEdit.cxx:56
 TClassEdit.cxx:57
 TClassEdit.cxx:58
 TClassEdit.cxx:59
 TClassEdit.cxx:60
 TClassEdit.cxx:61
 TClassEdit.cxx:62
 TClassEdit.cxx:63
 TClassEdit.cxx:64
 TClassEdit.cxx:65
 TClassEdit.cxx:66
 TClassEdit.cxx:67
 TClassEdit.cxx:68
 TClassEdit.cxx:69
 TClassEdit.cxx:70
 TClassEdit.cxx:71
 TClassEdit.cxx:72
 TClassEdit.cxx:73
 TClassEdit.cxx:74
 TClassEdit.cxx:75
 TClassEdit.cxx:76
 TClassEdit.cxx:77
 TClassEdit.cxx:78
 TClassEdit.cxx:79
 TClassEdit.cxx:80
 TClassEdit.cxx:81
 TClassEdit.cxx:82
 TClassEdit.cxx:83
 TClassEdit.cxx:84
 TClassEdit.cxx:85
 TClassEdit.cxx:86
 TClassEdit.cxx:87
 TClassEdit.cxx:88
 TClassEdit.cxx:89
 TClassEdit.cxx:90
 TClassEdit.cxx:91
 TClassEdit.cxx:92
 TClassEdit.cxx:93
 TClassEdit.cxx:94
 TClassEdit.cxx:95
 TClassEdit.cxx:96
 TClassEdit.cxx:97
 TClassEdit.cxx:98
 TClassEdit.cxx:99
 TClassEdit.cxx:100
 TClassEdit.cxx:101
 TClassEdit.cxx:102
 TClassEdit.cxx:103
 TClassEdit.cxx:104
 TClassEdit.cxx:105
 TClassEdit.cxx:106
 TClassEdit.cxx:107
 TClassEdit.cxx:108
 TClassEdit.cxx:109
 TClassEdit.cxx:110
 TClassEdit.cxx:111
 TClassEdit.cxx:112
 TClassEdit.cxx:113
 TClassEdit.cxx:114
 TClassEdit.cxx:115
 TClassEdit.cxx:116
 TClassEdit.cxx:117
 TClassEdit.cxx:118
 TClassEdit.cxx:119
 TClassEdit.cxx:120
 TClassEdit.cxx:121
 TClassEdit.cxx:122
 TClassEdit.cxx:123
 TClassEdit.cxx:124
 TClassEdit.cxx:125
 TClassEdit.cxx:126
 TClassEdit.cxx:127
 TClassEdit.cxx:128
 TClassEdit.cxx:129
 TClassEdit.cxx:130
 TClassEdit.cxx:131
 TClassEdit.cxx:132
 TClassEdit.cxx:133
 TClassEdit.cxx:134
 TClassEdit.cxx:135
 TClassEdit.cxx:136
 TClassEdit.cxx:137
 TClassEdit.cxx:138
 TClassEdit.cxx:139
 TClassEdit.cxx:140
 TClassEdit.cxx:141
 TClassEdit.cxx:142
 TClassEdit.cxx:143
 TClassEdit.cxx:144
 TClassEdit.cxx:145
 TClassEdit.cxx:146
 TClassEdit.cxx:147
 TClassEdit.cxx:148
 TClassEdit.cxx:149
 TClassEdit.cxx:150
 TClassEdit.cxx:151
 TClassEdit.cxx:152
 TClassEdit.cxx:153
 TClassEdit.cxx:154
 TClassEdit.cxx:155
 TClassEdit.cxx:156
 TClassEdit.cxx:157
 TClassEdit.cxx:158
 TClassEdit.cxx:159
 TClassEdit.cxx:160
 TClassEdit.cxx:161
 TClassEdit.cxx:162
 TClassEdit.cxx:163
 TClassEdit.cxx:164
 TClassEdit.cxx:165
 TClassEdit.cxx:166
 TClassEdit.cxx:167
 TClassEdit.cxx:168
 TClassEdit.cxx:169
 TClassEdit.cxx:170
 TClassEdit.cxx:171
 TClassEdit.cxx:172
 TClassEdit.cxx:173
 TClassEdit.cxx:174
 TClassEdit.cxx:175
 TClassEdit.cxx:176
 TClassEdit.cxx:177
 TClassEdit.cxx:178
 TClassEdit.cxx:179
 TClassEdit.cxx:180
 TClassEdit.cxx:181
 TClassEdit.cxx:182
 TClassEdit.cxx:183
 TClassEdit.cxx:184
 TClassEdit.cxx:185
 TClassEdit.cxx:186
 TClassEdit.cxx:187
 TClassEdit.cxx:188
 TClassEdit.cxx:189
 TClassEdit.cxx:190
 TClassEdit.cxx:191
 TClassEdit.cxx:192
 TClassEdit.cxx:193
 TClassEdit.cxx:194
 TClassEdit.cxx:195
 TClassEdit.cxx:196
 TClassEdit.cxx:197
 TClassEdit.cxx:198
 TClassEdit.cxx:199
 TClassEdit.cxx:200
 TClassEdit.cxx:201
 TClassEdit.cxx:202
 TClassEdit.cxx:203
 TClassEdit.cxx:204
 TClassEdit.cxx:205
 TClassEdit.cxx:206
 TClassEdit.cxx:207
 TClassEdit.cxx:208
 TClassEdit.cxx:209
 TClassEdit.cxx:210
 TClassEdit.cxx:211
 TClassEdit.cxx:212
 TClassEdit.cxx:213
 TClassEdit.cxx:214
 TClassEdit.cxx:215
 TClassEdit.cxx:216
 TClassEdit.cxx:217
 TClassEdit.cxx:218
 TClassEdit.cxx:219
 TClassEdit.cxx:220
 TClassEdit.cxx:221
 TClassEdit.cxx:222
 TClassEdit.cxx:223
 TClassEdit.cxx:224
 TClassEdit.cxx:225
 TClassEdit.cxx:226
 TClassEdit.cxx:227
 TClassEdit.cxx:228
 TClassEdit.cxx:229
 TClassEdit.cxx:230
 TClassEdit.cxx:231
 TClassEdit.cxx:232
 TClassEdit.cxx:233
 TClassEdit.cxx:234
 TClassEdit.cxx:235
 TClassEdit.cxx:236
 TClassEdit.cxx:237
 TClassEdit.cxx:238
 TClassEdit.cxx:239
 TClassEdit.cxx:240
 TClassEdit.cxx:241
 TClassEdit.cxx:242
 TClassEdit.cxx:243
 TClassEdit.cxx:244
 TClassEdit.cxx:245
 TClassEdit.cxx:246
 TClassEdit.cxx:247
 TClassEdit.cxx:248
 TClassEdit.cxx:249
 TClassEdit.cxx:250
 TClassEdit.cxx:251
 TClassEdit.cxx:252
 TClassEdit.cxx:253
 TClassEdit.cxx:254
 TClassEdit.cxx:255
 TClassEdit.cxx:256
 TClassEdit.cxx:257
 TClassEdit.cxx:258
 TClassEdit.cxx:259
 TClassEdit.cxx:260
 TClassEdit.cxx:261
 TClassEdit.cxx:262
 TClassEdit.cxx:263
 TClassEdit.cxx:264
 TClassEdit.cxx:265
 TClassEdit.cxx:266
 TClassEdit.cxx:267
 TClassEdit.cxx:268
 TClassEdit.cxx:269
 TClassEdit.cxx:270
 TClassEdit.cxx:271
 TClassEdit.cxx:272
 TClassEdit.cxx:273
 TClassEdit.cxx:274
 TClassEdit.cxx:275
 TClassEdit.cxx:276
 TClassEdit.cxx:277
 TClassEdit.cxx:278
 TClassEdit.cxx:279
 TClassEdit.cxx:280
 TClassEdit.cxx:281
 TClassEdit.cxx:282
 TClassEdit.cxx:283
 TClassEdit.cxx:284
 TClassEdit.cxx:285
 TClassEdit.cxx:286
 TClassEdit.cxx:287
 TClassEdit.cxx:288
 TClassEdit.cxx:289
 TClassEdit.cxx:290
 TClassEdit.cxx:291
 TClassEdit.cxx:292
 TClassEdit.cxx:293
 TClassEdit.cxx:294
 TClassEdit.cxx:295
 TClassEdit.cxx:296
 TClassEdit.cxx:297
 TClassEdit.cxx:298
 TClassEdit.cxx:299
 TClassEdit.cxx:300
 TClassEdit.cxx:301
 TClassEdit.cxx:302
 TClassEdit.cxx:303
 TClassEdit.cxx:304
 TClassEdit.cxx:305
 TClassEdit.cxx:306
 TClassEdit.cxx:307
 TClassEdit.cxx:308
 TClassEdit.cxx:309
 TClassEdit.cxx:310
 TClassEdit.cxx:311
 TClassEdit.cxx:312
 TClassEdit.cxx:313
 TClassEdit.cxx:314
 TClassEdit.cxx:315
 TClassEdit.cxx:316
 TClassEdit.cxx:317
 TClassEdit.cxx:318
 TClassEdit.cxx:319
 TClassEdit.cxx:320
 TClassEdit.cxx:321
 TClassEdit.cxx:322
 TClassEdit.cxx:323
 TClassEdit.cxx:324
 TClassEdit.cxx:325
 TClassEdit.cxx:326
 TClassEdit.cxx:327
 TClassEdit.cxx:328
 TClassEdit.cxx:329
 TClassEdit.cxx:330
 TClassEdit.cxx:331
 TClassEdit.cxx:332
 TClassEdit.cxx:333
 TClassEdit.cxx:334
 TClassEdit.cxx:335
 TClassEdit.cxx:336
 TClassEdit.cxx:337
 TClassEdit.cxx:338
 TClassEdit.cxx:339
 TClassEdit.cxx:340
 TClassEdit.cxx:341
 TClassEdit.cxx:342
 TClassEdit.cxx:343
 TClassEdit.cxx:344
 TClassEdit.cxx:345
 TClassEdit.cxx:346
 TClassEdit.cxx:347
 TClassEdit.cxx:348
 TClassEdit.cxx:349
 TClassEdit.cxx:350
 TClassEdit.cxx:351
 TClassEdit.cxx:352
 TClassEdit.cxx:353
 TClassEdit.cxx:354
 TClassEdit.cxx:355
 TClassEdit.cxx:356
 TClassEdit.cxx:357
 TClassEdit.cxx:358
 TClassEdit.cxx:359
 TClassEdit.cxx:360
 TClassEdit.cxx:361
 TClassEdit.cxx:362
 TClassEdit.cxx:363
 TClassEdit.cxx:364
 TClassEdit.cxx:365
 TClassEdit.cxx:366
 TClassEdit.cxx:367
 TClassEdit.cxx:368
 TClassEdit.cxx:369
 TClassEdit.cxx:370
 TClassEdit.cxx:371
 TClassEdit.cxx:372
 TClassEdit.cxx:373
 TClassEdit.cxx:374
 TClassEdit.cxx:375
 TClassEdit.cxx:376
 TClassEdit.cxx:377
 TClassEdit.cxx:378
 TClassEdit.cxx:379
 TClassEdit.cxx:380
 TClassEdit.cxx:381
 TClassEdit.cxx:382
 TClassEdit.cxx:383
 TClassEdit.cxx:384
 TClassEdit.cxx:385
 TClassEdit.cxx:386
 TClassEdit.cxx:387
 TClassEdit.cxx:388
 TClassEdit.cxx:389
 TClassEdit.cxx:390
 TClassEdit.cxx:391
 TClassEdit.cxx:392
 TClassEdit.cxx:393
 TClassEdit.cxx:394
 TClassEdit.cxx:395
 TClassEdit.cxx:396
 TClassEdit.cxx:397
 TClassEdit.cxx:398
 TClassEdit.cxx:399
 TClassEdit.cxx:400
 TClassEdit.cxx:401
 TClassEdit.cxx:402
 TClassEdit.cxx:403
 TClassEdit.cxx:404
 TClassEdit.cxx:405
 TClassEdit.cxx:406
 TClassEdit.cxx:407
 TClassEdit.cxx:408
 TClassEdit.cxx:409
 TClassEdit.cxx:410
 TClassEdit.cxx:411
 TClassEdit.cxx:412
 TClassEdit.cxx:413
 TClassEdit.cxx:414
 TClassEdit.cxx:415
 TClassEdit.cxx:416
 TClassEdit.cxx:417
 TClassEdit.cxx:418
 TClassEdit.cxx:419
 TClassEdit.cxx:420
 TClassEdit.cxx:421
 TClassEdit.cxx:422
 TClassEdit.cxx:423
 TClassEdit.cxx:424
 TClassEdit.cxx:425
 TClassEdit.cxx:426
 TClassEdit.cxx:427
 TClassEdit.cxx:428
 TClassEdit.cxx:429
 TClassEdit.cxx:430
 TClassEdit.cxx:431
 TClassEdit.cxx:432
 TClassEdit.cxx:433
 TClassEdit.cxx:434
 TClassEdit.cxx:435
 TClassEdit.cxx:436
 TClassEdit.cxx:437
 TClassEdit.cxx:438
 TClassEdit.cxx:439
 TClassEdit.cxx:440
 TClassEdit.cxx:441
 TClassEdit.cxx:442
 TClassEdit.cxx:443
 TClassEdit.cxx:444
 TClassEdit.cxx:445
 TClassEdit.cxx:446
 TClassEdit.cxx:447
 TClassEdit.cxx:448
 TClassEdit.cxx:449
 TClassEdit.cxx:450
 TClassEdit.cxx:451
 TClassEdit.cxx:452
 TClassEdit.cxx:453
 TClassEdit.cxx:454
 TClassEdit.cxx:455
 TClassEdit.cxx:456
 TClassEdit.cxx:457
 TClassEdit.cxx:458
 TClassEdit.cxx:459
 TClassEdit.cxx:460
 TClassEdit.cxx:461
 TClassEdit.cxx:462
 TClassEdit.cxx:463
 TClassEdit.cxx:464
 TClassEdit.cxx:465
 TClassEdit.cxx:466
 TClassEdit.cxx:467
 TClassEdit.cxx:468
 TClassEdit.cxx:469
 TClassEdit.cxx:470
 TClassEdit.cxx:471
 TClassEdit.cxx:472
 TClassEdit.cxx:473
 TClassEdit.cxx:474
 TClassEdit.cxx:475
 TClassEdit.cxx:476
 TClassEdit.cxx:477
 TClassEdit.cxx:478
 TClassEdit.cxx:479
 TClassEdit.cxx:480
 TClassEdit.cxx:481
 TClassEdit.cxx:482
 TClassEdit.cxx:483
 TClassEdit.cxx:484
 TClassEdit.cxx:485
 TClassEdit.cxx:486
 TClassEdit.cxx:487
 TClassEdit.cxx:488
 TClassEdit.cxx:489
 TClassEdit.cxx:490
 TClassEdit.cxx:491
 TClassEdit.cxx:492
 TClassEdit.cxx:493
 TClassEdit.cxx:494
 TClassEdit.cxx:495
 TClassEdit.cxx:496
 TClassEdit.cxx:497
 TClassEdit.cxx:498
 TClassEdit.cxx:499
 TClassEdit.cxx:500
 TClassEdit.cxx:501
 TClassEdit.cxx:502
 TClassEdit.cxx:503
 TClassEdit.cxx:504
 TClassEdit.cxx:505
 TClassEdit.cxx:506
 TClassEdit.cxx:507
 TClassEdit.cxx:508
 TClassEdit.cxx:509
 TClassEdit.cxx:510
 TClassEdit.cxx:511
 TClassEdit.cxx:512
 TClassEdit.cxx:513
 TClassEdit.cxx:514
 TClassEdit.cxx:515
 TClassEdit.cxx:516
 TClassEdit.cxx:517
 TClassEdit.cxx:518
 TClassEdit.cxx:519
 TClassEdit.cxx:520
 TClassEdit.cxx:521
 TClassEdit.cxx:522
 TClassEdit.cxx:523
 TClassEdit.cxx:524
 TClassEdit.cxx:525
 TClassEdit.cxx:526
 TClassEdit.cxx:527
 TClassEdit.cxx:528
 TClassEdit.cxx:529
 TClassEdit.cxx:530
 TClassEdit.cxx:531
 TClassEdit.cxx:532
 TClassEdit.cxx:533
 TClassEdit.cxx:534
 TClassEdit.cxx:535
 TClassEdit.cxx:536
 TClassEdit.cxx:537
 TClassEdit.cxx:538
 TClassEdit.cxx:539
 TClassEdit.cxx:540
 TClassEdit.cxx:541
 TClassEdit.cxx:542
 TClassEdit.cxx:543
 TClassEdit.cxx:544
 TClassEdit.cxx:545
 TClassEdit.cxx:546
 TClassEdit.cxx:547
 TClassEdit.cxx:548
 TClassEdit.cxx:549
 TClassEdit.cxx:550
 TClassEdit.cxx:551
 TClassEdit.cxx:552
 TClassEdit.cxx:553
 TClassEdit.cxx:554
 TClassEdit.cxx:555
 TClassEdit.cxx:556
 TClassEdit.cxx:557
 TClassEdit.cxx:558
 TClassEdit.cxx:559
 TClassEdit.cxx:560
 TClassEdit.cxx:561
 TClassEdit.cxx:562
 TClassEdit.cxx:563
 TClassEdit.cxx:564
 TClassEdit.cxx:565
 TClassEdit.cxx:566
 TClassEdit.cxx:567
 TClassEdit.cxx:568
 TClassEdit.cxx:569
 TClassEdit.cxx:570
 TClassEdit.cxx:571
 TClassEdit.cxx:572
 TClassEdit.cxx:573
 TClassEdit.cxx:574
 TClassEdit.cxx:575
 TClassEdit.cxx:576
 TClassEdit.cxx:577
 TClassEdit.cxx:578
 TClassEdit.cxx:579
 TClassEdit.cxx:580
 TClassEdit.cxx:581
 TClassEdit.cxx:582
 TClassEdit.cxx:583
 TClassEdit.cxx:584
 TClassEdit.cxx:585
 TClassEdit.cxx:586
 TClassEdit.cxx:587
 TClassEdit.cxx:588
 TClassEdit.cxx:589
 TClassEdit.cxx:590
 TClassEdit.cxx:591
 TClassEdit.cxx:592
 TClassEdit.cxx:593
 TClassEdit.cxx:594
 TClassEdit.cxx:595
 TClassEdit.cxx:596
 TClassEdit.cxx:597
 TClassEdit.cxx:598
 TClassEdit.cxx:599
 TClassEdit.cxx:600
 TClassEdit.cxx:601
 TClassEdit.cxx:602
 TClassEdit.cxx:603
 TClassEdit.cxx:604
 TClassEdit.cxx:605
 TClassEdit.cxx:606
 TClassEdit.cxx:607
 TClassEdit.cxx:608
 TClassEdit.cxx:609
 TClassEdit.cxx:610
 TClassEdit.cxx:611
 TClassEdit.cxx:612
 TClassEdit.cxx:613
 TClassEdit.cxx:614
 TClassEdit.cxx:615
 TClassEdit.cxx:616
 TClassEdit.cxx:617
 TClassEdit.cxx:618
 TClassEdit.cxx:619
 TClassEdit.cxx:620
 TClassEdit.cxx:621
 TClassEdit.cxx:622
 TClassEdit.cxx:623
 TClassEdit.cxx:624
 TClassEdit.cxx:625
 TClassEdit.cxx:626
 TClassEdit.cxx:627
 TClassEdit.cxx:628
 TClassEdit.cxx:629
 TClassEdit.cxx:630
 TClassEdit.cxx:631
 TClassEdit.cxx:632
 TClassEdit.cxx:633
 TClassEdit.cxx:634
 TClassEdit.cxx:635
 TClassEdit.cxx:636
 TClassEdit.cxx:637
 TClassEdit.cxx:638
 TClassEdit.cxx:639
 TClassEdit.cxx:640
 TClassEdit.cxx:641
 TClassEdit.cxx:642
 TClassEdit.cxx:643
 TClassEdit.cxx:644
 TClassEdit.cxx:645
 TClassEdit.cxx:646
 TClassEdit.cxx:647
 TClassEdit.cxx:648
 TClassEdit.cxx:649
 TClassEdit.cxx:650
 TClassEdit.cxx:651
 TClassEdit.cxx:652
 TClassEdit.cxx:653
 TClassEdit.cxx:654
 TClassEdit.cxx:655
 TClassEdit.cxx:656
 TClassEdit.cxx:657
 TClassEdit.cxx:658
 TClassEdit.cxx:659
 TClassEdit.cxx:660
 TClassEdit.cxx:661
 TClassEdit.cxx:662
 TClassEdit.cxx:663
 TClassEdit.cxx:664
 TClassEdit.cxx:665
 TClassEdit.cxx:666
 TClassEdit.cxx:667
 TClassEdit.cxx:668
 TClassEdit.cxx:669
 TClassEdit.cxx:670
 TClassEdit.cxx:671
 TClassEdit.cxx:672
 TClassEdit.cxx:673
 TClassEdit.cxx:674
 TClassEdit.cxx:675
 TClassEdit.cxx:676
 TClassEdit.cxx:677
 TClassEdit.cxx:678
 TClassEdit.cxx:679
 TClassEdit.cxx:680
 TClassEdit.cxx:681
 TClassEdit.cxx:682
 TClassEdit.cxx:683
 TClassEdit.cxx:684
 TClassEdit.cxx:685
 TClassEdit.cxx:686
 TClassEdit.cxx:687
 TClassEdit.cxx:688
 TClassEdit.cxx:689
 TClassEdit.cxx:690
 TClassEdit.cxx:691
 TClassEdit.cxx:692
 TClassEdit.cxx:693
 TClassEdit.cxx:694
 TClassEdit.cxx:695
 TClassEdit.cxx:696
 TClassEdit.cxx:697
 TClassEdit.cxx:698
 TClassEdit.cxx:699
 TClassEdit.cxx:700
 TClassEdit.cxx:701
 TClassEdit.cxx:702
 TClassEdit.cxx:703
 TClassEdit.cxx:704
 TClassEdit.cxx:705
 TClassEdit.cxx:706
 TClassEdit.cxx:707
 TClassEdit.cxx:708
 TClassEdit.cxx:709
 TClassEdit.cxx:710
 TClassEdit.cxx:711
 TClassEdit.cxx:712
 TClassEdit.cxx:713
 TClassEdit.cxx:714
 TClassEdit.cxx:715
 TClassEdit.cxx:716
 TClassEdit.cxx:717
 TClassEdit.cxx:718
 TClassEdit.cxx:719
 TClassEdit.cxx:720
 TClassEdit.cxx:721
 TClassEdit.cxx:722
 TClassEdit.cxx:723
 TClassEdit.cxx:724
 TClassEdit.cxx:725
 TClassEdit.cxx:726
 TClassEdit.cxx:727
 TClassEdit.cxx:728
 TClassEdit.cxx:729
 TClassEdit.cxx:730
 TClassEdit.cxx:731
 TClassEdit.cxx:732
 TClassEdit.cxx:733
 TClassEdit.cxx:734
 TClassEdit.cxx:735
 TClassEdit.cxx:736
 TClassEdit.cxx:737
 TClassEdit.cxx:738
 TClassEdit.cxx:739
 TClassEdit.cxx:740
 TClassEdit.cxx:741
 TClassEdit.cxx:742
 TClassEdit.cxx:743
 TClassEdit.cxx:744
 TClassEdit.cxx:745
 TClassEdit.cxx:746
 TClassEdit.cxx:747
 TClassEdit.cxx:748
 TClassEdit.cxx:749
 TClassEdit.cxx:750
 TClassEdit.cxx:751
 TClassEdit.cxx:752
 TClassEdit.cxx:753
 TClassEdit.cxx:754
 TClassEdit.cxx:755
 TClassEdit.cxx:756
 TClassEdit.cxx:757
 TClassEdit.cxx:758
 TClassEdit.cxx:759
 TClassEdit.cxx:760
 TClassEdit.cxx:761
 TClassEdit.cxx:762
 TClassEdit.cxx:763
 TClassEdit.cxx:764
 TClassEdit.cxx:765
 TClassEdit.cxx:766
 TClassEdit.cxx:767
 TClassEdit.cxx:768
 TClassEdit.cxx:769
 TClassEdit.cxx:770
 TClassEdit.cxx:771
 TClassEdit.cxx:772
 TClassEdit.cxx:773
 TClassEdit.cxx:774
 TClassEdit.cxx:775
 TClassEdit.cxx:776
 TClassEdit.cxx:777
 TClassEdit.cxx:778
 TClassEdit.cxx:779
 TClassEdit.cxx:780
 TClassEdit.cxx:781
 TClassEdit.cxx:782
 TClassEdit.cxx:783
 TClassEdit.cxx:784
 TClassEdit.cxx:785
 TClassEdit.cxx:786
 TClassEdit.cxx:787
 TClassEdit.cxx:788
 TClassEdit.cxx:789
 TClassEdit.cxx:790
 TClassEdit.cxx:791
 TClassEdit.cxx:792
 TClassEdit.cxx:793
 TClassEdit.cxx:794
 TClassEdit.cxx:795
 TClassEdit.cxx:796
 TClassEdit.cxx:797
 TClassEdit.cxx:798
 TClassEdit.cxx:799
 TClassEdit.cxx:800
 TClassEdit.cxx:801
 TClassEdit.cxx:802
 TClassEdit.cxx:803
 TClassEdit.cxx:804
 TClassEdit.cxx:805
 TClassEdit.cxx:806
 TClassEdit.cxx:807
 TClassEdit.cxx:808
 TClassEdit.cxx:809
 TClassEdit.cxx:810
 TClassEdit.cxx:811
 TClassEdit.cxx:812
 TClassEdit.cxx:813
 TClassEdit.cxx:814
 TClassEdit.cxx:815
 TClassEdit.cxx:816
 TClassEdit.cxx:817
 TClassEdit.cxx:818
 TClassEdit.cxx:819
 TClassEdit.cxx:820
 TClassEdit.cxx:821
 TClassEdit.cxx:822
 TClassEdit.cxx:823
 TClassEdit.cxx:824
 TClassEdit.cxx:825
 TClassEdit.cxx:826
 TClassEdit.cxx:827
 TClassEdit.cxx:828
 TClassEdit.cxx:829
 TClassEdit.cxx:830
 TClassEdit.cxx:831
 TClassEdit.cxx:832
 TClassEdit.cxx:833
 TClassEdit.cxx:834
 TClassEdit.cxx:835
 TClassEdit.cxx:836
 TClassEdit.cxx:837
 TClassEdit.cxx:838
 TClassEdit.cxx:839
 TClassEdit.cxx:840
 TClassEdit.cxx:841
 TClassEdit.cxx:842
 TClassEdit.cxx:843
 TClassEdit.cxx:844
 TClassEdit.cxx:845
 TClassEdit.cxx:846
 TClassEdit.cxx:847
 TClassEdit.cxx:848
 TClassEdit.cxx:849
 TClassEdit.cxx:850
 TClassEdit.cxx:851
 TClassEdit.cxx:852
 TClassEdit.cxx:853
 TClassEdit.cxx:854
 TClassEdit.cxx:855
 TClassEdit.cxx:856
 TClassEdit.cxx:857
 TClassEdit.cxx:858
 TClassEdit.cxx:859
 TClassEdit.cxx:860
 TClassEdit.cxx:861
 TClassEdit.cxx:862
 TClassEdit.cxx:863
 TClassEdit.cxx:864
 TClassEdit.cxx:865
 TClassEdit.cxx:866
 TClassEdit.cxx:867
 TClassEdit.cxx:868
 TClassEdit.cxx:869
 TClassEdit.cxx:870
 TClassEdit.cxx:871
 TClassEdit.cxx:872
 TClassEdit.cxx:873
 TClassEdit.cxx:874
 TClassEdit.cxx:875
 TClassEdit.cxx:876
 TClassEdit.cxx:877
 TClassEdit.cxx:878
 TClassEdit.cxx:879
 TClassEdit.cxx:880
 TClassEdit.cxx:881
 TClassEdit.cxx:882
 TClassEdit.cxx:883
 TClassEdit.cxx:884
 TClassEdit.cxx:885
 TClassEdit.cxx:886
 TClassEdit.cxx:887
 TClassEdit.cxx:888
 TClassEdit.cxx:889
 TClassEdit.cxx:890
 TClassEdit.cxx:891
 TClassEdit.cxx:892
 TClassEdit.cxx:893
 TClassEdit.cxx:894
 TClassEdit.cxx:895
 TClassEdit.cxx:896
 TClassEdit.cxx:897
 TClassEdit.cxx:898
 TClassEdit.cxx:899
 TClassEdit.cxx:900
 TClassEdit.cxx:901
 TClassEdit.cxx:902
 TClassEdit.cxx:903
 TClassEdit.cxx:904
 TClassEdit.cxx:905
 TClassEdit.cxx:906
 TClassEdit.cxx:907
 TClassEdit.cxx:908
 TClassEdit.cxx:909
 TClassEdit.cxx:910
 TClassEdit.cxx:911
 TClassEdit.cxx:912
 TClassEdit.cxx:913
 TClassEdit.cxx:914
 TClassEdit.cxx:915
 TClassEdit.cxx:916
 TClassEdit.cxx:917
 TClassEdit.cxx:918
 TClassEdit.cxx:919
 TClassEdit.cxx:920
 TClassEdit.cxx:921
 TClassEdit.cxx:922
 TClassEdit.cxx:923
 TClassEdit.cxx:924
 TClassEdit.cxx:925
 TClassEdit.cxx:926
 TClassEdit.cxx:927
 TClassEdit.cxx:928
 TClassEdit.cxx:929
 TClassEdit.cxx:930
 TClassEdit.cxx:931
 TClassEdit.cxx:932
 TClassEdit.cxx:933
 TClassEdit.cxx:934
 TClassEdit.cxx:935
 TClassEdit.cxx:936
 TClassEdit.cxx:937
 TClassEdit.cxx:938
 TClassEdit.cxx:939
 TClassEdit.cxx:940
 TClassEdit.cxx:941
 TClassEdit.cxx:942
 TClassEdit.cxx:943
 TClassEdit.cxx:944
 TClassEdit.cxx:945
 TClassEdit.cxx:946
 TClassEdit.cxx:947
 TClassEdit.cxx:948
 TClassEdit.cxx:949
 TClassEdit.cxx:950
 TClassEdit.cxx:951
 TClassEdit.cxx:952
 TClassEdit.cxx:953
 TClassEdit.cxx:954
 TClassEdit.cxx:955
 TClassEdit.cxx:956
 TClassEdit.cxx:957
 TClassEdit.cxx:958
 TClassEdit.cxx:959
 TClassEdit.cxx:960
 TClassEdit.cxx:961
 TClassEdit.cxx:962
 TClassEdit.cxx:963
 TClassEdit.cxx:964
 TClassEdit.cxx:965
 TClassEdit.cxx:966
 TClassEdit.cxx:967
 TClassEdit.cxx:968
 TClassEdit.cxx:969
 TClassEdit.cxx:970
 TClassEdit.cxx:971
 TClassEdit.cxx:972
 TClassEdit.cxx:973
 TClassEdit.cxx:974
 TClassEdit.cxx:975
 TClassEdit.cxx:976
 TClassEdit.cxx:977
 TClassEdit.cxx:978
 TClassEdit.cxx:979
 TClassEdit.cxx:980
 TClassEdit.cxx:981
 TClassEdit.cxx:982
 TClassEdit.cxx:983
 TClassEdit.cxx:984
 TClassEdit.cxx:985
 TClassEdit.cxx:986
 TClassEdit.cxx:987
 TClassEdit.cxx:988
 TClassEdit.cxx:989
 TClassEdit.cxx:990
 TClassEdit.cxx:991
 TClassEdit.cxx:992
 TClassEdit.cxx:993
 TClassEdit.cxx:994
 TClassEdit.cxx:995
 TClassEdit.cxx:996
 TClassEdit.cxx:997
 TClassEdit.cxx:998
 TClassEdit.cxx:999
 TClassEdit.cxx:1000
 TClassEdit.cxx:1001
 TClassEdit.cxx:1002
 TClassEdit.cxx:1003
 TClassEdit.cxx:1004
 TClassEdit.cxx:1005
 TClassEdit.cxx:1006
 TClassEdit.cxx:1007
 TClassEdit.cxx:1008
 TClassEdit.cxx:1009
 TClassEdit.cxx:1010
 TClassEdit.cxx:1011
 TClassEdit.cxx:1012
 TClassEdit.cxx:1013
 TClassEdit.cxx:1014
 TClassEdit.cxx:1015
 TClassEdit.cxx:1016
 TClassEdit.cxx:1017
 TClassEdit.cxx:1018
 TClassEdit.cxx:1019
 TClassEdit.cxx:1020
 TClassEdit.cxx:1021
 TClassEdit.cxx:1022
 TClassEdit.cxx:1023
 TClassEdit.cxx:1024
 TClassEdit.cxx:1025
 TClassEdit.cxx:1026
 TClassEdit.cxx:1027
 TClassEdit.cxx:1028
 TClassEdit.cxx:1029
 TClassEdit.cxx:1030
 TClassEdit.cxx:1031
 TClassEdit.cxx:1032
 TClassEdit.cxx:1033
 TClassEdit.cxx:1034
 TClassEdit.cxx:1035
 TClassEdit.cxx:1036
 TClassEdit.cxx:1037
 TClassEdit.cxx:1038
 TClassEdit.cxx:1039
 TClassEdit.cxx:1040
 TClassEdit.cxx:1041
 TClassEdit.cxx:1042
 TClassEdit.cxx:1043
 TClassEdit.cxx:1044
 TClassEdit.cxx:1045
 TClassEdit.cxx:1046
 TClassEdit.cxx:1047
 TClassEdit.cxx:1048
 TClassEdit.cxx:1049
 TClassEdit.cxx:1050
 TClassEdit.cxx:1051
 TClassEdit.cxx:1052
 TClassEdit.cxx:1053
 TClassEdit.cxx:1054
 TClassEdit.cxx:1055
 TClassEdit.cxx:1056
 TClassEdit.cxx:1057
 TClassEdit.cxx:1058
 TClassEdit.cxx:1059
 TClassEdit.cxx:1060
 TClassEdit.cxx:1061
 TClassEdit.cxx:1062
 TClassEdit.cxx:1063
 TClassEdit.cxx:1064
 TClassEdit.cxx:1065
 TClassEdit.cxx:1066
 TClassEdit.cxx:1067
 TClassEdit.cxx:1068
 TClassEdit.cxx:1069
 TClassEdit.cxx:1070
 TClassEdit.cxx:1071
 TClassEdit.cxx:1072
 TClassEdit.cxx:1073
 TClassEdit.cxx:1074
 TClassEdit.cxx:1075
 TClassEdit.cxx:1076
 TClassEdit.cxx:1077
 TClassEdit.cxx:1078
 TClassEdit.cxx:1079
 TClassEdit.cxx:1080
 TClassEdit.cxx:1081
 TClassEdit.cxx:1082
 TClassEdit.cxx:1083
 TClassEdit.cxx:1084
 TClassEdit.cxx:1085
 TClassEdit.cxx:1086
 TClassEdit.cxx:1087
 TClassEdit.cxx:1088
 TClassEdit.cxx:1089
 TClassEdit.cxx:1090
 TClassEdit.cxx:1091
 TClassEdit.cxx:1092
 TClassEdit.cxx:1093
 TClassEdit.cxx:1094
 TClassEdit.cxx:1095
 TClassEdit.cxx:1096
 TClassEdit.cxx:1097
 TClassEdit.cxx:1098
 TClassEdit.cxx:1099
 TClassEdit.cxx:1100
 TClassEdit.cxx:1101
 TClassEdit.cxx:1102
 TClassEdit.cxx:1103
 TClassEdit.cxx:1104
 TClassEdit.cxx:1105
 TClassEdit.cxx:1106
 TClassEdit.cxx:1107
 TClassEdit.cxx:1108
 TClassEdit.cxx:1109
 TClassEdit.cxx:1110
 TClassEdit.cxx:1111
 TClassEdit.cxx:1112
 TClassEdit.cxx:1113
 TClassEdit.cxx:1114
 TClassEdit.cxx:1115
 TClassEdit.cxx:1116
 TClassEdit.cxx:1117
 TClassEdit.cxx:1118
 TClassEdit.cxx:1119
 TClassEdit.cxx:1120
 TClassEdit.cxx:1121
 TClassEdit.cxx:1122
 TClassEdit.cxx:1123
 TClassEdit.cxx:1124
 TClassEdit.cxx:1125
 TClassEdit.cxx:1126
 TClassEdit.cxx:1127
 TClassEdit.cxx:1128
 TClassEdit.cxx:1129
 TClassEdit.cxx:1130
 TClassEdit.cxx:1131
 TClassEdit.cxx:1132
 TClassEdit.cxx:1133
 TClassEdit.cxx:1134
 TClassEdit.cxx:1135
 TClassEdit.cxx:1136
 TClassEdit.cxx:1137
 TClassEdit.cxx:1138
 TClassEdit.cxx:1139
 TClassEdit.cxx:1140
 TClassEdit.cxx:1141
 TClassEdit.cxx:1142
 TClassEdit.cxx:1143
 TClassEdit.cxx:1144
 TClassEdit.cxx:1145
 TClassEdit.cxx:1146
 TClassEdit.cxx:1147
 TClassEdit.cxx:1148
 TClassEdit.cxx:1149
 TClassEdit.cxx:1150
 TClassEdit.cxx:1151
 TClassEdit.cxx:1152
 TClassEdit.cxx:1153
 TClassEdit.cxx:1154
 TClassEdit.cxx:1155
 TClassEdit.cxx:1156
 TClassEdit.cxx:1157
 TClassEdit.cxx:1158
 TClassEdit.cxx:1159
 TClassEdit.cxx:1160
 TClassEdit.cxx:1161
 TClassEdit.cxx:1162
 TClassEdit.cxx:1163
 TClassEdit.cxx:1164
 TClassEdit.cxx:1165
 TClassEdit.cxx:1166
 TClassEdit.cxx:1167
 TClassEdit.cxx:1168
 TClassEdit.cxx:1169
 TClassEdit.cxx:1170
 TClassEdit.cxx:1171
 TClassEdit.cxx:1172
 TClassEdit.cxx:1173
 TClassEdit.cxx:1174
 TClassEdit.cxx:1175
 TClassEdit.cxx:1176
 TClassEdit.cxx:1177
 TClassEdit.cxx:1178
 TClassEdit.cxx:1179
 TClassEdit.cxx:1180
 TClassEdit.cxx:1181
 TClassEdit.cxx:1182
 TClassEdit.cxx:1183
 TClassEdit.cxx:1184
 TClassEdit.cxx:1185
 TClassEdit.cxx:1186
 TClassEdit.cxx:1187
 TClassEdit.cxx:1188
 TClassEdit.cxx:1189
 TClassEdit.cxx:1190
 TClassEdit.cxx:1191
 TClassEdit.cxx:1192
 TClassEdit.cxx:1193
 TClassEdit.cxx:1194
 TClassEdit.cxx:1195
 TClassEdit.cxx:1196
 TClassEdit.cxx:1197
 TClassEdit.cxx:1198
 TClassEdit.cxx:1199
 TClassEdit.cxx:1200
 TClassEdit.cxx:1201
 TClassEdit.cxx:1202
 TClassEdit.cxx:1203
 TClassEdit.cxx:1204
 TClassEdit.cxx:1205
 TClassEdit.cxx:1206
 TClassEdit.cxx:1207
 TClassEdit.cxx:1208
 TClassEdit.cxx:1209
 TClassEdit.cxx:1210
 TClassEdit.cxx:1211
 TClassEdit.cxx:1212
 TClassEdit.cxx:1213
 TClassEdit.cxx:1214
 TClassEdit.cxx:1215
 TClassEdit.cxx:1216
 TClassEdit.cxx:1217
 TClassEdit.cxx:1218
 TClassEdit.cxx:1219
 TClassEdit.cxx:1220
 TClassEdit.cxx:1221
 TClassEdit.cxx:1222
 TClassEdit.cxx:1223
 TClassEdit.cxx:1224
 TClassEdit.cxx:1225
 TClassEdit.cxx:1226
 TClassEdit.cxx:1227
 TClassEdit.cxx:1228
 TClassEdit.cxx:1229
 TClassEdit.cxx:1230
 TClassEdit.cxx:1231
 TClassEdit.cxx:1232
 TClassEdit.cxx:1233
 TClassEdit.cxx:1234
 TClassEdit.cxx:1235
 TClassEdit.cxx:1236
 TClassEdit.cxx:1237
 TClassEdit.cxx:1238
 TClassEdit.cxx:1239
 TClassEdit.cxx:1240
 TClassEdit.cxx:1241
 TClassEdit.cxx:1242
 TClassEdit.cxx:1243
 TClassEdit.cxx:1244
 TClassEdit.cxx:1245
 TClassEdit.cxx:1246
 TClassEdit.cxx:1247
 TClassEdit.cxx:1248
 TClassEdit.cxx:1249
 TClassEdit.cxx:1250
 TClassEdit.cxx:1251
 TClassEdit.cxx:1252
 TClassEdit.cxx:1253
 TClassEdit.cxx:1254
 TClassEdit.cxx:1255
 TClassEdit.cxx:1256
 TClassEdit.cxx:1257
 TClassEdit.cxx:1258
 TClassEdit.cxx:1259
 TClassEdit.cxx:1260
 TClassEdit.cxx:1261
 TClassEdit.cxx:1262
 TClassEdit.cxx:1263
 TClassEdit.cxx:1264
 TClassEdit.cxx:1265
 TClassEdit.cxx:1266
 TClassEdit.cxx:1267
 TClassEdit.cxx:1268
 TClassEdit.cxx:1269
 TClassEdit.cxx:1270
 TClassEdit.cxx:1271
 TClassEdit.cxx:1272
 TClassEdit.cxx:1273
 TClassEdit.cxx:1274
 TClassEdit.cxx:1275
 TClassEdit.cxx:1276
 TClassEdit.cxx:1277
 TClassEdit.cxx:1278
 TClassEdit.cxx:1279
 TClassEdit.cxx:1280
 TClassEdit.cxx:1281
 TClassEdit.cxx:1282
 TClassEdit.cxx:1283
 TClassEdit.cxx:1284
 TClassEdit.cxx:1285
 TClassEdit.cxx:1286
 TClassEdit.cxx:1287
 TClassEdit.cxx:1288
 TClassEdit.cxx:1289
 TClassEdit.cxx:1290
 TClassEdit.cxx:1291
 TClassEdit.cxx:1292
 TClassEdit.cxx:1293
 TClassEdit.cxx:1294
 TClassEdit.cxx:1295
 TClassEdit.cxx:1296
 TClassEdit.cxx:1297
 TClassEdit.cxx:1298
 TClassEdit.cxx:1299
 TClassEdit.cxx:1300
 TClassEdit.cxx:1301
 TClassEdit.cxx:1302
 TClassEdit.cxx:1303
 TClassEdit.cxx:1304
 TClassEdit.cxx:1305
 TClassEdit.cxx:1306
 TClassEdit.cxx:1307
 TClassEdit.cxx:1308
 TClassEdit.cxx:1309
 TClassEdit.cxx:1310
 TClassEdit.cxx:1311
 TClassEdit.cxx:1312
 TClassEdit.cxx:1313
 TClassEdit.cxx:1314
 TClassEdit.cxx:1315
 TClassEdit.cxx:1316
 TClassEdit.cxx:1317
 TClassEdit.cxx:1318
 TClassEdit.cxx:1319
 TClassEdit.cxx:1320
 TClassEdit.cxx:1321
 TClassEdit.cxx:1322
 TClassEdit.cxx:1323
 TClassEdit.cxx:1324
 TClassEdit.cxx:1325
 TClassEdit.cxx:1326
 TClassEdit.cxx:1327
 TClassEdit.cxx:1328
 TClassEdit.cxx:1329
 TClassEdit.cxx:1330
 TClassEdit.cxx:1331
 TClassEdit.cxx:1332
 TClassEdit.cxx:1333
 TClassEdit.cxx:1334
 TClassEdit.cxx:1335
 TClassEdit.cxx:1336
 TClassEdit.cxx:1337
 TClassEdit.cxx:1338
 TClassEdit.cxx:1339
 TClassEdit.cxx:1340
 TClassEdit.cxx:1341
 TClassEdit.cxx:1342
 TClassEdit.cxx:1343
 TClassEdit.cxx:1344
 TClassEdit.cxx:1345
 TClassEdit.cxx:1346
 TClassEdit.cxx:1347
 TClassEdit.cxx:1348
 TClassEdit.cxx:1349
 TClassEdit.cxx:1350
 TClassEdit.cxx:1351
 TClassEdit.cxx:1352
 TClassEdit.cxx:1353
 TClassEdit.cxx:1354
 TClassEdit.cxx:1355
 TClassEdit.cxx:1356
 TClassEdit.cxx:1357
 TClassEdit.cxx:1358
 TClassEdit.cxx:1359
 TClassEdit.cxx:1360
 TClassEdit.cxx:1361
 TClassEdit.cxx:1362
 TClassEdit.cxx:1363
 TClassEdit.cxx:1364
 TClassEdit.cxx:1365
 TClassEdit.cxx:1366
 TClassEdit.cxx:1367
 TClassEdit.cxx:1368
 TClassEdit.cxx:1369
 TClassEdit.cxx:1370
 TClassEdit.cxx:1371
 TClassEdit.cxx:1372
 TClassEdit.cxx:1373
 TClassEdit.cxx:1374
 TClassEdit.cxx:1375
 TClassEdit.cxx:1376
 TClassEdit.cxx:1377
 TClassEdit.cxx:1378
 TClassEdit.cxx:1379
 TClassEdit.cxx:1380
 TClassEdit.cxx:1381
 TClassEdit.cxx:1382
 TClassEdit.cxx:1383
 TClassEdit.cxx:1384
 TClassEdit.cxx:1385
 TClassEdit.cxx:1386
 TClassEdit.cxx:1387
 TClassEdit.cxx:1388
 TClassEdit.cxx:1389
 TClassEdit.cxx:1390
 TClassEdit.cxx:1391
 TClassEdit.cxx:1392
 TClassEdit.cxx:1393
 TClassEdit.cxx:1394
 TClassEdit.cxx:1395
 TClassEdit.cxx:1396
 TClassEdit.cxx:1397
 TClassEdit.cxx:1398
 TClassEdit.cxx:1399
 TClassEdit.cxx:1400
 TClassEdit.cxx:1401
 TClassEdit.cxx:1402
 TClassEdit.cxx:1403
 TClassEdit.cxx:1404
 TClassEdit.cxx:1405
 TClassEdit.cxx:1406
 TClassEdit.cxx:1407
 TClassEdit.cxx:1408
 TClassEdit.cxx:1409
 TClassEdit.cxx:1410
 TClassEdit.cxx:1411
 TClassEdit.cxx:1412
 TClassEdit.cxx:1413
 TClassEdit.cxx:1414
 TClassEdit.cxx:1415
 TClassEdit.cxx:1416
 TClassEdit.cxx:1417
 TClassEdit.cxx:1418
 TClassEdit.cxx:1419
 TClassEdit.cxx:1420
 TClassEdit.cxx:1421
 TClassEdit.cxx:1422
 TClassEdit.cxx:1423
 TClassEdit.cxx:1424
 TClassEdit.cxx:1425
 TClassEdit.cxx:1426
 TClassEdit.cxx:1427
 TClassEdit.cxx:1428
 TClassEdit.cxx:1429
 TClassEdit.cxx:1430
 TClassEdit.cxx:1431
 TClassEdit.cxx:1432
 TClassEdit.cxx:1433
 TClassEdit.cxx:1434
 TClassEdit.cxx:1435
 TClassEdit.cxx:1436
 TClassEdit.cxx:1437
 TClassEdit.cxx:1438
 TClassEdit.cxx:1439
 TClassEdit.cxx:1440
 TClassEdit.cxx:1441
 TClassEdit.cxx:1442
 TClassEdit.cxx:1443
 TClassEdit.cxx:1444
 TClassEdit.cxx:1445
 TClassEdit.cxx:1446
 TClassEdit.cxx:1447
 TClassEdit.cxx:1448
 TClassEdit.cxx:1449
 TClassEdit.cxx:1450
 TClassEdit.cxx:1451
 TClassEdit.cxx:1452
 TClassEdit.cxx:1453
 TClassEdit.cxx:1454
 TClassEdit.cxx:1455
 TClassEdit.cxx:1456
 TClassEdit.cxx:1457
 TClassEdit.cxx:1458
 TClassEdit.cxx:1459
 TClassEdit.cxx:1460
 TClassEdit.cxx:1461
 TClassEdit.cxx:1462
 TClassEdit.cxx:1463
 TClassEdit.cxx:1464
 TClassEdit.cxx:1465
 TClassEdit.cxx:1466
 TClassEdit.cxx:1467
 TClassEdit.cxx:1468
 TClassEdit.cxx:1469
 TClassEdit.cxx:1470
 TClassEdit.cxx:1471
 TClassEdit.cxx:1472
 TClassEdit.cxx:1473
 TClassEdit.cxx:1474
 TClassEdit.cxx:1475
 TClassEdit.cxx:1476
 TClassEdit.cxx:1477
 TClassEdit.cxx:1478
 TClassEdit.cxx:1479
 TClassEdit.cxx:1480
 TClassEdit.cxx:1481
 TClassEdit.cxx:1482
 TClassEdit.cxx:1483
 TClassEdit.cxx:1484
 TClassEdit.cxx:1485
 TClassEdit.cxx:1486
 TClassEdit.cxx:1487
 TClassEdit.cxx:1488
 TClassEdit.cxx:1489
 TClassEdit.cxx:1490
 TClassEdit.cxx:1491
 TClassEdit.cxx:1492
 TClassEdit.cxx:1493
 TClassEdit.cxx:1494
 TClassEdit.cxx:1495
 TClassEdit.cxx:1496
 TClassEdit.cxx:1497
 TClassEdit.cxx:1498
 TClassEdit.cxx:1499
 TClassEdit.cxx:1500
 TClassEdit.cxx:1501
 TClassEdit.cxx:1502
 TClassEdit.cxx:1503
 TClassEdit.cxx:1504
 TClassEdit.cxx:1505
 TClassEdit.cxx:1506
 TClassEdit.cxx:1507
 TClassEdit.cxx:1508
 TClassEdit.cxx:1509
 TClassEdit.cxx:1510
 TClassEdit.cxx:1511
 TClassEdit.cxx:1512
 TClassEdit.cxx:1513
 TClassEdit.cxx:1514
 TClassEdit.cxx:1515
 TClassEdit.cxx:1516
 TClassEdit.cxx:1517
 TClassEdit.cxx:1518
 TClassEdit.cxx:1519
 TClassEdit.cxx:1520
 TClassEdit.cxx:1521
 TClassEdit.cxx:1522
 TClassEdit.cxx:1523
 TClassEdit.cxx:1524
 TClassEdit.cxx:1525
 TClassEdit.cxx:1526
 TClassEdit.cxx:1527
 TClassEdit.cxx:1528
 TClassEdit.cxx:1529
 TClassEdit.cxx:1530
 TClassEdit.cxx:1531
 TClassEdit.cxx:1532
 TClassEdit.cxx:1533
 TClassEdit.cxx:1534
 TClassEdit.cxx:1535
 TClassEdit.cxx:1536
 TClassEdit.cxx:1537
 TClassEdit.cxx:1538
 TClassEdit.cxx:1539
 TClassEdit.cxx:1540
 TClassEdit.cxx:1541
 TClassEdit.cxx:1542
 TClassEdit.cxx:1543
 TClassEdit.cxx:1544
 TClassEdit.cxx:1545
 TClassEdit.cxx:1546
 TClassEdit.cxx:1547
 TClassEdit.cxx:1548
 TClassEdit.cxx:1549
 TClassEdit.cxx:1550
 TClassEdit.cxx:1551
 TClassEdit.cxx:1552
 TClassEdit.cxx:1553
 TClassEdit.cxx:1554
 TClassEdit.cxx:1555
 TClassEdit.cxx:1556
 TClassEdit.cxx:1557
 TClassEdit.cxx:1558
 TClassEdit.cxx:1559
 TClassEdit.cxx:1560
 TClassEdit.cxx:1561
 TClassEdit.cxx:1562
 TClassEdit.cxx:1563
 TClassEdit.cxx:1564
 TClassEdit.cxx:1565
 TClassEdit.cxx:1566
 TClassEdit.cxx:1567
 TClassEdit.cxx:1568
 TClassEdit.cxx:1569
 TClassEdit.cxx:1570
 TClassEdit.cxx:1571
 TClassEdit.cxx:1572
 TClassEdit.cxx:1573
 TClassEdit.cxx:1574
 TClassEdit.cxx:1575
 TClassEdit.cxx:1576
 TClassEdit.cxx:1577
 TClassEdit.cxx:1578
 TClassEdit.cxx:1579
 TClassEdit.cxx:1580
 TClassEdit.cxx:1581
 TClassEdit.cxx:1582
 TClassEdit.cxx:1583
 TClassEdit.cxx:1584
 TClassEdit.cxx:1585
 TClassEdit.cxx:1586
 TClassEdit.cxx:1587
 TClassEdit.cxx:1588
 TClassEdit.cxx:1589
 TClassEdit.cxx:1590
 TClassEdit.cxx:1591
 TClassEdit.cxx:1592
 TClassEdit.cxx:1593
 TClassEdit.cxx:1594
 TClassEdit.cxx:1595
 TClassEdit.cxx:1596
 TClassEdit.cxx:1597
 TClassEdit.cxx:1598
 TClassEdit.cxx:1599
 TClassEdit.cxx:1600
 TClassEdit.cxx:1601
 TClassEdit.cxx:1602
 TClassEdit.cxx:1603
 TClassEdit.cxx:1604
 TClassEdit.cxx:1605
 TClassEdit.cxx:1606
 TClassEdit.cxx:1607
 TClassEdit.cxx:1608
 TClassEdit.cxx:1609
 TClassEdit.cxx:1610
 TClassEdit.cxx:1611
 TClassEdit.cxx:1612
 TClassEdit.cxx:1613
 TClassEdit.cxx:1614
 TClassEdit.cxx:1615
 TClassEdit.cxx:1616
 TClassEdit.cxx:1617
 TClassEdit.cxx:1618
 TClassEdit.cxx:1619
 TClassEdit.cxx:1620
 TClassEdit.cxx:1621
 TClassEdit.cxx:1622
 TClassEdit.cxx:1623
 TClassEdit.cxx:1624
 TClassEdit.cxx:1625
 TClassEdit.cxx:1626
 TClassEdit.cxx:1627
 TClassEdit.cxx:1628
 TClassEdit.cxx:1629
 TClassEdit.cxx:1630
 TClassEdit.cxx:1631
 TClassEdit.cxx:1632
 TClassEdit.cxx:1633
 TClassEdit.cxx:1634
 TClassEdit.cxx:1635
 TClassEdit.cxx:1636
 TClassEdit.cxx:1637
 TClassEdit.cxx:1638
 TClassEdit.cxx:1639
 TClassEdit.cxx:1640
 TClassEdit.cxx:1641
 TClassEdit.cxx:1642
 TClassEdit.cxx:1643
 TClassEdit.cxx:1644
 TClassEdit.cxx:1645
 TClassEdit.cxx:1646
 TClassEdit.cxx:1647
 TClassEdit.cxx:1648
 TClassEdit.cxx:1649
 TClassEdit.cxx:1650
 TClassEdit.cxx:1651
 TClassEdit.cxx:1652
 TClassEdit.cxx:1653
 TClassEdit.cxx:1654
 TClassEdit.cxx:1655
 TClassEdit.cxx:1656
 TClassEdit.cxx:1657
 TClassEdit.cxx:1658
 TClassEdit.cxx:1659
 TClassEdit.cxx:1660
 TClassEdit.cxx:1661
 TClassEdit.cxx:1662
 TClassEdit.cxx:1663
 TClassEdit.cxx:1664
 TClassEdit.cxx:1665
 TClassEdit.cxx:1666
 TClassEdit.cxx:1667
 TClassEdit.cxx:1668
 TClassEdit.cxx:1669
 TClassEdit.cxx:1670
 TClassEdit.cxx:1671
 TClassEdit.cxx:1672
 TClassEdit.cxx:1673
 TClassEdit.cxx:1674
 TClassEdit.cxx:1675
 TClassEdit.cxx:1676
 TClassEdit.cxx:1677
 TClassEdit.cxx:1678
 TClassEdit.cxx:1679
 TClassEdit.cxx:1680
 TClassEdit.cxx:1681
 TClassEdit.cxx:1682
 TClassEdit.cxx:1683
 TClassEdit.cxx:1684
 TClassEdit.cxx:1685
 TClassEdit.cxx:1686
 TClassEdit.cxx:1687
 TClassEdit.cxx:1688
 TClassEdit.cxx:1689
 TClassEdit.cxx:1690
 TClassEdit.cxx:1691
 TClassEdit.cxx:1692
 TClassEdit.cxx:1693
 TClassEdit.cxx:1694
 TClassEdit.cxx:1695
 TClassEdit.cxx:1696
 TClassEdit.cxx:1697
 TClassEdit.cxx:1698
 TClassEdit.cxx:1699
 TClassEdit.cxx:1700
 TClassEdit.cxx:1701
 TClassEdit.cxx:1702
 TClassEdit.cxx:1703
 TClassEdit.cxx:1704
 TClassEdit.cxx:1705
 TClassEdit.cxx:1706
 TClassEdit.cxx:1707
 TClassEdit.cxx:1708
 TClassEdit.cxx:1709
 TClassEdit.cxx:1710
 TClassEdit.cxx:1711
 TClassEdit.cxx:1712
 TClassEdit.cxx:1713
 TClassEdit.cxx:1714
 TClassEdit.cxx:1715
 TClassEdit.cxx:1716
 TClassEdit.cxx:1717
 TClassEdit.cxx:1718
 TClassEdit.cxx:1719
 TClassEdit.cxx:1720
 TClassEdit.cxx:1721
 TClassEdit.cxx:1722
 TClassEdit.cxx:1723
 TClassEdit.cxx:1724
 TClassEdit.cxx:1725
 TClassEdit.cxx:1726
 TClassEdit.cxx:1727
 TClassEdit.cxx:1728
 TClassEdit.cxx:1729
 TClassEdit.cxx:1730
 TClassEdit.cxx:1731
 TClassEdit.cxx:1732
 TClassEdit.cxx:1733
 TClassEdit.cxx:1734
 TClassEdit.cxx:1735
 TClassEdit.cxx:1736
 TClassEdit.cxx:1737
 TClassEdit.cxx:1738
 TClassEdit.cxx:1739
 TClassEdit.cxx:1740
 TClassEdit.cxx:1741
 TClassEdit.cxx:1742
 TClassEdit.cxx:1743
 TClassEdit.cxx:1744
 TClassEdit.cxx:1745
 TClassEdit.cxx:1746
 TClassEdit.cxx:1747
 TClassEdit.cxx:1748
 TClassEdit.cxx:1749
 TClassEdit.cxx:1750
 TClassEdit.cxx:1751
 TClassEdit.cxx:1752
 TClassEdit.cxx:1753
 TClassEdit.cxx:1754
 TClassEdit.cxx:1755
 TClassEdit.cxx:1756
 TClassEdit.cxx:1757
 TClassEdit.cxx:1758
 TClassEdit.cxx:1759
 TClassEdit.cxx:1760
 TClassEdit.cxx:1761
 TClassEdit.cxx:1762
 TClassEdit.cxx:1763
 TClassEdit.cxx:1764
 TClassEdit.cxx:1765
 TClassEdit.cxx:1766
 TClassEdit.cxx:1767
 TClassEdit.cxx:1768
 TClassEdit.cxx:1769
 TClassEdit.cxx:1770
 TClassEdit.cxx:1771
 TClassEdit.cxx:1772
 TClassEdit.cxx:1773
 TClassEdit.cxx:1774
 TClassEdit.cxx:1775
 TClassEdit.cxx:1776
 TClassEdit.cxx:1777
 TClassEdit.cxx:1778
 TClassEdit.cxx:1779
 TClassEdit.cxx:1780
 TClassEdit.cxx:1781
 TClassEdit.cxx:1782
 TClassEdit.cxx:1783
 TClassEdit.cxx:1784
 TClassEdit.cxx:1785
 TClassEdit.cxx:1786
 TClassEdit.cxx:1787
 TClassEdit.cxx:1788
 TClassEdit.cxx:1789
 TClassEdit.cxx:1790
 TClassEdit.cxx:1791
 TClassEdit.cxx:1792
 TClassEdit.cxx:1793
 TClassEdit.cxx:1794
 TClassEdit.cxx:1795
 TClassEdit.cxx:1796
 TClassEdit.cxx:1797
 TClassEdit.cxx:1798
 TClassEdit.cxx:1799
 TClassEdit.cxx:1800
 TClassEdit.cxx:1801
 TClassEdit.cxx:1802
 TClassEdit.cxx:1803
 TClassEdit.cxx:1804
 TClassEdit.cxx:1805
 TClassEdit.cxx:1806
 TClassEdit.cxx:1807
 TClassEdit.cxx:1808
 TClassEdit.cxx:1809
 TClassEdit.cxx:1810
 TClassEdit.cxx:1811
 TClassEdit.cxx:1812
 TClassEdit.cxx:1813
 TClassEdit.cxx:1814
 TClassEdit.cxx:1815
 TClassEdit.cxx:1816
 TClassEdit.cxx:1817
 TClassEdit.cxx:1818
 TClassEdit.cxx:1819
 TClassEdit.cxx:1820
 TClassEdit.cxx:1821
 TClassEdit.cxx:1822
 TClassEdit.cxx:1823
 TClassEdit.cxx:1824
 TClassEdit.cxx:1825
 TClassEdit.cxx:1826
 TClassEdit.cxx:1827
 TClassEdit.cxx:1828
 TClassEdit.cxx:1829
 TClassEdit.cxx:1830
 TClassEdit.cxx:1831
 TClassEdit.cxx:1832
 TClassEdit.cxx:1833
 TClassEdit.cxx:1834
 TClassEdit.cxx:1835
 TClassEdit.cxx:1836
 TClassEdit.cxx:1837
 TClassEdit.cxx:1838
 TClassEdit.cxx:1839
 TClassEdit.cxx:1840
 TClassEdit.cxx:1841
 TClassEdit.cxx:1842
 TClassEdit.cxx:1843
 TClassEdit.cxx:1844
 TClassEdit.cxx:1845