These people have contributed to GNU Libtool.  Some have reported problems,
others have contributed improvements to the documentation and actual code.
The particular contributions are described in the version control logs and
ChangeLog files.  If your name has been left out, if you'd rather not be
listed, or if you'd prefer a different address be used, please send a
note to the bug-report mailing list (as seen at end of e.g., libtool --help).
##
## There is no need to list here any name that appears as an Author in
## "git log" output.  Those are automatically added when this template
## is used to generate the THANKS file. You will still need to add
## contributors who are not a git log Author - e.g. bug reporters.
##
## Folks already promoted to AUTHORS:
##
!Alexandre Oliva
!Bob Friesenhahn
!Charles Wilson
!Gary V. Vaughan
!Gordon Matzigkeit
!Ossama Othman
!Peter O'Gorman
!Ralf Wildenhues
!Robert Boehne
!Scott James Remnant
!Thomas Tanner
##
## Remove duplicates under alternate names, and add preferred email
## addresses from contributors that don't match git log output here:
##
Akim Demaille			akim@epita.fr
!Albert Chin
Albert Chin-A-Young		china@thewrittenword.com
Alexander Hass			alexander.hass@sap.com
Andreas Schwab			schwab@suse.de
Brian Barrett			brbarret@osl.iu.edu
!Brian W. Barret
Bruno Haible			haible@ilog.fr
Dalibor Topic			robilad@kaffe.org
David Edelsohn			edelsohn@gnu.org
DJ Delorie			dj@delorie.com
Ed Maste			emaste@freebsd.org
Erez Zadok			ezk@cs.columbia.edu
Eric Blake			ebb9@byu.net
H.J. Lu				hjl@gnu.org
Ian Lance Taylor		iant@google.com
Jeff Squyres			jsquyres@cisco.com
John David Anglin		dave.anglin@nrc.ca
Juergen Reuter			reuter@theoc01.desy.de
Karl Berry			karl@gnu.org
Maciej W. Rozycki		macro@linux-mips.org
Manfred Weichel			weichel@global.nacamar.de
Michael Pratt			mcpratt@pm.me
Mike Gorchak			mike@malva.ua
Mo DeJong			mdejong@redhat.com
Nick Hudson			skrll@netbsd.org
Olly Betts			olly@muscat.co.uk
Paul Eggert			eggert@cs.ucla.edu
Pavel Roskin			proskin@gnu.org
Peter Ekberg			peda@lysator.liu.se
Rainer Orth			ro@TechFak.Uni-Bielefeld.de
Robert Millan			robertmh@gnu.org
Samuel Thibault			samuel.thibault@gnu.org
Simon Josefsson			jas@extundo.com
Steve Ellcey			sellcey@mips.com
Todd Vierling			tv@netbsd.org
Vincent Torri			vtorri@univ-evry.fr
##
## Add bug reporters, patch Authors you forgot to attribute at commit
## time with 'git commit --author=...' and other non-patch contributors
## below:
##
Alex				lx_op@orcon.net.nz
Allan McRae			allan@archlinux.org
Andreas Schiffler		aschiffler@ferzkopp.net
Andreas Stieger		Andreas.Stieger@gmx.de
Anton Shterenlikht		shterenlikht@par-tec.com
Brent Leback			brent.leback@st.com
Camilo La Rota			camilo.larota@ens-lyon.fr
Carl D. Roth			roth@cse.ucsc.edu
Carlo Cabrera			carlo.antonio.cabrera@gmail.com
Chris P. Ross			cross@eng.us.uu.net
Christian Rössel		christian.roessel@gmx.de
Christopher Hulbert		cchgroupmail@gmail.com
Craig Tierney			Craig.Tierney@noaa.gov
Dan McMahill			mcmahill@mtl.mit.edu
Daniel Richard G.		skunk@iSKUNK.ORG
Dave Allured			dave.allured@noaa.gov
Dave Yost			Dave@Yost.com
Dimitri Papadopoulos		dpo@sfr.fr
Donn Washburn			n5xwb@comcast.net
Erik van Pienbroek		erik-gnu@vanpienbroek.nl
Ethan Mallove			ethan.mallove@sun.com
Fred Cox			sailorfred@yahoo.com
Frediano Ziglio		freddy77@gmail.com
FX Coudert			fxcoudert@gcc.gnu.org
Hiroyuki Sato			hiroysato@gmail.com
Jakub Bogusz			qboosh@pld-linux.org
James Su			james.su@gmail.com
Jay Krell			jay.krell@cornell.edu
Jeremy C. Reed			reed@reedmedia.net
Jim Meyering			jim@meyering.net
Joakim Tjernlund		joakim.tjernlund@transmode.se
Joel N. Weber II		devnull@gnu.org
Joerg Sonnenberger		joerg@netbsd.org
John R. Cary			cary@txcorp.com
John Wolfe			jlw@sco.com
Joseph Beckenbach III		jrb3@best.com
Kenneth Albanowski		kjahds@kjahds.com
Khem Raj			raj.khem@gmail.com
Kirill Makurin			maiddaisuki@outlook.com
Kurt D. Zeilenga		Kurt@OpenLDAP.Org
Lawrence Velázquez		larryv@macports.org
Lionel Landwerlin		llandwerlin@gmail.com
Maciej Helminiak		dion2@wp.pl
Mahesh Narayanamurthi		mahesh.mach@gmail.com
Marc Glisse			marc.glisse@inria.fr
Marcel Loose			loose@astron.nl
Markus Duft			markus.duft@salomon.at
Martin Doucha			doucha@integri.cz
Matthijs Kooijman		matthijs@stdin.nl
Micheal E. Faenza		mfaenza@mitre.org
Mike Miller			mtmiller@ieee.org
Misty De Meo			misty@brew.sh
Nick Bowler			nbowler@draconx.ca
Nix				nix@esperi.org.uk
Olaf Lenz			olenz@fias.uni-frankfurt.de
Ozkan Sezer			sezeroz@gmail.com
Patrice Fromy			patrice.fromy@u-psud.fr
Paul Biggar			paul.biggar@gmail.com
Paul Laight			plaight@quantxautomation.co.uk
Paul Seidler			sepek@lavabit.com
Pavel Raiskup			praiskup@redhat.com
Paweł Daniluk			pawel@bioexploratorium.pl
Peter Fritzsche			peter.fritzsche@gmx.de
Peter Jeremy			peterjeremy@optushome.com.au
Peter Johansson			trojkan@gmail.com
Peter Kjellerstedt		peter.kjellerstedt@axis.com
Pádraig Brady			P@draigBrady.com
Richard B. Kreckel		kreckel@ginac.de
Richard Purdie			rpurdie@rpsys.net
Richard W.M. Jones		rjones@redhat.com
Rico Tzschichholz		ricotz@ubuntu.com
Robert Garron			Robert.Garron@Access3000.net
Robert Ögren			lists@roboros.com
Robert Yang			liezhi.yang@windriver.com
Roberto Bagnara			bagnara@cs.unipr.it
Roland Mainz			roland.mainz@nrubsig.org
Rudolf Leitgeb			r.leitgeb@x-pin.com
Ryan Hill			dirtyepic@gentoo.org
Sebastian Wilhelmi		wilhelmi@ira.uka.de
Simon Sobisch
Sven Verdoolaege		skimo@liacs.nl
Terry D. Dontje			Terry.Dontje@Sun.COM
Tobias Stoeckmann		tobias@stoeckmann.org
Tom Tromey			tromey@cygnus.com
Ulrich Drepper			drepper@ipd.info.uni-karlsruhe.de
Václav Zeman			vhaisman@gmail.com
Warren Dodge			warren.l.dodge@Tektronix.com
Xavier Pianet			xavier@xingo.com
Xin Li				d@delphij.net
Юрий Андреевич Пухальский	pooh@cryptopro.ru
Дилян Палаузов			dilyan.palauzov@aegee.org
