diff --git a/lldb/utils/lui/breakwin.py b/lldb/utils/lui/breakwin.py
index 734f5ed..7ecb78f 100644
--- a/lldb/utils/lui/breakwin.py
+++ b/lldb/utils/lui/breakwin.py
@@ -1,90 +1,94 @@
 ##===-- breakwin.py ------------------------------------------*- Python -*-===##
 ##
-##                     The LLVM Compiler Infrastructure
+# The LLVM Compiler Infrastructure
 ##
-## This file is distributed under the University of Illinois Open Source
-## License. See LICENSE.TXT for details.
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
 ##
 ##===----------------------------------------------------------------------===##
 
 import cui
 import curses
-import lldb, lldbutil
+import lldb
+import lldbutil
 import re
 
+
 class BreakWin(cui.ListWin):
-  def __init__(self, driver, x, y, w, h):
-    super(BreakWin, self).__init__(x, y, w, h)
-    self.driver = driver
-    self.update()
-    self.showDetails = {}
 
-  def handleEvent(self, event):
-    if isinstance(event, lldb.SBEvent):
-      if lldb.SBBreakpoint.EventIsBreakpointEvent(event):
+    def __init__(self, driver, x, y, w, h):
+        super(BreakWin, self).__init__(x, y, w, h)
+        self.driver = driver
         self.update()
-    if isinstance(event, int):
-      if event == ord('d'):
-        self.deleteSelected()
-      if event == curses.ascii.NL or event == curses.ascii.SP:
-        self.toggleSelected()
-      elif event == curses.ascii.TAB:
-        if self.getSelected() != -1:
-          target = self.driver.getTarget()
-          if not target.IsValid():
+        self.showDetails = {}
+
+    def handleEvent(self, event):
+        if isinstance(event, lldb.SBEvent):
+            if lldb.SBBreakpoint.EventIsBreakpointEvent(event):
+                self.update()
+        if isinstance(event, int):
+            if event == ord('d'):
+                self.deleteSelected()
+            if event == curses.ascii.NL or event == curses.ascii.SP:
+                self.toggleSelected()
+            elif event == curses.ascii.TAB:
+                if self.getSelected() != -1:
+                    target = self.driver.getTarget()
+                    if not target.IsValid():
+                        return
+                    i = target.GetBreakpointAtIndex(self.getSelected()).id
+                    self.showDetails[i] = not self.showDetails[i]
+                    self.update()
+        super(BreakWin, self).handleEvent(event)
+
+    def toggleSelected(self):
+        if self.getSelected() == -1:
             return
-          i = target.GetBreakpointAtIndex(self.getSelected()).id
-          self.showDetails[i] = not self.showDetails[i]
-          self.update()
-    super(BreakWin, self).handleEvent(event)
+        target = self.driver.getTarget()
+        if not target.IsValid():
+            return
+        bp = target.GetBreakpointAtIndex(self.getSelected())
+        bp.SetEnabled(not bp.IsEnabled())
 
-  def toggleSelected(self):
-    if self.getSelected() == -1:
-      return
-    target = self.driver.getTarget()
-    if not target.IsValid():
-      return
-    bp = target.GetBreakpointAtIndex(self.getSelected())
-    bp.SetEnabled(not bp.IsEnabled())
+    def deleteSelected(self):
+        if self.getSelected() == -1:
+            return
+        target = self.driver.getTarget()
+        if not target.IsValid():
+            return
+        bp = target.GetBreakpointAtIndex(self.getSelected())
+        target.BreakpointDelete(bp.id)
 
-  def deleteSelected(self):
-    if self.getSelected() == -1:
-      return
-    target = self.driver.getTarget()
-    if not target.IsValid():
-      return
-    bp = target.GetBreakpointAtIndex(self.getSelected())
-    target.BreakpointDelete(bp.id)
+    def update(self):
+        target = self.driver.getTarget()
+        if not target.IsValid():
+            self.win.erase()
+            self.win.noutrefresh()
+            return
+        selected = self.getSelected()
+        self.clearItems()
+        for i in range(0, target.GetNumBreakpoints()):
+            bp = target.GetBreakpointAtIndex(i)
+            if bp.IsInternal():
+                continue
+            text = lldbutil.get_description(bp)
+            # FIXME: Use an API for this, not parsing the description.
+            match = re.search('SBBreakpoint: id = ([^,]+), (.*)', text)
+            try:
+                id = match.group(1)
+                desc = match.group(2).strip()
+                if bp.IsEnabled():
+                    text = '%s: %s' % (id, desc)
+                else:
+                    text = '%s: (disabled) %s' % (id, desc)
+            except ValueError as e:
+                # bp unparsable
+                pass
 
-  def update(self):
-    target = self.driver.getTarget()
-    if not target.IsValid():
-      self.win.erase()
-      self.win.noutrefresh()
-      return
-    selected = self.getSelected()
-    self.clearItems()
-    for i in range(0, target.GetNumBreakpoints()):
-      bp = target.GetBreakpointAtIndex(i)
-      if bp.IsInternal():
-        continue
-      text = lldbutil.get_description(bp)
-      # FIXME: Use an API for this, not parsing the description.
-      match = re.search('SBBreakpoint: id = ([^,]+), (.*)', text)
-      try:
-        id = match.group(1)
-        desc = match.group(2).strip()
-        if bp.IsEnabled():
-          text = '%s: %s' % (id, desc)
-        else:
-          text = '%s: (disabled) %s' % (id, desc)
-      except ValueError as e:
-        # bp unparsable
-        pass
-
-      if self.showDetails.setdefault(bp.id, False):
-        for location in bp:
-          desc = lldbutil.get_description(location, lldb.eDescriptionLevelFull)
-          text += '\n  ' + desc
-      self.addItem(text)
-    self.setSelected(selected)
+            if self.showDetails.setdefault(bp.id, False):
+                for location in bp:
+                    desc = lldbutil.get_description(
+                        location, lldb.eDescriptionLevelFull)
+                    text += '\n  ' + desc
+            self.addItem(text)
+        self.setSelected(selected)
