Your message dated Sat, 05 May 2007 15:32:05 +0000
with message-id <[EMAIL PROTECTED]>
and subject line Bug#420994: fixed in pdfedit 0.3.0-2
has caused the attached Bug report to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what I am
talking about this indicates a serious mail system misconfiguration
somewhere.  Please contact me immediately.)

Debian bug tracking system administrator
(administrator, Debian Bugs database)

--- Begin Message ---
Package: pdfedit
Version: 0.3.0-1
Usertags: ftbfs-gcc-4.3
Tags: patch

Your package fails to build with GCC 4.3.  Version 4.3 has not been
released yet but I'm building with a snapshot in order to find errors
and give people an advance warning.

You can reproduce this problem with gcc-snapshot (20070422-1 or higher)
from unstable. (Currently not available for i386, but for amd64, powerpc
and ia64.  I hope to have i386 binaries in the archive in the near
future.)

> Automatic build of pdfedit_0.3.0-1 on coconut0 by sbuild/ia64 0.49
...
> make[3]: Entering directory `/build/tbm/pdfedit-0.3.0/src/utils'
> g++ -c -pipe -Wall -W -Wconversion -Wcast-qual -Wwrite-strings -ansi 
> -pedantic -Wno-unused-variable -Wunused-function -D_REENTRANT -DDEBUG -g -O0 
> -I./ -I../ -I../xpdf/ -I../xpdf/xpdf -I../xpdf/goo -I../xpdf/splash 
> -I../xpdf/fofi  -o debug.o debug.cc
> In file included from debug.cc:31:
> debug.h:94: error: extra ';'
> make[3]: *** [debug.o] Error 1

--- ./src/kernel/cdict.h~       2007-04-25 17:08:33.000000000 +0000
+++ ./src/kernel/cdict.h        2007-04-25 17:08:57.815432514 +0000
@@ -106,7 +106,7 @@
        /** 
         * Public constructor. This object will not be associated with a pdf.
         */
-       CDict () {};
+       CDict () {}
 
 
        //
@@ -143,7 +143,7 @@
         *
         * @return Type of this property.
         */
-       virtual PropertyType getType () const {return type;};
+       virtual PropertyType getType () const {return type;}
        
 
        /**
@@ -165,7 +165,7 @@
        {
                //kernelPrintDbg (debug::DBG_DBG, "getPropertyCount(" << 
debug::getStringType<Tp>() << ") = " << value.size());
                return value.size();
-       };
+       }
  
 
        /**
@@ -207,7 +207,7 @@
         *
         */
        PropertyType getPropertyType (PropertyId id) const 
-               { return getProperty(id)->getType(); };
+               { return getProperty(id)->getType(); }
 
        
        //
@@ -277,7 +277,7 @@
        /**
         * Destructor
         */
-       ~CDict () {};
+       ~CDict () {}
        
 
        //
@@ -389,9 +389,9 @@
        boost::shared_ptr<IProperty> ip;
 
 public:
-       DictIdxComparator (const std::string& s) : str(s) {};
+       DictIdxComparator (const std::string& s) : str(s) {}
                
-       boost::shared_ptr<IProperty> getIProperty () {return ip;};
+       boost::shared_ptr<IProperty> getIProperty () {return ip;}
                
        bool operator() (const CDict::Value::value_type& item)
        {       
@@ -402,7 +402,7 @@
                }
                        
                return false;
-       };
+       }
 };
 
 
--- ./src/kernel/xpdf.h~        2007-04-25 17:09:07.000000000 +0000
+++ ./src/kernel/xpdf.h 2007-04-25 17:09:22.132815029 +0000
@@ -77,21 +77,21 @@
        typedef T element_type;
 
        /** Constructor. */
-       MassiveIdiocyWrapper () {};
+       MassiveIdiocyWrapper () {}
 
        /** Explicit delete.    */
-       void reset () { obj.free (); };
+       void reset () { obj.free (); }
        
        /** Dereference. */
-       T& operator*() /*const*/ { return obj; };
+       T& operator*() /*const*/ { return obj; }
        /** Dereference. */
-       T* operator->() /*const*/ { return &obj; };
+       T* operator->() /*const*/ { return &obj; }
 
        /** Get raw pointer. */
-       T* get () /*const*/ { return &obj; };
+       T* get () /*const*/ { return &obj; }
        
        /** Destructor. */
-       ~MassiveIdiocyWrapper () { obj.free (); };
+       ~MassiveIdiocyWrapper () { obj.free (); }
 };
 
 /** Xpdf object wrapper. */
@@ -134,8 +134,8 @@
 /** Create this class in a function using xpdf code sensitive to global 
variables. */
 struct GlobalUseXpdf
 {
-       GlobalUseXpdf () {openXpdfMess ();};
-       ~GlobalUseXpdf () {closeXpdfMess ();};
+       GlobalUseXpdf () {openXpdfMess ();}
+       ~GlobalUseXpdf () {closeXpdfMess ();}
 };
 
 
--- ./src/kernel/exceptions.h~  2007-04-25 17:10:13.000000000 +0000
+++ ./src/kernel/exceptions.h   2007-04-25 17:10:29.759767325 +0000
@@ -167,7 +167,7 @@
        /** Exception constructor.
         * @param msg Cause message.
         */
-       PdfOpenException(std::string msg):message(msg){};
+       PdfOpenException(std::string msg):message(msg){}
 
        virtual ~PdfOpenException()throw()
        {
@@ -192,7 +192,7 @@
 public:
        /** Exception constructor.
         */
-       IndirectObjectsExhausted(){};
+       IndirectObjectsExhausted(){}
 
        virtual ~IndirectObjectsExhausted()throw()
        {
@@ -214,7 +214,7 @@
 public:
        /** Exception constructor.
         */
-       NoPageRootException(){};
+       NoPageRootException(){}
 
        virtual ~NoPageRootException()throw()
        {
--- ./src/kernel/streamwriter.h~        2007-04-25 17:10:38.000000000 +0000
+++ ./src/kernel/streamwriter.h 2007-04-25 17:10:45.144532762 +0000
@@ -91,7 +91,7 @@
        /** Constructor with dictionary object.
         * @param dictA Object where to store stream dictionary.
         */
-       StreamWriter(Object * dictA):BaseStream(dictA){};
+       StreamWriter(Object * dictA):BaseStream(dictA){}
        
        /** Puts character at current position.
         * @param ch Character to put to the stream.
@@ -177,14 +177,14 @@
                : BaseStream(dictA),
                  StreamWriter(dictA),
                  FileStream(fA, startA, limitedA, lengthA, dictA) 
-                 {};
+                 {}
 
        /** Destructor for FileStreamWriter.
         *
         * NOTE: doesn't close given file handle. Instance creator is 
responsible to
         * that.
         */
-       virtual ~FileStreamWriter(){};
+       virtual ~FileStreamWriter(){}
        
        /** Puts character to the file.
         * @param ch Character to write.
--- ./src/kernel/pdfwriter.h~   2007-04-25 17:11:01.000000000 +0000
+++ ./src/kernel/pdfwriter.h    2007-04-25 17:15:58.839841419 +0000
@@ -160,7 +160,7 @@
        /** Default virtual destructor.
         * Empty destructor.
         */
-       virtual ~IProgressBar(){};
+       virtual ~IProgressBar(){}
        
        /** Starts progress visualization.
         */
@@ -335,7 +335,7 @@
                size_t objNum;
        };
 
-       virtual ~IPdfWriter(){};
+       virtual ~IPdfWriter(){}
 
        /** Puts all objects to given stream.
         * @param objectList List of objects to store.
@@ -434,7 +434,7 @@
         *
         * Initializes CONTENT and TRAILER fields to default values.
         */
-       OldStylePdfWriter():maxObjNum(0), CONTENT("Content phase"), 
TRAILER("XREF/TRAILER phase"){};
+       OldStylePdfWriter():maxObjNum(0), CONTENT("Content phase"), 
TRAILER("XREF/TRAILER phase"){}
 
        /** Writes given objects.
         * @param objectList List of objects to write.
--- ./src/kernel/carray.h~      2007-04-25 17:11:27.000000000 +0000
+++ ./src/kernel/carray.h       2007-04-25 17:11:40.256836774 +0000
@@ -98,7 +98,7 @@
        /** 
         * Public constructor. This object will not be associated with a pdf.
         */
-       CArray () {};
+       CArray () {}
 
 
        //
@@ -135,7 +135,7 @@
         *
         * @return Type of this property.
         */
-       virtual PropertyType getType () const {return type;};
+       virtual PropertyType getType () const {return type;}
        
 
        /**
@@ -157,7 +157,7 @@
        {
                //kernelPrintDbg (debug::DBG_DBG, "getPropertyCount(" << 
debug::getStringType<Tp>() << ") = " << value.size());
                return value.size();
-       };
+       }
  
 
        /**
@@ -177,7 +177,7 @@
         * \exception ObjInvalidPositionInComplex When the id does not 
correctly identify an item.
         */
        PropertyType getPropertyType (PropertyId id) const 
-               { return getProperty(id)->getType(); };
+               { return getProperty(id)->getType(); }
 
        
        //
@@ -246,7 +246,7 @@
        /**
         * Destructor
         */
-       ~CArray () {};
+       ~CArray () {}
        
 
        //
--- ./src/kernel/filters.h~     2007-04-25 17:11:54.000000000 +0000
+++ ./src/kernel/filters.h      2007-04-25 17:12:07.213867694 +0000
@@ -150,7 +150,7 @@
        typedef boost::iostreams::input_filter_tag  category;
        
        /** Default constructor. */
-       NoFilter () {utilsPrintDbg (debug::DBG_DBG, "NoFilter created."); };
+       NoFilter () {utilsPrintDbg (debug::DBG_DBG, "NoFilter created."); }
 
        /** Single char output function. */
        template<typename Source>
@@ -160,7 +160,7 @@
        }
 
        /** Destructor. */
-       ~NoFilter () { utilsPrintDbg (debug::DBG_DBG, "NoFilter destroyed."); };
+       ~NoFilter () { utilsPrintDbg (debug::DBG_DBG, "NoFilter destroyed."); }
 
 };
 
@@ -182,7 +182,7 @@
        typedef struct boost::iostreams::source_tag category;
 
        /** Constructor. */
-       buffer_source (const T& _b) : buffer (_b), pos(0) {utilsPrintDbg 
(debug::DBG_DBG, "");};
+       buffer_source (const T& _b) : buffer (_b), pos(0) {utilsPrintDbg 
(debug::DBG_DBG, "");}
 
        /** Read function.*/
     std::streamsize 
--- ./src/kernel/iproperty.h~   2007-04-25 17:12:19.000000000 +0000
+++ ./src/kernel/iproperty.h    2007-04-25 17:12:41.453125087 +0000
@@ -110,9 +110,9 @@
        IndiRef(int _num, int _gen) : num(_num), gen(_gen) {}
 
        /** Copy constructor. */
-       IndiRef& operator= (const IndiRef& _r) { num = _r.num; gen = _r.gen; 
return *this;};
+       IndiRef& operator= (const IndiRef& _r) { num = _r.num; gen = _r.gen; 
return *this;}
        /** Equality operator. */
-       bool operator== (const IndiRef& _r) const { return (num == _r.num && 
gen == _r.gen) ? true : false;};
+       bool operator== (const IndiRef& _r) const { return (num == _r.num && 
gen == _r.gen) ? true : false;}
                        
 } IndiRef;
 
@@ -152,7 +152,7 @@
        //
 private:
        /** Copy constructor. */
-       //IProperty (const IProperty&) : IPropertyObserverSubject() {};
+       //IProperty (const IProperty&) : IPropertyObserverSubject() {}
 
 protected:     
 
@@ -204,7 +204,7 @@
         * Returns pdf in which this object resides.
         * @return Pdf that this object is associated with.
         */
-       CPdf* getPdf () const {return pdf;};
+       CPdf* getPdf () const {return pdf;}
 
        /**
         * Checks if a property can be changed.
@@ -221,7 +221,7 @@
         *
         * @return Identification and generation number.
         */
-       const IndiRef& getIndiRef () const {return ref;};
+       const IndiRef& getIndiRef () const {return ref;}
 
 
        /**
@@ -229,7 +229,7 @@
         *
         * @param rf Indirect reference identification and generation number.
         */
-       virtual void setIndiRef (const IndiRef& rf) {ref = rf;};
+       virtual void setIndiRef (const IndiRef& rf) {ref = rf;}
 
  
        /**
@@ -238,7 +238,7 @@
         * @param n Objects identification number.
         * @param g Objects generation number.
         */
-       void setIndiRef (IndiRef::ObjNum n, IndiRef::GenNum g) {ref.num = n; 
ref.gen = g;};
+       void setIndiRef (IndiRef::ObjNum n, IndiRef::GenNum g) {ref.num = n; 
ref.gen = g;}
 
        //
        // PropertyMode
@@ -250,14 +250,14 @@
         *
         * @return Mode.
         */
-       PropertyMode getMode () const {return mode;};
+       PropertyMode getMode () const {return mode;}
 
        /**
         * Set mode of this property.
         *
         * @param md Mode.
         */
-       void setMode (PropertyMode md) {mode = md;};
+       void setMode (PropertyMode md) {mode = md;}
        
 
 public:
@@ -333,7 +333,7 @@
        /**
         * Destructor.
         */
-       virtual ~IProperty () {};
+       virtual ~IProperty () {}
 
 }; /* class IProperty */
 
--- ./src/kernel/cobjectsimple.h~       2007-04-25 17:12:53.000000000 +0000
+++ ./src/kernel/cobjectsimple.h        2007-04-25 17:13:07.077148211 +0000
@@ -176,7 +176,7 @@
         *
         * @return Type of this property.
         */
-       virtual PropertyType getType () const {return type;};
+       virtual PropertyType getType () const {return type;}
                        
 
        /**
@@ -235,7 +235,7 @@
        /**
         * Destructor
         */
-       ~CObjectSimple () {};
+       ~CObjectSimple () {}
        
 
        //
--- ./src/kernel/cxref.h~       2007-04-25 17:13:18.000000000 +0000
+++ ./src/kernel/cxref.h        2007-04-25 17:13:29.550780748 +0000
@@ -204,7 +204,7 @@
         * This constructor is protected to prevent uninitialized instances.
         * We need at least to specify stream with data.
         */
-       CXref(): XRef(NULL){};
+       CXref(): XRef(NULL){}
 
        /** Entry for ObjectStorage.
         *
--- ./src/kernel/modecontroller.h~      2007-04-25 17:13:41.000000000 +0000
+++ ./src/kernel/modecontroller.h       2007-04-25 17:20:13.497064862 +0000
@@ -439,7 +439,7 @@
        { 
                // initializes specialized rules matcher for property modes.
                setRuleMatcher(&matcher);
-       };
+       }
 
        /** Constructor with default mode.
         * @param defMod Default mode to be used.
@@ -451,12 +451,12 @@
        {
                // initializes specialized rules matcher for property modes.
                setRuleMatcher(&matcher);
-       };
+       }
 
        /** Virtual destructor.
         * This method is empty, because no special treatment is required.
         */
-       virtual ~ModeController () {};
+       virtual ~ModeController () {}
 
        /** 
         * Get default mode.
--- ./src/kernel/cobjecthelpers.h~      2007-04-25 17:14:27.000000000 +0000
+++ ./src/kernel/cobjecthelpers.h       2007-04-25 17:14:30.910154996 +0000
@@ -373,7 +373,7 @@
         */
        IdCollector(Container & cont, const boost::shared_ptr<IProperty> & 
search)
                :container(cont), searched(search), comp(Comparator())
-               {};
+               {}
 
        /** Filters ids of properties which equals searched.
         * @param entry Entry which contains identificator, property pair.
--- ./src/kernel/static.h~      2007-04-25 17:17:31.455074660 +0000
+++ ./src/kernel/static.h       2007-04-25 17:18:05.190425809 +0000
@@ -89,7 +89,7 @@
 template<typename T> struct EmptyDeallocator
 {
        /** Deallocation function operator. */
-       void operator()(T * ){};
+       void operator()(T * ){}
 };
 
 
@@ -116,7 +116,7 @@
 
 /** Char buffer deleter. */
 struct char_buffer_delete
-       {void operator() (char* p) {assert (p); delete [] p;};};
+       {void operator() (char* p) {assert (p); delete [] p;}};
 /** Char buffer alocator. */
 inline char* char_buffer_new (size_t l) {return new char [l];}
 
--- ./src/utils/types/basic_types.h~    2007-04-25 17:16:08.000000000 +0000
+++ ./src/utils/types/basic_types.h     2007-04-25 17:16:23.000000000 +0000
@@ -44,7 +44,7 @@
        template<typename T> operator T*() const { return 0; }
        template<typename C,typename T> operator T C::*() const { return 0; }
 private:
-       void operator&() const {}; // not defined  
+       void operator&() const {} // not defined  
 
 } NULLPTR = {};
 
--- ./src/utils/debug.h~        2007-04-25 17:08:09.000000000 +0000
+++ ./src/utils/debug.h 2007-04-25 17:08:20.981448590 +0000
@@ -91,7 +91,7 @@
        
 /** Helper class for STATIC_CHECK. */
 template<bool> struct CompileTimeChecker;
-template<> struct CompileTimeChecker<true> { CompileTimeChecker(...) {}; };
+template<> struct CompileTimeChecker<true> { CompileTimeChecker(...) {} };
 
 
 /**
--- ./src/utils/observer.h~     2007-04-25 17:09:30.000000000 +0000
+++ ./src/utils/observer.h      2007-04-25 17:09:43.291994457 +0000
@@ -202,7 +202,7 @@
        /** Virtual destructor.
         *
         */
-       virtual ~IChangeContext(){};
+       virtual ~IChangeContext(){}
 };
 
 /** Basic change context template class.
@@ -221,12 +221,12 @@
        /** Constructor with original value.
         * @param origVal Original value used for originalValue initialization.
         */
-       BasicChangeContext(boost::shared_ptr<T> origVal)throw() 
:originalValue(origVal){};
+       BasicChangeContext(boost::shared_ptr<T> origVal)throw() 
:originalValue(origVal){}
 
        /** Destructor.
         * Just to mark all destructors in subtypes as virtual.
         */
-       virtual ~BasicChangeContext()throw() {};
+       virtual ~BasicChangeContext()throw() {}
 
        /** Returns type of context.
         *
@@ -316,7 +316,7 @@
         *
         * Initializes scope field.
         */
-       ScopedChangeContext(boost::shared_ptr<S> s):scope(s){};
+       ScopedChangeContext(boost::shared_ptr<S> s):scope(s){}
 
        /** Returns scope.
         * @return Scope value wrapped by shared_ptr smart pointer.
@@ -411,7 +411,7 @@
        /**
         * Virtual destructor.
         */
-       virtual ~IObserver ()throw() {};
+       virtual ~IObserver ()throw() {}
 };
 
 namespace {
--- ./src/utils/objectstorage.h~        2007-04-25 17:09:51.000000000 +0000
+++ ./src/utils/objectstorage.h 2007-04-25 17:10:04.302736387 +0000
@@ -102,7 +102,7 @@
         /** Empty constructor.
          *
          */
-        ObjectStorage(){};
+        ObjectStorage(){}
 
         /** Clears mapping.
          *
@@ -111,7 +111,7 @@
         void clear()
         {
                 mapping.clear();
-        };
+        }
 
         /** Add/change mapping.
          * @param key Key of the mapping.
@@ -144,7 +144,7 @@
                 
                 // returns old value
                 return old;
-        };
+        }
 
         /** Finds value with the key.
          * @param key Key of the value.
@@ -162,7 +162,7 @@
                         return 0;
 
                 return iter->second;
-        };
+        }
 
         /** Checks of given key is in the storage.
          * @param key Key object.
@@ -200,7 +200,7 @@
                 mapping.erase(key);
                 
                 return old;
-        };
+        }
 
         /** Number of elements.
          *
--- ./src/utils/rulesmanager.h~ 2007-04-25 17:19:29.000000000 +0000
+++ ./src/utils/rulesmanager.h  2007-04-25 17:19:49.372065158 +0000
@@ -69,7 +69,7 @@
 
        /** Virtual destructor.
         */
-       virtual ~IRuleMatcher(){};
+       virtual ~IRuleMatcher(){}
        
        /** Checks whether prio2 is higher than prio1.
         * @param prio1 Priority.
@@ -187,14 +187,14 @@
        /** Empty constructor.
         * Initializes matcher to NULL.
         */
-       RulesManager():matcher(NULL){};
+       RulesManager():matcher(NULL){}
        
        /** Constructor.
         * @param m Implementation of rules matcher.
         *
         * Sets matcher field and creates empty mapping.
         */
-       RulesManager(const RuleMatcherType * m):matcher(m){};
+       RulesManager(const RuleMatcherType * m):matcher(m){}
 
        /** Constructor with initial mapping.
         * @param m Implementation of rules matcher.
@@ -202,12 +202,12 @@
         *
         * Sets matcher field and initializes mapping with given storage.
         */
-       RulesManager(const RuleMatcherType * m, RuleStorage 
map):mapping(map.begin(), map.end()), matcher(m){};
+       RulesManager(const RuleMatcherType * m, RuleStorage 
map):mapping(map.begin(), map.end()), matcher(m){}
 
        /** Virtual destructor.
         * This method is empty, because no special treatment is required.
         */
-       virtual ~RulesManager(){};
+       virtual ~RulesManager(){}
        
        /** Sets new rule matcher implementation.
         * @param newMatcher New matcher implementation.
--- ./src/utils/confparser.h~   2007-04-25 17:17:20.000000000 +0000
+++ ./src/utils/confparser.h    2007-04-25 17:17:23.886715377 +0000
@@ -214,7 +214,7 @@
                delimiterSet=":";
                commentsSet="%#";
                blankSet=" \t";
-       };
+       }
 
        /** Sets new commentsSet.
         * @param set Set of characters.

-- 
Martin Michlmayr
http://www.cyrius.com/


--- End Message ---
--- Begin Message ---
Source: pdfedit
Source-Version: 0.3.0-2

We believe that the bug you reported is fixed in the latest version of
pdfedit, which is due to be installed in the Debian FTP archive:

pdfedit_0.3.0-2.diff.gz
  to pool/main/p/pdfedit/pdfedit_0.3.0-2.diff.gz
pdfedit_0.3.0-2.dsc
  to pool/main/p/pdfedit/pdfedit_0.3.0-2.dsc
pdfedit_0.3.0-2_i386.deb
  to pool/main/p/pdfedit/pdfedit_0.3.0-2_i386.deb



A summary of the changes between this version and the previous one is
attached.

Thank you for reporting the bug, which will now be closed.  If you
have further comments please address them to [EMAIL PROTECTED],
and the maintainer will reopen the bug report if appropriate.

Debian distribution maintenance software
pp.
Varun Hiremath <[EMAIL PROTECTED]> (supplier of updated pdfedit package)

(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing [EMAIL PROTECTED])


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Format: 1.7
Date: Thu, 26 Apr 2007 18:15:27 +0530
Source: pdfedit
Binary: pdfedit
Architecture: source i386
Version: 0.3.0-2
Distribution: unstable
Urgency: low
Maintainer: Varun Hiremath <[EMAIL PROTECTED]>
Changed-By: Varun Hiremath <[EMAIL PROTECTED]>
Description: 
 pdfedit    - Editor for manipulating PDF documents
Closes: 417471 420994
Changes: 
 pdfedit (0.3.0-2) unstable; urgency=low
 .
   [ Torsten Werner ]
   * Add Build-Depends: libpaper-dev.
   * Add patch for g++-4.3. (Closes: #417471)
 .
   [ Varun Hiremath ]
   * Add patch to fix FTBFS with GCC 4.3: error: extra ';' (Closes: #420994).
     Thanks to Martin Michlmayr.
Files: 
 510d7797b79de6e9f17f3e7da79e082b 746 utils optional pdfedit_0.3.0-2.dsc
 987d4c166350f7ca508497e01ef25bd6 7231 utils optional pdfedit_0.3.0-2.diff.gz
 085b682d137359b8e185f246ce229519 2892756 utils optional 
pdfedit_0.3.0-2_i386.deb

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)

iD8DBQFGPJ5MfY3dicTPjsMRAlkbAJ9Bk4wG1wwpu6RhxZvKJ30MODBXfwCglHhn
bhW8hp7mu552bc2TpyGvrgs=
=UP/k
-----END PGP SIGNATURE-----


--- End Message ---

Reply via email to