// @(#)root/ged:$Id$
// Author: Marek Biskup, Ilka Antcheva   22/07/03

/*************************************************************************
 * Copyright (C) 1995-2002, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/


//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TGedPatternFrame, TGedPatternSelector, TGedPatternPopup              //
// and TGedPatternColor                                                 //
//                                                                      //
// The TGedPatternFrame is a small frame with border showing            //
// a specific pattern (fill style.                                      //
//                                                                      //
// The TGedPatternSelector is a composite frame with TGedPatternFrames  //
// of all diferent styles                                               //
//                                                                      //
// The TGedPatternPopup is a popup containing a TGedPatternSelector.    //
//                                                                      //
// The TGedPatternSelect widget is a button with pattern area with      //
// a little down arrow. When clicked on the arrow the                   //
// TGedPatternPopup pops up.                                            //
//                                                                      //
// Selecting a pattern in this widget will generate the event:          //
// kC_PATTERNSEL, kPAT_SELCHANGED, widget id, style.                    //
//                                                                      //
// and the signal:                                                      //
// PatternSelected(Style_t pattern)                                     //
//                                                                      //
// TGedSelect is button that shows popup window when clicked.           //
// TGedPopup is a popup window.                                         //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TGResourcePool.h"
#include "TGedPatternSelect.h"
#include "RConfigure.h"
#include "TGToolTip.h"
#include "TGButton.h"
#include "Riostream.h"
#include "RStipples.h"

ClassImp(TGedPopup)
ClassImp(TGedSelect)
ClassImp(TGedPatternFrame)
ClassImp(TGedPatternSelector)
ClassImp(TGedPatternPopup)
ClassImp(TGedPatternSelect)

TGGC* TGedPatternFrame::fgGC = 0;


//______________________________________________________________________________
TGedPatternFrame::TGedPatternFrame(const TGWindow *p, Style_t pattern,
                                   int width, int height)
   : TGFrame(p, width, height, kOwnBackground)
{
   // Pattern select ctor.

   Pixel_t white;
   gClient->GetColorByName("white", white); // white background
   SetBackgroundColor(white);

   // special case: solid
   if (pattern == 1001)
      SetBackgroundColor(0);     // if solid then black

   fPattern = pattern;

   AddInput(kButtonPressMask | kButtonReleaseMask);
   fMsgWindow  = p;
   fActive = kFALSE;
   snprintf(fTipText, 5, "%d", pattern);

   // solid and hollow must be treated separately
   if (pattern != 0 && pattern != 1001)
      fTip = new TGToolTip(fClient->GetDefaultRoot(), this, fTipText, 1000);
   else if (pattern == 0)
      fTip = new TGToolTip(fClient->GetDefaultRoot(), this, "0 - hollow", 1000);
   else // pattern == 1001
      fTip = new TGToolTip(fClient->GetDefaultRoot(), this, "1001 - solid", 1000);

   AddInput(kEnterWindowMask | kLeaveWindowMask);

   if (!fgGC) {
      GCValues_t gcv;
      gcv.fMask = kGCLineStyle  | kGCLineWidth  | kGCFillStyle |
                  kGCForeground | kGCBackground;
      gcv.fLineStyle  = kLineSolid;
      gcv.fLineWidth  = 0;
      gcv.fFillStyle  = 0;
      gcv.fBackground = white;
      gcv.fForeground = 0;    // black foreground
      fgGC = gClient->GetGC(&gcv, kTRUE);
   }
}

//______________________________________________________________________________
Bool_t TGedPatternFrame::HandleCrossing(Event_t *event)
{
   // Handle mouse crossing event.

   if (fTip) {
      if (event->fType == kEnterNotify)
         fTip->Reset();
      else
         fTip->Hide();
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGedPatternFrame::HandleButton(Event_t *event)
{
   // Handle mouse button event.

   if (event->fType == kButtonPress) {
      SendMessage(fMsgWindow, MK_MSG(kC_PATTERNSEL, kPAT_CLICK), event->fCode, fPattern);
   } else {    // kButtonRelease
      SendMessage(fMsgWindow, MK_MSG(kC_PATTERNSEL, kPAT_SELCHANGED), event->fCode, fPattern);
   }

   return kTRUE;
}

//______________________________________________________________________________
void TGedPatternFrame::DrawBorder()
{
   // Draw border.

   gVirtualX->DrawRectangle(fId, GetBckgndGC()(), 0, 0, fWidth, fHeight);
   Draw3dRectangle(kDoubleBorder | kSunkenFrame, 0, 0, fWidth, fHeight);
}

//______________________________________________________________________________
void TGedPatternFrame::DoRedraw()
{
   // Redraw selected pattern.

   TGFrame::DoRedraw();

   if (fPattern > 3000 && fPattern < 3026) {
      SetFillStyle(fgGC, fPattern);
      gVirtualX->FillRectangle(fId, fgGC->GetGC(), 0, 0, fWidth, fHeight);
   }
   DrawBorder();
}

//______________________________________________________________________________
void TGedPatternFrame::SetFillStyle(TGGC* gc, Style_t fstyle)
{
   // Set fill area style.
   // fstyle   : compound fill area interior style
   //    fstyle = 1000*interiorstyle + styleindex
   // this function should be in TGGC !!!

   Int_t style = fstyle/1000;
   Int_t fasi  = fstyle%1000;
   Int_t stn = (fasi >= 1 && fasi <=25) ? fasi : 2;

   static Pixmap_t fillPattern = 0;

   switch (style) {
      case 1:         // solid
         gc->SetFillStyle(kFillSolid);
         break;
      case 2:         // pattern
         break;
      case 3:         // hatch
         gc->SetFillStyle(kFillStippled);
         if (fillPattern != 0) {
            gVirtualX->DeletePixmap(fillPattern);
            fillPattern = 0;
         }
         fillPattern = gVirtualX->CreateBitmap(gClient->GetDefaultRoot()->GetId(),
                                               (const char*)gStipples[stn], 16, 16);
         gc->SetStipple(fillPattern);
         break;
      default:
        break;
   }
}

//______________________________________________________________________________
TGedPatternSelector::TGedPatternSelector(const TGWindow *p) :
   TGCompositeFrame(p, 124, 190)
{
   // Create pattern popup window.

   SetLayoutManager(new TGTileLayout(this, 1));

   Int_t i;
   for (i = 1; i <= 25; i++)
      fCe[i-1] = new TGedPatternFrame(this, 3000 + i);

   fCe[25] = new TGedPatternFrame(this, 0);
   fCe[26] = new TGedPatternFrame(this, 1001);

   for (i = 0; i < 27; i++)
      AddFrame(fCe[i], new TGLayoutHints(kLHintsNoHints));

   fMsgWindow  = p;
   fActive = -1;
}

//______________________________________________________________________________
TGedPatternSelector::~TGedPatternSelector()
{
   // Delete pattern popup window.

   Cleanup();
}

//______________________________________________________________________________
void TGedPatternSelector::SetActive(Int_t newat)
{
   // Set selected the current style.

   if (fActive != newat) {
      if ((fActive >= 0) && (fActive < 27)) {
         fCe[fActive]->SetActive(kFALSE);
      }
      fActive = newat;
      if ((fActive >= 0) && (fActive < 27)) {
         fCe[fActive]->SetActive(kTRUE);
      }
   }
}

//______________________________________________________________________________
Bool_t TGedPatternSelector::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
   // Process message generated by pattern popup window.

   switch (GET_MSG(msg)) {
      case kC_PATTERNSEL:
         switch (GET_SUBMSG(msg)) {
            case kPAT_SELCHANGED:
               switch (parm1) {
                  case kButton1:
                     SendMessage(fMsgWindow, MK_MSG(kC_PATTERNSEL,
                                 kPAT_SELCHANGED), parm1, parm2);
                     break;
               }
               break;
            case kPAT_CLICK:
               switch (parm1) {
                  case kButton1:
                     SetActive(parm2);
                     break;
               }
               break;
         }
   }

   return kTRUE;
}

//______________________________________________________________________________
TGedPopup::TGedPopup(const TGWindow *p, const TGWindow *m, UInt_t w, UInt_t h,
                     UInt_t options, Pixel_t back)
   : TGCompositeFrame(p, w, h, options, back)
{
   // Create a popup frame.

   fMsgWindow = m;
   SetWindowAttributes_t wattr;

   wattr.fMask = kWAOverrideRedirect | kWASaveUnder ;
   wattr.fOverrideRedirect = kTRUE;
   wattr.fSaveUnder = kTRUE;
   gVirtualX->ChangeWindowAttributes(fId, &wattr);

   AddInput(kStructureNotifyMask);
}

//______________________________________________________________________________
void TGedPopup::EndPopup()
{
   // Ungrab pointer and unmap popup window.

   gVirtualX->GrabPointer(0, 0, 0, 0, kFALSE);
   UnmapWindow();
}

//______________________________________________________________________________
void TGedPopup::PlacePopup(Int_t x, Int_t y, UInt_t w, UInt_t h)
{
   // Place popup window at the specified place.

   Int_t rx, ry;
   UInt_t rw, rh;

   // Parent is root window for the popup:
   gVirtualX->GetWindowSize(fParent->GetId(), rx, ry, rw, rh);

   if (x < 0) x = 0;
   if (x + fWidth > rw) x = rw - fWidth;
   if (y < 0) y = 0;
   if (y + fHeight > rh) y = rh - fHeight;

   MoveResize(x, y, w, h);
   MapSubwindows();
   Layout();
   MapRaised();

   gVirtualX->GrabPointer(fId, kButtonPressMask | kButtonReleaseMask |
                          kPointerMotionMask, kNone,
                          fClient->GetResourcePool()->GetGrabCursor());
   gClient->WaitForUnmap(this);
   EndPopup();
}

//______________________________________________________________________________
Bool_t TGedPopup::HandleButton(Event_t *event)
{
   // Handle mouse button event in popup window.

   if ((event->fX < 0) || (event->fX >= (Int_t) fWidth) ||
       (event->fY < 0) || (event->fY >= (Int_t) fHeight))  {

      if (event->fType == kButtonRelease) EndPopup();

   } else {
      TGFrame *f = GetFrameFromPoint(event->fX, event->fY);
      if (f && f != this) {
         TranslateCoordinates(f, event->fX, event->fY, event->fX, event->fY);
         f->HandleButton(event);
      }
   }
   return kTRUE;
}

//______________________________________________________________________________
Bool_t TGedPopup::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
   // Process messages generated by popup window.

   switch (GET_MSG(msg)) {
      case kC_POPUP:
         switch (GET_SUBMSG(msg)) {
            case kPOP_HIDE:
               EndPopup();
               SendMessage(fMsgWindow, MK_MSG(kC_POPUP, kPOP_HIDE),
                           parm1, parm2);
               break;
            default:
               break;
         }
         break;
   }
   return kTRUE;
}

//______________________________________________________________________________
TGedPatternPopup::TGedPatternPopup(const TGWindow *p, const TGWindow *m, Style_t pattern)
   : TGedPopup(p, m, 10, 10, kDoubleBorder | kRaisedFrame | kOwnBackground,
               GetDefaultFrameBackground())
{
   // Pattern popup constructor.

   fCurrentPattern = pattern;

   TGedPatternSelector *ps = new TGedPatternSelector(this);
   AddFrame(ps, new TGLayoutHints(kLHintsCenterX, 1, 1, 1, 1));

   MapSubwindows();
   Resize(ps->GetDefaultWidth() + 6, ps->GetDefaultHeight());
}

//______________________________________________________________________________
TGedPatternPopup::~TGedPatternPopup()
{
   // Destructor of pattern popup window.

   Cleanup();
}

//______________________________________________________________________________
Bool_t TGedPatternPopup::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
   // Process messages generated by pattern popup window.

   switch (GET_MSG(msg)) {
      case kC_PATTERNSEL:
         switch (GET_SUBMSG(msg)) {
            case kPAT_SELCHANGED:
               SendMessage(fMsgWindow, MK_MSG(kC_PATTERNSEL, kPAT_SELCHANGED),
                           parm1, parm2);
               UnmapWindow();
               break;

            default:
               break;
         }
         break;
   }
   return kTRUE;
}

//______________________________________________________________________________
TGedSelect::TGedSelect(const TGWindow *p, Int_t id)
   : TGCheckButton(p, "", id)
{
   // Create pattern select button.

   fPopup = 0;

   GCValues_t gcv;
   gcv.fMask = kGCLineStyle  | kGCLineWidth  | kGCFillStyle |
               kGCForeground | kGCBackground;
   gcv.fLineStyle  = kLineSolid;
   gcv.fLineWidth  = 0;
   gcv.fFillStyle  = 0;
   Pixel_t white;
   gClient->GetColorByName("white", white); // white background
   gcv.fBackground = white;
   gcv.fForeground = 0;    // black foreground
   fDrawGC = gClient->GetGC(&gcv, kTRUE);

   Enable();
   SetState(kButtonUp);
   AddInput(kButtonPressMask | kButtonReleaseMask);
}

//______________________________________________________________________________
TGedSelect::~TGedSelect()
{
   // Destructor of pattern select button.

   if (fPopup)
      delete fPopup;
   fClient->FreeGC(fDrawGC);
}

//______________________________________________________________________________
Bool_t TGedSelect::HandleButton(Event_t *event)
{
   // Handle mouse button events in pattern select button.

   TGFrame::HandleButton(event);

   if (!IsEnabled()) return kTRUE;

   if (event->fCode != kButton1) return kFALSE;

   if ((event->fType == kButtonPress) && HasFocus()) WantFocus();

   if (event->fType == kButtonPress) {
      if (fState != kButtonDown) {
         fPrevState = fState;
         SetState(kButtonDown);
      }
   } else {
      if (fState != kButtonUp) {
         SetState(kButtonUp);
         Window_t wdummy;
         Int_t ax, ay;
         if (fPopup) {
            gVirtualX->TranslateCoordinates(fId, gClient->GetDefaultRoot()->GetId(),
                                            0, fHeight, ax, ay, wdummy);
#ifdef R__HAS_COCOA
            gVirtualX->SetWMTransientHint(fPopup->GetId(), GetId());
#endif
            fPopup->PlacePopup(ax, ay, fPopup->GetDefaultWidth(),
                               fPopup->GetDefaultHeight());
         }
      }
   }
   return kTRUE;
}

//______________________________________________________________________________
void TGedSelect::Enable()
{
   // Set widget state flag (kTRUE=enabled, kFALSE=disabled).

   SetFlags(kWidgetIsEnabled);
   fClient->NeedRedraw(this);
}

//______________________________________________________________________________
void TGedSelect::Disable()
{
   // Clear widget state flag.

   ClearFlags(kWidgetIsEnabled);
   fClient->NeedRedraw(this);
}

//________________________________________________________________________________
void TGedSelect::DoRedraw()
{
   // Draw separator and arrow.

   Int_t  x, y;
   UInt_t h;

   TGButton::DoRedraw();

   if (IsEnabled()) {

      // separator
      x = fWidth - 6 - fBorderWidth - 6;
      y = fBorderWidth + 1;
      h = fHeight - fBorderWidth - 1;  // actually y1

      if (fState == kButtonDown) { ++x; ++y; }

      gVirtualX->DrawLine(fId, GetShadowGC()(),  x, y, x, h - 2);
      gVirtualX->DrawLine(fId, GetHilightGC()(), x + 1, y, x + 1, h - 1);
      gVirtualX->DrawLine(fId, GetHilightGC()(), x, h - 1, x + 1, h - 1);

      // arrow

      x = fWidth - 6 - fBorderWidth - 2;
      y = (fHeight - 4) / 2 + 1;

      if (fState == kButtonDown) { ++x; ++y; }

      DrawTriangle(GetBlackGC()(), x, y);

   } else {

      // separator
      x = fWidth - 6 - fBorderWidth - 6;
      y = fBorderWidth + 1;
      h = fHeight - fBorderWidth - 1;  // actually y1

      gVirtualX->DrawLine(fId, GetShadowGC()(),  x, y, x, h - 2);
      gVirtualX->DrawLine(fId, GetHilightGC()(), x + 1, y, x + 1, h - 1);
      gVirtualX->DrawLine(fId, GetHilightGC()(), x, h - 1, x + 1, h - 1);

      // sunken arrow

      x = fWidth - 6 - fBorderWidth - 2;
      y = (fHeight - 4) / 2 + 1;

      DrawTriangle(GetHilightGC()(), x + 1, y + 1);
      DrawTriangle(GetShadowGC()(), x, y);
   }
}

//______________________________________________________________________________
void TGedSelect::DrawTriangle(GContext_t gc, Int_t x, Int_t y)
{
   // Draw small triangle.

   Point_t points[3];

#ifdef R__HAS_COCOA
   points[0].fX = x;
   points[0].fY = y;
   points[1].fX = x + 6;
   points[1].fY = y;
   points[2].fX = x + 3;
   points[2].fY = y + 3;
#else
   points[0].fX = x;
   points[0].fY = y;
   points[1].fX = x + 5;
   points[1].fY = y;
   points[2].fX = x + 2;
   points[2].fY = y + 3;
#endif

   gVirtualX->FillPolygon(fId, gc, points, 3);
}


//______________________________________________________________________________
TGedPatternSelect::TGedPatternSelect(const TGWindow *p, Style_t pattern, Int_t id)
   : TGedSelect(p, id)
{
   // Create and pop up pattern select window.

   fPattern = pattern;
   SetPopup(new TGedPatternPopup(gClient->GetDefaultRoot(), this, fPattern));
   SetPattern(fPattern);
}

//______________________________________________________________________________
Bool_t TGedPatternSelect::ProcessMessage(Long_t msg, Long_t parm1, Long_t parm2)
{
   // Process message according to the user input.

   if (GET_MSG(msg) == kC_PATTERNSEL && GET_SUBMSG(msg) == kPAT_SELCHANGED)
   {
      SetPattern(parm2);
      parm1 = (Long_t)fWidgetId;
      SendMessage(fMsgWindow, MK_MSG(kC_PATTERNSEL, kPAT_SELCHANGED),
                  parm1, parm2);
   }
   return kTRUE;
}

//______________________________________________________________________________
void TGedPatternSelect::DoRedraw()
{
   // Draw selected pattern as current one.

   TGedSelect::DoRedraw();

   Int_t  x, y;
   UInt_t w, h;

   if (IsEnabled()) { // pattern rectangle

      x = fBorderWidth + 2;
      y = fBorderWidth + 2;  // 1;
      h = fHeight - (fBorderWidth * 2) - 4;  // -3;  // 14
      w = h * 2;
      if (fState == kButtonDown) { ++x; ++y; }

#ifdef R__HAS_COCOA
      TGedPatternFrame::SetFillStyle(fDrawGC, 1001);

      Pixel_t white;
      gClient->GetColorByName("white", white); // white background
      fDrawGC->SetForeground(white);
      gVirtualX->FillRectangle(fId, fDrawGC->GetGC(), x + 1, y + 1, w - 1, h - 1);

      if (fPattern != 0) {
         fDrawGC->SetForeground(0);
         TGedPatternFrame::SetFillStyle(fDrawGC, fPattern);
         gVirtualX->FillRectangle(fId, fDrawGC->GetGC(), x + 1, y + 1, w - 1, h - 1);
      }

      gVirtualX->DrawRectangle(fId, GetShadowGC()(), x + 1, y + 1, w - 1, h - 1);
#else
      gVirtualX->DrawRectangle(fId, GetShadowGC()(), x, y, w - 1, h - 1);

      TGedPatternFrame::SetFillStyle(fDrawGC, 1001);

      Pixel_t white;
      gClient->GetColorByName("white", white); // white background
      fDrawGC->SetForeground(white);
      gVirtualX->FillRectangle(fId, fDrawGC->GetGC(), x + 1, y + 1, w - 2, h - 2);

      if (fPattern != 0) {
         fDrawGC->SetForeground(0);
         TGedPatternFrame::SetFillStyle(fDrawGC, fPattern);
         gVirtualX->FillRectangle(fId, fDrawGC->GetGC(), x + 1, y + 1, w - 2, h - 2);
      }
#endif
   } else { // sunken rectangle

      x = fBorderWidth + 2;
      y = fBorderWidth + 2;  // 1;
      w = 42;
      h = fHeight - (fBorderWidth * 2) - 4;  // 3;
      Draw3dRectangle(kSunkenFrame, x, y, w, h);
   }
}

//______________________________________________________________________________
void TGedPatternSelect::SetPattern(Style_t pattern, Bool_t emit)
{
   // Set pattern.

   fPattern = pattern;
   gClient->NeedRedraw(this);
   if (emit)
      PatternSelected(fPattern);
}

//______________________________________________________________________________
void TGedPatternSelect::SavePrimitive(std::ostream &out, Option_t * /*= ""*/)
{
   // Save the pattern select widget as a C++ statement(s) on output stream out

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