ROOT logo
// $Id: ZQueen.cxx 2754 2012-06-04 17:42:33Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "ZQueen.h"
#include "ZHashList.h"
#include <Stones/ZComet.h>
#include "ZQueen.c7"
#include "ZKing.h"
#include <Ephra/Saturn.h>
#include <Glasses/EyeInfo.h>
#include <Ephra/EyeInfoVector.h>
#include <Gled/GledNS.h>
#include <Eye/Eye.h>
#include <Eye/Ray.h>

#include <Gled/GThread.h>
#include <TSystem.h>

//________________________________________________________________________
//
// A Queen controls its portion of the ID space.
// Glasses are adopted/instantiated and enlightened by it.
// Queens (like Kings) are exported to all Moons but are not
// necesarily activated immediately (controled by bMandatory).
// Queen's status is given by bRuling.
//
// Although queens are always at least partially exposed, MIRs with
// alpa=queen are *not* broadcasted to all Moons by the Saturn's mir
// processing code. Exported methods that should be called also at
// inactive queens must be pushed there by hand. This service is
// offered by the BroadcastMIRToNonRulingReflections() method. For
// example see ZQueen::AddDependency.
//
//
// Dev notes
// =========
//
// 1. QueenState_e mState is not handled at the moons. This was introduced for
// the future handling of queen mirroring using eunuchs w/ clean state
// transitions.
// The two flags bRuling and bAwaitingSceptre play this role for now.

ClassImp(ZQueen);

/**************************************************************************/

void ZQueen::_init()
{
  bMandatory = false;
  bFollowDeps = false;
  bRuling = bAwaitingSceptre = false;
  mState = QS_Sleeping;

  mMinID = mMaxID = 0;
  mIDsUsed = mIDsPurged = mIDsFree;
  mAvgPurgLen = 32; mSgmPurgLen = 0.2;
  mPurgedMS = 5000; mDeletedMS = 5000;

  mZeroRCPolicy = ZRCP_Delete;

  bStamping   = true;
  bStampIdOps = false;

  mAuthMode = AM_LensThenQueen;
  mAlignment = A_Good;
  mMapNoneTo = ZMirFilter::R_Deny;
  mProtector = 0;

  mDeps = 0; mOrphans = 0;

  mObservers = new EyeInfoVector(0);
  mObservers->IncRefCnt();
}

ZQueen::ZQueen(const Text_t* n, const Text_t* t) :
  ZNameMap(n,t), mIDSpan(0),
  mObservers(0),
  mSubjectWriteMutex(GMutex::recursive),
  mSubjectRefCntMutex(GMutex::recursive),
  mRayMutex()
{
  _init();
}

ZQueen:: ZQueen(ID_t span, const Text_t* n, const Text_t* t) :
  ZNameMap(n,t), mIDSpan(span),
  mObservers(0),
  mSubjectWriteMutex(GMutex::recursive),
  mSubjectRefCntMutex(GMutex::recursive),
  mRayMutex()
{
  _init();
}

ZQueen::~ZQueen()
{
  mObservers->DecRefCnt();
}

/**************************************************************************/

void ZQueen::bootstrap()
{
  // Initializes a new queen and creates mandatory lists.
  // Called from ZKing.
  // Not applicable for activation or instantiation of not Ruling Queens.

  static const Exc_t _eh("ZQueen::bootstrap ");

  assert(bRuling == false);
  assert(mIDMap.size() == 0 && mMinID && mMaxID > mMinID);
  assert(mPurgatory.size() == 0);

  try
  {
    mQueen = this;
    SetStamps(1);
    mSaturn->Enlight(this, mMinID);
  }
  catch (Exc_t& exc)
  {
    ISerr(_eh + "Queen enlightenment failed.");
    throw;
  }
  mIDMap.insert(make_pair(mSaturnID, produce_lens_details(mSaturnID, this)));
  mCreationID = mSaturnID + 1;
  mIDsUsed   = 1;
  mIDsPurged = 0;
  mIDsFree   = mIDSpan - 1;

  ZHashList* l = new ZHashList(GForm("Deps of %s", mName.Data()));
  l->SetElementFID(ZQueen::FID());
  CheckIn(l); SetDeps(l); l->SetMIRActive(false);

  l = new ZHashList(GForm("Orphans of %s", mName.Data()));
  CheckIn(l); SetOrphans(l); l->SetMIRActive(false);

  bRuling = true;
  mState  = QS_Ruling;
}

void ZQueen::embrace_of_life(ZComet& comet)
{
  // Initializes *this* queen with unstreamed queen.
  // Copies Links and List contents, no ref-counting is performed.

  ZQueen* queen = comet.mQueen;
  assert(VFID() == queen->VFID());

  { // Re-stream the queen and read it back into *this*
    TBufferFile qb(TBuffer::kWrite);
    queen->Streamer(qb);
    qb.SetReadMode(); qb.SetBufferOffset(0);
    ZHashList* ex_deps = mDeps.get();
    Streamer(qb);
    RebuildLinkRefs(&comet);
    RebuildListRefs(&comet);
    mDeps = ex_deps;
  }
}
/**************************************************************************/

bool ZQueen::has_free_ids(ID_t n_needed)
{
  if(n_needed + 1 > mIDsFree) {
    release_purgatory(n_needed - mIDsFree + 1);
  } else {
    if(mIDsPurged > ID_t((1 + mSgmPurgLen)*mAvgPurgLen + 1)) {
      release_purgatory(0);
    }
  }
  return (n_needed <= mIDsFree);
}

ID_t ZQueen::next_free_id(QueenIDMap_i i)
{
  static const Exc_t _eh("ZQueen::next_free_id ");

  bool wrapp = false;
  QueenIDMap_i j = i; ++j;
  while(1) {
    if(j != mIDMap.end()) {
      if(j->first > i->first + 1) break;
      i = j; ++j;
    } else {
      if(i->first < mMaxID) break;
      if(wrapp) throw _eh + "looped twice over the end ... dying.";
      wrapp = true;
      i = mIDMap.begin(); j = i; ++j;
    }
  }
  // i holds one prior to free space; j is junk.
  return i->first + 1;
}

ID_t ZQueen::assign_id(ZGlass* lens)
{
  // Assigns an ID to lens.

  static const Exc_t _eh("ZQueen::assign_ID ");

  if(mCreationID == 0) {
    mCreationID = next_free_id(mIDMap.begin());
  }

  ID_t this_id = mCreationID ? mCreationID : next_free_id(mIDMap.begin());

  pair<QueenIDMap_i, bool> poo = mIDMap.insert
    ( pair<ID_t, LensDetails*>
        (this_id, produce_lens_details(this_id, lens))
    );
  QueenIDMap_i ins_pos = poo.first;
  ++mIDsUsed; --mIDsFree;
  mCreationID = mIDsFree ? next_free_id(ins_pos) : 0;
  if(bStampIdOps) Stamp(FID());

  return this_id;
}

ZQueen::LensDetails* ZQueen::produce_lens_details(ID_t id, ZGlass* lens)
{
  return new LensDetails(lens);
}

void ZQueen::release_purgatory(ID_t n_needed)
{
  // Releases ID-space occupied by recently dead lenses.
  // Also performs deletion of lenses that were still referenced
  // by viewers at their death-time.

  static const Exc_t _eh("ZQueen::release_purgatory ");

  ID_t n_cleared = 0;
  ID_t happy = ID_t((1 - mSgmPurgLen)*mAvgPurgLen);

  GTime now(GTime::I_Now);
  while(mIDsPurged && (n_needed || mIDsPurged > happy)) {

    ID_t id = mPurgatory.front();
    QueenIDMap_i i = mIDMap.find(id);
    assert(i != mIDMap.end());

    if(i->second->mState != LS_Dead)
      break;

    GTime dt = now - i->second->mDeletionTime;
    if(dt.ToMiliSec() < mDeletedMS)
      break;

    delete i->second;
    mIDMap.erase(i);
    mPurgatory.pop_front();
    --mIDsPurged; ++mIDsFree;
    if(n_needed) --n_needed;
    ++n_cleared;

  }

  // broadcast release_moon_purgatory
  if(n_cleared) {
    auto_ptr<ZMIR> moonir( S_release_moon_purgatory(n_cleared) );
    mSaturn->markup_posted_mir(*moonir, mSaturn->GetSaturnInfo());
    mSaturn->BroadcastMIR(*moonir, mReflectors);
  }

  if(n_cleared) {
    if(bStampIdOps) Stamp(FID());
    ISdebug(1, _eh + Identify() + GForm(" cleared %d entries.", n_cleared));
  }

  if(!mZombies.empty()) release_zombies();
}

void ZQueen::release_moon_purgatory(ID_t n_to_release)
{
  // Mirrors purgatory release at moons.
  // Also performs deletion of lenses that were still referenced
  // by viewers at their death-time.

  static const Exc_t _eh("ZQueen::release_purgatory ");

  ID_t n_done = 0;
  while (n_done < n_to_release)
  {
    ID_t id = mPurgatory.front();
    mPurgatory.pop_front();
    QueenIDMap_i i = mIDMap.find(id);
    if (i != mIDMap.end())
    {
      delete i->second;
      mIDMap.erase(i);
    }
    else
    {
      ISwarn("Safromastundhell.");
    }
    --mIDsPurged;
    ++mIDsFree;
    ++n_done;
  }
  ISdebug(1, _eh + Identify() + GForm(" cleared %d entries.", n_done));
  if (bStampIdOps) Stamp(FID());

  if (! mZombies.empty()) release_zombies();
}

int ZQueen::release_zombies()
{
  static const Exc_t _eh("ZQueen::release_zombies ");

  int zc = 0;
  lpZGlass_i zi = mZombies.begin();
  while (zi != mZombies.end())
  {
    ZGlass *z = *zi;
    if (z->mEyeRefCount == 0)
    {
      ISdebug(0, _eh + GForm("EyeRefCount=0 for %s. Killing a zombie.",
                             z->Identify().Data()));
      lpZGlass_i xi = zi++;
      mZombies.erase(xi);
      delete z;
      ++zc;
    }
    else
    {
      ++zi;
    }
  }
  return zc;
}

/**************************************************************************/
// Lens ID/ptr handling
/**************************************************************************/

ZGlass* ZQueen::DemangleID(ID_t id)
{
  // This should serve to properly demangle external references for comets.
  // And check that the id is within the queen's dependencies.

  ZGlass* l = mSaturn->DemangleID(id);
  if(l && DependsOn(l->mQueen))
    return l;
  return 0;
}

/**************************************************************************/

ID_t ZQueen::CheckIn(ZGlass* lens)
{
  static const Exc_t _eh("ZQueen::CheckIn ");

  GLensWriteHolder _wrlck(this);
  if(mKing->GetLightType() != ZKing::LT_Moon) {
    if( ! has_free_ids(1) ) {
      throw _eh + "no ID space available.";
    }
  }
  ID_t new_id;
  try {
    new_id = assign_id(lens);
  }
  catch(Exc_t& exc) {
    ISerr(_eh + "ID assignment failed: " + exc);
    throw;
  }
  try {
    lens->mQueen = this;
    lens->SetStamps(1);
    mSaturn->Enlight(lens, new_id);
  }
  catch(Exc_t& exc) {
    ISerr(_eh + "enlightenment failed: " + exc);
    // THIS INDICATES A SERIOUS BUG: fail miseribly.
    fprintf(stderr, "%s detected inconsistency in Saturn ID management. "
	    "Stopping server.\n", _eh.Data());
    mSaturn->Shutdown();
    throw;
  }
  return new_id;
}

/**************************************************************************/

void ZQueen::DepCheckMIR(ZMIR& mir)
{
  // Allow beta/gamma from queens that *this* depends on + queen
  // arguments if alpha is *this*.

  static const Exc_t _eh("ZQueen::DepCheckMIR ");

  if(mir.fBeta) {
    if(! DependsOn(mir.fBeta->mQueen) && (mir.fAlpha!=this || mir.fBeta!=mir.fBeta->mQueen))
      {
	if(bFollowDeps) {
	  // !!!! missing code to add the dependency etc.
	} else {
	  throw _eh + GForm("beta '%s', id=%d: dependency check failed.",
			    mir.fBeta->GetName(), mir.fBetaID);
	}
      }
  }
  if(mir.fGamma) {
    if(! DependsOn(mir.fGamma->mQueen) && (mir.fAlpha!=this || mir.fGamma!=mir.fGamma->mQueen))
      {
	if(bFollowDeps) {
	  // !!!! missing code to add the dependency etc.
	} else {
	  throw _eh + GForm("gamma '%s', id=%d: dependency check failed.",
			    mir.fGamma->GetName(), mir.fGammaID);
	}
      }
  }
}

void ZQueen::BlessMIR(ZMIR& mir)
{
  // should check that the mir is valid and within deps.
  // If whorequeen should accept new ones and append them.
  // If light-queen with FollowDeps should append with broadcast
  // PRIOR to returning from this method.
  // Called from Saturn::Unfold() prior to locking and execution.
  // Errors/non-conformance should be reported by throwing an exception.
  //
  // Oh yess ... btw ... queens can as well block all execs to their
  // subjects. Eg, when bMIRActive of alpha is false.
  // Per queen access control can be implemented here.

  static const Exc_t _eh("ZQueen::BlessMIR() ");

  if(!bRuling && mir.fAlpha != this)
    throw _eh + "spooky ... not ruling, but alpha demangled";

  if(!mir.fAlpha->GetMIRActive())
    throw _eh + "alpha '" + mir.fAlpha->GetName() + "' not MIR active";

  // Dependency check
  DepCheckMIR(mir);

  /**************************************************************************/

  // Authorization

  // Allow everything if UseAuth is false
  if(mSaturn->GetSaturnInfo()->GetUseAuth() == false) {
    return;
  }

  // Always allow SunAbsolute access
  if(mir.fCaller->HasIdentity(mSaturn->mSunInfo->GetPrimaryIdentity())) {
    return;
  }

  UChar_t result = ZMirFilter::R_None;
  if(mAuthMode != AM_None) {
    ZMirFilter* fs[2] = { 0, 0 };
    switch(mAuthMode) {
    case AM_Queen:
      fs[0] = mProtector.get();
      break;
    case AM_Lens:
      fs[0] = mir.fAlpha->mGuard.get();
      break;
    case AM_QueenThenLens:
      fs[0] = mProtector.get();
      fs[1] = mir.fAlpha->mGuard.get();
      break;
    case AM_LensThenQueen:
      fs[0] = mir.fAlpha->mGuard.get();
      fs[1] = mProtector.get();
      break;
    }
    for(int i=0; i<2; ++i) {
      if(fs[i] != 0) {
	result |= fs[i]->FilterMIR(mir);
	if(mAlignment == A_Good && result & ZMirFilter::R_Allow) return;
	if(mAlignment == A_Evil && result & ZMirFilter::R_Deny)  break;
      }
    }
  }
  if( result & ZMirFilter::R_Deny ||
      (result == ZMirFilter::R_None && mMapNoneTo == ZMirFilter::R_Deny))
    {
      throw _eh + "access denied";
    }
}

/**************************************************************************/
// Dependencies
/**************************************************************************/

void ZQueen::AddDependency(ZQueen* new_dep)
{
  static const Exc_t _eh("ZQueen::AddDependency ");

  assert_MIR_presence(_eh, ZGlass::MC_IsFlare);
}

Bool_t ZQueen::DependsOn(ZQueen* some_queen)
{
  // Returns true if *this* depends on some_queen, i.e. if my lenses
  // can reference lenses ruled by some_queen.

  return some_queen == this || some_queen == (ZQueen*)mSaturn->GetSunQueen() ||
    mDeps->Has(some_queen);
}

/**************************************************************************/
// Instantiators
/**************************************************************************/

ZGlass* ZQueen::instantiate(FID_t fid, const Text_t* name, const Text_t* title)
{
  Exc_t _eh("ZQueen::instantiate ");

  ZGlass* g = GledNS::ConstructLens(fid);
  if(g == 0) throw _eh + "failed lens instantiation";
  if(name)  g->mName  = name;
  if(title) g->mTitle = title;
  CheckIn(g);
  return g;
}

ID_t ZQueen::InstantiateWAttach(LID_t new_lid, CID_t new_cid,
				const Text_t* name, const Text_t* title)
{
  // PostMIR version.
  // Instantiates a glass of FID(lid, cid) and attaches it to attach_to
  // by using last part of the message, which should be a properly
  // formulated Ctx call.
  // Ctx for this call is:
  // alpha ~ attach_to, beta ~ new glass, gamma ~ attach_gamma
  // Returns ID to the caller (also via MirResult if set in MIR).

  static const Exc_t _eh("ZQueen::InstantiateWAttach ");

  assert(bRuling);
  ZMIR* mir = assert_MIR_presence(_eh, ZGlass::MC_IsFlare);

  if(mir->HasChainedMIR() == false)
    throw _eh + "attachemnt mir is not supplied.";

  auto_ptr<ZMIR> att_mir( mir->UnchainMIR(this) );
  ZGlass* attach_to = att_mir->fAlpha;

  if(attach_to->GetQueen() != this)
    throw _eh + "can only attach to my own subjects.";

  if(attach_to->GetMIRActive() == false)
    throw _eh + "attach_to is not MIR active.";


  ZGlass* lens = GledNS::ConstructLens(FID_t(new_lid, new_cid));
  if(lens == 0) throw _eh + "failed lens instantiation.";

  try {
    CheckIn(lens);
  }
  catch(Exc_t& exc) {
    delete lens;
    throw _eh + exc;
  }
  if(name)  lens->SetName(name);
  if(title) lens->SetTitle(title);

  att_mir->fBeta   = lens;
  att_mir->fBetaID = lens->mSaturnID;
  try {
    // Should Bless? Yess ... but before lens construction ... then fix beta.
    // Or ... in this case ... could Request blessing by another queen.
    mSaturn->ExecMIR(att_mir);
  }
  catch(Exc_t& exc) {
    // Attach failed ...
    ISwarn(_eh + "attachment failed: " + exc);
  }
  if(lens->mRefCount <= 0) {
    // Perhaps should delete it?
    ZeroRefCount(lens);
  }

  if(mir->HasResultReq()) {
    TBufferFile b(TBuffer::kWrite);
    b << lens->mSaturnID;
    mSaturn->ShootMIRResult(b);
  }

  return lens->mSaturnID;
}

ID_t ZQueen::IncarnateWAttach()
{
  // Incarnates a new glass from the buffer and then attaches it in the
  // same manner as the above method.
  // Links and list contents are rebuilt in accordance with queen's dependency
  // state.

  static const Exc_t _eh("ZQueen::IncarnateWAttach ");

  assert(bRuling);
  ZMIR* mir = assert_MIR_presence(_eh, ZGlass::MC_IsFlare);

  if(mir->HasChainedMIR() == false)
    throw _eh + "attachemnt mir is not supplied.";

  // Must read full buffer before unchaining the attachment mir.
  ZGlass* lens = GledNS::StreamLens(*mir);
  if(lens == 0) throw _eh + "lens unstreaming failed.";

  auto_ptr<ZMIR> att_mir( mir->UnchainMIR(this) );
  ZGlass* attach_to = att_mir->fAlpha;

  if(attach_to->GetQueen() != this) {
    delete lens;
    throw _eh + "can only attach to my own subjects.";
  }
  if(attach_to->GetMIRActive() == false) {
    delete lens;
    throw _eh + "attach_to is not MIR active.";
  }

  { // Rebuild link/list refs
    lens->mQueen = this;
    int n_failed = lens->RebuildAllRefs(this);
    if(n_failed > 0) {
      ISwarn(_eh + GForm("missed %d referenced lenses.", n_failed));
    }
  }

  try {
    CheckIn(lens);
  }
  catch(Exc_t& exc) {
    lens->unreference_all();
    delete lens;
    throw _eh + exc;
  }

  att_mir->fBeta   = lens;
  att_mir->fBetaID = lens->mSaturnID;
  try {
    mSaturn->ExecMIR(att_mir);
  }
  catch(Exc_t& exc) {
    // Attach failed ...
    ISwarn(_eh + "attachment failed: " + exc);
  }
  if(lens->mRefCount <= 0) {
    // Perhaps should delete it?
    ZeroRefCount(lens);
  }

  if(mir->HasResultReq()) {
    TBufferFile b(TBuffer::kWrite);
    b << lens->mSaturnID;
    mSaturn->ShootMIRResult(b);
  }

  return lens->mSaturnID;
}

/**************************************************************************/
// Lens MIR-activity
/**************************************************************************/

void ZQueen::MIRActivateLens(ZGlass* lens)
{
  static const Exc_t _eh("ZQueen::MIRActivateLens ");

  assert_MIR_presence(_eh, ZGlass::MC_IsFlare);

  if(lens->mQueen != this)
    throw _eh + "lens " + lens->Identify() + " is not my subject.";

  if(lens == this)
    throw _eh + "will not apply to myself " + Identify() + ".";

  lens->SetMIRActive(true);
}

void ZQueen::MIRDeactivateLens(ZGlass* lens)
{
  static const Exc_t _eh("ZQueen::MIRDeactivateLens ");

  assert_MIR_presence(_eh, ZGlass::MC_IsFlare);

  if(lens->mQueen != this)
    throw _eh + "lens " + lens->Identify() + " is not my subject.";

  if(lens == this)
    throw _eh + "will not apply to myself " + Identify() + ".";

  lens->SetMIRActive(false);
}

/**************************************************************************/
// Lens deletion
/**************************************************************************/

void ZQueen::put_lens_to_purgatory(ZGlass* lens)
{
  static const Exc_t _eh("ZQueen::put_lens_to_purgatory ");

  QueenIDMap_i map_it;

  { // Check lens state consistency.
    map_it = mIDMap.find(lens->mSaturnID);
    if(map_it == mIDMap.end())
      throw _eh + "lens " + lens->Identify() + " not found in my subject list.";
    if(map_it->second->mState != LS_Alive)
      throw _eh + "lens " + lens->Identify() + " has already been put to death-bed.";
  }

  { // Stop threads.
    mSaturn->Freeze(lens);
  }

  GLensReadHolder qrd_lck(this);

  { // Fix lens state to dying. Already done on the Sun.
    ISdebug(2, _eh + "blocking new refs to " + lens->Identify() + ".");
    lens->bAcceptRefs = false;
    lens->mGlassBits |= kDyingBit;
  }

  // printf("%s %s RC=%d, MRC=%d, SRC=%d, FRC=%d\n", _eh.Data(), lens->Identify().Data(),
  //        lens->mRefCount, lens->mMoonRefCount, lens->mSunRefCount, lens->mFireRefCount);

  { // Remove all references to lens.
    ISdebug(2, _eh + "removing all refs to " + lens->Identify() + ".");
    set<ZGlass*> done_set;
    while( ! lens->mReverseRefs.empty() ) {
      hpZGlass2Int_i i = lens->mReverseRefs.begin();
      ZGlass* ref = i->first;
      Int_t n, nold = i->second;
      {
	GLensWriteHolder reflens_wrlck(ref);
	n = ref->RemoveReferencesTo(lens); // calls DecRefCount()
      }
      if(n != nold) {
	ISwarn(_eh + "remaining reference from " + ref->Identify() +
	       " to " + lens->Identify() + ".");
	lens->mReverseRefs.erase(i);
	continue;
      }
      // printf("Removing refs to %s from %s.\n", lens->Identify().Data(), ref->Identify().Data());
    }
    if(lens->mRefCount != 0) {
      ISerr(_eh + "ref-count not zero after enforced reverse refs removal.");
      ISerr(GForm("%s %s  RC=%d, MRC=%d, SRC=%d, FRC=%d\n",
		  _eh.Data(), lens->Identify().Data(),
		  lens->mRefCount, lens->mMoonRefCount,
		  lens->mSunRefCount, lens->mFireRefCount));
    }
  }

  { // Remove all references from lens.
    ISdebug(2, _eh + "removing all refs from " + lens->Identify() + ".");
    GLensReadHolder rdlck(lens);
    lens->ClearAllReferences();
  }

  // Emit the death Ray.
  auto_ptr<Ray> death_ray
    (Ray::PtrCtor(lens, RayNS::RQN_death, ++(lens->mTimeStamp), Ray::EB_StructuralChange));
  EmitRay(death_ray);

  map_it->second->mState = LS_Purged;
  mPurgatory.push_back(lens->mSaturnID);
  --mIDsUsed; ++mIDsPurged;

  if(mKing->GetLightType() != ZKing::LT_Moon) {
    SaturnInfo* si = mSaturn->GetSaturnInfo();
    GTime ref_time(GTime::I_Now);
    auto_ptr<ZMIR> void_mir( S_PutLensToVoid(lens->mSaturnID) );
    ref_time += GTime::MiliSec(mPurgedMS);
    mSaturn->delayed_shoot_mir(void_mir, si, ref_time);
  }
}

void ZQueen::PutLensToPurgatory(ZGlass* lens)
{
  // First step in the process of a lens removal.
  // Stops all detached threads via Saturn::Freeze().
  // Removes all references to a lens and sends Rays with RQN_death.
  // Then emits MIR to PutLensToVoid(lens).

  static const Exc_t _eh("ZQueen::PutLensToPurgatory ");

  assert_MIR_presence(_eh, ZGlass::MC_IsFlare);

  if(lens->mQueen != this)
    throw _eh + "lens " + lens->Identify() + " is not my subject.";

  GMutexHolder refcnt_lck(mSubjectRefCntMutex);
  put_lens_to_purgatory(lens);

  if(bStampIdOps) Stamp(FID());
}

void ZQueen::PutListElementsToPurgatory(AList* list)
{
  // Puts all elements of list having mQueen==this to purgatory.
  // Copies list contents, clears the list and then purges
  // individual elements. This optimizes removal procedure for
  // large lists.

  static const Exc_t _eh("ZQueen::PutListElementsToPurgatory ");

  assert_MIR_presence(_eh, ZGlass::MC_IsFlare);

  if(list->mQueen != this)
    throw _eh + "lens " + list->Identify() + " is not my subject.";

  GMutexHolder refcnt_lck(mSubjectRefCntMutex);

  // This simulates AList::ClearList but is somewhat optimized.
  lpZGlass_t foo;
  {
    GMutexHolder listreadlock(list->mReadMutex);
    GMutexHolder listlistlock(list->mListMutex);
    list->CopyList(foo);
    list->clear_list();
    list->StampListClear();
  }

  for(lpZGlass_i i=foo.begin(); i!=foo.end(); ++i) {
    ZGlass* lens = *i;
    if(lens->mQueen == this  &&  lens != this) {
      {
	GMutexHolder lensreadlock(lens->mReadMutex);
	hpZGlass2Int_i i = lens->mReverseRefs.find(list);
	// Elements can appear in a list several times.
	if(i != lens->mReverseRefs.end()) {
	  list->ZGlass::remove_references_to(lens);
	  lens->dec_ref_count(i, i->second);
	  lens->mReverseRefs.erase(i);
	}
      }
      put_lens_to_purgatory(lens);
    } else {
      lens->DecRefCount(list);
    }
  }

  if(bStampIdOps) Stamp(FID());
}

void ZQueen::PutLensToVoid(ID_t lens_id)
{
  // Final step in lens removal.
  // Endarks the lens.
  // Clears up internal structures.
  // Deletes the lens (or makes it a zombie).

  static const Exc_t _eh("ZQueen::PutLensToVoid ");

  assert_MIR_presence(_eh, ZGlass::MC_IsFlare);

  ZGlass* lens = mSaturn->DemangleID(lens_id);
  if(lens == 0) {
    // There is still a possibility that we are a moon and that
    // we connected between PutLensToPurgatory() and PutLensToVoid()
    // calls. Could check timing.
    if(mKing->GetLightType() == ZKing::LT_Moon) {
      GMutexHolder refcnt_lck(mSubjectRefCntMutex);
      QueenIDMap_i i = mIDMap.find(lens_id);
      if(i == mIDMap.end()) {
	ISerr(_eh + GForm("LensDetails for id=%d (expected as purged) not found in queen's ID map.", lens_id));
	return;
      }
      assert(i->second->mLens == 0);
      assert(i->second->mState == LS_Purged);
      i->second->mState = LS_Dead;
      i->second->mDeletionTime.SetNow();
      return;
    } else {
      throw _eh + GForm("lens id=%d not elightened.", lens_id);
    }
  }

  if(lens->mQueen != this)
    throw _eh + "lens " + lens->Identify() + " is not my subject.";

  // printf("%s %s RC=%d, MRC=%d, SRC=%d, FRC=%d\n", _eh.Data(), lens->Identify().Data(),
  //	    lens->mRefCount, lens->mMoonRefCount, lens->mSunRefCount, lens->mFireRefCount);

  GMutexHolder refcnt_lck(mSubjectRefCntMutex);

  QueenIDMap_i i = mIDMap.find(lens_id);
  if(i == mIDMap.end()) {
    throw _eh + "LensDetails of " + lens->Identify() + " not found in queen's ID map.";
  }
  if(i->second->mState != LS_Purged) {
    ISwarn(_eh + "lens has not been put to purged state ... expect trouble.");
  }
  if(i->second->mLens != lens) {
    ISwarn(_eh + "Saturn's and Queen's lens pointers do not mach ... expect trouble.");
  }
  ISdebug(2, _eh + "endarking lens " + lens->Identify() + ".");
  {
    GMutex::Lock_e lockp = lens->mReadMutex.TryLock();
    if(lockp != GMutex::ok) {
      ISwarn(_eh + GForm("failed acquiring ReadLock on '%s'. Proceeding anyway.",
			 lens->GetName()));
    }
    try {
      mSaturn->Endark(lens);
    }
    catch(Exc_t& exc) {
      if(lockp == GMutex::ok) lens->mReadMutex.Unlock();
      throw _eh + "endarkenment failed: " + exc + " Doing nothing.";
    }
    if(lockp == GMutex::ok) lens->mReadMutex.Unlock();
  }

  ISdebug(2, _eh + GForm("final removal of lens '%s'[%d].", lens->GetName(), i->first));
  i->second->mLens = 0;
  i->second->mState = LS_Dead;
  i->second->mDeletionTime.SetNow();

  // Now truly delete or make a zombie.
  if(lens->mEyeRefCount == 0) {
    delete lens;
    if(mKing->GetLightType() != ZKing::LT_Moon) {
      release_purgatory(0);
    }
  } else {
    ISdebug(0, _eh + GForm("EyeRefCount=%d for %s. Making a zombie.",
			   lens->mEyeRefCount, lens->Identify().Data()));
    mZombies.push_back(lens);
  }

  if(bStampIdOps) Stamp(FID());
}

void ZQueen::RemoveLens(ZGlass* lens)
{
  // Initiates removal of lens. This is the method that should be called
  // by user.
  // If called as Flare broadcasting is suppressed.
  // Does not have to be called under any lock as it shoots a MIR to
  // itself to initiate the lens destruction.

  static const Exc_t _eh("ZQueen::RemoveLens ");

  if(mKing->GetLightType() == ZKing::LT_Moon)
    throw _eh + "can not be called at a moon.";

  if(lens == 0)
    throw _eh + "called with null argument.";

  if(lens->mQueen != this)
    throw _eh + "lens " + lens->Identify() + " is not my subject.";

  if(lens == this)
    throw _eh + "attempt to delete ZQueen " + Identify() + ".";

  ZMIR* mir = GThread::MIR();
  if(mir && mir->IsFlare())
    mir->fSuppressFlareBroadcast = true;

  remove_lens(lens);
}

void ZQueen::RemoveLenses(AList* list, Bool_t recurse)
{
  // Remove elements of list. Does NOT cross queen boundaries.
  // Spawned in a dedicated thread.

  static const Exc_t _eh("ZQueen::RemoveLenses ");

  if(mKing->GetLightType() == ZKing::LT_Moon)
    throw _eh + "can not be called at a moon.";

  if(list == 0)
    throw _eh + "called with null argument.";

  ZMIR* mir = assert_MIR_presence(_eh);

  Bool_t syncp = mir->HasResultReq();
  remove_lenses(list, recurse, syncp);
}

/**************************************************************************/
// Lens-list removal ... low-level functions
/**************************************************************************/

void ZQueen::remove_lens(ZGlass* lens)
{
  // Low-level lens remove initiator. Called on queen's Sun.
  // Only checks if lens is already dying.

  static const Exc_t _eh("ZQueen::remove_lens ");

  {
    GMutexHolder _reflck(mSubjectRefCntMutex);

    if(lens->CheckBit(kDyingBit)) {
      // This might be(come) completely normal.
      ISdebug(0, _eh + "queen:" + Identify() +" lens:" + lens->Identify() +" already dying.");
      return;
    }

    lens->bAcceptRefs = false;
    lens->mGlassBits |= kDyingBit;
  }

  auto_ptr<ZMIR> purg_mir( S_PutLensToPurgatory(lens) );
  mSaturn->ShootMIR(purg_mir);
}

void ZQueen::remove_lenses(AList* list, Bool_t recurse, Bool_t syncmode)
{
  // Low-level massive lens remove initiator. Called on queen's Sun.

  lpZGlass_t ll;
  list->CopyList(ll);

  for(lpZGlass_i i=ll.begin(); i!=ll.end(); ++i) {
    if((*i)->mQueen == this  &&  (*i) != this) {
      (*i)->bAcceptRefs = false;
      (*i)->mGlassBits |= kDyingBit;

      if(recurse) {
	AList* seclist = dynamic_cast<AList*>(*i);
	if(seclist && ! seclist->IsEmpty())
	  remove_lenses(seclist, true, false);
      }
    }
  }

  auto_ptr<ZMIR> purg_mir( S_PutListElementsToPurgatory(list) );
  if(syncmode)
    mSaturn->ShootMIRWaitResult(purg_mir);
  else
    mSaturn->ShootMIR(purg_mir);
}

/**************************************************************************/
// ZeroRefCount and management of Orphans
/**************************************************************************/

void ZQueen::ZeroRefCount(ZGlass* lens)
{
  // Called by ZGlass upon hitting refcount of 0.
  // mSubjectRefCntMutex is (and should be) locked prior to call.

  static const Exc_t _eh("ZQueen::ZeroRefCount ");

  if(mKing->GetLightType() == ZKing::LT_Moon) return;
  if(lens->CheckBit(kDyingBit)) return;

  switch(mZeroRCPolicy) {
  case ZRCP_Delete: {
    RemoveLens(lens);
    break;
  }
  case ZRCP_ToOrphanage: {
    mOrphans->Add(lens);
    break;
  }
  case ZRCP_Ignore:
    break;
  }
}

void ZQueen::CleanOrphanage()
{
  if(!bRuling) return;
  mOrphans->mListMutex.Lock();
  lpZGlass_t l; mOrphans->CopyList(l);
  for(lpZGlass_i i=l.begin(); i!=l.end(); ++i) {
    if((*i)->mRefCount > 1) {
      mOrphans->Remove(*i);
    }
    /*
      else if((*i)->mRefCount == 1) {
      (*i)->mRefCount = -1;
      mOrphans->Remove(*i);
      CheckOut(*i);
      }
    */
  }
  mOrphans->mListMutex.Unlock();
}

/**************************************************************************/
// SetMandatory
/**************************************************************************/
/*
// This must be heavily changed ... must emit eunuchs etc.

void ZQueen::SetMandatory(Bool_t mandp)
{
static const Exc_t _eh("ZQueen::SetMandatory");
ZMIR* mir = assert_MIR_presence(_eh);

if(mandp == bMandatory) return;

if(mandp) {
if(bRuling) {
// mSaturn->BroadcastMIR(*mir, mReflectors);

} else {

}
bMandatory = true;
} else {
bMandatory = false;
}
Stamp(FID());
}
*/

/**************************************************************************/
// Reflections
/**************************************************************************/

// All Reflections are operated by King of the Queen.
// State variables and list of reflectors are also managed by the King.

void ZQueen::CreateReflection(TBuffer& buf)
{
  // Virtual. Creates reflection that can be invoked to produce a copy
  // of queen-space on other Saturn.
  // ZQueen itself just creates and streams a ZComet.

  release_purgatory(0);
  ZComet* c = MakeComet();
  c->Streamer(buf);
  delete c;
}

void ZQueen::InvokeReflection(TBuffer& buf)
{
  // Virtual. Invokes reflection created by a higher Saturn and thus
  // begins mirroring the object-space.
  // For ZQueen this involves unstreaming of ZComet and calling UnfoldFrom().

  static const Exc_t _eh("ZQueen::InvokeReflection ");

  ZComet c; c.Streamer(buf);
  if(c.GetType() != ZComet::CT_Queen) throw _eh + "wrong comet type.";

  c.AssignQueen(this);
  c.SetExtDemangler(this);
  c.bWarnOn = true;

  { // remove and delete comet's Deps, wipe it from comet's queen
    ID_t cdep_id = GledNS::CastLens2ID( c.mQueen->GetDeps() );
    assert(cdep_id == mDeps->GetSaturnID());
    ZGlass* cdep = c.DemangleID(cdep_id);
    delete cdep;
    c.mIDMap.erase(cdep_id);
    c.mQueen->mDeps = 0;
    // And remove the queen itself from the list
    assert(mSaturnID == c.mQueen->mSaturnID);
    c.mIDMap.erase(mSaturnID);
  }
  { // Rebuild the comet queen itself, assign stuff to *this* and delete it
    c.mQueen->RebuildLinkRefs(&c);
    c.mQueen->RebuildListRefs(&c);
    embrace_of_life(c);
    delete c.mQueen;
  }

  c.RebuildGraph();

  UnfoldFrom(c);
  // Now there is too much stuff in UnfoldFrom ... besides, SunQueen
  // has some link-related junk, too.
}

void ZQueen::RevokeReflection()
{
  // Virtual. Cleans up queen-space, putting it back into non-ruling state.
}

/**************************************************************************/
// Comet ops
/**************************************************************************/

ZComet* ZQueen::MakeComet()
{
  // Produces Comet of type ST_Queen.
  // Contains all glasses ruled by the queen.
  // External references are streamed as IDs and can be reconstructed
  // at lower Moons.
  // Used for producing a snapshot of Queen-space to be sent to a Moon.

  ZComet* comet = new ZComet(GetName(), GForm("Comet[Queen] of %s", GetName()));
  comet->mType = ZComet::CT_Queen;
  comet->mQueen = this;

  for(QueenIDMap_i i=mIDMap.begin(); i!=mIDMap.end(); ++i) {
    if(i->second->mState == LS_Alive)
      comet->AddGlass(i->second->mLens);
  }

  return comet;
}

void ZQueen::AdoptComet(AList* top_dest, AList* orphan_dest, ZComet* comet)
{
  // Adopts a Comet of type ST_CometBag.
  // External references of a Comet are ignored.

  Exc_t _eh("ZQueen::AdoptComet ");

  if(top_dest == 0)       top_dest = this;
  if(orphan_dest == 0) orphan_dest = mOrphans.get();

  // Should assert that top_dest & orphan_dest are my subjects.
  // Or at least that their queen depends on me.
  //    But then should do further authorization!

  comet->AssignQueen(this);
  comet->RebuildGraph();
  WriteLock();
  UInt_t free = mIDSpan - (mIDMap.size() + mPurgatory.size());
  UInt_t need = comet->mIDMap.size();
  if(free >= need) {
    for(mID2pZGlass_i i=comet->mIDMap.begin(); i!=comet->mIDMap.end(); ++i)
      CheckIn(i->second);
    for(lpZGlass_i i=comet->mTopLevels.begin(); i!=comet->mTopLevels.end(); ++i)
      top_dest->Add(*i);
    for(lpZGlass_i i=comet->mOrphans.begin(); i!=comet->mOrphans.end(); ++i)
      orphan_dest->Add(*i);
  } else {
    WriteUnlock();
    throw _eh + "(comet=" + comet->GetName() + ") ID shortage.";
  }
  WriteUnlock();
}

void ZQueen::UnfoldFrom(ZComet& comet)
{
  // Unfolds a dormant (not bRuling) queen from a comet of type ST_Queen
  // and makes it a ruling queen.
  // The incoming queen and its Deps are replaced with already present ones.
  // Does NOT call CheckIn ... does it directly with simultaneous building of
  // free block list.
  // At the end calls AdUnfoldment on all lenses.

  assert(comet.mType == ZComet::CT_Queen && comet.mQueen != 0);

  WriteLock();
  { // Reflect all lenses
    mID2pZGlass_i      i = comet.mIDMap.begin();
    QueenIDMap_i ins_pos = mIDMap.begin();
    while(i != comet.mIDMap.end()) {
      i->second->SetStamps(1);
      mSaturn->Reflect(i->second);
      ins_pos = mIDMap.insert
	( ins_pos, pair<ID_t, LensDetails*>
	  (i->first, produce_lens_details(i->first, i->second))
	  );
      ++i;
    }
  }
  { // Create dummy entries for lenses in purgatory.
    for(lID_i i=mPurgatory.begin(); i!=mPurgatory.end(); ++i) {
      LensDetails* ls = produce_lens_details(*i, 0);
      ls->mState = LS_Purged;
      mIDMap.insert(pair<ID_t, LensDetails*>(*i, ls));
    }
  }

  bRuling = true;

  // Call AdUnfoldment for all lenses
  for(mID2pZGlass_i i=comet.mIDMap.begin(); i!=comet.mIDMap.end(); ++i) {
    i->second->AdUnfoldment();
  }

  Stamp();
  StampLink();
  StampListRebuild();

  WriteUnlock();
}

/**************************************************************************/
// Reflectors
/**************************************************************************/

void ZQueen::add_reflector(SaturnInfo* moon)
{
  lpSaturnInfo_i i = find(mReflectors.begin(), mReflectors.end(), moon);
  if(i == mReflectors.end()) {
    mReflectors.push_back(moon);
  }
}

void ZQueen::remove_reflector(SaturnInfo* moon)
{
  lpSaturnInfo_i i = find(mReflectors.begin(), mReflectors.end(), moon);
  if(i != mReflectors.end()) {
    mReflectors.erase(i);
  }
}

/**************************************************************************/
// Maintenance of non-ruling queen reflections
/**************************************************************************/

void ZQueen::BroadcastMIRToNonRulingReflections(ZMIR& mir)
{
  static const Exc_t _eh("ZQueen::BroadcastMIRToNonRulingReflections ");

  // This is way sub-optimal ... need iterator based broadcast MIR and
  // set representation of reflectors and moons (instead of list).

  lpSaturnInfo_t foo; mSaturn->CopyMoons(foo);
  for(lpSaturnInfo_i i=mReflectors.begin(); i!=mReflectors.end(); ++i) {
    foo.remove(*i);
  }
  mSaturn->BroadcastMIR(mir, foo);
}

void ZQueen::BasicQueenChange(ZMIR& mir)
{
  static const Exc_t _eh("ZQueen::BasicQueenChange ");

  if(mir.fAlpha != this) throw _eh + "alpha is not *this* queen.";
  if(mir.HasRecipient()) throw _eh + "MIR is a beam, should be flare.";
  if( FID_t(mir.fLid, mir.fCid) != ZGlass::FID() )
    throw _eh + "FID does not correspond to ZGlass.";
  if(mir.fMid != ZGlass::Mid_SetName() && mir.fMid != ZGlass::Mid_SetTitle())
    throw _eh + "MID does not correspond to SetName or SetTitle.";

  BroadcastMIRToNonRulingReflections(mir);
}

/**************************************************************************/
// Stamping
/**************************************************************************/

void ZQueen::AddObserver(EyeInfo* ei)
{
  static const Exc_t _eh("ZQueen::AddObserver ");

  ISmess(_eh +  "[" + Identify() + "] Registering EyeInfo " + ei->Identify() + ".");

  GMutexHolder lck(mRayMutex);
  mObservers = EyeInfoVector::CloneAndAdd(mObservers, ei);
}

void ZQueen::RemoveObserver(EyeInfo* ei)
{
  static const Exc_t _eh("ZQueen::RemoveObserver ");

  ISmess(_eh + "[" + Identify() + "] Removing EyeInfo " + ei->Identify() + ".");

  GMutexHolder lck(mRayMutex);
  mObservers = EyeInfoVector::CloneAndRemove(mObservers, ei);
}

void ZQueen::EmitRay(auto_ptr<Ray>& ray)
{
  // eventually lock mRayMutex and do direct ray delivery

  GMutexHolder lck(mRayMutex);
  if (! mObservers->empty())
  {
    mSaturn->Shine(ray, mObservers);
  }
}

void ZQueen::PrintEyeConnections()
{
  static const Exc_t _eh("ZQueen::PrintEyeConnections ");

  GMutexHolder lck(mRayMutex);
  printf("%s [%s], N_eyes=%d\n", _eh.Data(), Identify().Data(), (Int_t) mObservers->size());
  Int_t n = 1;
  for (vector<EyeInfo*>::iterator i = mObservers->begin(); i != mObservers->end(); ++i, ++n)
  {
    printf("  %d. %s -- N_imgs=%d\n", n, (*i)->Identify().Data(), (*i)->hEye->GetImageCount(this));
  }
}

void ZQueen::PrintObservedLenses(Bool_t dump_views)
{
  static const Exc_t _eh("ZQueen::PrintObservedLenses ");

  GMutexHolder lck(mRayMutex);
  printf("%s [%s], N_eyes=%d\n", _eh.Data(), Identify().Data(), (Int_t) mObservers->size());
  Int_t n = 1;
  for (vector<EyeInfo*>::iterator i = mObservers->begin(); i != mObservers->end(); ++i, ++n)
  {
    printf("========================================================================\n");
    printf("%3d. %s, N_imgs=%d\n", n, (*i)->Identify().Data(), (*i)->hEye->GetImageCount(this));
    printf("------------------------------------------------------------------------\n");
    (*i)->hEye->PrintObservedLenses(this, dump_views);
  }
}

/**************************************************************************/
// tmp
/**************************************************************************/

void ZQueen::ListAll()
{
  // attempt at looking at all subjects based on ids
  // else might be forced into having local hash.

  for(QueenIDMap_i i=mIDMap.begin(); i!=mIDMap.end(); ++i) {
    ZGlass* l = i->second->mLens;
    if(l != 0) {
      cout <<"ID="<< i->first <<": "<< l->GetName() <<
	"["<< l->VGlassInfo()->fName <<"]\n";
    } else {
      cout <<"ID="<< i->first <<": <reserved>\n";
    }
  }
}

/**************************************************************************/
 ZQueen.cxx:1
 ZQueen.cxx:2
 ZQueen.cxx:3
 ZQueen.cxx:4
 ZQueen.cxx:5
 ZQueen.cxx:6
 ZQueen.cxx:7
 ZQueen.cxx:8
 ZQueen.cxx:9
 ZQueen.cxx:10
 ZQueen.cxx:11
 ZQueen.cxx:12
 ZQueen.cxx:13
 ZQueen.cxx:14
 ZQueen.cxx:15
 ZQueen.cxx:16
 ZQueen.cxx:17
 ZQueen.cxx:18
 ZQueen.cxx:19
 ZQueen.cxx:20
 ZQueen.cxx:21
 ZQueen.cxx:22
 ZQueen.cxx:23
 ZQueen.cxx:24
 ZQueen.cxx:25
 ZQueen.cxx:26
 ZQueen.cxx:27
 ZQueen.cxx:28
 ZQueen.cxx:29
 ZQueen.cxx:30
 ZQueen.cxx:31
 ZQueen.cxx:32
 ZQueen.cxx:33
 ZQueen.cxx:34
 ZQueen.cxx:35
 ZQueen.cxx:36
 ZQueen.cxx:37
 ZQueen.cxx:38
 ZQueen.cxx:39
 ZQueen.cxx:40
 ZQueen.cxx:41
 ZQueen.cxx:42
 ZQueen.cxx:43
 ZQueen.cxx:44
 ZQueen.cxx:45
 ZQueen.cxx:46
 ZQueen.cxx:47
 ZQueen.cxx:48
 ZQueen.cxx:49
 ZQueen.cxx:50
 ZQueen.cxx:51
 ZQueen.cxx:52
 ZQueen.cxx:53
 ZQueen.cxx:54
 ZQueen.cxx:55
 ZQueen.cxx:56
 ZQueen.cxx:57
 ZQueen.cxx:58
 ZQueen.cxx:59
 ZQueen.cxx:60
 ZQueen.cxx:61
 ZQueen.cxx:62
 ZQueen.cxx:63
 ZQueen.cxx:64
 ZQueen.cxx:65
 ZQueen.cxx:66
 ZQueen.cxx:67
 ZQueen.cxx:68
 ZQueen.cxx:69
 ZQueen.cxx:70
 ZQueen.cxx:71
 ZQueen.cxx:72
 ZQueen.cxx:73
 ZQueen.cxx:74
 ZQueen.cxx:75
 ZQueen.cxx:76
 ZQueen.cxx:77
 ZQueen.cxx:78
 ZQueen.cxx:79
 ZQueen.cxx:80
 ZQueen.cxx:81
 ZQueen.cxx:82
 ZQueen.cxx:83
 ZQueen.cxx:84
 ZQueen.cxx:85
 ZQueen.cxx:86
 ZQueen.cxx:87
 ZQueen.cxx:88
 ZQueen.cxx:89
 ZQueen.cxx:90
 ZQueen.cxx:91
 ZQueen.cxx:92
 ZQueen.cxx:93
 ZQueen.cxx:94
 ZQueen.cxx:95
 ZQueen.cxx:96
 ZQueen.cxx:97
 ZQueen.cxx:98
 ZQueen.cxx:99
 ZQueen.cxx:100
 ZQueen.cxx:101
 ZQueen.cxx:102
 ZQueen.cxx:103
 ZQueen.cxx:104
 ZQueen.cxx:105
 ZQueen.cxx:106
 ZQueen.cxx:107
 ZQueen.cxx:108
 ZQueen.cxx:109
 ZQueen.cxx:110
 ZQueen.cxx:111
 ZQueen.cxx:112
 ZQueen.cxx:113
 ZQueen.cxx:114
 ZQueen.cxx:115
 ZQueen.cxx:116
 ZQueen.cxx:117
 ZQueen.cxx:118
 ZQueen.cxx:119
 ZQueen.cxx:120
 ZQueen.cxx:121
 ZQueen.cxx:122
 ZQueen.cxx:123
 ZQueen.cxx:124
 ZQueen.cxx:125
 ZQueen.cxx:126
 ZQueen.cxx:127
 ZQueen.cxx:128
 ZQueen.cxx:129
 ZQueen.cxx:130
 ZQueen.cxx:131
 ZQueen.cxx:132
 ZQueen.cxx:133
 ZQueen.cxx:134
 ZQueen.cxx:135
 ZQueen.cxx:136
 ZQueen.cxx:137
 ZQueen.cxx:138
 ZQueen.cxx:139
 ZQueen.cxx:140
 ZQueen.cxx:141
 ZQueen.cxx:142
 ZQueen.cxx:143
 ZQueen.cxx:144
 ZQueen.cxx:145
 ZQueen.cxx:146
 ZQueen.cxx:147
 ZQueen.cxx:148
 ZQueen.cxx:149
 ZQueen.cxx:150
 ZQueen.cxx:151
 ZQueen.cxx:152
 ZQueen.cxx:153
 ZQueen.cxx:154
 ZQueen.cxx:155
 ZQueen.cxx:156
 ZQueen.cxx:157
 ZQueen.cxx:158
 ZQueen.cxx:159
 ZQueen.cxx:160
 ZQueen.cxx:161
 ZQueen.cxx:162
 ZQueen.cxx:163
 ZQueen.cxx:164
 ZQueen.cxx:165
 ZQueen.cxx:166
 ZQueen.cxx:167
 ZQueen.cxx:168
 ZQueen.cxx:169
 ZQueen.cxx:170
 ZQueen.cxx:171
 ZQueen.cxx:172
 ZQueen.cxx:173
 ZQueen.cxx:174
 ZQueen.cxx:175
 ZQueen.cxx:176
 ZQueen.cxx:177
 ZQueen.cxx:178
 ZQueen.cxx:179
 ZQueen.cxx:180
 ZQueen.cxx:181
 ZQueen.cxx:182
 ZQueen.cxx:183
 ZQueen.cxx:184
 ZQueen.cxx:185
 ZQueen.cxx:186
 ZQueen.cxx:187
 ZQueen.cxx:188
 ZQueen.cxx:189
 ZQueen.cxx:190
 ZQueen.cxx:191
 ZQueen.cxx:192
 ZQueen.cxx:193
 ZQueen.cxx:194
 ZQueen.cxx:195
 ZQueen.cxx:196
 ZQueen.cxx:197
 ZQueen.cxx:198
 ZQueen.cxx:199
 ZQueen.cxx:200
 ZQueen.cxx:201
 ZQueen.cxx:202
 ZQueen.cxx:203
 ZQueen.cxx:204
 ZQueen.cxx:205
 ZQueen.cxx:206
 ZQueen.cxx:207
 ZQueen.cxx:208
 ZQueen.cxx:209
 ZQueen.cxx:210
 ZQueen.cxx:211
 ZQueen.cxx:212
 ZQueen.cxx:213
 ZQueen.cxx:214
 ZQueen.cxx:215
 ZQueen.cxx:216
 ZQueen.cxx:217
 ZQueen.cxx:218
 ZQueen.cxx:219
 ZQueen.cxx:220
 ZQueen.cxx:221
 ZQueen.cxx:222
 ZQueen.cxx:223
 ZQueen.cxx:224
 ZQueen.cxx:225
 ZQueen.cxx:226
 ZQueen.cxx:227
 ZQueen.cxx:228
 ZQueen.cxx:229
 ZQueen.cxx:230
 ZQueen.cxx:231
 ZQueen.cxx:232
 ZQueen.cxx:233
 ZQueen.cxx:234
 ZQueen.cxx:235
 ZQueen.cxx:236
 ZQueen.cxx:237
 ZQueen.cxx:238
 ZQueen.cxx:239
 ZQueen.cxx:240
 ZQueen.cxx:241
 ZQueen.cxx:242
 ZQueen.cxx:243
 ZQueen.cxx:244
 ZQueen.cxx:245
 ZQueen.cxx:246
 ZQueen.cxx:247
 ZQueen.cxx:248
 ZQueen.cxx:249
 ZQueen.cxx:250
 ZQueen.cxx:251
 ZQueen.cxx:252
 ZQueen.cxx:253
 ZQueen.cxx:254
 ZQueen.cxx:255
 ZQueen.cxx:256
 ZQueen.cxx:257
 ZQueen.cxx:258
 ZQueen.cxx:259
 ZQueen.cxx:260
 ZQueen.cxx:261
 ZQueen.cxx:262
 ZQueen.cxx:263
 ZQueen.cxx:264
 ZQueen.cxx:265
 ZQueen.cxx:266
 ZQueen.cxx:267
 ZQueen.cxx:268
 ZQueen.cxx:269
 ZQueen.cxx:270
 ZQueen.cxx:271
 ZQueen.cxx:272
 ZQueen.cxx:273
 ZQueen.cxx:274
 ZQueen.cxx:275
 ZQueen.cxx:276
 ZQueen.cxx:277
 ZQueen.cxx:278
 ZQueen.cxx:279
 ZQueen.cxx:280
 ZQueen.cxx:281
 ZQueen.cxx:282
 ZQueen.cxx:283
 ZQueen.cxx:284
 ZQueen.cxx:285
 ZQueen.cxx:286
 ZQueen.cxx:287
 ZQueen.cxx:288
 ZQueen.cxx:289
 ZQueen.cxx:290
 ZQueen.cxx:291
 ZQueen.cxx:292
 ZQueen.cxx:293
 ZQueen.cxx:294
 ZQueen.cxx:295
 ZQueen.cxx:296
 ZQueen.cxx:297
 ZQueen.cxx:298
 ZQueen.cxx:299
 ZQueen.cxx:300
 ZQueen.cxx:301
 ZQueen.cxx:302
 ZQueen.cxx:303
 ZQueen.cxx:304
 ZQueen.cxx:305
 ZQueen.cxx:306
 ZQueen.cxx:307
 ZQueen.cxx:308
 ZQueen.cxx:309
 ZQueen.cxx:310
 ZQueen.cxx:311
 ZQueen.cxx:312
 ZQueen.cxx:313
 ZQueen.cxx:314
 ZQueen.cxx:315
 ZQueen.cxx:316
 ZQueen.cxx:317
 ZQueen.cxx:318
 ZQueen.cxx:319
 ZQueen.cxx:320
 ZQueen.cxx:321
 ZQueen.cxx:322
 ZQueen.cxx:323
 ZQueen.cxx:324
 ZQueen.cxx:325
 ZQueen.cxx:326
 ZQueen.cxx:327
 ZQueen.cxx:328
 ZQueen.cxx:329
 ZQueen.cxx:330
 ZQueen.cxx:331
 ZQueen.cxx:332
 ZQueen.cxx:333
 ZQueen.cxx:334
 ZQueen.cxx:335
 ZQueen.cxx:336
 ZQueen.cxx:337
 ZQueen.cxx:338
 ZQueen.cxx:339
 ZQueen.cxx:340
 ZQueen.cxx:341
 ZQueen.cxx:342
 ZQueen.cxx:343
 ZQueen.cxx:344
 ZQueen.cxx:345
 ZQueen.cxx:346
 ZQueen.cxx:347
 ZQueen.cxx:348
 ZQueen.cxx:349
 ZQueen.cxx:350
 ZQueen.cxx:351
 ZQueen.cxx:352
 ZQueen.cxx:353
 ZQueen.cxx:354
 ZQueen.cxx:355
 ZQueen.cxx:356
 ZQueen.cxx:357
 ZQueen.cxx:358
 ZQueen.cxx:359
 ZQueen.cxx:360
 ZQueen.cxx:361
 ZQueen.cxx:362
 ZQueen.cxx:363
 ZQueen.cxx:364
 ZQueen.cxx:365
 ZQueen.cxx:366
 ZQueen.cxx:367
 ZQueen.cxx:368
 ZQueen.cxx:369
 ZQueen.cxx:370
 ZQueen.cxx:371
 ZQueen.cxx:372
 ZQueen.cxx:373
 ZQueen.cxx:374
 ZQueen.cxx:375
 ZQueen.cxx:376
 ZQueen.cxx:377
 ZQueen.cxx:378
 ZQueen.cxx:379
 ZQueen.cxx:380
 ZQueen.cxx:381
 ZQueen.cxx:382
 ZQueen.cxx:383
 ZQueen.cxx:384
 ZQueen.cxx:385
 ZQueen.cxx:386
 ZQueen.cxx:387
 ZQueen.cxx:388
 ZQueen.cxx:389
 ZQueen.cxx:390
 ZQueen.cxx:391
 ZQueen.cxx:392
 ZQueen.cxx:393
 ZQueen.cxx:394
 ZQueen.cxx:395
 ZQueen.cxx:396
 ZQueen.cxx:397
 ZQueen.cxx:398
 ZQueen.cxx:399
 ZQueen.cxx:400
 ZQueen.cxx:401
 ZQueen.cxx:402
 ZQueen.cxx:403
 ZQueen.cxx:404
 ZQueen.cxx:405
 ZQueen.cxx:406
 ZQueen.cxx:407
 ZQueen.cxx:408
 ZQueen.cxx:409
 ZQueen.cxx:410
 ZQueen.cxx:411
 ZQueen.cxx:412
 ZQueen.cxx:413
 ZQueen.cxx:414
 ZQueen.cxx:415
 ZQueen.cxx:416
 ZQueen.cxx:417
 ZQueen.cxx:418
 ZQueen.cxx:419
 ZQueen.cxx:420
 ZQueen.cxx:421
 ZQueen.cxx:422
 ZQueen.cxx:423
 ZQueen.cxx:424
 ZQueen.cxx:425
 ZQueen.cxx:426
 ZQueen.cxx:427
 ZQueen.cxx:428
 ZQueen.cxx:429
 ZQueen.cxx:430
 ZQueen.cxx:431
 ZQueen.cxx:432
 ZQueen.cxx:433
 ZQueen.cxx:434
 ZQueen.cxx:435
 ZQueen.cxx:436
 ZQueen.cxx:437
 ZQueen.cxx:438
 ZQueen.cxx:439
 ZQueen.cxx:440
 ZQueen.cxx:441
 ZQueen.cxx:442
 ZQueen.cxx:443
 ZQueen.cxx:444
 ZQueen.cxx:445
 ZQueen.cxx:446
 ZQueen.cxx:447
 ZQueen.cxx:448
 ZQueen.cxx:449
 ZQueen.cxx:450
 ZQueen.cxx:451
 ZQueen.cxx:452
 ZQueen.cxx:453
 ZQueen.cxx:454
 ZQueen.cxx:455
 ZQueen.cxx:456
 ZQueen.cxx:457
 ZQueen.cxx:458
 ZQueen.cxx:459
 ZQueen.cxx:460
 ZQueen.cxx:461
 ZQueen.cxx:462
 ZQueen.cxx:463
 ZQueen.cxx:464
 ZQueen.cxx:465
 ZQueen.cxx:466
 ZQueen.cxx:467
 ZQueen.cxx:468
 ZQueen.cxx:469
 ZQueen.cxx:470
 ZQueen.cxx:471
 ZQueen.cxx:472
 ZQueen.cxx:473
 ZQueen.cxx:474
 ZQueen.cxx:475
 ZQueen.cxx:476
 ZQueen.cxx:477
 ZQueen.cxx:478
 ZQueen.cxx:479
 ZQueen.cxx:480
 ZQueen.cxx:481
 ZQueen.cxx:482
 ZQueen.cxx:483
 ZQueen.cxx:484
 ZQueen.cxx:485
 ZQueen.cxx:486
 ZQueen.cxx:487
 ZQueen.cxx:488
 ZQueen.cxx:489
 ZQueen.cxx:490
 ZQueen.cxx:491
 ZQueen.cxx:492
 ZQueen.cxx:493
 ZQueen.cxx:494
 ZQueen.cxx:495
 ZQueen.cxx:496
 ZQueen.cxx:497
 ZQueen.cxx:498
 ZQueen.cxx:499
 ZQueen.cxx:500
 ZQueen.cxx:501
 ZQueen.cxx:502
 ZQueen.cxx:503
 ZQueen.cxx:504
 ZQueen.cxx:505
 ZQueen.cxx:506
 ZQueen.cxx:507
 ZQueen.cxx:508
 ZQueen.cxx:509
 ZQueen.cxx:510
 ZQueen.cxx:511
 ZQueen.cxx:512
 ZQueen.cxx:513
 ZQueen.cxx:514
 ZQueen.cxx:515
 ZQueen.cxx:516
 ZQueen.cxx:517
 ZQueen.cxx:518
 ZQueen.cxx:519
 ZQueen.cxx:520
 ZQueen.cxx:521
 ZQueen.cxx:522
 ZQueen.cxx:523
 ZQueen.cxx:524
 ZQueen.cxx:525
 ZQueen.cxx:526
 ZQueen.cxx:527
 ZQueen.cxx:528
 ZQueen.cxx:529
 ZQueen.cxx:530
 ZQueen.cxx:531
 ZQueen.cxx:532
 ZQueen.cxx:533
 ZQueen.cxx:534
 ZQueen.cxx:535
 ZQueen.cxx:536
 ZQueen.cxx:537
 ZQueen.cxx:538
 ZQueen.cxx:539
 ZQueen.cxx:540
 ZQueen.cxx:541
 ZQueen.cxx:542
 ZQueen.cxx:543
 ZQueen.cxx:544
 ZQueen.cxx:545
 ZQueen.cxx:546
 ZQueen.cxx:547
 ZQueen.cxx:548
 ZQueen.cxx:549
 ZQueen.cxx:550
 ZQueen.cxx:551
 ZQueen.cxx:552
 ZQueen.cxx:553
 ZQueen.cxx:554
 ZQueen.cxx:555
 ZQueen.cxx:556
 ZQueen.cxx:557
 ZQueen.cxx:558
 ZQueen.cxx:559
 ZQueen.cxx:560
 ZQueen.cxx:561
 ZQueen.cxx:562
 ZQueen.cxx:563
 ZQueen.cxx:564
 ZQueen.cxx:565
 ZQueen.cxx:566
 ZQueen.cxx:567
 ZQueen.cxx:568
 ZQueen.cxx:569
 ZQueen.cxx:570
 ZQueen.cxx:571
 ZQueen.cxx:572
 ZQueen.cxx:573
 ZQueen.cxx:574
 ZQueen.cxx:575
 ZQueen.cxx:576
 ZQueen.cxx:577
 ZQueen.cxx:578
 ZQueen.cxx:579
 ZQueen.cxx:580
 ZQueen.cxx:581
 ZQueen.cxx:582
 ZQueen.cxx:583
 ZQueen.cxx:584
 ZQueen.cxx:585
 ZQueen.cxx:586
 ZQueen.cxx:587
 ZQueen.cxx:588
 ZQueen.cxx:589
 ZQueen.cxx:590
 ZQueen.cxx:591
 ZQueen.cxx:592
 ZQueen.cxx:593
 ZQueen.cxx:594
 ZQueen.cxx:595
 ZQueen.cxx:596
 ZQueen.cxx:597
 ZQueen.cxx:598
 ZQueen.cxx:599
 ZQueen.cxx:600
 ZQueen.cxx:601
 ZQueen.cxx:602
 ZQueen.cxx:603
 ZQueen.cxx:604
 ZQueen.cxx:605
 ZQueen.cxx:606
 ZQueen.cxx:607
 ZQueen.cxx:608
 ZQueen.cxx:609
 ZQueen.cxx:610
 ZQueen.cxx:611
 ZQueen.cxx:612
 ZQueen.cxx:613
 ZQueen.cxx:614
 ZQueen.cxx:615
 ZQueen.cxx:616
 ZQueen.cxx:617
 ZQueen.cxx:618
 ZQueen.cxx:619
 ZQueen.cxx:620
 ZQueen.cxx:621
 ZQueen.cxx:622
 ZQueen.cxx:623
 ZQueen.cxx:624
 ZQueen.cxx:625
 ZQueen.cxx:626
 ZQueen.cxx:627
 ZQueen.cxx:628
 ZQueen.cxx:629
 ZQueen.cxx:630
 ZQueen.cxx:631
 ZQueen.cxx:632
 ZQueen.cxx:633
 ZQueen.cxx:634
 ZQueen.cxx:635
 ZQueen.cxx:636
 ZQueen.cxx:637
 ZQueen.cxx:638
 ZQueen.cxx:639
 ZQueen.cxx:640
 ZQueen.cxx:641
 ZQueen.cxx:642
 ZQueen.cxx:643
 ZQueen.cxx:644
 ZQueen.cxx:645
 ZQueen.cxx:646
 ZQueen.cxx:647
 ZQueen.cxx:648
 ZQueen.cxx:649
 ZQueen.cxx:650
 ZQueen.cxx:651
 ZQueen.cxx:652
 ZQueen.cxx:653
 ZQueen.cxx:654
 ZQueen.cxx:655
 ZQueen.cxx:656
 ZQueen.cxx:657
 ZQueen.cxx:658
 ZQueen.cxx:659
 ZQueen.cxx:660
 ZQueen.cxx:661
 ZQueen.cxx:662
 ZQueen.cxx:663
 ZQueen.cxx:664
 ZQueen.cxx:665
 ZQueen.cxx:666
 ZQueen.cxx:667
 ZQueen.cxx:668
 ZQueen.cxx:669
 ZQueen.cxx:670
 ZQueen.cxx:671
 ZQueen.cxx:672
 ZQueen.cxx:673
 ZQueen.cxx:674
 ZQueen.cxx:675
 ZQueen.cxx:676
 ZQueen.cxx:677
 ZQueen.cxx:678
 ZQueen.cxx:679
 ZQueen.cxx:680
 ZQueen.cxx:681
 ZQueen.cxx:682
 ZQueen.cxx:683
 ZQueen.cxx:684
 ZQueen.cxx:685
 ZQueen.cxx:686
 ZQueen.cxx:687
 ZQueen.cxx:688
 ZQueen.cxx:689
 ZQueen.cxx:690
 ZQueen.cxx:691
 ZQueen.cxx:692
 ZQueen.cxx:693
 ZQueen.cxx:694
 ZQueen.cxx:695
 ZQueen.cxx:696
 ZQueen.cxx:697
 ZQueen.cxx:698
 ZQueen.cxx:699
 ZQueen.cxx:700
 ZQueen.cxx:701
 ZQueen.cxx:702
 ZQueen.cxx:703
 ZQueen.cxx:704
 ZQueen.cxx:705
 ZQueen.cxx:706
 ZQueen.cxx:707
 ZQueen.cxx:708
 ZQueen.cxx:709
 ZQueen.cxx:710
 ZQueen.cxx:711
 ZQueen.cxx:712
 ZQueen.cxx:713
 ZQueen.cxx:714
 ZQueen.cxx:715
 ZQueen.cxx:716
 ZQueen.cxx:717
 ZQueen.cxx:718
 ZQueen.cxx:719
 ZQueen.cxx:720
 ZQueen.cxx:721
 ZQueen.cxx:722
 ZQueen.cxx:723
 ZQueen.cxx:724
 ZQueen.cxx:725
 ZQueen.cxx:726
 ZQueen.cxx:727
 ZQueen.cxx:728
 ZQueen.cxx:729
 ZQueen.cxx:730
 ZQueen.cxx:731
 ZQueen.cxx:732
 ZQueen.cxx:733
 ZQueen.cxx:734
 ZQueen.cxx:735
 ZQueen.cxx:736
 ZQueen.cxx:737
 ZQueen.cxx:738
 ZQueen.cxx:739
 ZQueen.cxx:740
 ZQueen.cxx:741
 ZQueen.cxx:742
 ZQueen.cxx:743
 ZQueen.cxx:744
 ZQueen.cxx:745
 ZQueen.cxx:746
 ZQueen.cxx:747
 ZQueen.cxx:748
 ZQueen.cxx:749
 ZQueen.cxx:750
 ZQueen.cxx:751
 ZQueen.cxx:752
 ZQueen.cxx:753
 ZQueen.cxx:754
 ZQueen.cxx:755
 ZQueen.cxx:756
 ZQueen.cxx:757
 ZQueen.cxx:758
 ZQueen.cxx:759
 ZQueen.cxx:760
 ZQueen.cxx:761
 ZQueen.cxx:762
 ZQueen.cxx:763
 ZQueen.cxx:764
 ZQueen.cxx:765
 ZQueen.cxx:766
 ZQueen.cxx:767
 ZQueen.cxx:768
 ZQueen.cxx:769
 ZQueen.cxx:770
 ZQueen.cxx:771
 ZQueen.cxx:772
 ZQueen.cxx:773
 ZQueen.cxx:774
 ZQueen.cxx:775
 ZQueen.cxx:776
 ZQueen.cxx:777
 ZQueen.cxx:778
 ZQueen.cxx:779
 ZQueen.cxx:780
 ZQueen.cxx:781
 ZQueen.cxx:782
 ZQueen.cxx:783
 ZQueen.cxx:784
 ZQueen.cxx:785
 ZQueen.cxx:786
 ZQueen.cxx:787
 ZQueen.cxx:788
 ZQueen.cxx:789
 ZQueen.cxx:790
 ZQueen.cxx:791
 ZQueen.cxx:792
 ZQueen.cxx:793
 ZQueen.cxx:794
 ZQueen.cxx:795
 ZQueen.cxx:796
 ZQueen.cxx:797
 ZQueen.cxx:798
 ZQueen.cxx:799
 ZQueen.cxx:800
 ZQueen.cxx:801
 ZQueen.cxx:802
 ZQueen.cxx:803
 ZQueen.cxx:804
 ZQueen.cxx:805
 ZQueen.cxx:806
 ZQueen.cxx:807
 ZQueen.cxx:808
 ZQueen.cxx:809
 ZQueen.cxx:810
 ZQueen.cxx:811
 ZQueen.cxx:812
 ZQueen.cxx:813
 ZQueen.cxx:814
 ZQueen.cxx:815
 ZQueen.cxx:816
 ZQueen.cxx:817
 ZQueen.cxx:818
 ZQueen.cxx:819
 ZQueen.cxx:820
 ZQueen.cxx:821
 ZQueen.cxx:822
 ZQueen.cxx:823
 ZQueen.cxx:824
 ZQueen.cxx:825
 ZQueen.cxx:826
 ZQueen.cxx:827
 ZQueen.cxx:828
 ZQueen.cxx:829
 ZQueen.cxx:830
 ZQueen.cxx:831
 ZQueen.cxx:832
 ZQueen.cxx:833
 ZQueen.cxx:834
 ZQueen.cxx:835
 ZQueen.cxx:836
 ZQueen.cxx:837
 ZQueen.cxx:838
 ZQueen.cxx:839
 ZQueen.cxx:840
 ZQueen.cxx:841
 ZQueen.cxx:842
 ZQueen.cxx:843
 ZQueen.cxx:844
 ZQueen.cxx:845
 ZQueen.cxx:846
 ZQueen.cxx:847
 ZQueen.cxx:848
 ZQueen.cxx:849
 ZQueen.cxx:850
 ZQueen.cxx:851
 ZQueen.cxx:852
 ZQueen.cxx:853
 ZQueen.cxx:854
 ZQueen.cxx:855
 ZQueen.cxx:856
 ZQueen.cxx:857
 ZQueen.cxx:858
 ZQueen.cxx:859
 ZQueen.cxx:860
 ZQueen.cxx:861
 ZQueen.cxx:862
 ZQueen.cxx:863
 ZQueen.cxx:864
 ZQueen.cxx:865
 ZQueen.cxx:866
 ZQueen.cxx:867
 ZQueen.cxx:868
 ZQueen.cxx:869
 ZQueen.cxx:870
 ZQueen.cxx:871
 ZQueen.cxx:872
 ZQueen.cxx:873
 ZQueen.cxx:874
 ZQueen.cxx:875
 ZQueen.cxx:876
 ZQueen.cxx:877
 ZQueen.cxx:878
 ZQueen.cxx:879
 ZQueen.cxx:880
 ZQueen.cxx:881
 ZQueen.cxx:882
 ZQueen.cxx:883
 ZQueen.cxx:884
 ZQueen.cxx:885
 ZQueen.cxx:886
 ZQueen.cxx:887
 ZQueen.cxx:888
 ZQueen.cxx:889
 ZQueen.cxx:890
 ZQueen.cxx:891
 ZQueen.cxx:892
 ZQueen.cxx:893
 ZQueen.cxx:894
 ZQueen.cxx:895
 ZQueen.cxx:896
 ZQueen.cxx:897
 ZQueen.cxx:898
 ZQueen.cxx:899
 ZQueen.cxx:900
 ZQueen.cxx:901
 ZQueen.cxx:902
 ZQueen.cxx:903
 ZQueen.cxx:904
 ZQueen.cxx:905
 ZQueen.cxx:906
 ZQueen.cxx:907
 ZQueen.cxx:908
 ZQueen.cxx:909
 ZQueen.cxx:910
 ZQueen.cxx:911
 ZQueen.cxx:912
 ZQueen.cxx:913
 ZQueen.cxx:914
 ZQueen.cxx:915
 ZQueen.cxx:916
 ZQueen.cxx:917
 ZQueen.cxx:918
 ZQueen.cxx:919
 ZQueen.cxx:920
 ZQueen.cxx:921
 ZQueen.cxx:922
 ZQueen.cxx:923
 ZQueen.cxx:924
 ZQueen.cxx:925
 ZQueen.cxx:926
 ZQueen.cxx:927
 ZQueen.cxx:928
 ZQueen.cxx:929
 ZQueen.cxx:930
 ZQueen.cxx:931
 ZQueen.cxx:932
 ZQueen.cxx:933
 ZQueen.cxx:934
 ZQueen.cxx:935
 ZQueen.cxx:936
 ZQueen.cxx:937
 ZQueen.cxx:938
 ZQueen.cxx:939
 ZQueen.cxx:940
 ZQueen.cxx:941
 ZQueen.cxx:942
 ZQueen.cxx:943
 ZQueen.cxx:944
 ZQueen.cxx:945
 ZQueen.cxx:946
 ZQueen.cxx:947
 ZQueen.cxx:948
 ZQueen.cxx:949
 ZQueen.cxx:950
 ZQueen.cxx:951
 ZQueen.cxx:952
 ZQueen.cxx:953
 ZQueen.cxx:954
 ZQueen.cxx:955
 ZQueen.cxx:956
 ZQueen.cxx:957
 ZQueen.cxx:958
 ZQueen.cxx:959
 ZQueen.cxx:960
 ZQueen.cxx:961
 ZQueen.cxx:962
 ZQueen.cxx:963
 ZQueen.cxx:964
 ZQueen.cxx:965
 ZQueen.cxx:966
 ZQueen.cxx:967
 ZQueen.cxx:968
 ZQueen.cxx:969
 ZQueen.cxx:970
 ZQueen.cxx:971
 ZQueen.cxx:972
 ZQueen.cxx:973
 ZQueen.cxx:974
 ZQueen.cxx:975
 ZQueen.cxx:976
 ZQueen.cxx:977
 ZQueen.cxx:978
 ZQueen.cxx:979
 ZQueen.cxx:980
 ZQueen.cxx:981
 ZQueen.cxx:982
 ZQueen.cxx:983
 ZQueen.cxx:984
 ZQueen.cxx:985
 ZQueen.cxx:986
 ZQueen.cxx:987
 ZQueen.cxx:988
 ZQueen.cxx:989
 ZQueen.cxx:990
 ZQueen.cxx:991
 ZQueen.cxx:992
 ZQueen.cxx:993
 ZQueen.cxx:994
 ZQueen.cxx:995
 ZQueen.cxx:996
 ZQueen.cxx:997
 ZQueen.cxx:998
 ZQueen.cxx:999
 ZQueen.cxx:1000
 ZQueen.cxx:1001
 ZQueen.cxx:1002
 ZQueen.cxx:1003
 ZQueen.cxx:1004
 ZQueen.cxx:1005
 ZQueen.cxx:1006
 ZQueen.cxx:1007
 ZQueen.cxx:1008
 ZQueen.cxx:1009
 ZQueen.cxx:1010
 ZQueen.cxx:1011
 ZQueen.cxx:1012
 ZQueen.cxx:1013
 ZQueen.cxx:1014
 ZQueen.cxx:1015
 ZQueen.cxx:1016
 ZQueen.cxx:1017
 ZQueen.cxx:1018
 ZQueen.cxx:1019
 ZQueen.cxx:1020
 ZQueen.cxx:1021
 ZQueen.cxx:1022
 ZQueen.cxx:1023
 ZQueen.cxx:1024
 ZQueen.cxx:1025
 ZQueen.cxx:1026
 ZQueen.cxx:1027
 ZQueen.cxx:1028
 ZQueen.cxx:1029
 ZQueen.cxx:1030
 ZQueen.cxx:1031
 ZQueen.cxx:1032
 ZQueen.cxx:1033
 ZQueen.cxx:1034
 ZQueen.cxx:1035
 ZQueen.cxx:1036
 ZQueen.cxx:1037
 ZQueen.cxx:1038
 ZQueen.cxx:1039
 ZQueen.cxx:1040
 ZQueen.cxx:1041
 ZQueen.cxx:1042
 ZQueen.cxx:1043
 ZQueen.cxx:1044
 ZQueen.cxx:1045
 ZQueen.cxx:1046
 ZQueen.cxx:1047
 ZQueen.cxx:1048
 ZQueen.cxx:1049
 ZQueen.cxx:1050
 ZQueen.cxx:1051
 ZQueen.cxx:1052
 ZQueen.cxx:1053
 ZQueen.cxx:1054
 ZQueen.cxx:1055
 ZQueen.cxx:1056
 ZQueen.cxx:1057
 ZQueen.cxx:1058
 ZQueen.cxx:1059
 ZQueen.cxx:1060
 ZQueen.cxx:1061
 ZQueen.cxx:1062
 ZQueen.cxx:1063
 ZQueen.cxx:1064
 ZQueen.cxx:1065
 ZQueen.cxx:1066
 ZQueen.cxx:1067
 ZQueen.cxx:1068
 ZQueen.cxx:1069
 ZQueen.cxx:1070
 ZQueen.cxx:1071
 ZQueen.cxx:1072
 ZQueen.cxx:1073
 ZQueen.cxx:1074
 ZQueen.cxx:1075
 ZQueen.cxx:1076
 ZQueen.cxx:1077
 ZQueen.cxx:1078
 ZQueen.cxx:1079
 ZQueen.cxx:1080
 ZQueen.cxx:1081
 ZQueen.cxx:1082
 ZQueen.cxx:1083
 ZQueen.cxx:1084
 ZQueen.cxx:1085
 ZQueen.cxx:1086
 ZQueen.cxx:1087
 ZQueen.cxx:1088
 ZQueen.cxx:1089
 ZQueen.cxx:1090
 ZQueen.cxx:1091
 ZQueen.cxx:1092
 ZQueen.cxx:1093
 ZQueen.cxx:1094
 ZQueen.cxx:1095
 ZQueen.cxx:1096
 ZQueen.cxx:1097
 ZQueen.cxx:1098
 ZQueen.cxx:1099
 ZQueen.cxx:1100
 ZQueen.cxx:1101
 ZQueen.cxx:1102
 ZQueen.cxx:1103
 ZQueen.cxx:1104
 ZQueen.cxx:1105
 ZQueen.cxx:1106
 ZQueen.cxx:1107
 ZQueen.cxx:1108
 ZQueen.cxx:1109
 ZQueen.cxx:1110
 ZQueen.cxx:1111
 ZQueen.cxx:1112
 ZQueen.cxx:1113
 ZQueen.cxx:1114
 ZQueen.cxx:1115
 ZQueen.cxx:1116
 ZQueen.cxx:1117
 ZQueen.cxx:1118
 ZQueen.cxx:1119
 ZQueen.cxx:1120
 ZQueen.cxx:1121
 ZQueen.cxx:1122
 ZQueen.cxx:1123
 ZQueen.cxx:1124
 ZQueen.cxx:1125
 ZQueen.cxx:1126
 ZQueen.cxx:1127
 ZQueen.cxx:1128
 ZQueen.cxx:1129
 ZQueen.cxx:1130
 ZQueen.cxx:1131
 ZQueen.cxx:1132
 ZQueen.cxx:1133
 ZQueen.cxx:1134
 ZQueen.cxx:1135
 ZQueen.cxx:1136
 ZQueen.cxx:1137
 ZQueen.cxx:1138
 ZQueen.cxx:1139
 ZQueen.cxx:1140
 ZQueen.cxx:1141
 ZQueen.cxx:1142
 ZQueen.cxx:1143
 ZQueen.cxx:1144
 ZQueen.cxx:1145
 ZQueen.cxx:1146
 ZQueen.cxx:1147
 ZQueen.cxx:1148
 ZQueen.cxx:1149
 ZQueen.cxx:1150
 ZQueen.cxx:1151
 ZQueen.cxx:1152
 ZQueen.cxx:1153
 ZQueen.cxx:1154
 ZQueen.cxx:1155
 ZQueen.cxx:1156
 ZQueen.cxx:1157
 ZQueen.cxx:1158
 ZQueen.cxx:1159
 ZQueen.cxx:1160
 ZQueen.cxx:1161
 ZQueen.cxx:1162
 ZQueen.cxx:1163
 ZQueen.cxx:1164
 ZQueen.cxx:1165
 ZQueen.cxx:1166
 ZQueen.cxx:1167
 ZQueen.cxx:1168
 ZQueen.cxx:1169
 ZQueen.cxx:1170
 ZQueen.cxx:1171
 ZQueen.cxx:1172
 ZQueen.cxx:1173
 ZQueen.cxx:1174
 ZQueen.cxx:1175
 ZQueen.cxx:1176
 ZQueen.cxx:1177
 ZQueen.cxx:1178
 ZQueen.cxx:1179
 ZQueen.cxx:1180
 ZQueen.cxx:1181
 ZQueen.cxx:1182
 ZQueen.cxx:1183
 ZQueen.cxx:1184
 ZQueen.cxx:1185
 ZQueen.cxx:1186
 ZQueen.cxx:1187
 ZQueen.cxx:1188
 ZQueen.cxx:1189
 ZQueen.cxx:1190
 ZQueen.cxx:1191
 ZQueen.cxx:1192
 ZQueen.cxx:1193
 ZQueen.cxx:1194
 ZQueen.cxx:1195
 ZQueen.cxx:1196
 ZQueen.cxx:1197
 ZQueen.cxx:1198
 ZQueen.cxx:1199
 ZQueen.cxx:1200
 ZQueen.cxx:1201
 ZQueen.cxx:1202
 ZQueen.cxx:1203
 ZQueen.cxx:1204
 ZQueen.cxx:1205
 ZQueen.cxx:1206
 ZQueen.cxx:1207
 ZQueen.cxx:1208
 ZQueen.cxx:1209
 ZQueen.cxx:1210
 ZQueen.cxx:1211
 ZQueen.cxx:1212
 ZQueen.cxx:1213
 ZQueen.cxx:1214
 ZQueen.cxx:1215
 ZQueen.cxx:1216
 ZQueen.cxx:1217
 ZQueen.cxx:1218
 ZQueen.cxx:1219
 ZQueen.cxx:1220
 ZQueen.cxx:1221
 ZQueen.cxx:1222
 ZQueen.cxx:1223
 ZQueen.cxx:1224
 ZQueen.cxx:1225
 ZQueen.cxx:1226
 ZQueen.cxx:1227
 ZQueen.cxx:1228
 ZQueen.cxx:1229
 ZQueen.cxx:1230
 ZQueen.cxx:1231
 ZQueen.cxx:1232
 ZQueen.cxx:1233
 ZQueen.cxx:1234
 ZQueen.cxx:1235
 ZQueen.cxx:1236
 ZQueen.cxx:1237
 ZQueen.cxx:1238
 ZQueen.cxx:1239
 ZQueen.cxx:1240
 ZQueen.cxx:1241
 ZQueen.cxx:1242
 ZQueen.cxx:1243
 ZQueen.cxx:1244
 ZQueen.cxx:1245
 ZQueen.cxx:1246
 ZQueen.cxx:1247
 ZQueen.cxx:1248
 ZQueen.cxx:1249
 ZQueen.cxx:1250
 ZQueen.cxx:1251
 ZQueen.cxx:1252
 ZQueen.cxx:1253
 ZQueen.cxx:1254
 ZQueen.cxx:1255
 ZQueen.cxx:1256
 ZQueen.cxx:1257
 ZQueen.cxx:1258
 ZQueen.cxx:1259
 ZQueen.cxx:1260
 ZQueen.cxx:1261
 ZQueen.cxx:1262
 ZQueen.cxx:1263
 ZQueen.cxx:1264
 ZQueen.cxx:1265
 ZQueen.cxx:1266
 ZQueen.cxx:1267
 ZQueen.cxx:1268
 ZQueen.cxx:1269
 ZQueen.cxx:1270
 ZQueen.cxx:1271
 ZQueen.cxx:1272
 ZQueen.cxx:1273
 ZQueen.cxx:1274
 ZQueen.cxx:1275
 ZQueen.cxx:1276
 ZQueen.cxx:1277
 ZQueen.cxx:1278
 ZQueen.cxx:1279
 ZQueen.cxx:1280
 ZQueen.cxx:1281
 ZQueen.cxx:1282
 ZQueen.cxx:1283
 ZQueen.cxx:1284
 ZQueen.cxx:1285
 ZQueen.cxx:1286
 ZQueen.cxx:1287
 ZQueen.cxx:1288
 ZQueen.cxx:1289
 ZQueen.cxx:1290
 ZQueen.cxx:1291
 ZQueen.cxx:1292
 ZQueen.cxx:1293
 ZQueen.cxx:1294
 ZQueen.cxx:1295
 ZQueen.cxx:1296
 ZQueen.cxx:1297
 ZQueen.cxx:1298
 ZQueen.cxx:1299
 ZQueen.cxx:1300
 ZQueen.cxx:1301
 ZQueen.cxx:1302
 ZQueen.cxx:1303
 ZQueen.cxx:1304
 ZQueen.cxx:1305
 ZQueen.cxx:1306
 ZQueen.cxx:1307
 ZQueen.cxx:1308
 ZQueen.cxx:1309
 ZQueen.cxx:1310
 ZQueen.cxx:1311
 ZQueen.cxx:1312
 ZQueen.cxx:1313
 ZQueen.cxx:1314
 ZQueen.cxx:1315
 ZQueen.cxx:1316
 ZQueen.cxx:1317
 ZQueen.cxx:1318
 ZQueen.cxx:1319
 ZQueen.cxx:1320
 ZQueen.cxx:1321
 ZQueen.cxx:1322
 ZQueen.cxx:1323
 ZQueen.cxx:1324
 ZQueen.cxx:1325
 ZQueen.cxx:1326
 ZQueen.cxx:1327
 ZQueen.cxx:1328
 ZQueen.cxx:1329
 ZQueen.cxx:1330
 ZQueen.cxx:1331
 ZQueen.cxx:1332
 ZQueen.cxx:1333
 ZQueen.cxx:1334
 ZQueen.cxx:1335
 ZQueen.cxx:1336
 ZQueen.cxx:1337
 ZQueen.cxx:1338
 ZQueen.cxx:1339
 ZQueen.cxx:1340
 ZQueen.cxx:1341
 ZQueen.cxx:1342
 ZQueen.cxx:1343
 ZQueen.cxx:1344
 ZQueen.cxx:1345
 ZQueen.cxx:1346
 ZQueen.cxx:1347
 ZQueen.cxx:1348
 ZQueen.cxx:1349
 ZQueen.cxx:1350
 ZQueen.cxx:1351
 ZQueen.cxx:1352
 ZQueen.cxx:1353
 ZQueen.cxx:1354
 ZQueen.cxx:1355
 ZQueen.cxx:1356
 ZQueen.cxx:1357
 ZQueen.cxx:1358
 ZQueen.cxx:1359
 ZQueen.cxx:1360
 ZQueen.cxx:1361
 ZQueen.cxx:1362
 ZQueen.cxx:1363
 ZQueen.cxx:1364
 ZQueen.cxx:1365
 ZQueen.cxx:1366
 ZQueen.cxx:1367
 ZQueen.cxx:1368
 ZQueen.cxx:1369
 ZQueen.cxx:1370
 ZQueen.cxx:1371
 ZQueen.cxx:1372
 ZQueen.cxx:1373
 ZQueen.cxx:1374
 ZQueen.cxx:1375
 ZQueen.cxx:1376
 ZQueen.cxx:1377
 ZQueen.cxx:1378
 ZQueen.cxx:1379
 ZQueen.cxx:1380
 ZQueen.cxx:1381
 ZQueen.cxx:1382
 ZQueen.cxx:1383
 ZQueen.cxx:1384
 ZQueen.cxx:1385
 ZQueen.cxx:1386
 ZQueen.cxx:1387
 ZQueen.cxx:1388
 ZQueen.cxx:1389
 ZQueen.cxx:1390
 ZQueen.cxx:1391
 ZQueen.cxx:1392
 ZQueen.cxx:1393
 ZQueen.cxx:1394
 ZQueen.cxx:1395
 ZQueen.cxx:1396
 ZQueen.cxx:1397
 ZQueen.cxx:1398
 ZQueen.cxx:1399
 ZQueen.cxx:1400
 ZQueen.cxx:1401
 ZQueen.cxx:1402
 ZQueen.cxx:1403
 ZQueen.cxx:1404
 ZQueen.cxx:1405
 ZQueen.cxx:1406
 ZQueen.cxx:1407
 ZQueen.cxx:1408
 ZQueen.cxx:1409
 ZQueen.cxx:1410
 ZQueen.cxx:1411
 ZQueen.cxx:1412
 ZQueen.cxx:1413
 ZQueen.cxx:1414
 ZQueen.cxx:1415
 ZQueen.cxx:1416
 ZQueen.cxx:1417
 ZQueen.cxx:1418
 ZQueen.cxx:1419
 ZQueen.cxx:1420
 ZQueen.cxx:1421
 ZQueen.cxx:1422
 ZQueen.cxx:1423
 ZQueen.cxx:1424