// Path: src/com/metamolecular/mx/model/Atom.java
// public interface Atom
// {
//   public String getSymbol();
//   
//   public void setSymbol(String newSymbol);
//   
//   public int getIndex();
//   
//   public void setIsotope(int isotope);
//   
//   public int getIsotope();
//   
//   public boolean hasSingleIsotope();
//   
//   public void setCharge(int charge);
//   
//   public int getCharge();
//   
//   public void setRadical(int radical);
//   
//   public int getRadical();
//   
//   public Atom[] getNeighbors();
//   
//   public Bond[] getBonds();
//   
//   public Bond getBond(Atom neighbor);
//   
//   public int countNeighbors();
//   
//   public boolean isConnectedTo(Atom atom);
//   
//   public int countVirtualHydrogens();
//   
//   public double getX();
//   
//   public double getY();
//   
//   public double getZ();
//   
//   public void move(double x, double y, double z);
//   
//   public int getValence();
//   
//   public Molecule getMolecule();
// }
// 
// Path: src/com/metamolecular/mx/model/Bond.java
// public interface Bond
// {
//   public int getIndex();
//   
//   public Atom getSource();
//   
//   public Atom getTarget();
//   
//   public Atom getMate(Atom atom);
//   
//   public boolean contains(Atom atom);
//   
//   public void setType(int type);
//   
//   public int getType();
//   
//   public void setStereo(int stereo);
//   
//   public int getStereo();
//   
//   public void reverse();
//   
//   public Molecule getMolecule();
//   
//   public Atom[] getNeighborAtoms();
// }


import com.metamolecular.mx.model.Atom;
import com.metamolecular.mx.model.Bond;
    this.bondOrder = -1;
    this.unsaturation = -1;
  }

  public DefaultBondMatcher(Bond bond)
  {
    this.bondOrder = bond.getType();
    this.unsaturation = getUnsaturation(bond);
  }

  public boolean matches(Bond bond)
  {
    if (bondOrder == bond.getType())
    {
      return true;
    }
    
    if (this.unsaturation == getUnsaturation(bond))
    {
      return true;
    }
    
    return false;
  }

  private int getUnsaturation(Bond bond)
  {
    return getUnsaturation(bond.getSource()) + getUnsaturation(bond.getTarget());
  }

// Path: src/com/metamolecular/mx/model/Atom.java
// public interface Atom
// {
//   public String getSymbol();
//   
//   public void setSymbol(String newSymbol);
//   
//   public int getIndex();
//   
//   public void setIsotope(int isotope);
//   
//   public int getIsotope();
//   
//   public boolean hasSingleIsotope();
//   
//   public void setCharge(int charge);
//   
//   public int getCharge();
//   
//   public void setRadical(int radical);
//   
//   public int getRadical();
//   
//   public Atom[] getNeighbors();
//   
//   public Bond[] getBonds();
//   
//   public Bond getBond(Atom neighbor);
//   
//   public int countNeighbors();
//   
//   public boolean isConnectedTo(Atom atom);
//   
//   public int countVirtualHydrogens();
//   
//   public double getX();
//   
//   public double getY();
//   
//   public double getZ();
//   
//   public void move(double x, double y, double z);
//   
//   public int getValence();
//   
//   public Molecule getMolecule();
// }
// 
// Path: src/com/metamolecular/mx/model/Bond.java
// public interface Bond
// {
//   public int getIndex();
//   
//   public Atom getSource();
//   
//   public Atom getTarget();
//   
//   public Atom getMate(Atom atom);
//   
//   public boolean contains(Atom atom);
//   
//   public void setType(int type);
//   
//   public int getType();
//   
//   public void setStereo(int stereo);
//   
//   public int getStereo();
//   
//   public void reverse();
//   
//   public Molecule getMolecule();
//   
//   public Atom[] getNeighborAtoms();
// }


// Path: src/com/metamolecular/mx/query/DefaultBondMatcher.java
import com.metamolecular.mx.model.Atom;
import com.metamolecular.mx.model.Bond;

    this.bondOrder = -1;
    this.unsaturation = -1;
  }

  public DefaultBondMatcher(Bond bond)
  {
    this.bondOrder = bond.getType();
    this.unsaturation = getUnsaturation(bond);
  }

  public boolean matches(Bond bond)
  {
    if (bondOrder == bond.getType())
    {
      return true;
    }
    
    if (this.unsaturation == getUnsaturation(bond))
    {
      return true;
    }
    
    return false;
  }

  private int getUnsaturation(Bond bond)
  {
    return getUnsaturation(bond.getSource()) + getUnsaturation(bond.getTarget());
  }

  private int getUnsaturation(Atom atom)