Hi Rich!

First off thanks for taking on this work. The only issue I have with it is the legacy code. You've got the old matching algorithm in there twice, once in a static method and again in the new iterator class.

Honestly, I'm not too happy about leaving it in there at all - for one thing, it's not usable with the modern QName class (which doesn't allow nulls), is it? If you really need the algorithm, can't you just put it somewhere outside Axiom? I.e. you're already asking people to do new OMChildrenLegacyQNameIterator(), which is a new class, so why not new com.ibm.LegacyQNameIterator()? That would keep the dependency in your code since you're the only ones who've asked for it.

Hm - actually, I just re-read the actual algorithm in said legacy code, and now I'm convinced it should go. It can't match unqualified elements! In other words QName("", "dog"), which is *exactly* <dog xmlns=""/>, would match <anyNS:dog/> also, which is plain wrong. It would be one thing if it was actually relying on null as a wildcard value, but considering it also matches the empty namespace as if it was null, this falls into my "evil code" realm. :) Can we please get rid of it?

--Glen

[EMAIL PROTECTED] wrote:
Author: scheu
Date: Wed Oct 10 12:32:15 2007
New Revision: 583588

URL: http://svn.apache.org/viewvc?rev=583588&view=rev
Log:
WSCOMMONS-256
Contributor:Rich Scheuerle
Added iterators for getting child elements that match a certain local name or 
namespace.
Added deprecated iterator for the old qname equality code.  This is not used in 
Axiom, but we have some customers that had a dependency on the old algorithm.

kudos to Mike and Glen

Added:
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenLegacyQNameIterator.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenLocalNameIterator.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenNamespaceIterator.java
Modified:
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMElement.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenQNameIterator.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocumentImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
    
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java?rev=583588&r1=583587&r2=583588&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMContainer.java
 Wed Oct 10 12:32:15 2007
@@ -45,6 +45,25 @@
      * @return Returns an iterator of [EMAIL PROTECTED] OMElement} items that 
match the given QName
      */
     Iterator getChildrenWithName(QName elementQName);
+ + /**
+     * Returns an iterator for child nodes matching the local name.
+     * <p/>
+     *
+ * @param localName + * @return Returns an iterator of [EMAIL PROTECTED] OMElement} items that match the given localName
+     */
+    Iterator getChildrenWithLocalName(String localName);
+ + /**
+     * Returns an iterator for child nodes matching the namespace uri.
+     * <p/>
+     *
+ * @param uri + * @return Returns an iterator of [EMAIL PROTECTED] OMElement} items that match the given uri
+     */
+    Iterator getChildrenWithNamespaceURI(String uri);
+ /**
      * Returns the first child in document order that matches the given QName

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMElement.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMElement.java?rev=583588&r1=583587&r2=583588&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMElement.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/OMElement.java
 Wed Oct 10 12:32:15 2007
@@ -40,7 +40,7 @@
      * @see #getChildrenWithName(javax.xml.namespace.QName)
      */
     Iterator getChildElements();
-
+ /**
      * Creates a namespace in the current element scope.
      *

Added: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenLegacyQNameIterator.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenLegacyQNameIterator.java?rev=583588&view=auto
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenLegacyQNameIterator.java
 (added)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenLegacyQNameIterator.java
 Wed Oct 10 12:32:15 2007
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.om.impl.traverse;
+
+import org.apache.axiom.om.OMNode;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Iterate over elements with the QName that uses the + * legacy algorithm. This iterator is only retained for migrating
+ * some existing customers that have a dependency on the old algorithm
+ * @deprecated
+ */
+public class OMChildrenLegacyQNameIterator extends OMChildrenQNameIterator {
+
+    public OMChildrenLegacyQNameIterator(OMNode currentChild, QName qName) {
+        super(currentChild, qName);
+    }
+
+    /**
+     * This version of equals returns true if the local parts match.
+ * + * @param searchQName
+     * @param currentQName
+     * @return true if equals
+     */
+    public boolean isEquals(QName searchQName, QName currentQName) {
+ // if the given localname is null, whatever value this.qname has, its a match. + // But can one give a QName without a localName ??
+        String localPart = searchQName.getLocalPart();
+        boolean localNameMatch =(localPart == null) || (localPart.equals("")) 
||
+            ((currentQName != null) && 
currentQName.getLocalPart().equals(localPart));
+ + String namespaceURI = searchQName.getNamespaceURI();
+        boolean namespaceURIMatch = (namespaceURI == null) || 
(namespaceURI.equals(""))||
+            ((currentQName != null) && 
currentQName.getNamespaceURI().equals(namespaceURI));
+        return localNameMatch && namespaceURIMatch;
+    }
+}

Added: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenLocalNameIterator.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenLocalNameIterator.java?rev=583588&view=auto
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenLocalNameIterator.java
 (added)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenLocalNameIterator.java
 Wed Oct 10 12:32:15 2007
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.om.impl.traverse;
+
+import org.apache.axiom.om.OMNode;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Iterate over elements with the same LocalName
+ *
+ */
+public class OMChildrenLocalNameIterator extends OMChildrenQNameIterator {
+
+    public OMChildrenLocalNameIterator(OMNode currentChild, String localName) {
+        super(currentChild, new QName("", localName));
+    }
+
+    /**
+     * This version of equals returns true if the local parts match.
+ * + * @param searchQName
+     * @param currentQName
+     * @return true if equals
+     */
+    public boolean isEquals(QName searchQName, QName currentQName) {
+        return searchQName.getLocalPart().equals(searchQName.getLocalPart());
+    }
+}

Added: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenNamespaceIterator.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenNamespaceIterator.java?rev=583588&view=auto
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenNamespaceIterator.java
 (added)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenNamespaceIterator.java
 Wed Oct 10 12:32:15 2007
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.om.impl.traverse;
+
+import org.apache.axiom.om.OMNode;
+
+import javax.xml.namespace.QName;
+
+/**
+ * Iterate over elements with the same namespace uri
+ *
+ */
+public class OMChildrenNamespaceIterator extends OMChildrenQNameIterator {
+
+    public OMChildrenNamespaceIterator(OMNode currentChild, String uri) {
+        super(currentChild, new QName(uri, "dummyName"));
+    }
+
+    /**
+     * This version of equals returns true if the local parts match.
+ * + * @param searchQName
+     * @param currentQName
+     * @return true if equals
+     */
+    public boolean isEquals(QName searchQName, QName currentQName) {
+        return 
searchQName.getNamespaceURI().equals(searchQName.getNamespaceURI());
+    }
+}

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenQNameIterator.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenQNameIterator.java?rev=583588&r1=583587&r2=583588&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenQNameIterator.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/om/impl/traverse/OMChildrenQNameIterator.java
 Wed Oct 10 12:32:15 2007
@@ -24,10 +24,16 @@
import javax.xml.namespace.QName; -/** Class OMChildrenQNameIterator */ +/** + * Class OMChildrenQNameIterator + * + * This iterator returns the elements that have a matching QName.
+ * This class can be extended to customize the QName equality.
+ *
+ */
 public class OMChildrenQNameIterator extends OMChildrenIterator {
     /** Field givenQName */
-    private QName givenQName;
+    private final QName givenQName;
/** Field needToMoveForward */
     private boolean needToMoveForward = true;
@@ -45,6 +51,18 @@
         super(currentChild);
         this.givenQName = givenQName;
     }
+ + /**
+     * Returns true if the qnames are equal.
+     * The default algorithm is to use the QName equality (which examines the 
namespace and localPart).
+     * You can extend this class to provide your own equality algorithm.
+     * @param searchQName
+     * @param currentQName
+     * @return true if qnames are equal.
+     */
+    public boolean isEqual(QName searchQName, QName currentQName) {
+        return searchQName.equals(currentQName);
+    }
/**
      * Returns <tt>true</tt> if the iteration has more elements. (In other 
words, returns
@@ -58,7 +76,8 @@
                 // check the current node for the criteria
                 if (currentChild instanceof OMElement) {
                     QName thisQName = ((OMElement)currentChild).getQName();
-                    if (givenQName == null || thisQName.equals(givenQName)) {
+                    // A null givenName is an indicator to return all elements
+                    if (givenQName == null || isEqual(givenQName, thisQName)) {
                         isMatchingNodeFound = true;
                         needToMoveForward = false;
                         break;
@@ -93,4 +112,29 @@
         currentChild = currentChild.getNextOMSibling();
         return lastChild;
     }
+ + /**
+     * Prior versions of the OMChildrenQNameIterator used the following
+     * logic to check equality.  This algorithm is incorrect; however some 
customers
+     * have dependency on this behavior.  This method is retained (but 
deprecated) to allow
+     * them an opportunity to use the old algorithm.
+ * + * @param searchQName
+     * @param currentQName
+     * @return true using legacy equality match
+     * @deprecated
+     */
+    public static boolean isEquals_Legacy(QName searchQName, QName 
currentQName) {
+ + // if the given localname is null, whatever value this.qname has, its a match. But can one give a QName without a localName ??
+        String localPart = searchQName.getLocalPart();
+        boolean localNameMatch =(localPart == null) || (localPart.equals("")) 
||
+            ((currentQName != null) && 
currentQName.getLocalPart().equals(localPart));
+        String namespaceURI = searchQName.getNamespaceURI();
+        boolean namespaceURIMatch = (namespaceURI == null) || 
(namespaceURI.equals(""))||
+            ((currentQName != null) && 
currentQName.getNamespaceURI().equals(namespaceURI));
+        return localNameMatch && namespaceURIMatch;
+    }
+ + }

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java?rev=583588&r1=583587&r2=583588&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-dom/src/main/java/org/apache/axiom/om/impl/dom/ParentNode.java
 Wed Oct 10 12:32:15 2007
@@ -31,6 +31,8 @@
 import org.apache.axiom.om.impl.builder.StAXOMBuilder;
 import org.apache.axiom.om.impl.dom.factory.OMDOMFactory;
 import org.apache.axiom.om.impl.traverse.OMChildrenIterator;
+import org.apache.axiom.om.impl.traverse.OMChildrenLocalNameIterator;
+import org.apache.axiom.om.impl.traverse.OMChildrenNamespaceIterator;
 import org.apache.axiom.om.impl.traverse.OMChildrenQNameIterator;
 import org.w3c.dom.DOMException;
 import org.w3c.dom.Document;
@@ -90,6 +92,17 @@
      */
     public Iterator getChildrenWithName(QName elementQName) throws OMException 
{
         return new OMChildrenQNameIterator(getFirstOMChild(), elementQName);
+    }
+ + public Iterator getChildrenWithLocalName(String localName) {
+        return new OMChildrenLocalNameIterator(getFirstOMChild(),
+                                               localName);
+    }
+
+
+    public Iterator getChildrenWithNamespaceURI(String uri) {
+        return new OMChildrenNamespaceIterator(getFirstOMChild(),
+                                               uri);
     }
/**

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocumentImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocumentImpl.java?rev=583588&r1=583587&r2=583588&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocumentImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMDocumentImpl.java
 Wed Oct 10 12:32:15 2007
@@ -30,6 +30,8 @@
 import org.apache.axiom.om.impl.OMContainerEx;
 import org.apache.axiom.om.impl.OMNodeEx;
 import org.apache.axiom.om.impl.traverse.OMChildrenIterator;
+import org.apache.axiom.om.impl.traverse.OMChildrenLocalNameIterator;
+import org.apache.axiom.om.impl.traverse.OMChildrenNamespaceIterator;
 import org.apache.axiom.om.impl.traverse.OMChildrenQNameIterator;
import javax.xml.namespace.QName;
@@ -229,6 +231,16 @@
                                            elementQName);
     }
+ public Iterator getChildrenWithLocalName(String localName) {
+        return new OMChildrenLocalNameIterator(getFirstOMChild(),
+                                               localName);
+    }
+
+
+    public Iterator getChildrenWithNamespaceURI(String uri) {
+        return new OMChildrenNamespaceIterator(getFirstOMChild(),
+                                               uri);
+    }
     /**
      * Method getFirstOMChild.
      *

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java?rev=583588&r1=583587&r2=583588&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMElementImpl.java
 Wed Oct 10 12:32:15 2007
@@ -37,6 +37,9 @@
 import org.apache.axiom.om.impl.llom.factory.OMLinkedListImplFactory;
 import org.apache.axiom.om.impl.traverse.OMChildElementIterator;
 import org.apache.axiom.om.impl.traverse.OMChildrenIterator;
+import org.apache.axiom.om.impl.traverse.OMChildrenLegacyQNameIterator;
+import org.apache.axiom.om.impl.traverse.OMChildrenLocalNameIterator;
+import org.apache.axiom.om.impl.traverse.OMChildrenNamespaceIterator;
 import org.apache.axiom.om.impl.traverse.OMChildrenQNameIterator;
 import org.apache.axiom.om.impl.util.EmptyIterator;
 import org.apache.axiom.om.impl.util.OMSerializerUtil;
@@ -208,7 +211,27 @@
     public Iterator getChildrenWithName(QName elementQName) {
         return new OMChildrenQNameIterator(getFirstOMChild(),
                                            elementQName);
+ + // The semantics of this call was changed.
+        // The original sematics had a looser definition of QName equality.
+        // To get this original functionality use:
+        /*
+        return new OMChildrenLegacyQNameIterator(getFirstOMChild(), 
elementQName);
+        */
     }
+ +
+    public Iterator getChildrenWithLocalName(String localName) {
+        return new OMChildrenLocalNameIterator(getFirstOMChild(),
+                                               localName);
+    }
+
+
+    public Iterator getChildrenWithNamespaceURI(String uri) {
+        return new OMChildrenNamespaceIterator(getFirstOMChild(),
+                                               uri);
+    }
+
/**
      * Method getFirstChildWithName.

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java?rev=583588&r1=583587&r2=583588&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-impl/src/main/java/org/apache/axiom/om/impl/llom/OMSourcedElementImpl.java
 Wed Oct 10 12:32:15 2007
@@ -61,6 +61,7 @@
  * heavy overhead penalty, so should be avoided if possible.</p>
  */
 public class OMSourcedElementImpl extends OMElementImpl implements 
OMSourcedElement {
+ /** Data source for element data. */
     private OMDataSource dataSource;
@@ -768,6 +769,16 @@
     public Iterator getChildrenWithName(QName elementQName) {
         forceExpand();
         return super.getChildrenWithName(elementQName);
+    }
+ + public Iterator getChildrenWithLocalName(String localName) {
+        forceExpand();
+        return super.getChildrenWithLocalName(localName);
+    }
+
+    public Iterator getChildrenWithNamespaceURI(String uri) {
+        forceExpand();
+        return super.getChildrenWithNamespaceURI(uri);
     }
/* (non-Javadoc)



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to