diff --git a/Lib/tabnanny.py b/Lib/tabnanny.py
index 8d3eab5..ea4fbc6 100755
--- a/Lib/tabnanny.py
+++ b/Lib/tabnanny.py
@@ -248,125 +248,124 @@
 # in use.
 
 if hasattr(tokenize, 'NL'):
- # take advantage of Guido's patch!
+    # take advantage of Guido's patch!
 
- indents = []
- check_equal = 0
+    indents = []
+    check_equal = 0
 
- def reset_globals():
-     global indents, check_equal
-     check_equal = 0
-     indents = [Whitespace("")]
+    def reset_globals():
+        global indents, check_equal
+        check_equal = 0
+        indents = [Whitespace("")]
 
- def tokeneater(type, token, start, end, line,
-                INDENT=tokenize.INDENT,
-                DEDENT=tokenize.DEDENT,
-                NEWLINE=tokenize.NEWLINE,
-                JUNK=(tokenize.COMMENT, tokenize.NL) ):
-     global indents, check_equal
+    def tokeneater(type, token, start, end, line,
+                   INDENT=tokenize.INDENT,
+                   DEDENT=tokenize.DEDENT,
+                   NEWLINE=tokenize.NEWLINE,
+                   JUNK=(tokenize.COMMENT, tokenize.NL) ):
+        global indents, check_equal
 
-     if type == NEWLINE:
-         # a program statement, or ENDMARKER, will eventually follow,
-         # after some (possibly empty) run of tokens of the form
-         #     (NL | COMMENT)* (INDENT | DEDENT+)?
-         # If an INDENT appears, setting check_equal is wrong, and will
-         # be undone when we see the INDENT.
-         check_equal = 1
+        if type == NEWLINE:
+            # a program statement, or ENDMARKER, will eventually follow,
+            # after some (possibly empty) run of tokens of the form
+            #     (NL | COMMENT)* (INDENT | DEDENT+)?
+            # If an INDENT appears, setting check_equal is wrong, and will
+            # be undone when we see the INDENT.
+            check_equal = 1
 
-     elif type == INDENT:
-         check_equal = 0
-         thisguy = Whitespace(token)
-         if not indents[-1].less(thisguy):
-             witness = indents[-1].not_less_witness(thisguy)
-             msg = "indent not greater e.g. " + format_witnesses(witness)
-             raise NannyNag(start[0], msg, line)
-         indents.append(thisguy)
+        elif type == INDENT:
+            check_equal = 0
+            thisguy = Whitespace(token)
+            if not indents[-1].less(thisguy):
+                witness = indents[-1].not_less_witness(thisguy)
+                msg = "indent not greater e.g. " + format_witnesses(witness)
+                raise NannyNag(start[0], msg, line)
+            indents.append(thisguy)
 
-     elif type == DEDENT:
-         # there's nothing we need to check here!  what's important is
-         # that when the run of DEDENTs ends, the indentation of the
-         # program statement (or ENDMARKER) that triggered the run is
-         # equal to what's left at the top of the indents stack
+        elif type == DEDENT:
+            # there's nothing we need to check here!  what's important is
+            # that when the run of DEDENTs ends, the indentation of the
+            # program statement (or ENDMARKER) that triggered the run is
+            # equal to what's left at the top of the indents stack
 
-         # Ouch!  This assert triggers if the last line of the source
-         # is indented *and* lacks a newline -- then DEDENTs pop out
-         # of thin air.
-         # assert check_equal  # else no earlier NEWLINE, or an earlier INDENT
-         check_equal = 1
+            # Ouch!  This assert triggers if the last line of the source
+            # is indented *and* lacks a newline -- then DEDENTs pop out
+            # of thin air.
+            # assert check_equal  # else no earlier NEWLINE, or an earlier INDENT
+            check_equal = 1
 
-         del indents[-1]
+            del indents[-1]
 
-     elif check_equal and type not in JUNK:
-         # this is the first "real token" following a NEWLINE, so it
-         # must be the first token of the next program statement, or an
-         # ENDMARKER; the "line" argument exposes the leading whitespace
-         # for this statement; in the case of ENDMARKER, line is an empty
-         # string, so will properly match the empty string with which the
-         # "indents" stack was seeded
-         check_equal = 0
-         thisguy = Whitespace(line)
-         if not indents[-1].equal(thisguy):
-             witness = indents[-1].not_equal_witness(thisguy)
-             msg = "indent not equal e.g. " + format_witnesses(witness)
-             raise NannyNag(start[0], msg, line)
+        elif check_equal and type not in JUNK:
+            # this is the first "real token" following a NEWLINE, so it
+            # must be the first token of the next program statement, or an
+            # ENDMARKER; the "line" argument exposes the leading whitespace
+            # for this statement; in the case of ENDMARKER, line is an empty
+            # string, so will properly match the empty string with which the
+            # "indents" stack was seeded
+            check_equal = 0
+            thisguy = Whitespace(line)
+            if not indents[-1].equal(thisguy):
+                witness = indents[-1].not_equal_witness(thisguy)
+                msg = "indent not equal e.g. " + format_witnesses(witness)
+                raise NannyNag(start[0], msg, line)
 
 else:
- # unpatched version of tokenize
+    # unpatched version of tokenize
 
- nesting_level = 0
- indents = []
- check_equal = 0
+    nesting_level = 0
+    indents = []
+    check_equal = 0
 
- def reset_globals():
-     global nesting_level, indents, check_equal
-     nesting_level = check_equal = 0
-     indents = [Whitespace("")]
+    def reset_globals():
+        global nesting_level, indents, check_equal
+        nesting_level = check_equal = 0
+        indents = [Whitespace("")]
 
- def tokeneater(type, token, start, end, line,
-                INDENT=tokenize.INDENT,
-                DEDENT=tokenize.DEDENT,
-                NEWLINE=tokenize.NEWLINE,
-                COMMENT=tokenize.COMMENT,
-                OP=tokenize.OP):
-     global nesting_level, indents, check_equal
+    def tokeneater(type, token, start, end, line,
+                   INDENT=tokenize.INDENT,
+                   DEDENT=tokenize.DEDENT,
+                   NEWLINE=tokenize.NEWLINE,
+                   COMMENT=tokenize.COMMENT,
+                   OP=tokenize.OP):
+        global nesting_level, indents, check_equal
 
-     if type == INDENT:
-         check_equal = 0
-         thisguy = Whitespace(token)
-         if not indents[-1].less(thisguy):
-             witness = indents[-1].not_less_witness(thisguy)
-             msg = "indent not greater e.g. " + format_witnesses(witness)
-             raise NannyNag(start[0], msg, line)
-         indents.append(thisguy)
+        if type == INDENT:
+            check_equal = 0
+            thisguy = Whitespace(token)
+            if not indents[-1].less(thisguy):
+                witness = indents[-1].not_less_witness(thisguy)
+                msg = "indent not greater e.g. " + format_witnesses(witness)
+                raise NannyNag(start[0], msg, line)
+            indents.append(thisguy)
 
-     elif type == DEDENT:
-         del indents[-1]
+        elif type == DEDENT:
+            del indents[-1]
 
-     elif type == NEWLINE:
-         if nesting_level == 0:
-             check_equal = 1
+        elif type == NEWLINE:
+            if nesting_level == 0:
+                check_equal = 1
 
-     elif type == COMMENT:
-         pass
+        elif type == COMMENT:
+            pass
 
-     elif check_equal:
-         check_equal = 0
-         thisguy = Whitespace(line)
-         if not indents[-1].equal(thisguy):
-             witness = indents[-1].not_equal_witness(thisguy)
-             msg = "indent not equal e.g. " + format_witnesses(witness)
-             raise NannyNag(start[0], msg, line)
+        elif check_equal:
+            check_equal = 0
+            thisguy = Whitespace(line)
+            if not indents[-1].equal(thisguy):
+                witness = indents[-1].not_equal_witness(thisguy)
+                msg = "indent not equal e.g. " + format_witnesses(witness)
+                raise NannyNag(start[0], msg, line)
 
-     if type == OP and token in ('{', '[', '('):
-         nesting_level = nesting_level + 1
+        if type == OP and token in ('{', '[', '('):
+            nesting_level = nesting_level + 1
 
-     elif type == OP and token in ('}', ']', ')'):
-         if nesting_level == 0:
-             raise NannyNag(start[0],
-                            "unbalanced bracket '" + token + "'",
-                            line)
-         nesting_level = nesting_level - 1
+        elif type == OP and token in ('}', ']', ')'):
+            if nesting_level == 0:
+                raise NannyNag(start[0],
+                               "unbalanced bracket '" + token + "'",
+                               line)
+            nesting_level = nesting_level - 1
 
 if __name__ == '__main__':
     main()
-
diff --git a/Lib/telnetlib.py b/Lib/telnetlib.py
index dfd549e..d2d0b9b 100644
--- a/Lib/telnetlib.py
+++ b/Lib/telnetlib.py
@@ -11,7 +11,7 @@
 >>> print tn.read_all()
 Login       Name               TTY         Idle    When    Where
 guido    Guido van Rossum      pts/2        <Dec  2 11:10> snag.cnri.reston..
- 
+
 >>>
 
 Note that read_all() won't read until eof -- it just reads some data
@@ -250,7 +250,7 @@
 
     def read_very_eager(self):
         """Read everything that's possible without blocking in I/O (eager).
-        
+
         Raise EOFError if connection closed and no cooked data
         available.  Return '' if no cooked data available otherwise.
         Don't block unless in the midst of an IAC sequence.
@@ -278,7 +278,7 @@
 
     def read_lazy(self):
         """Process and return data that's already in the queues (lazy).
-        
+
         Raise EOFError if connection closed and no data available.
         Return '' if no cooked data available otherwise.  Don't block
         unless in the midst of an IAC sequence.
diff --git a/Lib/tempfile.py b/Lib/tempfile.py
index 8ac707d..a503e7f 100644
--- a/Lib/tempfile.py
+++ b/Lib/tempfile.py
@@ -26,10 +26,10 @@
     elif os.name == 'mac':
         import macfs, MACFS
         try:
-             refnum, dirid = macfs.FindFolder(MACFS.kOnSystemDisk,
-                                              MACFS.kTemporaryFolderType, 1)
-             dirname = macfs.FSSpec((refnum, dirid, '')).as_pathname()
-             attempdirs.insert(0, dirname)
+            refnum, dirid = macfs.FindFolder(MACFS.kOnSystemDisk,
+                                             MACFS.kTemporaryFolderType, 1)
+            dirname = macfs.FSSpec((refnum, dirid, '')).as_pathname()
+            attempdirs.insert(0, dirname)
         except macfs.error:
             pass
     for envname in 'TMPDIR', 'TEMP', 'TMP':
@@ -38,27 +38,27 @@
     testfile = gettempprefix() + 'test'
     for dir in attempdirs:
         try:
-           filename = os.path.join(dir, testfile)
-           if os.name == 'posix':
-               try:
-                   fd = os.open(filename, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700)
-               except OSError:
-                   pass
-               else:
-                   fp = os.fdopen(fd, 'w')
-                   fp.write('blat')
-                   fp.close()
-                   os.unlink(filename)
-                   del fp, fd
-                   tempdir = dir
-                   break
-           else:
-               fp = open(filename, 'w')
-               fp.write('blat')
-               fp.close()
-               os.unlink(filename)
-               tempdir = dir
-               break
+            filename = os.path.join(dir, testfile)
+            if os.name == 'posix':
+                try:
+                    fd = os.open(filename, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700)
+                except OSError:
+                    pass
+                else:
+                    fp = os.fdopen(fd, 'w')
+                    fp.write('blat')
+                    fp.close()
+                    os.unlink(filename)
+                    del fp, fd
+                    tempdir = dir
+                    break
+            else:
+                fp = open(filename, 'w')
+                fp.write('blat')
+                fp.close()
+                os.unlink(filename)
+                tempdir = dir
+                break
         except IOError:
             pass
     if tempdir is None:
diff --git a/Lib/threading.py b/Lib/threading.py
index fbc1f5c..e484521 100644
--- a/Lib/threading.py
+++ b/Lib/threading.py
@@ -65,7 +65,7 @@
     return apply(_RLock, args, kwargs)
 
 class _RLock(_Verbose):
-    
+
     def __init__(self, verbose=None):
         _Verbose.__init__(self, verbose)
         self.__block = _allocate_lock()
@@ -440,7 +440,7 @@
     def isAlive(self):
         assert self.__initialized, "Thread.__init__() not called"
         return self.__started and not self.__stopped
-    
+
     def isDaemon(self):
         assert self.__initialized, "Thread.__init__() not called"
         return self.__daemonic
@@ -496,7 +496,7 @@
 # when we exit (conform previous semantics).
 
 class _DummyThread(Thread):
-    
+
     def __init__(self):
         Thread.__init__(self, name=_newname("Dummy-%d"))
         self._Thread__started = 1
diff --git a/Lib/toaiff.py b/Lib/toaiff.py
index 25be46f..96d4642 100644
--- a/Lib/toaiff.py
+++ b/Lib/toaiff.py
@@ -54,51 +54,51 @@
 
 
 class error(Exception):
-        pass
+    pass
 
 def toaiff(filename):
-	temps = []
-	ret = None
-	try:
-		ret = _toaiff(filename, temps)
-	finally:
-		for temp in temps[:]:
-			if temp != ret:
-				try:
-					os.unlink(temp)
-				except os.error:
-					pass
-				temps.remove(temp)
-	return ret
+    temps = []
+    ret = None
+    try:
+        ret = _toaiff(filename, temps)
+    finally:
+        for temp in temps[:]:
+            if temp != ret:
+                try:
+                    os.unlink(temp)
+                except os.error:
+                    pass
+                temps.remove(temp)
+    return ret
 
 def _toaiff(filename, temps):
-	if filename[-2:] == '.Z':
-		fname = tempfile.mktemp()
-		temps.append(fname)
-		sts = uncompress.copy(filename, fname)
-		if sts:
-			raise error, filename + ': uncompress failed'
-	else:
-		fname = filename
-	try:
-		ftype = sndhdr.whathdr(fname)
-		if ftype:
-			ftype = ftype[0] # All we're interested in
-	except IOError:
-		if type(msg) == type(()) and len(msg) == 2 and \
-			type(msg[0]) == type(0) and type(msg[1]) == type(''):
-			msg = msg[1]
-		if type(msg) != type(''):
-			msg = `msg`
-		raise error, filename + ': ' + msg
-	if ftype == 'aiff':
-		return fname
-	if ftype is None or not table.has_key(ftype):
-		raise error, \
-			filename + ': unsupported audio file type ' + `ftype`
-	temp = tempfile.mktemp()
-	temps.append(temp)
-	sts = table[ftype].copy(fname, temp)
-	if sts:
-		raise error, filename + ': conversion to aiff failed'
-	return temp
+    if filename[-2:] == '.Z':
+        fname = tempfile.mktemp()
+        temps.append(fname)
+        sts = uncompress.copy(filename, fname)
+        if sts:
+            raise error, filename + ': uncompress failed'
+    else:
+        fname = filename
+    try:
+        ftype = sndhdr.whathdr(fname)
+        if ftype:
+            ftype = ftype[0] # All we're interested in
+    except IOError:
+        if type(msg) == type(()) and len(msg) == 2 and \
+                type(msg[0]) == type(0) and type(msg[1]) == type(''):
+            msg = msg[1]
+        if type(msg) != type(''):
+            msg = `msg`
+        raise error, filename + ': ' + msg
+    if ftype == 'aiff':
+        return fname
+    if ftype is None or not table.has_key(ftype):
+        raise error, \
+                filename + ': unsupported audio file type ' + `ftype`
+    temp = tempfile.mktemp()
+    temps.append(temp)
+    sts = table[ftype].copy(fname, temp)
+    if sts:
+        raise error, filename + ': conversion to aiff failed'
+    return temp
diff --git a/Lib/tokenize.py b/Lib/tokenize.py
index f2ba0a2..d205159 100644
--- a/Lib/tokenize.py
+++ b/Lib/tokenize.py
@@ -215,4 +215,3 @@
     import sys
     if len(sys.argv) > 1: tokenize(open(sys.argv[1]).readline)
     else: tokenize(sys.stdin.readline)
-
diff --git a/Lib/traceback.py b/Lib/traceback.py
index 064712e..7097b8f 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -6,273 +6,273 @@
 import types
 
 def _print(file, str='', terminator='\n'):
-	file.write(str+terminator)
+    file.write(str+terminator)
 
 
 def print_list(extracted_list, file=None):
-	"""Print the list of tuples as returned by extract_tb() or
-	extract_stack() as a formatted stack trace to the given file."""
-	if not file:
-		file = sys.stderr
-	for filename, lineno, name, line in extracted_list:
-		_print(file,
-		       '  File "%s", line %d, in %s' % (filename,lineno,name))
-		if line:
-			_print(file, '    %s' % string.strip(line))
+    """Print the list of tuples as returned by extract_tb() or
+    extract_stack() as a formatted stack trace to the given file."""
+    if not file:
+        file = sys.stderr
+    for filename, lineno, name, line in extracted_list:
+        _print(file,
+               '  File "%s", line %d, in %s' % (filename,lineno,name))
+        if line:
+            _print(file, '    %s' % string.strip(line))
 
 def format_list(extracted_list):
-	"""Given a list of tuples as returned by extract_tb() or
-	extract_stack(), return a list of strings ready for printing.
-	Each string in the resulting list corresponds to the item with
-	the same index in the argument list.  Each string ends in a
-	newline; the strings may contain internal newlines as well, for
-	those items whose source text line is not None."""
-	list = []
-	for filename, lineno, name, line in extracted_list:
-		item = '  File "%s", line %d, in %s\n' % (filename,lineno,name)
-		if line:
-			item = item + '    %s\n' % string.strip(line)
-		list.append(item)
-	return list
-	
+    """Given a list of tuples as returned by extract_tb() or
+    extract_stack(), return a list of strings ready for printing.
+    Each string in the resulting list corresponds to the item with
+    the same index in the argument list.  Each string ends in a
+    newline; the strings may contain internal newlines as well, for
+    those items whose source text line is not None."""
+    list = []
+    for filename, lineno, name, line in extracted_list:
+        item = '  File "%s", line %d, in %s\n' % (filename,lineno,name)
+        if line:
+            item = item + '    %s\n' % string.strip(line)
+        list.append(item)
+    return list
+
 
 def print_tb(tb, limit=None, file=None):
-	"""Print up to 'limit' stack trace entries from the traceback 'tb'.
-	If 'limit' is omitted or None, all entries are printed.  If 'file' is
-	omitted or None, the output goes to sys.stderr; otherwise 'file'
-	should be an open file or file-like object with a write() method."""
-	if not file:
-		file = sys.stderr
-	if limit is None:
-		if hasattr(sys, 'tracebacklimit'):
-			limit = sys.tracebacklimit
-	n = 0
-	while tb is not None and (limit is None or n < limit):
-		f = tb.tb_frame
-		lineno = tb_lineno(tb)
-		co = f.f_code
-		filename = co.co_filename
-		name = co.co_name
-		_print(file,
-		       '  File "%s", line %d, in %s' % (filename,lineno,name))
-		line = linecache.getline(filename, lineno)
-		if line: _print(file, '    ' + string.strip(line))
-		tb = tb.tb_next
-		n = n+1
+    """Print up to 'limit' stack trace entries from the traceback 'tb'.
+    If 'limit' is omitted or None, all entries are printed.  If 'file' is
+    omitted or None, the output goes to sys.stderr; otherwise 'file'
+    should be an open file or file-like object with a write() method."""
+    if not file:
+        file = sys.stderr
+    if limit is None:
+        if hasattr(sys, 'tracebacklimit'):
+            limit = sys.tracebacklimit
+    n = 0
+    while tb is not None and (limit is None or n < limit):
+        f = tb.tb_frame
+        lineno = tb_lineno(tb)
+        co = f.f_code
+        filename = co.co_filename
+        name = co.co_name
+        _print(file,
+               '  File "%s", line %d, in %s' % (filename,lineno,name))
+        line = linecache.getline(filename, lineno)
+        if line: _print(file, '    ' + string.strip(line))
+        tb = tb.tb_next
+        n = n+1
 
 def format_tb(tb, limit = None):
-	"""A shorthand for 'format_list(extract_stack(f, limit))."""
-	return format_list(extract_tb(tb, limit))
+    """A shorthand for 'format_list(extract_stack(f, limit))."""
+    return format_list(extract_tb(tb, limit))
 
 def extract_tb(tb, limit = None):
-	"""Return a list of up to 'limit' pre-processed stack trace entries
-	extracted from the traceback object 'traceback'.  This is useful for
-	alternate formatting of stack traces.  If 'limit' is omitted or None,
-	all entries are extracted.  A pre-processed stack trace entry is a
-	quadruple (filename, line number, function name, text) representing
-	the information that is usually printed for a stack trace.  The text
-	is a string with leading and trailing whitespace stripped; if the
-	source is not available it is None."""
-	if limit is None:
-		if hasattr(sys, 'tracebacklimit'):
-			limit = sys.tracebacklimit
-	list = []
-	n = 0
-	while tb is not None and (limit is None or n < limit):
-		f = tb.tb_frame
-		lineno = tb_lineno(tb)
-		co = f.f_code
-		filename = co.co_filename
-		name = co.co_name
-		line = linecache.getline(filename, lineno)
-		if line: line = string.strip(line)
-		else: line = None
-		list.append((filename, lineno, name, line))
-		tb = tb.tb_next
-		n = n+1
-	return list
+    """Return a list of up to 'limit' pre-processed stack trace entries
+    extracted from the traceback object 'traceback'.  This is useful for
+    alternate formatting of stack traces.  If 'limit' is omitted or None,
+    all entries are extracted.  A pre-processed stack trace entry is a
+    quadruple (filename, line number, function name, text) representing
+    the information that is usually printed for a stack trace.  The text
+    is a string with leading and trailing whitespace stripped; if the
+    source is not available it is None."""
+    if limit is None:
+        if hasattr(sys, 'tracebacklimit'):
+            limit = sys.tracebacklimit
+    list = []
+    n = 0
+    while tb is not None and (limit is None or n < limit):
+        f = tb.tb_frame
+        lineno = tb_lineno(tb)
+        co = f.f_code
+        filename = co.co_filename
+        name = co.co_name
+        line = linecache.getline(filename, lineno)
+        if line: line = string.strip(line)
+        else: line = None
+        list.append((filename, lineno, name, line))
+        tb = tb.tb_next
+        n = n+1
+    return list
 
 
 def print_exception(etype, value, tb, limit=None, file=None):
-	"""Print exception information and up to 'limit' stack trace entries
-	from the traceback 'tb' to 'file'.  This differs from print_tb() in
-	the following ways: (1) if traceback is not None, it prints a header
-	"Traceback (most recent call last):"; (2) it prints the exception type and
-	value after the stack trace; (3) if type is SyntaxError and value has
-	the appropriate format, it prints the line where the syntax error
-	occurred with a caret on the next line indicating the approximate
-	position of the error."""
-	if not file:
-		file = sys.stderr
-	if tb:
-		_print(file, 'Traceback (most recent call last):')
-		print_tb(tb, limit, file)
-	lines = format_exception_only(etype, value)
-	for line in lines[:-1]:
-		_print(file, line, ' ')
-	_print(file, lines[-1], '')
+    """Print exception information and up to 'limit' stack trace entries
+    from the traceback 'tb' to 'file'.  This differs from print_tb() in
+    the following ways: (1) if traceback is not None, it prints a header
+    "Traceback (most recent call last):"; (2) it prints the exception type and
+    value after the stack trace; (3) if type is SyntaxError and value has
+    the appropriate format, it prints the line where the syntax error
+    occurred with a caret on the next line indicating the approximate
+    position of the error."""
+    if not file:
+        file = sys.stderr
+    if tb:
+        _print(file, 'Traceback (most recent call last):')
+        print_tb(tb, limit, file)
+    lines = format_exception_only(etype, value)
+    for line in lines[:-1]:
+        _print(file, line, ' ')
+    _print(file, lines[-1], '')
 
 def format_exception(etype, value, tb, limit = None):
-	"""Format a stack trace and the exception information.  The arguments
-	have the same meaning as the corresponding arguments to
-	print_exception().  The return value is a list of strings, each
-	ending in a newline and some containing internal newlines.  When 
-	these lines are concatenated and printed, exactly the same text is
-	printed as does print_exception()."""
-	if tb:
-		list = ['Traceback (most recent call last):\n']
-		list = list + format_tb(tb, limit)
-	else:
-		list = []
-	list = list + format_exception_only(etype, value)
-	return list
+    """Format a stack trace and the exception information.  The arguments
+    have the same meaning as the corresponding arguments to
+    print_exception().  The return value is a list of strings, each
+    ending in a newline and some containing internal newlines.  When
+    these lines are concatenated and printed, exactly the same text is
+    printed as does print_exception()."""
+    if tb:
+        list = ['Traceback (most recent call last):\n']
+        list = list + format_tb(tb, limit)
+    else:
+        list = []
+    list = list + format_exception_only(etype, value)
+    return list
 
 def format_exception_only(etype, value):
-	"""Format the exception part of a traceback.  The arguments are the
-	exception type and value such as given by sys.last_type and
-	sys.last_value. The return value is a list of strings, each ending
-	in a newline.  Normally, the list contains a single string;
-	however, for SyntaxError exceptions, it contains several lines that
-	(when printed) display detailed information about where the syntax
-	error occurred.  The message indicating which exception occurred is
-	the always last string in the list."""
-	list = []
-	if type(etype) == types.ClassType:
-		stype = etype.__name__
-	else:
-		stype = etype
-	if value is None:
-		list.append(str(stype) + '\n')
-	else:
-		if etype is SyntaxError:
-			try:
-				msg, (filename, lineno, offset, line) = value
-			except:
-				pass
-			else:
-				if not filename: filename = "<string>"
-				list.append('  File "%s", line %d\n' %
-					    (filename, lineno))
-				i = 0
-				while i < len(line) and \
-				      line[i] in string.whitespace:
-					i = i+1
-				list.append('    %s\n' % string.strip(line))
-				s = '    '
-				for c in line[i:offset-1]:
-					if c in string.whitespace:
-						s = s + c
-					else:
-						s = s + ' '
-				list.append('%s^\n' % s)
-				value = msg
-		s = _some_str(value)
-		if s:
-			list.append('%s: %s\n' % (str(stype), s))
-		else:
-			list.append('%s\n' % str(stype))
-	return list
+    """Format the exception part of a traceback.  The arguments are the
+    exception type and value such as given by sys.last_type and
+    sys.last_value. The return value is a list of strings, each ending
+    in a newline.  Normally, the list contains a single string;
+    however, for SyntaxError exceptions, it contains several lines that
+    (when printed) display detailed information about where the syntax
+    error occurred.  The message indicating which exception occurred is
+    the always last string in the list."""
+    list = []
+    if type(etype) == types.ClassType:
+        stype = etype.__name__
+    else:
+        stype = etype
+    if value is None:
+        list.append(str(stype) + '\n')
+    else:
+        if etype is SyntaxError:
+            try:
+                msg, (filename, lineno, offset, line) = value
+            except:
+                pass
+            else:
+                if not filename: filename = "<string>"
+                list.append('  File "%s", line %d\n' %
+                            (filename, lineno))
+                i = 0
+                while i < len(line) and \
+                      line[i] in string.whitespace:
+                    i = i+1
+                list.append('    %s\n' % string.strip(line))
+                s = '    '
+                for c in line[i:offset-1]:
+                    if c in string.whitespace:
+                        s = s + c
+                    else:
+                        s = s + ' '
+                list.append('%s^\n' % s)
+                value = msg
+        s = _some_str(value)
+        if s:
+            list.append('%s: %s\n' % (str(stype), s))
+        else:
+            list.append('%s\n' % str(stype))
+    return list
 
 def _some_str(value):
-	try:
-		return str(value)
-	except:
-		return '<unprintable %s object>' % type(value).__name__
+    try:
+        return str(value)
+    except:
+        return '<unprintable %s object>' % type(value).__name__
 
 
 def print_exc(limit=None, file=None):
-	"""This is a shorthand for 'print_exception(sys.exc_type,
-	sys.exc_value, sys.exc_traceback, limit, file)'.
-	(In fact, it uses sys.exc_info() to retrieve the same information
-	in a thread-safe way.)"""
-	if not file:
-		file = sys.stderr
-	try:
-	    etype, value, tb = sys.exc_info()
-	    print_exception(etype, value, tb, limit, file)
-	finally:
-	    etype = value = tb = None
+    """This is a shorthand for 'print_exception(sys.exc_type,
+    sys.exc_value, sys.exc_traceback, limit, file)'.
+    (In fact, it uses sys.exc_info() to retrieve the same information
+    in a thread-safe way.)"""
+    if not file:
+        file = sys.stderr
+    try:
+        etype, value, tb = sys.exc_info()
+        print_exception(etype, value, tb, limit, file)
+    finally:
+        etype = value = tb = None
 
 def print_last(limit=None, file=None):
-	"""This is a shorthand for 'print_exception(sys.last_type,
-	sys.last_value, sys.last_traceback, limit, file)'."""
-	if not file:
-		file = sys.stderr
-	print_exception(sys.last_type, sys.last_value, sys.last_traceback,
-			limit, file)
+    """This is a shorthand for 'print_exception(sys.last_type,
+    sys.last_value, sys.last_traceback, limit, file)'."""
+    if not file:
+        file = sys.stderr
+    print_exception(sys.last_type, sys.last_value, sys.last_traceback,
+                    limit, file)
 
 
 def print_stack(f=None, limit=None, file=None):
-	"""This function prints a stack trace from its invocation point.
-	The optional 'f' argument can be used to specify an alternate stack
-	frame at which to start. The optional 'limit' and 'file' arguments
-	have the same meaning as for print_exception()."""
-	if f is None:
-		try:
-			raise ZeroDivisionError
-		except ZeroDivisionError:
-			f = sys.exc_info()[2].tb_frame.f_back
-	print_list(extract_stack(f, limit), file)
+    """This function prints a stack trace from its invocation point.
+    The optional 'f' argument can be used to specify an alternate stack
+    frame at which to start. The optional 'limit' and 'file' arguments
+    have the same meaning as for print_exception()."""
+    if f is None:
+        try:
+            raise ZeroDivisionError
+        except ZeroDivisionError:
+            f = sys.exc_info()[2].tb_frame.f_back
+    print_list(extract_stack(f, limit), file)
 
 def format_stack(f=None, limit=None):
-	"""A shorthand for 'format_list(extract_stack(f, limit))'."""
-	if f is None:
-		try:
-			raise ZeroDivisionError
-		except ZeroDivisionError:
-			f = sys.exc_info()[2].tb_frame.f_back
-	return format_list(extract_stack(f, limit))
+    """A shorthand for 'format_list(extract_stack(f, limit))'."""
+    if f is None:
+        try:
+            raise ZeroDivisionError
+        except ZeroDivisionError:
+            f = sys.exc_info()[2].tb_frame.f_back
+    return format_list(extract_stack(f, limit))
 
 def extract_stack(f=None, limit = None):
-	"""Extract the raw traceback from the current stack frame.  The
-	return value has the same format as for extract_tb().  The optional
-	'f' and 'limit' arguments have the same meaning as for print_stack(). 
-	Each item in the list is a quadruple (filename, line number,
-	function name, text), and the entries are in order from oldest
-	to newest stack frame."""
-	if f is None:
-		try:
-			raise ZeroDivisionError
-		except ZeroDivisionError:
-			f = sys.exc_info()[2].tb_frame.f_back
-	if limit is None:
-		if hasattr(sys, 'tracebacklimit'):
-			limit = sys.tracebacklimit
-	list = []
-	n = 0
-	while f is not None and (limit is None or n < limit):
-		lineno = f.f_lineno	# XXX Too bad if -O is used
-		co = f.f_code
-		filename = co.co_filename
-		name = co.co_name
-		line = linecache.getline(filename, lineno)
-		if line: line = string.strip(line)
-		else: line = None
-		list.append((filename, lineno, name, line))
-		f = f.f_back
-		n = n+1
-	list.reverse()
-	return list
+    """Extract the raw traceback from the current stack frame.  The
+    return value has the same format as for extract_tb().  The optional
+    'f' and 'limit' arguments have the same meaning as for print_stack().
+    Each item in the list is a quadruple (filename, line number,
+    function name, text), and the entries are in order from oldest
+    to newest stack frame."""
+    if f is None:
+        try:
+            raise ZeroDivisionError
+        except ZeroDivisionError:
+            f = sys.exc_info()[2].tb_frame.f_back
+    if limit is None:
+        if hasattr(sys, 'tracebacklimit'):
+            limit = sys.tracebacklimit
+    list = []
+    n = 0
+    while f is not None and (limit is None or n < limit):
+        lineno = f.f_lineno     # XXX Too bad if -O is used
+        co = f.f_code
+        filename = co.co_filename
+        name = co.co_name
+        line = linecache.getline(filename, lineno)
+        if line: line = string.strip(line)
+        else: line = None
+        list.append((filename, lineno, name, line))
+        f = f.f_back
+        n = n+1
+    list.reverse()
+    return list
 
 def tb_lineno(tb):
-	"""Calculate the correct line number of the traceback given in tb
-	(even with -O on)."""
+    """Calculate the correct line number of the traceback given in tb
+    (even with -O on)."""
 
-	# Coded by Marc-Andre Lemburg from the example of PyCode_Addr2Line()
-	# in compile.c.
-	# Revised version by Jim Hugunin to work with JPython too.
+    # Coded by Marc-Andre Lemburg from the example of PyCode_Addr2Line()
+    # in compile.c.
+    # Revised version by Jim Hugunin to work with JPython too.
 
-	c = tb.tb_frame.f_code
-	if not hasattr(c, 'co_lnotab'):
-		return tb.tb_lineno
+    c = tb.tb_frame.f_code
+    if not hasattr(c, 'co_lnotab'):
+        return tb.tb_lineno
 
-	tab = c.co_lnotab
-	line = c.co_firstlineno
-	stopat = tb.tb_lasti
-	addr = 0
-	for i in range(0, len(tab), 2):
-		addr = addr + ord(tab[i])
-		if addr > stopat:
-			break
-		line = line + ord(tab[i+1])
-	return line
+    tab = c.co_lnotab
+    line = c.co_firstlineno
+    stopat = tb.tb_lasti
+    addr = 0
+    for i in range(0, len(tab), 2):
+        addr = addr + ord(tab[i])
+        if addr > stopat:
+            break
+        line = line + ord(tab[i+1])
+    return line
diff --git a/Lib/tty.py b/Lib/tty.py
index 20a31c0..b76a617 100644
--- a/Lib/tty.py
+++ b/Lib/tty.py
@@ -5,7 +5,7 @@
 from TERMIOS import *
 from termios import *
 
-# Indexes for termios list. 
+# Indexes for termios list.
 IFLAG = 0
 OFLAG = 1
 CFLAG = 2
@@ -15,22 +15,21 @@
 CC = 6
 
 def setraw(fd, when=TCSAFLUSH):
-	"""Put terminal into a raw mode."""
-	mode = tcgetattr(fd)
-	mode[IFLAG] = mode[IFLAG] & ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON)
-	mode[OFLAG] = mode[OFLAG] & ~(OPOST)
-	mode[CFLAG] = mode[CFLAG] & ~(CSIZE | PARENB)
-	mode[CFLAG] = mode[CFLAG] | CS8
-	mode[LFLAG] = mode[LFLAG] & ~(ECHO | ICANON | IEXTEN | ISIG)
-	mode[CC][VMIN] = 1
-	mode[CC][VTIME] = 0
-	tcsetattr(fd, when, mode)
+    """Put terminal into a raw mode."""
+    mode = tcgetattr(fd)
+    mode[IFLAG] = mode[IFLAG] & ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON)
+    mode[OFLAG] = mode[OFLAG] & ~(OPOST)
+    mode[CFLAG] = mode[CFLAG] & ~(CSIZE | PARENB)
+    mode[CFLAG] = mode[CFLAG] | CS8
+    mode[LFLAG] = mode[LFLAG] & ~(ECHO | ICANON | IEXTEN | ISIG)
+    mode[CC][VMIN] = 1
+    mode[CC][VTIME] = 0
+    tcsetattr(fd, when, mode)
 
 def setcbreak(fd, when=TCSAFLUSH):
-	"""Put terminal into a cbreak mode."""
-	mode = tcgetattr(fd)
-	mode[LFLAG] = mode[LFLAG] & ~(ECHO | ICANON)
-	mode[CC][VMIN] = 1
-	mode[CC][VTIME] = 0
-	tcsetattr(fd, when, mode)
-
+    """Put terminal into a cbreak mode."""
+    mode = tcgetattr(fd)
+    mode[LFLAG] = mode[LFLAG] & ~(ECHO | ICANON)
+    mode[CC][VMIN] = 1
+    mode[CC][VTIME] = 0
+    tcsetattr(fd, when, mode)
diff --git a/Lib/tzparse.py b/Lib/tzparse.py
index 27f1fa1..38e6af1 100644
--- a/Lib/tzparse.py
+++ b/Lib/tzparse.py
@@ -4,90 +4,90 @@
 # XXX Only the typical form "XXXhhYYY;ddd/hh,ddd/hh" is currently supported.
 
 tzpat = ('^([A-Z][A-Z][A-Z])([-+]?[0-9]+)([A-Z][A-Z][A-Z]);'
-	  '([0-9]+)/([0-9]+),([0-9]+)/([0-9]+)$')
+          '([0-9]+)/([0-9]+),([0-9]+)/([0-9]+)$')
 
 tzprog = None
 
 def tzparse(tzstr):
-	"""Given a timezone spec, return a tuple of information
-	(tzname, delta, dstname, daystart, hourstart, dayend, hourend),
-	where 'tzname' is the name of the timezone, 'delta' is the offset
-	in hours from GMT, 'dstname' is the name of the daylight-saving
-	timezone, and 'daystart'/'hourstart' and 'dayend'/'hourend'
-	specify the starting and ending points for daylight saving time."""
-	global tzprog
-	if tzprog is None:
-		import re
-		tzprog = re.compile(tzpat)
-	match = tzprog.match(tzstr)
-	if not match:
-		raise ValueError, 'not the TZ syntax I understand'
-	subs = []
-	for i in range(1, 8):
-		subs.append(match.group(i))
-	for i in (1, 3, 4, 5, 6):
-		subs[i] = eval(subs[i])
-	[tzname, delta, dstname, daystart, hourstart, dayend, hourend] = subs
-	return (tzname, delta, dstname, daystart, hourstart, dayend, hourend)
+    """Given a timezone spec, return a tuple of information
+    (tzname, delta, dstname, daystart, hourstart, dayend, hourend),
+    where 'tzname' is the name of the timezone, 'delta' is the offset
+    in hours from GMT, 'dstname' is the name of the daylight-saving
+    timezone, and 'daystart'/'hourstart' and 'dayend'/'hourend'
+    specify the starting and ending points for daylight saving time."""
+    global tzprog
+    if tzprog is None:
+        import re
+        tzprog = re.compile(tzpat)
+    match = tzprog.match(tzstr)
+    if not match:
+        raise ValueError, 'not the TZ syntax I understand'
+    subs = []
+    for i in range(1, 8):
+        subs.append(match.group(i))
+    for i in (1, 3, 4, 5, 6):
+        subs[i] = eval(subs[i])
+    [tzname, delta, dstname, daystart, hourstart, dayend, hourend] = subs
+    return (tzname, delta, dstname, daystart, hourstart, dayend, hourend)
 
 def tzlocaltime(secs, params):
-	"""Given a Unix time in seconds and a tuple of information about
-	a timezone as returned by tzparse(), return the local time in the
-	form (year, month, day, hour, min, sec, yday, wday, tzname)."""
-	import time
-	(tzname, delta, dstname, daystart, hourstart, dayend, hourend) = params
-	year, month, days, hours, mins, secs, yday, wday, isdst = \
-		time.gmtime(secs - delta*3600)
-	if (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend):
-		tzname = dstname
-		hours = hours + 1
-	return year, month, days, hours, mins, secs, yday, wday, tzname
+    """Given a Unix time in seconds and a tuple of information about
+    a timezone as returned by tzparse(), return the local time in the
+    form (year, month, day, hour, min, sec, yday, wday, tzname)."""
+    import time
+    (tzname, delta, dstname, daystart, hourstart, dayend, hourend) = params
+    year, month, days, hours, mins, secs, yday, wday, isdst = \
+            time.gmtime(secs - delta*3600)
+    if (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend):
+        tzname = dstname
+        hours = hours + 1
+    return year, month, days, hours, mins, secs, yday, wday, tzname
 
 def tzset():
-	"""Determine the current timezone from the "TZ" environment variable."""
-	global tzparams, timezone, altzone, daylight, tzname
-	import os
-	tzstr = os.environ['TZ']
-	tzparams = tzparse(tzstr)
-	timezone = tzparams[1] * 3600
-	altzone = timezone - 3600
-	daylight = 1
-	tzname = tzparams[0], tzparams[2]
+    """Determine the current timezone from the "TZ" environment variable."""
+    global tzparams, timezone, altzone, daylight, tzname
+    import os
+    tzstr = os.environ['TZ']
+    tzparams = tzparse(tzstr)
+    timezone = tzparams[1] * 3600
+    altzone = timezone - 3600
+    daylight = 1
+    tzname = tzparams[0], tzparams[2]
 
 def isdst(secs):
-	"""Return true if daylight-saving time is in effect for the given
-	Unix time in the current timezone."""
-	import time
-	(tzname, delta, dstname, daystart, hourstart, dayend, hourend) = \
-		tzparams
-	year, month, days, hours, mins, secs, yday, wday, isdst = \
-		time.gmtime(secs - delta*3600)
-	return (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend)
+    """Return true if daylight-saving time is in effect for the given
+    Unix time in the current timezone."""
+    import time
+    (tzname, delta, dstname, daystart, hourstart, dayend, hourend) = \
+            tzparams
+    year, month, days, hours, mins, secs, yday, wday, isdst = \
+            time.gmtime(secs - delta*3600)
+    return (daystart, hourstart) <= (yday+1, hours) < (dayend, hourend)
 
 tzset()
 
 def localtime(secs):
-	"""Get the local time in the current timezone."""
-	return tzlocaltime(secs, tzparams)
+    """Get the local time in the current timezone."""
+    return tzlocaltime(secs, tzparams)
 
 def test():
-	from time import asctime, gmtime
-	import time, sys
-	now = time.time()
-	x = localtime(now)
-	tm = x[:-1] + (0,)
-	print 'now =', now, '=', asctime(tm), x[-1]
-	now = now - now % (24*3600)
-	if sys.argv[1:]: now = now + eval(sys.argv[1])
-	x = gmtime(now)
-	tm = x[:-1] + (0,)
-	print 'gmtime =', now, '=', asctime(tm), 'yday =', x[-2]
-	jan1 = now - x[-2]*24*3600
-	x = localtime(jan1)
-	tm = x[:-1] + (0,)
-	print 'jan1 =', jan1, '=', asctime(tm), x[-1]
-	for d in range(85, 95) + range(265, 275):
-		t = jan1 + d*24*3600
-		x = localtime(t)
-		tm = x[:-1] + (0,)
-		print 'd =', d, 't =', t, '=', asctime(tm), x[-1]
+    from time import asctime, gmtime
+    import time, sys
+    now = time.time()
+    x = localtime(now)
+    tm = x[:-1] + (0,)
+    print 'now =', now, '=', asctime(tm), x[-1]
+    now = now - now % (24*3600)
+    if sys.argv[1:]: now = now + eval(sys.argv[1])
+    x = gmtime(now)
+    tm = x[:-1] + (0,)
+    print 'gmtime =', now, '=', asctime(tm), 'yday =', x[-2]
+    jan1 = now - x[-2]*24*3600
+    x = localtime(jan1)
+    tm = x[:-1] + (0,)
+    print 'jan1 =', jan1, '=', asctime(tm), x[-1]
+    for d in range(85, 95) + range(265, 275):
+        t = jan1 + d*24*3600
+        x = localtime(t)
+        tm = x[:-1] + (0,)
+        print 'd =', d, 't =', t, '=', asctime(tm), x[-1]
