Contributors to the Python Documentation
----------------------------------------

This section lists people who have contributed in some way to the Python
documentation.  It is probably not complete -- if you feel that you or
anyone else should be on this list, please let us know (send email to
docs@python.org), and we'll be glad to correct the problem.

.. acks::

   * Aahz
   * Michael Abbott
   * Steve Alexander
   * Jim Ahlstrom
   * Fred Allen
   * A. Amoroso
   * Pehr Anderson
   * Oliver Andrich
   * Heidi Annexstad
   * Jesús Cea Avión
   * Manuel Balsera
   * Daniel Barclay
   * Chris Barker
   * Don Bashford
   * Anthony Baxter
   * Alexander Belopolsky
   * Bennett Benson
   * Jonathan Black
   * Robin Boerdijk
   * Michal Bozon
   * Aaron Brancotti
   * Georg Brandl
   * Keith Briggs
   * Ian Bruntlett
   * Lee Busby
   * Lorenzo M. Catucci
   * Carl Cerecke
   * Mauro Cicognini
   * Gilles Civario
   * Mike Clarkson
   * Steve Clift
   * Dave Cole
   * Matthew Cowles
   * Jeremy Craven
   * Andrew Dalke
   * Ben Darnell
   * L. Peter Deutsch
   * Robert Donohue
   * Fred L. Drake, Jr.
   * Jacques Ducasse
   * Josip Dzolonga
   * Jeff Epler
   * Michael Ernst
   * Blame Andy Eskilsson
   * Carey Evans
   * Martijn Faassen
   * Carl Feynman
   * Dan Finnie
   * Hernán Martínez Foffani
   * Stefan Franke
   * Jim Fulton
   * Peter Funk
   * Lele Gaifax
   * Matthew Gallagher
   * Gabriel Genellina
   * Ben Gertzfield
   * Nadim Ghaznavi
   * Jonathan Giddy
   * Matt Giuca
   * Shelley Gooch
   * Nathaniel Gray
   * Grant Griffin
   * Thomas Guettler
   * Anders Hammarquist
   * Mark Hammond
   * Harald Hanche-Olsen
   * Manus Hand
   * Gerhard Häring
   * Travis B. Hartwell
   * Tim Hatch
   * Janko Hauser
   * Thomas Heller
   * Bernhard Herzog
   * Magnus L. Hetland
   * Konrad Hinsen
   * Stefan Hoffmeister
   * Albert Hofkamp
   * Gregor Hoffleit
   * Steve Holden
   * Thomas Holenstein
   * Gerrit Holl
   * Rob Hooft
   * Brian Hooper
   * Randall Hopper
   * Michael Hudson
   * Eric Huss
   * Jeremy Hylton
   * Roger Irwin
   * Jack Jansen
   * Philip H. Jensen
   * Pedro Diaz Jimenez
   * Kent Johnson
   * Lucas de Jonge
   * Andreas Jung
   * Robert Kern
   * Jim Kerr
   * Jan Kim
   * Greg Kochanski
   * Guido Kollerie
   * Peter A. Koren
   * Daniel Kozan
   * Andrew M. Kuchling
   * Dave Kuhlman
   * Erno Kuusela
   * Ross Lagerwall
   * Thomas Lamb
   * Detlef Lannert
   * Piers Lauder
   * Glyph Lefkowitz
   * Robert Lehmann
   * Marc-André Lemburg
   * Ross Light
   * Gediminas Liktaras
   * Ulf A. Lindgren
   * Everett Lipman
   * Mirko Liss
   * Martin von Löwis
   * Fredrik Lundh
   * Jeff MacDonald
   * John Machin
   * Andrew MacIntyre
   * Vladimir Marangozov
   * Vincent Marchetti
   * Westley Martínez
   * Laura Matson
   * Daniel May
   * Rebecca McCreary
   * Doug Mennella
   * Paolo Milani
   * Skip Montanaro
   * Paul Moore
   * Ross Moore
   * Sjoerd Mullender
   * Dale Nagata
   * Michal Nowikowski 
   * Ng Pheng Siong
   * Koray Oner
   * Tomas Oppelstrup
   * Denis S. Otkidach
   * Zooko O'Whielacronx
   * Shriphani Palakodety
   * William Park
   * Joonas Paalasmaa
   * Harri Pasanen
   * Bo Peng
   * Tim Peters
   * Benjamin Peterson
   * Christopher Petrilli
   * Justin D. Pettit
   * Chris Phoenix
   * François Pinard
   * Paul Prescod
   * Eric S. Raymond
   * Edward K. Ream
   * Terry J. Reedy
   * Sean Reifschneider
   * Bernhard Reiter
   * Armin Rigo
   * Wes Rishel
   * Armin Ronacher
   * Jim Roskind
   * Guido van Rossum
   * Donald Wallace Rouse II
   * Mark Russell
   * Nick Russo
   * Chris Ryland
   * Constantina S.
   * Hugh Sasse
   * Bob Savage
   * Scott Schram
   * Neil Schemenauer
   * Barry Scott
   * Joakim Sernbrant
   * Justin Sheehy
   * Charlie Shepherd
   * SilentGhost
   * Michael Simcich
   * Ionel Simionescu
   * Michael Sloan
   * Gregory P. Smith
   * Roy Smith
   * Clay Spence
   * Nicholas Spies
   * Tage Stabell-Kulo
   * Frank Stajano
   * Anthony Starks
   * Greg Stein
   * Peter Stoehr
   * Mark Summerfield
   * Reuben Sumner
   * Kalle Svensson
   * Jim Tittsler
   * David Turner
   * Ville Vainio
   * Nadeem Vawda
   * Martijn Vries
   * Charles G. Waldman
   * Greg Ward
   * Barry Warsaw
   * Corran Webster
   * Glyn Webster
   * Bob Weiner
   * Eddy Welbourne
   * Jeff Wheeler
   * Mats Wichmann
   * Gerry Wiener
   * Timothy Wild
   * Paul Winkler
   * Collin Winter
   * Blake Winton
   * Dan Wolfe
   * Steven Work
   * Thomas Wouters
   * Ka-Ping Yee
   * Rory Yorke
   * Moshe Zadka
   * Milan Zamazal
   * Cheng Zhang
   * Trent Nelson
   * Michael Foord
