diff --git a/.gitignore b/.gitignore index b690e33c..fa15edfc 100644 --- a/.gitignore +++ b/.gitignore @@ -63,3 +63,6 @@ mydbstub.py* ubuntu-xenial-16.04-cloudimg-console.log ubuntu-bionic-18.04-cloudimg-console.log .pytest_cache + +/samples/doodle/build +/samples/doodle/dist diff --git a/samples/doodle/ChangeLog.txt b/samples/doodle/ChangeLog.txt new file mode 100644 index 00000000..36dac8f6 --- /dev/null +++ b/samples/doodle/ChangeLog.txt @@ -0,0 +1,61 @@ +Recent changes for the SuperDoodle application +============================================== + +This is not a real change-log, but rather serves as an example that goes +along with SuperDoodle's example of self-updating functionality. To see it +in action download and unzip either the Windows or Mac version of +SuperDoodle 1.0.0 from http://wxPython.org/software-update-test/. When you +run the 1.0.0 version there will be a "Check for Updates..." item on the +help menu that you can use to see how the self-updating UI works. The +application will download the latest version available, install it, and +will restart SuperDoodle for you. Be sure to check the version numbers in +the About dialog before and after the update so you can see that it is +changing. (That is the only real change in each of the application +updates.) + +And now we return you to the totally fake change log, already in +progress... + + +Version 1.0.3 +------------- + * A little of this, a little of that. + * Fixed the foozlehopper. + * Added a whatsamagigit + * There's a wocket in my pocket. + + +Version 1.0.2 +------------- + * "I don't believe there's a power in the 'verse that can stop Kaylee + from being cheerful." + + * "Ten percent of nuthin' is...let me do the math here...nuthin' into + nuthin'...carry the nuthin'..." + + * "Well, what about you, Shepherd? How come you're flying about with us + brigands? I mean, shouldn't you be off bringing religiosity to the + Fuzzie-Wuzzies or some such?" + + * "Do you know what the chain of command is here? It's the chain I go + get and beat you with to show you who's in command." + + * "A man walks down the street in that hat, people know he's not afraid + of anything." + + + +Version 1.0.1 +------------- + * "Time is an illusion. Lunchtime doubly so." + + * "The ships hung in the sky in much the same way that bricks don't." + + * "Forty-two." + + * "Reality is frequently inaccurate." + + +Version 1.0.0 +------------- + * Initial release. diff --git a/samples/doodle/README.txt b/samples/doodle/README.txt new file mode 100644 index 00000000..18584d2d --- /dev/null +++ b/samples/doodle/README.txt @@ -0,0 +1,21 @@ +Doodle +------ + +This little sample is a doodle application. It shows you how to draw +on a canvas, deal with mouse events, popup menus, update UI events, +and much more. + + doodle.py A class for the main drawing window. You can also + run it directly to see just this window. + + + superdoodle.py Takes the DoodleWindow from doodle.py and puts it + in a more full featured application with a control + panel, and the ability to save and load doodles. + + setup.py This sample also shows you how to make your + applications automatically self-update when new + releases are available. There is a bit of code in + the superdoodle module to use the softwareupdate + module from the library, but the real magic + happens here in the distutils setup module. diff --git a/samples/doodle/doodle.py b/samples/doodle/doodle.py new file mode 100644 index 00000000..216de32f --- /dev/null +++ b/samples/doodle/doodle.py @@ -0,0 +1,258 @@ +# doodle.py + +""" +This module contains the DoodleWindow class which is a window that you +can do simple drawings upon. +""" + + +import wx + +#---------------------------------------------------------------------- + +class DoodleWindow(wx.Window): + menuColours = { 100 : 'Black', + 101 : 'Yellow', + 102 : 'Red', + 103 : 'Green', + 104 : 'Blue', + 105 : 'Purple', + 106 : 'Brown', + 107 : 'Aquamarine', + 108 : 'Forest Green', + 109 : 'Light Blue', + 110 : 'Goldenrod', + 111 : 'Cyan', + 112 : 'Orange', + 113 : 'Navy', + 114 : 'Dark Grey', + 115 : 'Light Grey', + } + maxThickness = 16 + + + def __init__(self, parent, ID): + wx.Window.__init__(self, parent, ID, style=wx.NO_FULL_REPAINT_ON_RESIZE) + self.SetBackgroundColour("WHITE") + self.listeners = [] + self.thickness = 1 + self.SetColour("Black") + self.lines = [] + self.pos = wx.Point(0,0) + self.MakeMenu() + + self.InitBuffer() + + self.SetCursor(wx.Cursor(wx.CURSOR_PENCIL)) + + # hook some mouse events + self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) + self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) + self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) + self.Bind(wx.EVT_MOTION, self.OnMotion) + + # the window resize event and idle events for managing the buffer + self.Bind(wx.EVT_SIZE, self.OnSize) + self.Bind(wx.EVT_IDLE, self.OnIdle) + + # and the refresh event + self.Bind(wx.EVT_PAINT, self.OnPaint) + + # When the window is destroyed, clean up resources. + self.Bind(wx.EVT_WINDOW_DESTROY, self.Cleanup) + + + def Cleanup(self, evt): + if hasattr(self, "menu"): + self.menu.Destroy() + del self.menu + + + def InitBuffer(self): + """Initialize the bitmap used for buffering the display.""" + size = self.GetClientSize() + self.buffer = wx.Bitmap(max(1,size.width), max(1,size.height)) + dc = wx.BufferedDC(None, self.buffer) + dc.SetBackground(wx.Brush(self.GetBackgroundColour())) + dc.Clear() + self.DrawLines(dc) + self.reInitBuffer = False + + + def SetColour(self, colour): + """Set a new colour and make a matching pen""" + self.colour = colour + self.pen = wx.Pen(self.colour, self.thickness, wx.SOLID) + self.Notify() + + + def SetThickness(self, num): + """Set a new line thickness and make a matching pen""" + self.thickness = num + self.pen = wx.Pen(self.colour, self.thickness, wx.SOLID) + self.Notify() + + + def GetLinesData(self): + return self.lines[:] + + + def SetLinesData(self, lines): + self.lines = lines[:] + self.InitBuffer() + self.Refresh() + + + def MakeMenu(self): + """Make a menu that can be popped up later""" + menu = wx.Menu() + keys = list(self.menuColours.keys()) + keys.sort() + for k in keys: + text = self.menuColours[k] + menu.Append(k, text, kind=wx.ITEM_CHECK) + self.Bind(wx.EVT_MENU_RANGE, self.OnMenuSetColour, id=100, id2=200) + self.Bind(wx.EVT_UPDATE_UI_RANGE, self.OnCheckMenuColours, id=100, id2=200) + menu.Break() + + for x in range(1, self.maxThickness+1): + menu.Append(x, str(x), kind=wx.ITEM_CHECK) + + self.Bind(wx.EVT_MENU_RANGE, self.OnMenuSetThickness, id=1, id2=self.maxThickness) + self.Bind(wx.EVT_UPDATE_UI_RANGE, self.OnCheckMenuThickness, id=1, id2=self.maxThickness) + self.menu = menu + + + # These two event handlers are called before the menu is displayed + # to determine which items should be checked. + def OnCheckMenuColours(self, event): + text = self.menuColours[event.GetId()] + if text == self.colour: + event.Check(True) + event.SetText(text.upper()) + else: + event.Check(False) + event.SetText(text) + + def OnCheckMenuThickness(self, event): + if event.GetId() == self.thickness: + event.Check(True) + else: + event.Check(False) + + + def OnLeftDown(self, event): + """called when the left mouse button is pressed""" + self.curLine = [] + self.pos = event.GetPosition() + self.CaptureMouse() + + + def OnLeftUp(self, event): + """called when the left mouse button is released""" + if self.HasCapture(): + self.lines.append( (self.colour, self.thickness, self.curLine) ) + self.curLine = [] + self.ReleaseMouse() + + + def OnRightUp(self, event): + """called when the right mouse button is released, will popup the menu""" + pt = event.GetPosition() + self.PopupMenu(self.menu, pt) + + + + def OnMotion(self, event): + """ + Called when the mouse is in motion. If the left button is + dragging then draw a line from the last event position to the + current one. Save the coordinants for redraws. + """ + if event.Dragging() and event.LeftIsDown(): + dc = wx.BufferedDC(wx.ClientDC(self), self.buffer) + dc.SetPen(self.pen) + pos = event.GetPosition() + coords = (self.pos.x, self.pos.y, pos.x, pos.y) + self.curLine.append(coords) + dc.DrawLine(*coords) + self.pos = pos + + + def OnSize(self, event): + """ + Called when the window is resized. We set a flag so the idle + handler will resize the buffer. + """ + self.reInitBuffer = True + + + def OnIdle(self, event): + """ + If the size was changed then resize the bitmap used for double + buffering to match the window size. We do it in Idle time so + there is only one refresh after resizing is done, not lots while + it is happening. + """ + if self.reInitBuffer: + self.InitBuffer() + self.Refresh(False) + + + def OnPaint(self, event): + """ + Called when the window is exposed. + """ + # Create a buffered paint DC. It will create the real + # wx.PaintDC and then blit the bitmap to it when dc is + # deleted. Since we don't need to draw anything else + # here that's all there is to it. + dc = wx.BufferedPaintDC(self, self.buffer) + + + def DrawLines(self, dc): + """ + Redraws all the lines that have been drawn already. + """ + for colour, thickness, line in self.lines: + pen = wx.Pen(colour, thickness, wx.SOLID) + dc.SetPen(pen) + for coords in line: + dc.DrawLine(*coords) + + + # Event handlers for the popup menu, uses the event ID to determine + # the colour or the thickness to set. + def OnMenuSetColour(self, event): + self.SetColour(self.menuColours[event.GetId()]) + + def OnMenuSetThickness(self, event): + self.SetThickness(event.GetId()) + + + # Observer pattern. Listeners are registered and then notified + # whenever doodle settings change. + def AddListener(self, listener): + self.listeners.append(listener) + + def Notify(self): + for other in self.listeners: + other.Update(self.colour, self.thickness) + + +#---------------------------------------------------------------------- + +class DoodleFrame(wx.Frame): + def __init__(self, parent): + wx.Frame.__init__(self, parent, -1, "Doodle Frame", size=(800,600), + style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) + doodle = DoodleWindow(self, -1) + +#---------------------------------------------------------------------- + +if __name__ == '__main__': + app = wx.App() + frame = DoodleFrame(None) + frame.Show(True) + app.MainLoop() + diff --git a/samples/doodle/mondrian.icns b/samples/doodle/mondrian.icns new file mode 100644 index 00000000..43fbff2c Binary files /dev/null and b/samples/doodle/mondrian.icns differ diff --git a/samples/doodle/mondrian.ico b/samples/doodle/mondrian.ico new file mode 100644 index 00000000..2310c5d2 Binary files /dev/null and b/samples/doodle/mondrian.ico differ diff --git a/samples/doodle/sample.ddl b/samples/doodle/sample.ddl new file mode 100644 index 00000000..d1a42b34 --- /dev/null +++ b/samples/doodle/sample.ddl @@ -0,0 +1,8339 @@ +(lp1 +(S'Blue' +p2 +I12 +(lp3 +(I71 +I117 +I71 +I118 +tp4 +a(I71 +I118 +I71 +I119 +tp5 +a(I71 +I119 +I71 +I121 +tp6 +a(I71 +I121 +I71 +I122 +tp7 +a(I71 +I122 +I71 +I123 +tp8 +a(I71 +I123 +I70 +I123 +tp9 +a(I70 +I123 +I70 +I124 +tp10 +a(I70 +I124 +I70 +I125 +tp11 +a(I70 +I125 +I69 +I126 +tp12 +a(I69 +I126 +I69 +I127 +tp13 +a(I69 +I127 +I69 +I128 +tp14 +a(I69 +I128 +I69 +I129 +tp15 +a(I69 +I129 +I69 +I130 +tp16 +a(I69 +I130 +I70 +I130 +tp17 +a(I70 +I130 +I70 +I131 +tp18 +a(I70 +I131 +I71 +I132 +tp19 +a(I71 +I132 +I71 +I133 +tp20 +a(I71 +I133 +I72 +I134 +tp21 +a(I72 +I134 +I73 +I136 +tp22 +a(I73 +I136 +I74 +I137 +tp23 +a(I74 +I137 +I74 +I138 +tp24 +a(I74 +I138 +I75 +I139 +tp25 +a(I75 +I139 +I76 +I140 +tp26 +a(I76 +I140 +I76 +I141 +tp27 +a(I76 +I141 +I77 +I141 +tp28 +a(I77 +I141 +I78 +I141 +tp29 +a(I78 +I141 +I78 +I142 +tp30 +a(I78 +I142 +I79 +I143 +tp31 +a(I79 +I143 +I80 +I143 +tp32 +a(I80 +I143 +I80 +I144 +tp33 +a(I80 +I144 +I81 +I144 +tp34 +a(I81 +I144 +I82 +I145 +tp35 +a(I82 +I145 +I83 +I145 +tp36 +a(I83 +I145 +I84 +I145 +tp37 +a(I84 +I145 +I85 +I145 +tp38 +a(I85 +I145 +I86 +I145 +tp39 +a(I86 +I145 +I87 +I145 +tp40 +a(I87 +I145 +I88 +I145 +tp41 +a(I88 +I145 +I89 +I145 +tp42 +a(I89 +I145 +I91 +I145 +tp43 +a(I91 +I145 +I92 +I145 +tp44 +a(I92 +I145 +I93 +I144 +tp45 +a(I93 +I144 +I93 +I143 +tp46 +a(I93 +I143 +I94 +I143 +tp47 +a(I94 +I143 +I95 +I142 +tp48 +a(I95 +I142 +I95 +I141 +tp49 +a(I95 +I141 +I96 +I140 +tp50 +a(I96 +I140 +I97 +I138 +tp51 +a(I97 +I138 +I97 +I137 +tp52 +a(I97 +I137 +I98 +I137 +tp53 +a(I98 +I137 +I98 +I135 +tp54 +a(I98 +I135 +I98 +I134 +tp55 +a(I98 +I134 +I98 +I133 +tp56 +a(I98 +I133 +I98 +I132 +tp57 +a(I98 +I132 +I98 +I131 +tp58 +a(I98 +I131 +I98 +I130 +tp59 +a(I98 +I130 +I98 +I129 +tp60 +a(I98 +I129 +I98 +I128 +tp61 +a(I98 +I128 +I98 +I127 +tp62 +a(I98 +I127 +I98 +I128 +tp63 +a(I98 +I128 +I98 +I129 +tp64 +a(I98 +I129 +I98 +I130 +tp65 +a(I98 +I130 +I98 +I131 +tp66 +a(I98 +I131 +I98 +I133 +tp67 +a(I98 +I133 +I98 +I135 +tp68 +a(I98 +I135 +I98 +I136 +tp69 +a(I98 +I136 +I98 +I137 +tp70 +a(I98 +I137 +I99 +I138 +tp71 +a(I99 +I138 +I100 +I138 +tp72 +a(I100 +I138 +I100 +I139 +tp73 +a(I100 +I139 +I101 +I140 +tp74 +a(I101 +I140 +I102 +I140 +tp75 +a(I102 +I140 +I103 +I141 +tp76 +a(I103 +I141 +I105 +I142 +tp77 +a(I105 +I142 +I107 +I143 +tp78 +a(I107 +I143 +I108 +I144 +tp79 +a(I108 +I144 +I110 +I144 +tp80 +a(I110 +I144 +I111 +I145 +tp81 +a(I111 +I145 +I111 +I146 +tp82 +a(I111 +I146 +I113 +I146 +tp83 +a(I113 +I146 +I115 +I146 +tp84 +a(I115 +I146 +I116 +I146 +tp85 +a(I116 +I146 +I117 +I146 +tp86 +a(I117 +I146 +I118 +I146 +tp87 +a(I118 +I146 +I119 +I145 +tp88 +a(I119 +I145 +I120 +I144 +tp89 +a(I120 +I144 +I121 +I144 +tp90 +a(I121 +I144 +I122 +I142 +tp91 +a(I122 +I142 +I123 +I141 +tp92 +a(I123 +I141 +I123 +I140 +tp93 +a(I123 +I140 +I124 +I139 +tp94 +a(I124 +I139 +I124 +I138 +tp95 +a(I124 +I138 +I125 +I136 +tp96 +a(I125 +I136 +I125 +I135 +tp97 +a(I125 +I135 +I125 +I134 +tp98 +a(I125 +I134 +I126 +I132 +tp99 +a(I126 +I132 +I126 +I131 +tp100 +a(I126 +I131 +I126 +I129 +tp101 +a(I126 +I129 +I126 +I128 +tp102 +a(I126 +I128 +I126 +I126 +tp103 +a(I126 +I126 +I126 +I125 +tp104 +a(I126 +I125 +I125 +I123 +tp105 +a(I125 +I123 +I125 +I122 +tp106 +a(I125 +I122 +I124 +I120 +tp107 +a(I124 +I120 +I124 +I119 +tp108 +a(I124 +I119 +I123 +I118 +tp109 +a(I123 +I118 +I123 +I117 +tp110 +a(I123 +I117 +I123 +I116 +tp111 +a(I123 +I116 +I123 +I115 +tp112 +a(I123 +I115 +I122 +I114 +tp113 +a(I122 +I114 +I122 +I113 +tp114 +a(I122 +I113 +I122 +I112 +tp115 +a(I122 +I112 +I121 +I112 +tp116 +a(I121 +I112 +I121 +I111 +tp117 +a(I121 +I111 +I121 +I110 +tp118 +atp119 +a(g2 +I12 +(lp120 +(I149 +I109 +I149 +I110 +tp121 +a(I149 +I110 +I149 +I111 +tp122 +a(I149 +I111 +I150 +I111 +tp123 +a(I150 +I111 +I150 +I112 +tp124 +a(I150 +I112 +I151 +I113 +tp125 +a(I151 +I113 +I153 +I114 +tp126 +a(I153 +I114 +I153 +I115 +tp127 +a(I153 +I115 +I155 +I116 +tp128 +a(I155 +I116 +I156 +I117 +tp129 +a(I156 +I117 +I157 +I119 +tp130 +a(I157 +I119 +I160 +I121 +tp131 +a(I160 +I121 +I161 +I123 +tp132 +a(I161 +I123 +I163 +I125 +tp133 +a(I163 +I125 +I165 +I126 +tp134 +a(I165 +I126 +I166 +I128 +tp135 +a(I166 +I128 +I167 +I129 +tp136 +a(I167 +I129 +I169 +I129 +tp137 +a(I169 +I129 +I169 +I131 +tp138 +a(I169 +I131 +I171 +I132 +tp139 +a(I171 +I132 +I172 +I134 +tp140 +a(I172 +I134 +I174 +I134 +tp141 +a(I174 +I134 +I174 +I135 +tp142 +a(I174 +I135 +I175 +I136 +tp143 +a(I175 +I136 +I176 +I136 +tp144 +a(I176 +I136 +I177 +I137 +tp145 +a(I177 +I137 +I179 +I138 +tp146 +a(I179 +I138 +I179 +I139 +tp147 +a(I179 +I139 +I181 +I139 +tp148 +a(I181 +I139 +I181 +I140 +tp149 +a(I181 +I140 +I183 +I141 +tp150 +a(I183 +I141 +I184 +I141 +tp151 +a(I184 +I141 +I185 +I142 +tp152 +a(I185 +I142 +I186 +I143 +tp153 +a(I186 +I143 +I186 +I144 +tp154 +a(I186 +I144 +I187 +I144 +tp155 +a(I187 +I144 +I187 +I143 +tp156 +a(I187 +I143 +I187 +I141 +tp157 +a(I187 +I141 +I186 +I141 +tp158 +atp159 +a(g2 +I12 +(lp160 +(I178 +I107 +I177 +I107 +tp161 +a(I177 +I107 +I176 +I107 +tp162 +a(I176 +I107 +I176 +I108 +tp163 +a(I176 +I108 +I175 +I109 +tp164 +a(I175 +I109 +I174 +I110 +tp165 +a(I174 +I110 +I173 +I111 +tp166 +a(I173 +I111 +I172 +I112 +tp167 +a(I172 +I112 +I171 +I112 +tp168 +a(I171 +I112 +I170 +I113 +tp169 +a(I170 +I113 +I169 +I114 +tp170 +a(I169 +I114 +I167 +I115 +tp171 +a(I167 +I115 +I166 +I116 +tp172 +a(I166 +I116 +I165 +I118 +tp173 +a(I165 +I118 +I164 +I119 +tp174 +a(I164 +I119 +I163 +I120 +tp175 +a(I163 +I120 +I162 +I121 +tp176 +a(I162 +I121 +I161 +I121 +tp177 +a(I161 +I121 +I161 +I122 +tp178 +a(I161 +I122 +I160 +I123 +tp179 +a(I160 +I123 +I160 +I125 +tp180 +a(I160 +I125 +I159 +I126 +tp181 +a(I159 +I126 +I158 +I126 +tp182 +a(I158 +I126 +I158 +I128 +tp183 +a(I158 +I128 +I157 +I129 +tp184 +a(I157 +I129 +I157 +I130 +tp185 +a(I157 +I130 +I156 +I130 +tp186 +a(I156 +I130 +I155 +I132 +tp187 +a(I155 +I132 +I155 +I133 +tp188 +a(I155 +I133 +I154 +I134 +tp189 +a(I154 +I134 +I154 +I135 +tp190 +a(I154 +I135 +I153 +I135 +tp191 +a(I153 +I135 +I153 +I136 +tp192 +a(I153 +I136 +I153 +I137 +tp193 +a(I153 +I137 +I152 +I137 +tp194 +a(I152 +I137 +I152 +I138 +tp195 +a(I152 +I138 +I151 +I138 +tp196 +a(I151 +I138 +I151 +I139 +tp197 +a(I151 +I139 +I151 +I140 +tp198 +a(I151 +I140 +I151 +I141 +tp199 +a(I151 +I141 +I151 +I142 +tp200 +a(I151 +I142 +I151 +I143 +tp201 +a(I151 +I143 +I151 +I144 +tp202 +a(I151 +I144 +I150 +I144 +tp203 +a(I150 +I144 +I150 +I145 +tp204 +a(I150 +I145 +I151 +I145 +tp205 +a(I151 +I145 +I151 +I144 +tp206 +atp207 +a(g2 +I12 +(lp208 +(I211 +I53 +I211 +I54 +tp209 +a(I211 +I54 +I211 +I55 +tp210 +a(I211 +I55 +I211 +I56 +tp211 +a(I211 +I56 +I211 +I58 +tp212 +a(I211 +I58 +I211 +I60 +tp213 +a(I211 +I60 +I211 +I62 +tp214 +a(I211 +I62 +I212 +I63 +tp215 +a(I212 +I63 +I212 +I66 +tp216 +a(I212 +I66 +I213 +I69 +tp217 +a(I213 +I69 +I213 +I70 +tp218 +a(I213 +I70 +I214 +I73 +tp219 +a(I214 +I73 +I214 +I75 +tp220 +a(I214 +I75 +I214 +I79 +tp221 +a(I214 +I79 +I214 +I81 +tp222 +a(I214 +I81 +I214 +I85 +tp223 +a(I214 +I85 +I214 +I88 +tp224 +a(I214 +I88 +I214 +I91 +tp225 +a(I214 +I91 +I214 +I95 +tp226 +a(I214 +I95 +I214 +I97 +tp227 +a(I214 +I97 +I214 +I101 +tp228 +a(I214 +I101 +I214 +I103 +tp229 +a(I214 +I103 +I214 +I107 +tp230 +a(I214 +I107 +I214 +I110 +tp231 +a(I214 +I110 +I214 +I113 +tp232 +a(I214 +I113 +I214 +I116 +tp233 +a(I214 +I116 +I214 +I119 +tp234 +a(I214 +I119 +I215 +I122 +tp235 +a(I215 +I122 +I215 +I125 +tp236 +a(I215 +I125 +I215 +I127 +tp237 +a(I215 +I127 +I215 +I129 +tp238 +a(I215 +I129 +I215 +I130 +tp239 +a(I215 +I130 +I215 +I132 +tp240 +a(I215 +I132 +I215 +I134 +tp241 +a(I215 +I134 +I215 +I135 +tp242 +a(I215 +I135 +I215 +I136 +tp243 +a(I215 +I136 +I215 +I137 +tp244 +a(I215 +I137 +I215 +I138 +tp245 +a(I215 +I138 +I215 +I139 +tp246 +a(I215 +I139 +I215 +I140 +tp247 +a(I215 +I140 +I215 +I139 +tp248 +a(I215 +I139 +I215 +I138 +tp249 +a(I215 +I138 +I215 +I137 +tp250 +a(I215 +I137 +I215 +I136 +tp251 +atp252 +a(g2 +I12 +(lp253 +(I214 +I57 +I214 +I56 +tp254 +a(I214 +I56 +I215 +I56 +tp255 +a(I215 +I56 +I216 +I55 +tp256 +a(I216 +I55 +I219 +I55 +tp257 +a(I219 +I55 +I221 +I54 +tp258 +a(I221 +I54 +I224 +I54 +tp259 +a(I224 +I54 +I225 +I53 +tp260 +a(I225 +I53 +I228 +I52 +tp261 +a(I228 +I52 +I231 +I52 +tp262 +a(I231 +I52 +I233 +I51 +tp263 +a(I233 +I51 +I236 +I50 +tp264 +a(I236 +I50 +I238 +I50 +tp265 +a(I238 +I50 +I240 +I50 +tp266 +a(I240 +I50 +I242 +I50 +tp267 +a(I242 +I50 +I243 +I50 +tp268 +a(I243 +I50 +I246 +I50 +tp269 +a(I246 +I50 +I248 +I50 +tp270 +a(I248 +I50 +I251 +I50 +tp271 +a(I251 +I50 +I253 +I50 +tp272 +a(I253 +I50 +I255 +I50 +tp273 +a(I255 +I50 +I256 +I50 +tp274 +a(I256 +I50 +I256 +I51 +tp275 +a(I256 +I51 +I257 +I51 +tp276 +a(I257 +I51 +I258 +I51 +tp277 +a(I258 +I51 +I259 +I51 +tp278 +a(I259 +I51 +I260 +I52 +tp279 +a(I260 +I52 +I261 +I53 +tp280 +a(I261 +I53 +I262 +I53 +tp281 +a(I262 +I53 +I263 +I55 +tp282 +a(I263 +I55 +I264 +I56 +tp283 +a(I264 +I56 +I266 +I58 +tp284 +a(I266 +I58 +I267 +I60 +tp285 +a(I267 +I60 +I269 +I63 +tp286 +a(I269 +I63 +I271 +I66 +tp287 +a(I271 +I66 +I272 +I68 +tp288 +a(I272 +I68 +I273 +I71 +tp289 +a(I273 +I71 +I274 +I72 +tp290 +a(I274 +I72 +I274 +I75 +tp291 +a(I274 +I75 +I274 +I76 +tp292 +a(I274 +I76 +I274 +I79 +tp293 +a(I274 +I79 +I274 +I80 +tp294 +a(I274 +I80 +I274 +I82 +tp295 +a(I274 +I82 +I274 +I85 +tp296 +a(I274 +I85 +I274 +I86 +tp297 +a(I274 +I86 +I273 +I88 +tp298 +a(I273 +I88 +I271 +I89 +tp299 +a(I271 +I89 +I270 +I90 +tp300 +a(I270 +I90 +I269 +I92 +tp301 +a(I269 +I92 +I267 +I93 +tp302 +a(I267 +I93 +I265 +I94 +tp303 +a(I265 +I94 +I263 +I96 +tp304 +a(I263 +I96 +I261 +I97 +tp305 +a(I261 +I97 +I260 +I98 +tp306 +a(I260 +I98 +I257 +I98 +tp307 +a(I257 +I98 +I254 +I98 +tp308 +a(I254 +I98 +I251 +I99 +tp309 +a(I251 +I99 +I247 +I99 +tp310 +a(I247 +I99 +I245 +I99 +tp311 +a(I245 +I99 +I242 +I99 +tp312 +a(I242 +I99 +I240 +I99 +tp313 +a(I240 +I99 +I238 +I99 +tp314 +a(I238 +I99 +I236 +I99 +tp315 +a(I236 +I99 +I234 +I99 +tp316 +a(I234 +I99 +I233 +I99 +tp317 +a(I233 +I99 +I232 +I99 +tp318 +a(I232 +I99 +I230 +I99 +tp319 +a(I230 +I99 +I229 +I99 +tp320 +a(I229 +I99 +I228 +I99 +tp321 +a(I228 +I99 +I227 +I99 +tp322 +a(I227 +I99 +I226 +I99 +tp323 +a(I226 +I99 +I225 +I99 +tp324 +a(I225 +I99 +I224 +I99 +tp325 +a(I224 +I99 +I223 +I99 +tp326 +a(I223 +I99 +I222 +I99 +tp327 +atp328 +a(g2 +I12 +(lp329 +(I294 +I110 +I294 +I111 +tp330 +a(I294 +I111 +I293 +I112 +tp331 +a(I293 +I112 +I293 +I113 +tp332 +a(I293 +I113 +I292 +I114 +tp333 +a(I292 +I114 +I292 +I116 +tp334 +a(I292 +I116 +I292 +I117 +tp335 +a(I292 +I117 +I292 +I118 +tp336 +a(I292 +I118 +I292 +I120 +tp337 +a(I292 +I120 +I292 +I121 +tp338 +a(I292 +I121 +I292 +I122 +tp339 +a(I292 +I122 +I293 +I123 +tp340 +a(I293 +I123 +I293 +I125 +tp341 +a(I293 +I125 +I293 +I126 +tp342 +a(I293 +I126 +I293 +I127 +tp343 +a(I293 +I127 +I294 +I128 +tp344 +a(I294 +I128 +I294 +I129 +tp345 +a(I294 +I129 +I295 +I130 +tp346 +a(I295 +I130 +I295 +I131 +tp347 +a(I295 +I131 +I295 +I132 +tp348 +a(I295 +I132 +I296 +I132 +tp349 +a(I296 +I132 +I296 +I133 +tp350 +a(I296 +I133 +I297 +I134 +tp351 +a(I297 +I134 +I298 +I135 +tp352 +a(I298 +I135 +I299 +I136 +tp353 +a(I299 +I136 +I299 +I137 +tp354 +a(I299 +I137 +I301 +I137 +tp355 +a(I301 +I137 +I302 +I138 +tp356 +a(I302 +I138 +I303 +I139 +tp357 +a(I303 +I139 +I304 +I139 +tp358 +a(I304 +I139 +I306 +I139 +tp359 +a(I306 +I139 +I307 +I139 +tp360 +a(I307 +I139 +I308 +I139 +tp361 +a(I308 +I139 +I309 +I139 +tp362 +a(I309 +I139 +I310 +I139 +tp363 +a(I310 +I139 +I311 +I139 +tp364 +a(I311 +I139 +I313 +I139 +tp365 +a(I313 +I139 +I314 +I139 +tp366 +a(I314 +I139 +I316 +I139 +tp367 +a(I316 +I139 +I317 +I139 +tp368 +a(I317 +I139 +I318 +I139 +tp369 +a(I318 +I139 +I319 +I139 +tp370 +a(I319 +I139 +I320 +I139 +tp371 +a(I320 +I139 +I321 +I138 +tp372 +a(I321 +I138 +I322 +I137 +tp373 +a(I322 +I137 +I324 +I137 +tp374 +a(I324 +I137 +I325 +I136 +tp375 +a(I325 +I136 +I326 +I134 +tp376 +a(I326 +I134 +I327 +I133 +tp377 +a(I327 +I133 +I327 +I131 +tp378 +a(I327 +I131 +I327 +I130 +tp379 +a(I327 +I130 +I328 +I128 +tp380 +a(I328 +I128 +I328 +I126 +tp381 +a(I328 +I126 +I329 +I126 +tp382 +a(I329 +I126 +I329 +I124 +tp383 +a(I329 +I124 +I329 +I123 +tp384 +a(I329 +I123 +I329 +I122 +tp385 +a(I329 +I122 +I329 +I121 +tp386 +a(I329 +I121 +I329 +I120 +tp387 +a(I329 +I120 +I329 +I119 +tp388 +a(I329 +I119 +I329 +I117 +tp389 +a(I329 +I117 +I329 +I116 +tp390 +a(I329 +I116 +I328 +I114 +tp391 +a(I328 +I114 +I328 +I113 +tp392 +a(I328 +I113 +I328 +I112 +tp393 +a(I328 +I112 +I328 +I111 +tp394 +a(I328 +I111 +I328 +I110 +tp395 +a(I328 +I110 +I328 +I109 +tp396 +a(I328 +I109 +I327 +I109 +tp397 +atp398 +a(g2 +I12 +(lp399 +(I326 +I131 +I326 +I132 +tp400 +a(I326 +I132 +I326 +I133 +tp401 +a(I326 +I133 +I326 +I134 +tp402 +a(I326 +I134 +I326 +I135 +tp403 +a(I326 +I135 +I326 +I136 +tp404 +a(I326 +I136 +I326 +I137 +tp405 +a(I326 +I137 +I326 +I138 +tp406 +a(I326 +I138 +I326 +I140 +tp407 +a(I326 +I140 +I326 +I141 +tp408 +a(I326 +I141 +I326 +I143 +tp409 +a(I326 +I143 +I326 +I144 +tp410 +a(I326 +I144 +I326 +I145 +tp411 +a(I326 +I145 +I326 +I147 +tp412 +a(I326 +I147 +I326 +I148 +tp413 +a(I326 +I148 +I325 +I150 +tp414 +a(I325 +I150 +I325 +I151 +tp415 +a(I325 +I151 +I325 +I152 +tp416 +a(I325 +I152 +I325 +I153 +tp417 +a(I325 +I153 +I325 +I154 +tp418 +a(I325 +I154 +I325 +I155 +tp419 +a(I325 +I155 +I325 +I156 +tp420 +a(I325 +I156 +I325 +I157 +tp421 +a(I325 +I157 +I325 +I158 +tp422 +a(I325 +I158 +I324 +I159 +tp423 +a(I324 +I159 +I324 +I160 +tp424 +a(I324 +I160 +I324 +I162 +tp425 +a(I324 +I162 +I324 +I163 +tp426 +a(I324 +I163 +I323 +I165 +tp427 +a(I323 +I165 +I323 +I166 +tp428 +a(I323 +I166 +I323 +I168 +tp429 +a(I323 +I168 +I323 +I169 +tp430 +a(I323 +I169 +I323 +I170 +tp431 +a(I323 +I170 +I323 +I172 +tp432 +a(I323 +I172 +I323 +I174 +tp433 +a(I323 +I174 +I323 +I176 +tp434 +a(I323 +I176 +I323 +I177 +tp435 +a(I323 +I177 +I323 +I178 +tp436 +a(I323 +I178 +I323 +I179 +tp437 +a(I323 +I179 +I323 +I180 +tp438 +a(I323 +I180 +I322 +I181 +tp439 +a(I322 +I181 +I322 +I182 +tp440 +a(I322 +I182 +I321 +I182 +tp441 +a(I321 +I182 +I321 +I183 +tp442 +a(I321 +I183 +I319 +I184 +tp443 +a(I319 +I184 +I317 +I185 +tp444 +a(I317 +I185 +I316 +I185 +tp445 +a(I316 +I185 +I314 +I185 +tp446 +a(I314 +I185 +I312 +I185 +tp447 +a(I312 +I185 +I310 +I185 +tp448 +a(I310 +I185 +I308 +I185 +tp449 +a(I308 +I185 +I307 +I185 +tp450 +a(I307 +I185 +I305 +I185 +tp451 +a(I305 +I185 +I303 +I185 +tp452 +a(I303 +I185 +I300 +I185 +tp453 +a(I300 +I185 +I298 +I185 +tp454 +a(I298 +I185 +I294 +I185 +tp455 +a(I294 +I185 +I292 +I185 +tp456 +a(I292 +I185 +I288 +I184 +tp457 +a(I288 +I184 +I286 +I184 +tp458 +a(I286 +I184 +I283 +I183 +tp459 +a(I283 +I183 +I282 +I182 +tp460 +a(I282 +I182 +I280 +I182 +tp461 +a(I280 +I182 +I277 +I181 +tp462 +a(I277 +I181 +I274 +I181 +tp463 +a(I274 +I181 +I271 +I180 +tp464 +a(I271 +I180 +I268 +I180 +tp465 +a(I268 +I180 +I265 +I180 +tp466 +a(I265 +I180 +I262 +I180 +tp467 +a(I262 +I180 +I261 +I180 +tp468 +a(I261 +I180 +I259 +I180 +tp469 +a(I259 +I180 +I258 +I180 +tp470 +a(I258 +I180 +I257 +I180 +tp471 +a(I257 +I180 +I256 +I180 +tp472 +a(I256 +I180 +I253 +I180 +tp473 +a(I253 +I180 +I251 +I180 +tp474 +a(I251 +I180 +I248 +I180 +tp475 +a(I248 +I180 +I246 +I181 +tp476 +a(I246 +I181 +I245 +I182 +tp477 +a(I245 +I182 +I244 +I182 +tp478 +a(I244 +I182 +I243 +I182 +tp479 +a(I243 +I182 +I242 +I183 +tp480 +a(I242 +I183 +I241 +I183 +tp481 +a(I241 +I183 +I241 +I184 +tp482 +a(I241 +I184 +I240 +I184 +tp483 +a(I240 +I184 +I239 +I185 +tp484 +a(I239 +I185 +I240 +I185 +tp485 +a(I240 +I185 +I241 +I185 +tp486 +a(I241 +I185 +I243 +I185 +tp487 +atp488 +a(g2 +I12 +(lp489 +(I352 +I69 +I352 +I70 +tp490 +a(I352 +I70 +I352 +I71 +tp491 +a(I352 +I71 +I351 +I71 +tp492 +a(I351 +I71 +I351 +I72 +tp493 +a(I351 +I72 +I351 +I73 +tp494 +a(I351 +I73 +I351 +I75 +tp495 +a(I351 +I75 +I350 +I78 +tp496 +a(I350 +I78 +I350 +I79 +tp497 +a(I350 +I79 +I350 +I82 +tp498 +a(I350 +I82 +I349 +I84 +tp499 +a(I349 +I84 +I349 +I87 +tp500 +a(I349 +I87 +I349 +I89 +tp501 +a(I349 +I89 +I349 +I93 +tp502 +a(I349 +I93 +I349 +I96 +tp503 +a(I349 +I96 +I349 +I98 +tp504 +a(I349 +I98 +I348 +I101 +tp505 +a(I348 +I101 +I348 +I103 +tp506 +a(I348 +I103 +I347 +I106 +tp507 +a(I347 +I106 +I346 +I109 +tp508 +a(I346 +I109 +I346 +I111 +tp509 +a(I346 +I111 +I346 +I114 +tp510 +a(I346 +I114 +I346 +I115 +tp511 +a(I346 +I115 +I346 +I118 +tp512 +a(I346 +I118 +I346 +I119 +tp513 +a(I346 +I119 +I346 +I121 +tp514 +a(I346 +I121 +I346 +I122 +tp515 +a(I346 +I122 +I346 +I124 +tp516 +a(I346 +I124 +I346 +I125 +tp517 +a(I346 +I125 +I346 +I127 +tp518 +a(I346 +I127 +I346 +I128 +tp519 +a(I346 +I128 +I346 +I129 +tp520 +a(I346 +I129 +I346 +I130 +tp521 +a(I346 +I130 +I346 +I131 +tp522 +a(I346 +I131 +I346 +I132 +tp523 +a(I346 +I132 +I346 +I133 +tp524 +a(I346 +I133 +I346 +I134 +tp525 +a(I346 +I134 +I347 +I134 +tp526 +a(I347 +I134 +I347 +I135 +tp527 +a(I347 +I135 +I348 +I135 +tp528 +atp529 +a(g2 +I12 +(lp530 +(I330 +I88 +I331 +I88 +tp531 +a(I331 +I88 +I331 +I89 +tp532 +a(I331 +I89 +I332 +I89 +tp533 +a(I332 +I89 +I334 +I90 +tp534 +a(I334 +I90 +I335 +I90 +tp535 +a(I335 +I90 +I337 +I91 +tp536 +a(I337 +I91 +I338 +I91 +tp537 +a(I338 +I91 +I341 +I91 +tp538 +a(I341 +I91 +I343 +I91 +tp539 +a(I343 +I91 +I346 +I91 +tp540 +a(I346 +I91 +I349 +I92 +tp541 +a(I349 +I92 +I351 +I92 +tp542 +a(I351 +I92 +I353 +I92 +tp543 +a(I353 +I92 +I355 +I92 +tp544 +a(I355 +I92 +I357 +I92 +tp545 +a(I357 +I92 +I358 +I92 +tp546 +a(I358 +I92 +I360 +I92 +tp547 +a(I360 +I92 +I361 +I92 +tp548 +a(I361 +I92 +I362 +I92 +tp549 +a(I362 +I92 +I363 +I92 +tp550 +a(I363 +I92 +I366 +I92 +tp551 +a(I366 +I92 +I369 +I92 +tp552 +a(I369 +I92 +I371 +I92 +tp553 +a(I371 +I92 +I373 +I92 +tp554 +a(I373 +I92 +I374 +I92 +tp555 +a(I374 +I92 +I376 +I92 +tp556 +a(I376 +I92 +I377 +I92 +tp557 +a(I377 +I92 +I379 +I92 +tp558 +a(I379 +I92 +I381 +I92 +tp559 +a(I381 +I92 +I384 +I92 +tp560 +a(I384 +I92 +I386 +I92 +tp561 +a(I386 +I92 +I387 +I92 +tp562 +a(I387 +I92 +I388 +I92 +tp563 +atp564 +a(g2 +I12 +(lp565 +(I387 +I53 +I387 +I54 +tp566 +a(I387 +I54 +I387 +I56 +tp567 +a(I387 +I56 +I387 +I57 +tp568 +a(I387 +I57 +I387 +I59 +tp569 +a(I387 +I59 +I387 +I60 +tp570 +a(I387 +I60 +I388 +I62 +tp571 +a(I388 +I62 +I388 +I63 +tp572 +a(I388 +I63 +I388 +I65 +tp573 +a(I388 +I65 +I388 +I66 +tp574 +a(I388 +I66 +I388 +I69 +tp575 +a(I388 +I69 +I389 +I71 +tp576 +a(I389 +I71 +I390 +I73 +tp577 +a(I390 +I73 +I390 +I75 +tp578 +a(I390 +I75 +I390 +I76 +tp579 +a(I390 +I76 +I390 +I79 +tp580 +a(I390 +I79 +I390 +I82 +tp581 +a(I390 +I82 +I389 +I85 +tp582 +a(I389 +I85 +I389 +I87 +tp583 +a(I389 +I87 +I389 +I90 +tp584 +a(I389 +I90 +I389 +I93 +tp585 +a(I389 +I93 +I390 +I94 +tp586 +a(I390 +I94 +I390 +I97 +tp587 +a(I390 +I97 +I390 +I99 +tp588 +a(I390 +I99 +I390 +I101 +tp589 +a(I390 +I101 +I390 +I102 +tp590 +a(I390 +I102 +I390 +I104 +tp591 +a(I390 +I104 +I390 +I105 +tp592 +a(I390 +I105 +I390 +I107 +tp593 +a(I390 +I107 +I390 +I108 +tp594 +a(I390 +I108 +I390 +I110 +tp595 +a(I390 +I110 +I390 +I112 +tp596 +a(I390 +I112 +I390 +I113 +tp597 +a(I390 +I113 +I390 +I114 +tp598 +a(I390 +I114 +I390 +I115 +tp599 +a(I390 +I115 +I390 +I117 +tp600 +a(I390 +I117 +I390 +I118 +tp601 +a(I390 +I118 +I390 +I120 +tp602 +a(I390 +I120 +I391 +I120 +tp603 +a(I391 +I120 +I391 +I121 +tp604 +a(I391 +I121 +I391 +I122 +tp605 +a(I391 +I122 +I391 +I123 +tp606 +a(I391 +I123 +I391 +I124 +tp607 +a(I391 +I124 +I391 +I125 +tp608 +a(I391 +I125 +I391 +I126 +tp609 +a(I391 +I126 +I391 +I127 +tp610 +a(I391 +I127 +I391 +I128 +tp611 +a(I391 +I128 +I391 +I129 +tp612 +a(I391 +I129 +I391 +I130 +tp613 +a(I391 +I130 +I391 +I131 +tp614 +a(I391 +I131 +I391 +I132 +tp615 +a(I391 +I132 +I390 +I132 +tp616 +a(I390 +I132 +I390 +I133 +tp617 +a(I390 +I133 +I390 +I134 +tp618 +a(I390 +I134 +I390 +I135 +tp619 +a(I390 +I135 +I390 +I136 +tp620 +atp621 +a(g2 +I12 +(lp622 +(I390 +I109 +I390 +I108 +tp623 +a(I390 +I108 +I391 +I108 +tp624 +a(I391 +I108 +I391 +I107 +tp625 +a(I391 +I107 +I391 +I106 +tp626 +a(I391 +I106 +I391 +I105 +tp627 +a(I391 +I105 +I391 +I104 +tp628 +a(I391 +I104 +I391 +I103 +tp629 +a(I391 +I103 +I391 +I102 +tp630 +a(I391 +I102 +I392 +I101 +tp631 +a(I392 +I101 +I392 +I100 +tp632 +a(I392 +I100 +I393 +I100 +tp633 +a(I393 +I100 +I393 +I99 +tp634 +a(I393 +I99 +I393 +I98 +tp635 +a(I393 +I98 +I393 +I97 +tp636 +a(I393 +I97 +I394 +I97 +tp637 +a(I394 +I97 +I395 +I96 +tp638 +a(I395 +I96 +I396 +I95 +tp639 +a(I396 +I95 +I396 +I94 +tp640 +a(I396 +I94 +I397 +I93 +tp641 +a(I397 +I93 +I398 +I92 +tp642 +a(I398 +I92 +I399 +I92 +tp643 +a(I399 +I92 +I400 +I91 +tp644 +a(I400 +I91 +I400 +I90 +tp645 +a(I400 +I90 +I401 +I90 +tp646 +a(I401 +I90 +I402 +I90 +tp647 +a(I402 +I90 +I403 +I90 +tp648 +a(I403 +I90 +I405 +I89 +tp649 +a(I405 +I89 +I406 +I89 +tp650 +a(I406 +I89 +I408 +I89 +tp651 +a(I408 +I89 +I410 +I89 +tp652 +a(I410 +I89 +I411 +I89 +tp653 +a(I411 +I89 +I413 +I89 +tp654 +a(I413 +I89 +I414 +I89 +tp655 +a(I414 +I89 +I416 +I89 +tp656 +a(I416 +I89 +I417 +I89 +tp657 +a(I417 +I89 +I418 +I90 +tp658 +a(I418 +I90 +I419 +I90 +tp659 +a(I419 +I90 +I420 +I90 +tp660 +a(I420 +I90 +I421 +I90 +tp661 +a(I421 +I90 +I422 +I91 +tp662 +a(I422 +I91 +I423 +I92 +tp663 +a(I423 +I92 +I424 +I92 +tp664 +a(I424 +I92 +I424 +I93 +tp665 +a(I424 +I93 +I425 +I94 +tp666 +a(I425 +I94 +I426 +I94 +tp667 +a(I426 +I94 +I426 +I95 +tp668 +a(I426 +I95 +I426 +I96 +tp669 +a(I426 +I96 +I426 +I97 +tp670 +a(I426 +I97 +I426 +I98 +tp671 +a(I426 +I98 +I426 +I99 +tp672 +a(I426 +I99 +I426 +I100 +tp673 +a(I426 +I100 +I426 +I101 +tp674 +a(I426 +I101 +I426 +I103 +tp675 +a(I426 +I103 +I426 +I104 +tp676 +a(I426 +I104 +I426 +I105 +tp677 +a(I426 +I105 +I426 +I106 +tp678 +a(I426 +I106 +I426 +I107 +tp679 +a(I426 +I107 +I426 +I108 +tp680 +a(I426 +I108 +I426 +I109 +tp681 +a(I426 +I109 +I426 +I110 +tp682 +a(I426 +I110 +I426 +I111 +tp683 +a(I426 +I111 +I426 +I112 +tp684 +a(I426 +I112 +I426 +I113 +tp685 +a(I426 +I113 +I426 +I114 +tp686 +a(I426 +I114 +I426 +I115 +tp687 +a(I426 +I115 +I426 +I116 +tp688 +a(I426 +I116 +I426 +I117 +tp689 +a(I426 +I117 +I426 +I118 +tp690 +a(I426 +I118 +I426 +I119 +tp691 +a(I426 +I119 +I426 +I120 +tp692 +a(I426 +I120 +I427 +I120 +tp693 +a(I427 +I120 +I427 +I121 +tp694 +a(I427 +I121 +I427 +I122 +tp695 +a(I427 +I122 +I428 +I122 +tp696 +a(I428 +I122 +I428 +I124 +tp697 +a(I428 +I124 +I428 +I125 +tp698 +a(I428 +I125 +I428 +I126 +tp699 +a(I428 +I126 +I428 +I127 +tp700 +a(I428 +I127 +I429 +I127 +tp701 +a(I429 +I127 +I429 +I128 +tp702 +a(I429 +I128 +I430 +I128 +tp703 +a(I430 +I128 +I430 +I129 +tp704 +a(I430 +I129 +I430 +I130 +tp705 +a(I430 +I130 +I430 +I131 +tp706 +a(I430 +I131 +I430 +I132 +tp707 +a(I430 +I132 +I430 +I133 +tp708 +a(I430 +I133 +I431 +I133 +tp709 +a(I431 +I133 +I432 +I133 +tp710 +a(I432 +I133 +I432 +I134 +tp711 +a(I432 +I134 +I432 +I135 +tp712 +atp713 +a(g2 +I12 +(lp714 +(I465 +I90 +I464 +I90 +tp715 +a(I464 +I90 +I463 +I91 +tp716 +a(I463 +I91 +I462 +I92 +tp717 +a(I462 +I92 +I460 +I93 +tp718 +a(I460 +I93 +I460 +I94 +tp719 +a(I460 +I94 +I459 +I95 +tp720 +a(I459 +I95 +I458 +I96 +tp721 +a(I458 +I96 +I458 +I97 +tp722 +a(I458 +I97 +I457 +I98 +tp723 +a(I457 +I98 +I457 +I99 +tp724 +a(I457 +I99 +I456 +I100 +tp725 +a(I456 +I100 +I455 +I101 +tp726 +a(I455 +I101 +I455 +I103 +tp727 +a(I455 +I103 +I455 +I104 +tp728 +a(I455 +I104 +I455 +I106 +tp729 +a(I455 +I106 +I454 +I107 +tp730 +a(I454 +I107 +I454 +I109 +tp731 +a(I454 +I109 +I454 +I111 +tp732 +a(I454 +I111 +I454 +I112 +tp733 +a(I454 +I112 +I454 +I113 +tp734 +a(I454 +I113 +I454 +I114 +tp735 +a(I454 +I114 +I454 +I115 +tp736 +a(I454 +I115 +I455 +I115 +tp737 +a(I455 +I115 +I456 +I117 +tp738 +a(I456 +I117 +I457 +I118 +tp739 +a(I457 +I118 +I457 +I119 +tp740 +a(I457 +I119 +I458 +I120 +tp741 +a(I458 +I120 +I460 +I121 +tp742 +a(I460 +I121 +I462 +I122 +tp743 +a(I462 +I122 +I465 +I124 +tp744 +a(I465 +I124 +I467 +I125 +tp745 +a(I467 +I125 +I468 +I126 +tp746 +a(I468 +I126 +I470 +I126 +tp747 +a(I470 +I126 +I472 +I127 +tp748 +a(I472 +I127 +I473 +I127 +tp749 +a(I473 +I127 +I474 +I128 +tp750 +a(I474 +I128 +I475 +I128 +tp751 +a(I475 +I128 +I476 +I128 +tp752 +a(I476 +I128 +I477 +I128 +tp753 +a(I477 +I128 +I477 +I129 +tp754 +a(I477 +I129 +I479 +I129 +tp755 +a(I479 +I129 +I481 +I129 +tp756 +a(I481 +I129 +I483 +I129 +tp757 +a(I483 +I129 +I485 +I128 +tp758 +a(I485 +I128 +I486 +I128 +tp759 +a(I486 +I128 +I487 +I127 +tp760 +a(I487 +I127 +I488 +I127 +tp761 +a(I488 +I127 +I489 +I127 +tp762 +a(I489 +I127 +I490 +I126 +tp763 +a(I490 +I126 +I491 +I126 +tp764 +a(I491 +I126 +I492 +I126 +tp765 +a(I492 +I126 +I493 +I124 +tp766 +a(I493 +I124 +I494 +I123 +tp767 +a(I494 +I123 +I495 +I123 +tp768 +a(I495 +I123 +I495 +I121 +tp769 +a(I495 +I121 +I496 +I120 +tp770 +a(I496 +I120 +I496 +I118 +tp771 +a(I496 +I118 +I496 +I117 +tp772 +a(I496 +I117 +I496 +I115 +tp773 +a(I496 +I115 +I497 +I113 +tp774 +a(I497 +I113 +I497 +I112 +tp775 +a(I497 +I112 +I497 +I110 +tp776 +a(I497 +I110 +I497 +I109 +tp777 +a(I497 +I109 +I496 +I108 +tp778 +a(I496 +I108 +I496 +I107 +tp779 +a(I496 +I107 +I496 +I106 +tp780 +a(I496 +I106 +I495 +I105 +tp781 +a(I495 +I105 +I495 +I104 +tp782 +a(I495 +I104 +I494 +I103 +tp783 +a(I494 +I103 +I493 +I100 +tp784 +a(I493 +I100 +I493 +I98 +tp785 +a(I493 +I98 +I492 +I97 +tp786 +a(I492 +I97 +I491 +I96 +tp787 +a(I491 +I96 +I491 +I95 +tp788 +a(I491 +I95 +I490 +I94 +tp789 +a(I490 +I94 +I489 +I94 +tp790 +a(I489 +I94 +I489 +I93 +tp791 +a(I489 +I93 +I488 +I92 +tp792 +a(I488 +I92 +I487 +I91 +tp793 +a(I487 +I91 +I486 +I90 +tp794 +a(I486 +I90 +I485 +I89 +tp795 +a(I485 +I89 +I484 +I89 +tp796 +a(I484 +I89 +I484 +I88 +tp797 +a(I484 +I88 +I483 +I88 +tp798 +a(I483 +I88 +I482 +I88 +tp799 +a(I482 +I88 +I481 +I88 +tp800 +a(I481 +I88 +I480 +I88 +tp801 +a(I480 +I88 +I479 +I87 +tp802 +a(I479 +I87 +I477 +I87 +tp803 +a(I477 +I87 +I476 +I87 +tp804 +a(I476 +I87 +I475 +I87 +tp805 +a(I475 +I87 +I473 +I87 +tp806 +a(I473 +I87 +I472 +I87 +tp807 +a(I472 +I87 +I471 +I87 +tp808 +a(I471 +I87 +I470 +I87 +tp809 +a(I470 +I87 +I469 +I87 +tp810 +a(I469 +I87 +I467 +I88 +tp811 +a(I467 +I88 +I466 +I88 +tp812 +a(I466 +I88 +I465 +I89 +tp813 +a(I465 +I89 +I464 +I89 +tp814 +a(I464 +I89 +I463 +I89 +tp815 +a(I463 +I89 +I462 +I89 +tp816 +a(I462 +I89 +I462 +I90 +tp817 +atp818 +a(g2 +I12 +(lp819 +(I524 +I89 +I524 +I90 +tp820 +a(I524 +I90 +I524 +I91 +tp821 +a(I524 +I91 +I524 +I93 +tp822 +a(I524 +I93 +I524 +I95 +tp823 +a(I524 +I95 +I524 +I96 +tp824 +a(I524 +I96 +I524 +I98 +tp825 +a(I524 +I98 +I524 +I99 +tp826 +a(I524 +I99 +I524 +I101 +tp827 +a(I524 +I101 +I524 +I102 +tp828 +a(I524 +I102 +I524 +I104 +tp829 +a(I524 +I104 +I525 +I105 +tp830 +a(I525 +I105 +I525 +I107 +tp831 +a(I525 +I107 +I526 +I109 +tp832 +a(I526 +I109 +I526 +I110 +tp833 +a(I526 +I110 +I526 +I112 +tp834 +a(I526 +I112 +I527 +I113 +tp835 +a(I527 +I113 +I527 +I114 +tp836 +a(I527 +I114 +I527 +I115 +tp837 +a(I527 +I115 +I527 +I116 +tp838 +a(I527 +I116 +I528 +I116 +tp839 +a(I528 +I116 +I528 +I118 +tp840 +a(I528 +I118 +I528 +I119 +tp841 +a(I528 +I119 +I529 +I120 +tp842 +a(I529 +I120 +I529 +I121 +tp843 +a(I529 +I121 +I529 +I122 +tp844 +a(I529 +I122 +I529 +I123 +tp845 +a(I529 +I123 +I529 +I124 +tp846 +a(I529 +I124 +I529 +I125 +tp847 +a(I529 +I125 +I529 +I126 +tp848 +a(I529 +I126 +I529 +I127 +tp849 +a(I529 +I127 +I530 +I127 +tp850 +a(I530 +I127 +I530 +I128 +tp851 +a(I530 +I128 +I530 +I129 +tp852 +a(I530 +I129 +I530 +I130 +tp853 +a(I530 +I130 +I531 +I130 +tp854 +a(I531 +I130 +I531 +I131 +tp855 +a(I531 +I131 +I531 +I133 +tp856 +a(I531 +I133 +I531 +I134 +tp857 +a(I531 +I134 +I532 +I134 +tp858 +a(I532 +I134 +I532 +I135 +tp859 +a(I532 +I135 +I533 +I136 +tp860 +a(I533 +I136 +I533 +I137 +tp861 +a(I533 +I137 +I533 +I138 +tp862 +a(I533 +I138 +I534 +I138 +tp863 +a(I534 +I138 +I534 +I139 +tp864 +atp865 +a(g2 +I12 +(lp866 +(I528 +I101 +I529 +I101 +tp867 +a(I529 +I101 +I530 +I101 +tp868 +a(I530 +I101 +I530 +I100 +tp869 +a(I530 +I100 +I531 +I100 +tp870 +a(I531 +I100 +I532 +I100 +tp871 +a(I532 +I100 +I533 +I100 +tp872 +a(I533 +I100 +I533 +I99 +tp873 +a(I533 +I99 +I534 +I99 +tp874 +a(I534 +I99 +I534 +I98 +tp875 +a(I534 +I98 +I535 +I98 +tp876 +a(I535 +I98 +I536 +I98 +tp877 +a(I536 +I98 +I537 +I97 +tp878 +a(I537 +I97 +I539 +I97 +tp879 +a(I539 +I97 +I540 +I97 +tp880 +a(I540 +I97 +I542 +I96 +tp881 +a(I542 +I96 +I543 +I96 +tp882 +a(I543 +I96 +I543 +I95 +tp883 +a(I543 +I95 +I545 +I95 +tp884 +a(I545 +I95 +I546 +I95 +tp885 +a(I546 +I95 +I549 +I95 +tp886 +a(I549 +I95 +I552 +I95 +tp887 +a(I552 +I95 +I555 +I94 +tp888 +a(I555 +I94 +I560 +I94 +tp889 +a(I560 +I94 +I562 +I94 +tp890 +a(I562 +I94 +I565 +I94 +tp891 +a(I565 +I94 +I567 +I94 +tp892 +a(I567 +I94 +I569 +I94 +tp893 +a(I569 +I94 +I570 +I94 +tp894 +a(I570 +I94 +I571 +I94 +tp895 +a(I571 +I94 +I572 +I94 +tp896 +a(I572 +I94 +I573 +I95 +tp897 +a(I573 +I95 +I574 +I95 +tp898 +a(I574 +I95 +I574 +I96 +tp899 +a(I574 +I96 +I576 +I96 +tp900 +a(I576 +I96 +I577 +I97 +tp901 +a(I577 +I97 +I577 +I98 +tp902 +a(I577 +I98 +I578 +I98 +tp903 +a(I578 +I98 +I579 +I99 +tp904 +a(I579 +I99 +I579 +I100 +tp905 +a(I579 +I100 +I579 +I101 +tp906 +a(I579 +I101 +I579 +I102 +tp907 +a(I579 +I102 +I579 +I103 +tp908 +a(I579 +I103 +I580 +I104 +tp909 +a(I580 +I104 +I580 +I106 +tp910 +a(I580 +I106 +I580 +I107 +tp911 +a(I580 +I107 +I580 +I108 +tp912 +a(I580 +I108 +I580 +I109 +tp913 +a(I580 +I109 +I579 +I111 +tp914 +a(I579 +I111 +I579 +I112 +tp915 +a(I579 +I112 +I579 +I113 +tp916 +a(I579 +I113 +I579 +I114 +tp917 +a(I579 +I114 +I579 +I115 +tp918 +a(I579 +I115 +I579 +I116 +tp919 +a(I579 +I116 +I579 +I117 +tp920 +a(I579 +I117 +I579 +I118 +tp921 +a(I579 +I118 +I579 +I120 +tp922 +a(I579 +I120 +I579 +I121 +tp923 +a(I579 +I121 +I579 +I123 +tp924 +a(I579 +I123 +I579 +I125 +tp925 +a(I579 +I125 +I578 +I125 +tp926 +a(I578 +I125 +I578 +I127 +tp927 +a(I578 +I127 +I578 +I128 +tp928 +a(I578 +I128 +I578 +I129 +tp929 +a(I578 +I129 +I578 +I130 +tp930 +a(I578 +I130 +I578 +I131 +tp931 +a(I578 +I131 +I578 +I133 +tp932 +a(I578 +I133 +I578 +I134 +tp933 +a(I578 +I134 +I578 +I136 +tp934 +a(I578 +I136 +I579 +I136 +tp935 +a(I579 +I136 +I579 +I137 +tp936 +a(I579 +I137 +I579 +I138 +tp937 +a(I579 +I138 +I580 +I139 +tp938 +a(I580 +I139 +I580 +I140 +tp939 +a(I580 +I140 +I581 +I141 +tp940 +a(I581 +I141 +I581 +I143 +tp941 +a(I581 +I143 +I581 +I144 +tp942 +a(I581 +I144 +I582 +I144 +tp943 +a(I582 +I144 +I582 +I145 +tp944 +a(I582 +I145 +I582 +I146 +tp945 +a(I582 +I146 +I583 +I146 +tp946 +a(I583 +I146 +I583 +I147 +tp947 +a(I583 +I147 +I584 +I147 +tp948 +a(I584 +I147 +I584 +I148 +tp949 +atp950 +a(S'Purple' +p951 +I12 +(lp952 +(I142 +I246 +I142 +I247 +tp953 +a(I142 +I247 +I142 +I248 +tp954 +a(I142 +I248 +I142 +I249 +tp955 +a(I142 +I249 +I142 +I251 +tp956 +a(I142 +I251 +I142 +I253 +tp957 +a(I142 +I253 +I142 +I255 +tp958 +a(I142 +I255 +I142 +I257 +tp959 +a(I142 +I257 +I142 +I260 +tp960 +a(I142 +I260 +I142 +I263 +tp961 +a(I142 +I263 +I142 +I266 +tp962 +a(I142 +I266 +I142 +I270 +tp963 +a(I142 +I270 +I142 +I273 +tp964 +a(I142 +I273 +I142 +I277 +tp965 +a(I142 +I277 +I142 +I282 +tp966 +a(I142 +I282 +I142 +I287 +tp967 +a(I142 +I287 +I142 +I292 +tp968 +a(I142 +I292 +I142 +I298 +tp969 +a(I142 +I298 +I143 +I303 +tp970 +a(I143 +I303 +I143 +I308 +tp971 +a(I143 +I308 +I143 +I313 +tp972 +a(I143 +I313 +I143 +I318 +tp973 +a(I143 +I318 +I143 +I323 +tp974 +a(I143 +I323 +I143 +I328 +tp975 +a(I143 +I328 +I143 +I333 +tp976 +a(I143 +I333 +I143 +I338 +tp977 +a(I143 +I338 +I143 +I343 +tp978 +a(I143 +I343 +I143 +I346 +tp979 +a(I143 +I346 +I143 +I351 +tp980 +a(I143 +I351 +I144 +I355 +tp981 +a(I144 +I355 +I144 +I357 +tp982 +a(I144 +I357 +I144 +I360 +tp983 +a(I144 +I360 +I144 +I361 +tp984 +a(I144 +I361 +I144 +I363 +tp985 +a(I144 +I363 +I144 +I364 +tp986 +a(I144 +I364 +I144 +I365 +tp987 +a(I144 +I365 +I144 +I366 +tp988 +a(I144 +I366 +I144 +I367 +tp989 +a(I144 +I367 +I144 +I368 +tp990 +a(I144 +I368 +I145 +I368 +tp991 +a(I145 +I368 +I146 +I368 +tp992 +a(I146 +I368 +I146 +I367 +tp993 +atp994 +a(g951 +I12 +(lp995 +(I148 +I247 +I149 +I247 +tp996 +a(I149 +I247 +I150 +I246 +tp997 +a(I150 +I246 +I152 +I245 +tp998 +a(I152 +I245 +I156 +I244 +tp999 +a(I156 +I244 +I159 +I243 +tp1000 +a(I159 +I243 +I163 +I241 +tp1001 +a(I163 +I241 +I169 +I240 +tp1002 +a(I169 +I240 +I172 +I239 +tp1003 +a(I172 +I239 +I176 +I238 +tp1004 +a(I176 +I238 +I178 +I237 +tp1005 +a(I178 +I237 +I182 +I237 +tp1006 +a(I182 +I237 +I188 +I237 +tp1007 +a(I188 +I237 +I195 +I237 +tp1008 +a(I195 +I237 +I203 +I237 +tp1009 +a(I203 +I237 +I212 +I239 +tp1010 +a(I212 +I239 +I220 +I239 +tp1011 +a(I220 +I239 +I229 +I239 +tp1012 +a(I229 +I239 +I232 +I240 +tp1013 +a(I232 +I240 +I233 +I240 +tp1014 +a(I233 +I240 +I234 +I240 +tp1015 +a(I234 +I240 +I235 +I242 +tp1016 +a(I235 +I242 +I236 +I242 +tp1017 +a(I236 +I242 +I236 +I244 +tp1018 +a(I236 +I244 +I237 +I246 +tp1019 +a(I237 +I246 +I239 +I247 +tp1020 +a(I239 +I247 +I239 +I249 +tp1021 +a(I239 +I249 +I239 +I250 +tp1022 +a(I239 +I250 +I239 +I252 +tp1023 +a(I239 +I252 +I239 +I253 +tp1024 +a(I239 +I253 +I238 +I256 +tp1025 +a(I238 +I256 +I237 +I259 +tp1026 +a(I237 +I259 +I235 +I260 +tp1027 +a(I235 +I260 +I234 +I263 +tp1028 +a(I234 +I263 +I233 +I266 +tp1029 +a(I233 +I266 +I229 +I268 +tp1030 +a(I229 +I268 +I226 +I269 +tp1031 +a(I226 +I269 +I224 +I271 +tp1032 +a(I224 +I271 +I221 +I273 +tp1033 +a(I221 +I273 +I219 +I274 +tp1034 +a(I219 +I274 +I218 +I275 +tp1035 +a(I218 +I275 +I216 +I275 +tp1036 +a(I216 +I275 +I215 +I275 +tp1037 +a(I215 +I275 +I214 +I275 +tp1038 +a(I214 +I275 +I212 +I275 +tp1039 +a(I212 +I275 +I209 +I275 +tp1040 +a(I209 +I275 +I204 +I276 +tp1041 +a(I204 +I276 +I197 +I276 +tp1042 +a(I197 +I276 +I194 +I277 +tp1043 +a(I194 +I277 +I190 +I278 +tp1044 +a(I190 +I278 +I189 +I279 +tp1045 +a(I189 +I279 +I187 +I280 +tp1046 +a(I187 +I280 +I185 +I280 +tp1047 +a(I185 +I280 +I183 +I281 +tp1048 +a(I183 +I281 +I182 +I282 +tp1049 +a(I182 +I282 +I179 +I283 +tp1050 +a(I179 +I283 +I177 +I284 +tp1051 +a(I177 +I284 +I175 +I285 +tp1052 +a(I175 +I285 +I174 +I286 +tp1053 +a(I174 +I286 +I172 +I287 +tp1054 +a(I172 +I287 +I171 +I287 +tp1055 +a(I171 +I287 +I171 +I288 +tp1056 +a(I171 +I288 +I169 +I289 +tp1057 +a(I169 +I289 +I167 +I290 +tp1058 +a(I167 +I290 +I166 +I290 +tp1059 +a(I166 +I290 +I164 +I292 +tp1060 +a(I164 +I292 +I162 +I294 +tp1061 +a(I162 +I294 +I161 +I295 +tp1062 +a(I161 +I295 +I160 +I295 +tp1063 +a(I160 +I295 +I159 +I296 +tp1064 +a(I159 +I296 +I159 +I297 +tp1065 +a(I159 +I297 +I158 +I297 +tp1066 +a(I158 +I297 +I157 +I298 +tp1067 +a(I157 +I298 +I157 +I299 +tp1068 +a(I157 +I299 +I156 +I299 +tp1069 +a(I156 +I299 +I156 +I300 +tp1070 +a(I156 +I300 +I155 +I300 +tp1071 +a(I155 +I300 +I155 +I301 +tp1072 +a(I155 +I301 +I154 +I301 +tp1073 +a(I154 +I301 +I153 +I301 +tp1074 +a(I153 +I301 +I153 +I302 +tp1075 +a(I153 +I302 +I153 +I303 +tp1076 +a(I153 +I303 +I152 +I303 +tp1077 +a(I152 +I303 +I151 +I304 +tp1078 +a(I151 +I304 +I151 +I305 +tp1079 +a(I151 +I305 +I150 +I306 +tp1080 +a(I150 +I306 +I150 +I308 +tp1081 +a(I150 +I308 +I148 +I309 +tp1082 +a(I148 +I309 +I147 +I309 +tp1083 +a(I147 +I309 +I147 +I311 +tp1084 +a(I147 +I311 +I147 +I312 +tp1085 +a(I147 +I312 +I148 +I311 +tp1086 +a(I148 +I311 +I149 +I311 +tp1087 +a(I149 +I311 +I150 +I310 +tp1088 +atp1089 +a(g951 +I12 +(lp1090 +(I155 +I304 +I156 +I304 +tp1091 +a(I156 +I304 +I157 +I304 +tp1092 +a(I157 +I304 +I160 +I304 +tp1093 +a(I160 +I304 +I163 +I304 +tp1094 +a(I163 +I304 +I165 +I304 +tp1095 +a(I165 +I304 +I169 +I304 +tp1096 +a(I169 +I304 +I174 +I305 +tp1097 +a(I174 +I305 +I179 +I305 +tp1098 +a(I179 +I305 +I184 +I306 +tp1099 +a(I184 +I306 +I185 +I307 +tp1100 +a(I185 +I307 +I187 +I307 +tp1101 +a(I187 +I307 +I188 +I307 +tp1102 +a(I188 +I307 +I190 +I308 +tp1103 +a(I190 +I308 +I191 +I309 +tp1104 +a(I191 +I309 +I192 +I310 +tp1105 +a(I192 +I310 +I193 +I310 +tp1106 +a(I193 +I310 +I195 +I311 +tp1107 +a(I195 +I311 +I198 +I313 +tp1108 +a(I198 +I313 +I200 +I315 +tp1109 +a(I200 +I315 +I204 +I318 +tp1110 +a(I204 +I318 +I210 +I320 +tp1111 +a(I210 +I320 +I212 +I323 +tp1112 +a(I212 +I323 +I215 +I324 +tp1113 +a(I215 +I324 +I218 +I327 +tp1114 +a(I218 +I327 +I218 +I328 +tp1115 +a(I218 +I328 +I220 +I330 +tp1116 +a(I220 +I330 +I222 +I333 +tp1117 +a(I222 +I333 +I224 +I335 +tp1118 +a(I224 +I335 +I225 +I337 +tp1119 +a(I225 +I337 +I226 +I339 +tp1120 +a(I226 +I339 +I228 +I342 +tp1121 +a(I228 +I342 +I231 +I343 +tp1122 +a(I231 +I343 +I233 +I346 +tp1123 +a(I233 +I346 +I234 +I348 +tp1124 +a(I234 +I348 +I236 +I350 +tp1125 +a(I236 +I350 +I237 +I350 +tp1126 +a(I237 +I350 +I237 +I352 +tp1127 +a(I237 +I352 +I239 +I353 +tp1128 +a(I239 +I353 +I240 +I353 +tp1129 +a(I240 +I353 +I241 +I353 +tp1130 +a(I241 +I353 +I241 +I354 +tp1131 +a(I241 +I354 +I242 +I354 +tp1132 +a(I242 +I354 +I243 +I354 +tp1133 +a(I243 +I354 +I244 +I354 +tp1134 +a(I244 +I354 +I245 +I354 +tp1135 +a(I245 +I354 +I246 +I354 +tp1136 +a(I246 +I354 +I247 +I354 +tp1137 +a(I247 +I354 +I248 +I354 +tp1138 +a(I248 +I354 +I248 +I353 +tp1139 +a(I248 +I353 +I248 +I352 +tp1140 +a(I248 +I352 +I248 +I351 +tp1141 +atp1142 +a(g951 +I12 +(lp1143 +(I287 +I308 +I286 +I308 +tp1144 +a(I286 +I308 +I285 +I308 +tp1145 +a(I285 +I308 +I284 +I308 +tp1146 +a(I284 +I308 +I283 +I308 +tp1147 +a(I283 +I308 +I282 +I308 +tp1148 +a(I282 +I308 +I281 +I309 +tp1149 +a(I281 +I309 +I281 +I310 +tp1150 +a(I281 +I310 +I280 +I310 +tp1151 +a(I280 +I310 +I278 +I312 +tp1152 +a(I278 +I312 +I278 +I313 +tp1153 +a(I278 +I313 +I276 +I314 +tp1154 +a(I276 +I314 +I274 +I316 +tp1155 +a(I274 +I316 +I273 +I318 +tp1156 +a(I273 +I318 +I271 +I320 +tp1157 +a(I271 +I320 +I270 +I322 +tp1158 +a(I270 +I322 +I270 +I323 +tp1159 +a(I270 +I323 +I270 +I325 +tp1160 +a(I270 +I325 +I270 +I326 +tp1161 +a(I270 +I326 +I270 +I328 +tp1162 +a(I270 +I328 +I271 +I330 +tp1163 +a(I271 +I330 +I271 +I331 +tp1164 +a(I271 +I331 +I272 +I333 +tp1165 +a(I272 +I333 +I273 +I335 +tp1166 +a(I273 +I335 +I274 +I336 +tp1167 +a(I274 +I336 +I275 +I338 +tp1168 +a(I275 +I338 +I276 +I340 +tp1169 +a(I276 +I340 +I278 +I341 +tp1170 +a(I278 +I341 +I279 +I343 +tp1171 +a(I279 +I343 +I282 +I345 +tp1172 +a(I282 +I345 +I285 +I346 +tp1173 +a(I285 +I346 +I287 +I347 +tp1174 +a(I287 +I347 +I289 +I348 +tp1175 +a(I289 +I348 +I292 +I349 +tp1176 +a(I292 +I349 +I293 +I350 +tp1177 +a(I293 +I350 +I295 +I351 +tp1178 +a(I295 +I351 +I297 +I352 +tp1179 +a(I297 +I352 +I300 +I352 +tp1180 +a(I300 +I352 +I302 +I352 +tp1181 +a(I302 +I352 +I305 +I352 +tp1182 +a(I305 +I352 +I307 +I352 +tp1183 +a(I307 +I352 +I310 +I352 +tp1184 +a(I310 +I352 +I311 +I352 +tp1185 +a(I311 +I352 +I312 +I352 +tp1186 +a(I312 +I352 +I313 +I352 +tp1187 +a(I313 +I352 +I314 +I351 +tp1188 +a(I314 +I351 +I315 +I350 +tp1189 +a(I315 +I350 +I316 +I349 +tp1190 +a(I316 +I349 +I317 +I348 +tp1191 +a(I317 +I348 +I318 +I346 +tp1192 +a(I318 +I346 +I318 +I345 +tp1193 +a(I318 +I345 +I319 +I344 +tp1194 +a(I319 +I344 +I319 +I343 +tp1195 +a(I319 +I343 +I320 +I342 +tp1196 +a(I320 +I342 +I320 +I341 +tp1197 +a(I320 +I341 +I320 +I339 +tp1198 +a(I320 +I339 +I320 +I338 +tp1199 +a(I320 +I338 +I320 +I336 +tp1200 +a(I320 +I336 +I320 +I335 +tp1201 +a(I320 +I335 +I320 +I333 +tp1202 +a(I320 +I333 +I319 +I331 +tp1203 +a(I319 +I331 +I318 +I330 +tp1204 +a(I318 +I330 +I316 +I328 +tp1205 +a(I316 +I328 +I315 +I326 +tp1206 +a(I315 +I326 +I314 +I325 +tp1207 +a(I314 +I325 +I313 +I324 +tp1208 +a(I313 +I324 +I312 +I322 +tp1209 +a(I312 +I322 +I311 +I321 +tp1210 +a(I311 +I321 +I310 +I320 +tp1211 +a(I310 +I320 +I309 +I319 +tp1212 +a(I309 +I319 +I308 +I319 +tp1213 +a(I308 +I319 +I306 +I318 +tp1214 +a(I306 +I318 +I305 +I318 +tp1215 +a(I305 +I318 +I304 +I317 +tp1216 +a(I304 +I317 +I302 +I316 +tp1217 +a(I302 +I316 +I301 +I315 +tp1218 +a(I301 +I315 +I300 +I315 +tp1219 +a(I300 +I315 +I299 +I314 +tp1220 +a(I299 +I314 +I297 +I314 +tp1221 +a(I297 +I314 +I296 +I314 +tp1222 +a(I296 +I314 +I295 +I313 +tp1223 +a(I295 +I313 +I294 +I313 +tp1224 +a(I294 +I313 +I294 +I312 +tp1225 +a(I294 +I312 +I293 +I312 +tp1226 +a(I293 +I312 +I292 +I312 +tp1227 +a(I292 +I312 +I290 +I312 +tp1228 +a(I290 +I312 +I289 +I311 +tp1229 +a(I289 +I311 +I288 +I311 +tp1230 +a(I288 +I311 +I288 +I310 +tp1231 +a(I288 +I310 +I286 +I310 +tp1232 +a(I286 +I310 +I285 +I309 +tp1233 +a(I285 +I309 +I284 +I309 +tp1234 +atp1235 +a(g951 +I12 +(lp1236 +(I364 +I307 +I362 +I306 +tp1237 +a(I362 +I306 +I361 +I306 +tp1238 +a(I361 +I306 +I360 +I306 +tp1239 +a(I360 +I306 +I359 +I306 +tp1240 +a(I359 +I306 +I358 +I306 +tp1241 +a(I358 +I306 +I357 +I306 +tp1242 +a(I357 +I306 +I356 +I306 +tp1243 +a(I356 +I306 +I355 +I306 +tp1244 +a(I355 +I306 +I354 +I306 +tp1245 +a(I354 +I306 +I353 +I306 +tp1246 +a(I353 +I306 +I352 +I306 +tp1247 +a(I352 +I306 +I351 +I306 +tp1248 +a(I351 +I306 +I350 +I306 +tp1249 +a(I350 +I306 +I349 +I306 +tp1250 +a(I349 +I306 +I348 +I308 +tp1251 +a(I348 +I308 +I346 +I309 +tp1252 +a(I346 +I309 +I346 +I311 +tp1253 +a(I346 +I311 +I345 +I312 +tp1254 +a(I345 +I312 +I344 +I313 +tp1255 +a(I344 +I313 +I344 +I314 +tp1256 +a(I344 +I314 +I343 +I314 +tp1257 +a(I343 +I314 +I343 +I316 +tp1258 +a(I343 +I316 +I342 +I318 +tp1259 +a(I342 +I318 +I342 +I319 +tp1260 +a(I342 +I319 +I341 +I321 +tp1261 +a(I341 +I321 +I341 +I324 +tp1262 +a(I341 +I324 +I341 +I326 +tp1263 +a(I341 +I326 +I341 +I329 +tp1264 +a(I341 +I329 +I341 +I330 +tp1265 +a(I341 +I330 +I341 +I332 +tp1266 +a(I341 +I332 +I341 +I333 +tp1267 +a(I341 +I333 +I341 +I334 +tp1268 +a(I341 +I334 +I342 +I335 +tp1269 +a(I342 +I335 +I342 +I336 +tp1270 +a(I342 +I336 +I343 +I338 +tp1271 +a(I343 +I338 +I343 +I339 +tp1272 +a(I343 +I339 +I344 +I340 +tp1273 +a(I344 +I340 +I346 +I341 +tp1274 +a(I346 +I341 +I346 +I342 +tp1275 +a(I346 +I342 +I348 +I343 +tp1276 +a(I348 +I343 +I349 +I344 +tp1277 +a(I349 +I344 +I350 +I344 +tp1278 +a(I350 +I344 +I351 +I344 +tp1279 +a(I351 +I344 +I351 +I345 +tp1280 +a(I351 +I345 +I353 +I346 +tp1281 +a(I353 +I346 +I354 +I346 +tp1282 +a(I354 +I346 +I356 +I346 +tp1283 +a(I356 +I346 +I357 +I346 +tp1284 +a(I357 +I346 +I360 +I347 +tp1285 +a(I360 +I347 +I362 +I347 +tp1286 +a(I362 +I347 +I363 +I347 +tp1287 +a(I363 +I347 +I366 +I347 +tp1288 +a(I366 +I347 +I367 +I347 +tp1289 +a(I367 +I347 +I368 +I347 +tp1290 +a(I368 +I347 +I369 +I347 +tp1291 +a(I369 +I347 +I372 +I347 +tp1292 +a(I372 +I347 +I374 +I347 +tp1293 +a(I374 +I347 +I377 +I346 +tp1294 +a(I377 +I346 +I380 +I346 +tp1295 +a(I380 +I346 +I382 +I346 +tp1296 +a(I382 +I346 +I384 +I345 +tp1297 +a(I384 +I345 +I386 +I344 +tp1298 +a(I386 +I344 +I387 +I343 +tp1299 +a(I387 +I343 +I389 +I342 +tp1300 +a(I389 +I342 +I390 +I341 +tp1301 +a(I390 +I341 +I391 +I340 +tp1302 +a(I391 +I340 +I392 +I340 +tp1303 +a(I392 +I340 +I393 +I339 +tp1304 +a(I393 +I339 +I394 +I339 +tp1305 +a(I394 +I339 +I394 +I338 +tp1306 +a(I394 +I338 +I394 +I337 +tp1307 +atp1308 +a(g951 +I12 +(lp1309 +(I413 +I249 +I413 +I250 +tp1310 +a(I413 +I250 +I413 +I251 +tp1311 +a(I413 +I251 +I413 +I252 +tp1312 +a(I413 +I252 +I413 +I253 +tp1313 +a(I413 +I253 +I413 +I255 +tp1314 +a(I413 +I255 +I413 +I257 +tp1315 +a(I413 +I257 +I413 +I259 +tp1316 +a(I413 +I259 +I413 +I261 +tp1317 +a(I413 +I261 +I413 +I262 +tp1318 +a(I413 +I262 +I413 +I264 +tp1319 +a(I413 +I264 +I413 +I265 +tp1320 +a(I413 +I265 +I413 +I268 +tp1321 +a(I413 +I268 +I413 +I269 +tp1322 +a(I413 +I269 +I413 +I272 +tp1323 +a(I413 +I272 +I413 +I273 +tp1324 +a(I413 +I273 +I413 +I275 +tp1325 +a(I413 +I275 +I413 +I277 +tp1326 +a(I413 +I277 +I413 +I278 +tp1327 +a(I413 +I278 +I413 +I280 +tp1328 +a(I413 +I280 +I414 +I281 +tp1329 +a(I414 +I281 +I414 +I282 +tp1330 +a(I414 +I282 +I414 +I283 +tp1331 +a(I414 +I283 +I414 +I285 +tp1332 +a(I414 +I285 +I414 +I287 +tp1333 +a(I414 +I287 +I414 +I289 +tp1334 +a(I414 +I289 +I414 +I291 +tp1335 +a(I414 +I291 +I414 +I293 +tp1336 +a(I414 +I293 +I415 +I295 +tp1337 +a(I415 +I295 +I415 +I296 +tp1338 +a(I415 +I296 +I415 +I298 +tp1339 +a(I415 +I298 +I415 +I299 +tp1340 +a(I415 +I299 +I415 +I301 +tp1341 +a(I415 +I301 +I415 +I303 +tp1342 +a(I415 +I303 +I415 +I304 +tp1343 +a(I415 +I304 +I415 +I305 +tp1344 +a(I415 +I305 +I415 +I306 +tp1345 +a(I415 +I306 +I415 +I308 +tp1346 +a(I415 +I308 +I415 +I309 +tp1347 +a(I415 +I309 +I415 +I310 +tp1348 +a(I415 +I310 +I415 +I311 +tp1349 +a(I415 +I311 +I415 +I313 +tp1350 +a(I415 +I313 +I415 +I315 +tp1351 +a(I415 +I315 +I415 +I316 +tp1352 +a(I415 +I316 +I415 +I317 +tp1353 +a(I415 +I317 +I415 +I318 +tp1354 +a(I415 +I318 +I415 +I319 +tp1355 +a(I415 +I319 +I415 +I320 +tp1356 +a(I415 +I320 +I415 +I321 +tp1357 +a(I415 +I321 +I415 +I322 +tp1358 +a(I415 +I322 +I415 +I323 +tp1359 +a(I415 +I323 +I415 +I325 +tp1360 +a(I415 +I325 +I415 +I327 +tp1361 +a(I415 +I327 +I415 +I328 +tp1362 +a(I415 +I328 +I415 +I329 +tp1363 +a(I415 +I329 +I415 +I330 +tp1364 +a(I415 +I330 +I415 +I331 +tp1365 +a(I415 +I331 +I415 +I332 +tp1366 +a(I415 +I332 +I415 +I333 +tp1367 +a(I415 +I333 +I415 +I334 +tp1368 +a(I415 +I334 +I415 +I335 +tp1369 +a(I415 +I335 +I414 +I335 +tp1370 +a(I414 +I335 +I414 +I337 +tp1371 +a(I414 +I337 +I414 +I338 +tp1372 +a(I414 +I338 +I414 +I339 +tp1373 +a(I414 +I339 +I414 +I340 +tp1374 +a(I414 +I340 +I414 +I341 +tp1375 +a(I414 +I341 +I414 +I340 +tp1376 +a(I414 +I340 +I415 +I338 +tp1377 +atp1378 +a(g951 +I12 +(lp1379 +(I417 +I308 +I418 +I308 +tp1380 +a(I418 +I308 +I418 +I307 +tp1381 +a(I418 +I307 +I419 +I307 +tp1382 +a(I419 +I307 +I419 +I306 +tp1383 +a(I419 +I306 +I420 +I305 +tp1384 +a(I420 +I305 +I421 +I305 +tp1385 +a(I421 +I305 +I421 +I304 +tp1386 +a(I421 +I304 +I422 +I303 +tp1387 +a(I422 +I303 +I423 +I303 +tp1388 +a(I423 +I303 +I423 +I302 +tp1389 +a(I423 +I302 +I424 +I301 +tp1390 +a(I424 +I301 +I425 +I300 +tp1391 +a(I425 +I300 +I425 +I299 +tp1392 +a(I425 +I299 +I426 +I299 +tp1393 +a(I426 +I299 +I426 +I298 +tp1394 +a(I426 +I298 +I426 +I297 +tp1395 +a(I426 +I297 +I427 +I297 +tp1396 +a(I427 +I297 +I428 +I297 +tp1397 +a(I428 +I297 +I428 +I296 +tp1398 +a(I428 +I296 +I429 +I295 +tp1399 +a(I429 +I295 +I430 +I294 +tp1400 +a(I430 +I294 +I430 +I293 +tp1401 +a(I430 +I293 +I431 +I293 +tp1402 +a(I431 +I293 +I432 +I292 +tp1403 +a(I432 +I292 +I433 +I291 +tp1404 +a(I433 +I291 +I433 +I290 +tp1405 +a(I433 +I290 +I434 +I290 +tp1406 +a(I434 +I290 +I435 +I290 +tp1407 +a(I435 +I290 +I435 +I289 +tp1408 +a(I435 +I289 +I435 +I288 +tp1409 +a(I435 +I288 +I436 +I288 +tp1410 +a(I436 +I288 +I437 +I287 +tp1411 +a(I437 +I287 +I437 +I286 +tp1412 +a(I437 +I286 +I438 +I286 +tp1413 +a(I438 +I286 +I438 +I285 +tp1414 +a(I438 +I285 +I439 +I284 +tp1415 +a(I439 +I284 +I439 +I283 +tp1416 +a(I439 +I283 +I439 +I282 +tp1417 +atp1418 +a(g951 +I12 +(lp1419 +(I427 +I305 +I427 +I306 +tp1420 +a(I427 +I306 +I427 +I307 +tp1421 +a(I427 +I307 +I427 +I308 +tp1422 +a(I427 +I308 +I428 +I310 +tp1423 +a(I428 +I310 +I429 +I311 +tp1424 +a(I429 +I311 +I430 +I313 +tp1425 +a(I430 +I313 +I430 +I315 +tp1426 +a(I430 +I315 +I431 +I316 +tp1427 +a(I431 +I316 +I432 +I318 +tp1428 +a(I432 +I318 +I432 +I321 +tp1429 +a(I432 +I321 +I433 +I322 +tp1430 +a(I433 +I322 +I433 +I324 +tp1431 +a(I433 +I324 +I433 +I325 +tp1432 +a(I433 +I325 +I434 +I326 +tp1433 +a(I434 +I326 +I435 +I327 +tp1434 +a(I435 +I327 +I436 +I327 +tp1435 +a(I436 +I327 +I436 +I328 +tp1436 +a(I436 +I328 +I436 +I329 +tp1437 +a(I436 +I329 +I437 +I329 +tp1438 +a(I437 +I329 +I437 +I330 +tp1439 +a(I437 +I330 +I438 +I331 +tp1440 +a(I438 +I331 +I438 +I332 +tp1441 +a(I438 +I332 +I439 +I332 +tp1442 +a(I439 +I332 +I439 +I333 +tp1443 +a(I439 +I333 +I440 +I333 +tp1444 +a(I440 +I333 +I440 +I334 +tp1445 +a(I440 +I334 +I440 +I335 +tp1446 +a(I440 +I335 +I441 +I335 +tp1447 +a(I441 +I335 +I441 +I336 +tp1448 +a(I441 +I336 +I442 +I336 +tp1449 +atp1450 +a(g951 +I12 +(lp1451 +(I488 +I279 +I487 +I279 +tp1452 +a(I487 +I279 +I487 +I278 +tp1453 +a(I487 +I278 +I486 +I278 +tp1454 +a(I486 +I278 +I485 +I278 +tp1455 +a(I485 +I278 +I484 +I278 +tp1456 +a(I484 +I278 +I483 +I278 +tp1457 +a(I483 +I278 +I481 +I277 +tp1458 +a(I481 +I277 +I480 +I277 +tp1459 +a(I480 +I277 +I479 +I277 +tp1460 +a(I479 +I277 +I478 +I277 +tp1461 +a(I478 +I277 +I477 +I277 +tp1462 +a(I477 +I277 +I476 +I277 +tp1463 +a(I476 +I277 +I475 +I277 +tp1464 +a(I475 +I277 +I474 +I277 +tp1465 +a(I474 +I277 +I473 +I278 +tp1466 +a(I473 +I278 +I472 +I279 +tp1467 +a(I472 +I279 +I471 +I279 +tp1468 +a(I471 +I279 +I471 +I280 +tp1469 +a(I471 +I280 +I470 +I280 +tp1470 +a(I470 +I280 +I470 +I281 +tp1471 +a(I470 +I281 +I469 +I282 +tp1472 +a(I469 +I282 +I469 +I283 +tp1473 +a(I469 +I283 +I469 +I284 +tp1474 +a(I469 +I284 +I469 +I286 +tp1475 +a(I469 +I286 +I468 +I286 +tp1476 +a(I468 +I286 +I468 +I287 +tp1477 +a(I468 +I287 +I468 +I289 +tp1478 +a(I468 +I289 +I468 +I291 +tp1479 +a(I468 +I291 +I468 +I292 +tp1480 +a(I468 +I292 +I469 +I293 +tp1481 +a(I469 +I293 +I469 +I294 +tp1482 +a(I469 +I294 +I470 +I294 +tp1483 +a(I470 +I294 +I470 +I295 +tp1484 +a(I470 +I295 +I471 +I295 +tp1485 +a(I471 +I295 +I472 +I296 +tp1486 +a(I472 +I296 +I474 +I297 +tp1487 +a(I474 +I297 +I475 +I298 +tp1488 +a(I475 +I298 +I477 +I298 +tp1489 +a(I477 +I298 +I480 +I299 +tp1490 +a(I480 +I299 +I481 +I300 +tp1491 +a(I481 +I300 +I483 +I300 +tp1492 +a(I483 +I300 +I484 +I300 +tp1493 +a(I484 +I300 +I485 +I300 +tp1494 +a(I485 +I300 +I485 +I301 +tp1495 +a(I485 +I301 +I486 +I301 +tp1496 +a(I486 +I301 +I487 +I301 +tp1497 +a(I487 +I301 +I488 +I301 +tp1498 +a(I488 +I301 +I489 +I301 +tp1499 +a(I489 +I301 +I490 +I301 +tp1500 +a(I490 +I301 +I491 +I301 +tp1501 +a(I491 +I301 +I491 +I302 +tp1502 +a(I491 +I302 +I492 +I302 +tp1503 +a(I492 +I302 +I493 +I302 +tp1504 +a(I493 +I302 +I493 +I303 +tp1505 +a(I493 +I303 +I494 +I303 +tp1506 +a(I494 +I303 +I494 +I304 +tp1507 +a(I494 +I304 +I495 +I304 +tp1508 +a(I495 +I304 +I495 +I305 +tp1509 +a(I495 +I305 +I496 +I306 +tp1510 +a(I496 +I306 +I496 +I307 +tp1511 +a(I496 +I307 +I497 +I308 +tp1512 +a(I497 +I308 +I498 +I309 +tp1513 +a(I498 +I309 +I498 +I310 +tp1514 +a(I498 +I310 +I498 +I311 +tp1515 +a(I498 +I311 +I498 +I313 +tp1516 +a(I498 +I313 +I498 +I314 +tp1517 +a(I498 +I314 +I498 +I316 +tp1518 +a(I498 +I316 +I498 +I317 +tp1519 +a(I498 +I317 +I498 +I319 +tp1520 +a(I498 +I319 +I498 +I320 +tp1521 +a(I498 +I320 +I498 +I321 +tp1522 +a(I498 +I321 +I498 +I322 +tp1523 +a(I498 +I322 +I498 +I323 +tp1524 +a(I498 +I323 +I497 +I323 +tp1525 +a(I497 +I323 +I496 +I324 +tp1526 +a(I496 +I324 +I495 +I325 +tp1527 +a(I495 +I325 +I494 +I325 +tp1528 +a(I494 +I325 +I494 +I326 +tp1529 +a(I494 +I326 +I493 +I326 +tp1530 +a(I493 +I326 +I492 +I326 +tp1531 +a(I492 +I326 +I491 +I327 +tp1532 +a(I491 +I327 +I489 +I327 +tp1533 +a(I489 +I327 +I489 +I328 +tp1534 +a(I489 +I328 +I488 +I328 +tp1535 +a(I488 +I328 +I487 +I328 +tp1536 +a(I487 +I328 +I486 +I328 +tp1537 +a(I486 +I328 +I485 +I328 +tp1538 +a(I485 +I328 +I484 +I328 +tp1539 +a(I484 +I328 +I483 +I328 +tp1540 +a(I483 +I328 +I482 +I328 +tp1541 +a(I482 +I328 +I481 +I328 +tp1542 +a(I481 +I328 +I481 +I329 +tp1543 +a(I481 +I329 +I479 +I329 +tp1544 +a(I479 +I329 +I478 +I329 +tp1545 +a(I478 +I329 +I477 +I330 +tp1546 +a(I477 +I330 +I476 +I330 +tp1547 +a(I476 +I330 +I475 +I330 +tp1548 +a(I475 +I330 +I474 +I330 +tp1549 +a(I474 +I330 +I472 +I330 +tp1550 +a(I472 +I330 +I471 +I330 +tp1551 +a(I471 +I330 +I470 +I331 +tp1552 +a(I470 +I331 +I469 +I331 +tp1553 +a(I469 +I331 +I468 +I331 +tp1554 +a(I468 +I331 +I468 +I332 +tp1555 +a(I468 +I332 +I467 +I332 +tp1556 +a(I467 +I332 +I466 +I332 +tp1557 +a(I466 +I332 +I465 +I332 +tp1558 +atp1559 +a(g951 +I12 +(lp1560 +(I531 +I226 +I530 +I228 +tp1561 +a(I530 +I228 +I530 +I229 +tp1562 +a(I530 +I229 +I530 +I231 +tp1563 +a(I530 +I231 +I530 +I232 +tp1564 +a(I530 +I232 +I530 +I234 +tp1565 +a(I530 +I234 +I530 +I236 +tp1566 +a(I530 +I236 +I530 +I239 +tp1567 +a(I530 +I239 +I530 +I242 +tp1568 +a(I530 +I242 +I530 +I244 +tp1569 +a(I530 +I244 +I530 +I248 +tp1570 +a(I530 +I248 +I530 +I252 +tp1571 +a(I530 +I252 +I530 +I256 +tp1572 +a(I530 +I256 +I530 +I262 +tp1573 +a(I530 +I262 +I530 +I266 +tp1574 +a(I530 +I266 +I530 +I270 +tp1575 +a(I530 +I270 +I530 +I274 +tp1576 +a(I530 +I274 +I530 +I276 +tp1577 +a(I530 +I276 +I530 +I279 +tp1578 +a(I530 +I279 +I531 +I282 +tp1579 +a(I531 +I282 +I532 +I285 +tp1580 +a(I532 +I285 +I533 +I288 +tp1581 +a(I533 +I288 +I534 +I290 +tp1582 +a(I534 +I290 +I535 +I294 +tp1583 +a(I535 +I294 +I536 +I298 +tp1584 +a(I536 +I298 +I537 +I303 +tp1585 +a(I537 +I303 +I538 +I307 +tp1586 +a(I538 +I307 +I539 +I309 +tp1587 +a(I539 +I309 +I539 +I312 +tp1588 +a(I539 +I312 +I539 +I314 +tp1589 +a(I539 +I314 +I539 +I316 +tp1590 +a(I539 +I316 +I539 +I318 +tp1591 +a(I539 +I318 +I539 +I321 +tp1592 +a(I539 +I321 +I540 +I324 +tp1593 +a(I540 +I324 +I540 +I327 +tp1594 +a(I540 +I327 +I540 +I330 +tp1595 +a(I540 +I330 +I541 +I332 +tp1596 +a(I541 +I332 +I541 +I335 +tp1597 +a(I541 +I335 +I541 +I336 +tp1598 +a(I541 +I336 +I542 +I337 +tp1599 +a(I542 +I337 +I542 +I338 +tp1600 +a(I542 +I338 +I542 +I339 +tp1601 +atp1602 +a(g951 +I12 +(lp1603 +(I541 +I366 +I540 +I366 +tp1604 +a(I540 +I366 +I539 +I366 +tp1605 +a(I539 +I366 +I538 +I366 +tp1606 +a(I538 +I366 +I539 +I366 +tp1607 +a(I539 +I366 +I540 +I366 +tp1608 +atp1609 +a(S'Red' +p1610 +I12 +(lp1611 +(I201 +I424 +I202 +I424 +tp1612 +a(I202 +I424 +I204 +I424 +tp1613 +a(I204 +I424 +I206 +I423 +tp1614 +a(I206 +I423 +I210 +I423 +tp1615 +a(I210 +I423 +I213 +I423 +tp1616 +a(I213 +I423 +I218 +I422 +tp1617 +a(I218 +I422 +I225 +I421 +tp1618 +a(I225 +I421 +I233 +I420 +tp1619 +a(I233 +I420 +I241 +I420 +tp1620 +a(I241 +I420 +I254 +I417 +tp1621 +a(I254 +I417 +I269 +I416 +tp1622 +a(I269 +I416 +I283 +I416 +tp1623 +a(I283 +I416 +I301 +I414 +tp1624 +a(I301 +I414 +I317 +I413 +tp1625 +a(I317 +I413 +I333 +I412 +tp1626 +a(I333 +I412 +I349 +I410 +tp1627 +a(I349 +I410 +I361 +I409 +tp1628 +a(I361 +I409 +I374 +I409 +tp1629 +a(I374 +I409 +I389 +I408 +tp1630 +a(I389 +I408 +I401 +I408 +tp1631 +a(I401 +I408 +I413 +I408 +tp1632 +a(I413 +I408 +I422 +I408 +tp1633 +a(I422 +I408 +I432 +I408 +tp1634 +a(I432 +I408 +I440 +I409 +tp1635 +a(I440 +I409 +I447 +I411 +tp1636 +a(I447 +I411 +I452 +I413 +tp1637 +a(I452 +I413 +I457 +I417 +tp1638 +a(I457 +I417 +I458 +I418 +tp1639 +a(I458 +I418 +I460 +I420 +tp1640 +a(I460 +I420 +I462 +I421 +tp1641 +a(I462 +I421 +I462 +I423 +tp1642 +a(I462 +I423 +I463 +I426 +tp1643 +a(I463 +I426 +I463 +I427 +tp1644 +a(I463 +I427 +I462 +I429 +tp1645 +a(I462 +I429 +I460 +I431 +tp1646 +a(I460 +I431 +I456 +I433 +tp1647 +a(I456 +I433 +I447 +I435 +tp1648 +a(I447 +I435 +I439 +I436 +tp1649 +a(I439 +I436 +I429 +I437 +tp1650 +a(I429 +I437 +I421 +I440 +tp1651 +a(I421 +I440 +I413 +I441 +tp1652 +a(I413 +I441 +I406 +I443 +tp1653 +a(I406 +I443 +I398 +I445 +tp1654 +a(I398 +I445 +I389 +I446 +tp1655 +a(I389 +I446 +I379 +I447 +tp1656 +a(I379 +I447 +I368 +I448 +tp1657 +a(I368 +I448 +I357 +I448 +tp1658 +a(I357 +I448 +I347 +I449 +tp1659 +a(I347 +I449 +I339 +I451 +tp1660 +a(I339 +I451 +I334 +I452 +tp1661 +a(I334 +I452 +I328 +I454 +tp1662 +a(I328 +I454 +I327 +I455 +tp1663 +a(I327 +I455 +I325 +I456 +tp1664 +a(I325 +I456 +I323 +I458 +tp1665 +a(I323 +I458 +I322 +I460 +tp1666 +a(I322 +I460 +I322 +I462 +tp1667 +a(I322 +I462 +I321 +I464 +tp1668 +a(I321 +I464 +I321 +I465 +tp1669 +a(I321 +I465 +I321 +I467 +tp1670 +a(I321 +I467 +I321 +I468 +tp1671 +a(I321 +I468 +I321 +I470 +tp1672 +a(I321 +I470 +I322 +I471 +tp1673 +a(I322 +I471 +I322 +I473 +tp1674 +a(I322 +I473 +I324 +I474 +tp1675 +a(I324 +I474 +I326 +I476 +tp1676 +a(I326 +I476 +I327 +I476 +tp1677 +a(I327 +I476 +I330 +I477 +tp1678 +a(I330 +I477 +I334 +I478 +tp1679 +a(I334 +I478 +I339 +I478 +tp1680 +a(I339 +I478 +I344 +I478 +tp1681 +a(I344 +I478 +I352 +I479 +tp1682 +a(I352 +I479 +I360 +I479 +tp1683 +a(I360 +I479 +I368 +I481 +tp1684 +a(I368 +I481 +I376 +I481 +tp1685 +a(I376 +I481 +I384 +I481 +tp1686 +a(I384 +I481 +I394 +I481 +tp1687 +a(I394 +I481 +I402 +I481 +tp1688 +a(I402 +I481 +I412 +I481 +tp1689 +a(I412 +I481 +I420 +I481 +tp1690 +a(I420 +I481 +I428 +I481 +tp1691 +a(I428 +I481 +I434 +I481 +tp1692 +a(I434 +I481 +I441 +I481 +tp1693 +a(I441 +I481 +I446 +I481 +tp1694 +a(I446 +I481 +I451 +I482 +tp1695 +a(I451 +I482 +I456 +I483 +tp1696 +a(I456 +I483 +I461 +I484 +tp1697 +a(I461 +I484 +I465 +I485 +tp1698 +a(I465 +I485 +I468 +I485 +tp1699 +a(I468 +I485 +I469 +I486 +tp1700 +a(I469 +I486 +I471 +I487 +tp1701 +atp1702 +a. \ No newline at end of file diff --git a/samples/doodle/setup.py b/samples/doodle/setup.py new file mode 100644 index 00000000..3c6bcb6f --- /dev/null +++ b/samples/doodle/setup.py @@ -0,0 +1,73 @@ +#--------------------------------------------------------------------------- +# This setup file serves as a model for how to structure your +# distutils setup files for making self-updating applications using +# Esky. When you run this script use +# +# python setup.py bdist_esky +# +# Esky will then use py2app or py2exe as appropriate to create the +# bundled application and also its own shell that will help manage +# doing the updates. See wx.lib.softwareupdate for the class you can +# use to add self-updates to your applications, and you can see how +# that code is used here in the superdoodle.py module. +#--------------------------------------------------------------------------- + + +import sys, os +from esky import bdist_esky +from setuptools import setup + +import version + + +# platform specific settings for Windows/py2exe +if sys.platform == "win32": + import py2exe + + FREEZER = 'py2exe' + FREEZER_OPTIONS = dict(compressed = 0, + optimize = 0, + bundle_files = 3, + dll_excludes = ['MSVCP90.dll', + 'mswsock.dll', + 'powrprof.dll', + 'USP10.dll',], + ) + exeICON = 'mondrian.ico' + + +# platform specific settings for Mac/py2app +elif sys.platform == "darwin": + import py2app + + FREEZER = 'py2app' + FREEZER_OPTIONS = dict(argv_emulation = False, + iconfile = 'mondrian.icns', + ) + exeICON = None + + + +# Common settings +NAME = "SuperDoodle" +APP = [bdist_esky.Executable("superdoodle.py", + gui_only=True, + icon=exeICON, + )] +DATA_FILES = [ 'mondrian.ico' ] +ESKY_OPTIONS = dict( freezer_module = FREEZER, + freezer_options = FREEZER_OPTIONS, + enable_appdata_dir = True, + bundle_msvcrt = True, + ) + + +# Build the app and the esky bundle +setup( name = NAME, + scripts = APP, + version = version.VERSION, + data_files = DATA_FILES, + options = dict(bdist_esky=ESKY_OPTIONS), + ) + + diff --git a/samples/doodle/superdoodle.py b/samples/doodle/superdoodle.py new file mode 100644 index 00000000..e8d148fe --- /dev/null +++ b/samples/doodle/superdoodle.py @@ -0,0 +1,434 @@ +# superdoodle.py +""" +This module implements the SuperDoodle demo application. It takes the +DoodleWindow previously presented and reuses it in a much more +intelligent Frame. This one has a menu and a statusbar, is able to +save and reload doodles, clear the workspace, and has a simple control +panel for setting color and line thickness in addition to the popup +menu that DoodleWindow provides. There is also a nice About dialog +implmented using an wx.html.HtmlWindow. +""" + +import sys +import os + +from six.moves import cPickle as pickle + +import wx +import wx.html +from wx.lib import buttons # for generic button classes +from doodle import DoodleWindow + +from wx.lib.mixins.inspection import InspectionMixin + +USE_SOFTWARE_UPDATE=False + +if USE_SOFTWARE_UPDATE: + from wx.lib.softwareupdate import SoftwareUpdate + +HERE = os.path.dirname(os.path.abspath(__file__)) +if hasattr(sys, 'frozen') and sys.frozen: + HERE = os.path.dirname(os.path.abspath(sys.argv[0])) + +#---------------------------------------------------------------------- + +# There are standard IDs for the menu items we need in this app, or we +# could have used wx.NewId() to autogenerate some new unique ID values +# instead. + +idNEW = wx.ID_NEW +idOPEN = wx.ID_OPEN +idSAVE = wx.ID_SAVE +idSAVEAS = wx.ID_SAVEAS +idCLEAR = wx.ID_CLEAR +idEXIT = wx.ID_EXIT +idABOUT = wx.ID_ABOUT + + + +class DoodleFrame(wx.Frame): + """ + A DoodleFrame contains a DoodleWindow and a ControlPanel and manages + their layout with a wx.BoxSizer. A menu and associated event handlers + provides for saving a doodle to a file, etc. + """ + title = "Do a doodle" + def __init__(self, parent): + wx.Frame.__init__(self, parent, -1, self.title, size=(800,600), + style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) + self.SetIcon(wx.Icon(os.path.join(HERE, 'mondrian.ico'))) + self.CreateStatusBar() + self.MakeMenu() + self.filename = None + + self.doodle = DoodleWindow(self, -1) + cPanel = ControlPanel(self, -1, self.doodle) + + # Create a sizer to layout the two windows side-by-side. + # Both will grow vertically, the doodle window will grow + # horizontally as well. + box = wx.BoxSizer(wx.HORIZONTAL) + box.Add(cPanel, 0, wx.EXPAND) + box.Add(self.doodle, 1, wx.EXPAND) + + # Tell the frame that it should layout itself in response to + # size events using this sizer. + self.SetSizer(box) + + + def SaveFile(self): + if self.filename: + data = self.doodle.GetLinesData() + f = open(self.filename, 'wb') + pickle.dump(data, f) + f.close() + + + def ReadFile(self): + if self.filename: + try: + f = open(self.filename, 'rb') + data = pickle.load(f) + f.close() + self.doodle.SetLinesData(data) + except pickle.UnpicklingError: + wx.MessageBox("%s is not a doodle file." % self.filename, + "oops!", style=wx.OK|wx.ICON_EXCLAMATION) + + + def MakeMenu(self): + # create the file menu + menu1 = wx.Menu() + + # Using the "\tKeyName" syntax automatically creates a + # wx.AcceleratorTable for this frame and binds the keys to + # the menu items. + menu1.Append(idOPEN, "&Open\tCtrl-O", "Open a doodle file") + menu1.Append(idSAVE, "&Save\tCtrl-S", "Save the doodle") + menu1.Append(idSAVEAS, "Save &As", "Save the doodle in a new file") + menu1.AppendSeparator() + menu1.Append(idCLEAR, "&Clear", "Clear the current doodle") + menu1.AppendSeparator() + menu1.Append(idEXIT, "E&xit", "Terminate the application") + + # and the help menu + menu2 = wx.Menu() + if hasattr(sys, 'frozen'): + item = menu2.Append(-1, "Check for Update...") + self.Bind(wx.EVT_MENU, self.OnMenuCheckForUpdate, item) + + menu2.Append(idABOUT, "&About\tCtrl-H", "Display the gratuitous 'about this app' thingamajig") + + # and add them to a menubar + menuBar = wx.MenuBar() + menuBar.Append(menu1, "&File") + menuBar.Append(menu2, "&Help") + self.SetMenuBar(menuBar) + + self.Bind(wx.EVT_MENU, self.OnMenuOpen, id=idOPEN) + self.Bind(wx.EVT_MENU, self.OnMenuSave, id=idSAVE) + self.Bind(wx.EVT_MENU, self.OnMenuSaveAs, id=idSAVEAS) + self.Bind(wx.EVT_MENU, self.OnMenuClear, id=idCLEAR) + self.Bind(wx.EVT_MENU, self.OnMenuExit, id=idEXIT) + self.Bind(wx.EVT_MENU, self.OnMenuAbout, id=idABOUT) + + + + wildcard = "Doodle files (*.ddl)|*.ddl|All files (*.*)|*.*" + + def OnMenuOpen(self, event): + dlg = wx.FileDialog(self, "Open doodle file...", os.getcwd(), + style=wx.FD_OPEN, wildcard = self.wildcard) + if dlg.ShowModal() == wx.ID_OK: + self.filename = dlg.GetPath() + self.ReadFile() + self.SetTitle(self.title + ' -- ' + self.filename) + dlg.Destroy() + + + def OnMenuSave(self, event): + if not self.filename: + self.OnMenuSaveAs(event) + else: + self.SaveFile() + + + def OnMenuSaveAs(self, event): + dlg = wx.FileDialog(self, "Save doodle as...", os.getcwd(), + style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT, + wildcard = self.wildcard) + if dlg.ShowModal() == wx.ID_OK: + filename = dlg.GetPath() + if not os.path.splitext(filename)[1]: + filename = filename + '.ddl' + self.filename = filename + self.SaveFile() + self.SetTitle(self.title + ' -- ' + self.filename) + dlg.Destroy() + + + def OnMenuClear(self, event): + self.doodle.SetLinesData([]) + self.SetTitle(self.title) + + + def OnMenuExit(self, event): + self.Close() + + + def OnMenuAbout(self, event): + dlg = DoodleAbout(self) + dlg.ShowModal() + dlg.Destroy() + + def OnMenuCheckForUpdate(self, event): + wx.GetApp().CheckForUpdate(parentWindow=self) + +#---------------------------------------------------------------------- + + +class ControlPanel(wx.Panel): + """ + This class implements a very simple control panel for the DoodleWindow. + It creates buttons for each of the colours and thickneses supported by + the DoodleWindow, and event handlers to set the selected values. There is + also a little window that shows an example doodleLine in the selected + values. Nested sizers are used for layout. + """ + + BMP_SIZE = 16 + BMP_BORDER = 3 + + def __init__(self, parent, ID, doodle): + wx.Panel.__init__(self, parent, ID, style=wx.RAISED_BORDER) + + numCols = 4 + spacing = 4 + + btnSize = wx.Size(self.BMP_SIZE + 2*self.BMP_BORDER, + self.BMP_SIZE + 2*self.BMP_BORDER) + + # Make a grid of buttons for each colour. Attach each button + # event to self.OnSetColour. The button ID is the same as the + # key in the colour dictionary. + self.clrBtns = {} + colours = doodle.menuColours + keys = list(colours.keys()) + keys.sort() + cGrid = wx.GridSizer(cols=numCols, hgap=2, vgap=2) + for k in keys: + bmp = self.MakeBitmap(colours[k]) + b = buttons.GenBitmapToggleButton(self, k, bmp, size=btnSize ) + b.SetBezelWidth(1) + b.SetUseFocusIndicator(False) + self.Bind(wx.EVT_BUTTON, self.OnSetColour, b) + cGrid.Add(b, 0) + self.clrBtns[colours[k]] = b + self.clrBtns[colours[keys[0]]].SetToggle(True) + + + # Make a grid of buttons for the thicknesses. Attach each button + # event to self.OnSetThickness. The button ID is the same as the + # thickness value. + self.thknsBtns = {} + tGrid = wx.GridSizer(cols=numCols, hgap=2, vgap=2) + for x in range(1, doodle.maxThickness+1): + b = buttons.GenToggleButton(self, x, str(x), size=btnSize) + b.SetBezelWidth(1) + b.SetUseFocusIndicator(False) + self.Bind(wx.EVT_BUTTON, self.OnSetThickness, b) + tGrid.Add(b, 0) + self.thknsBtns[x] = b + self.thknsBtns[1].SetToggle(True) + + # Make a colour indicator window, it is registerd as a listener + # with the doodle window so it will be notified when the settings + # change + ci = ColourIndicator(self) + doodle.AddListener(ci) + doodle.Notify() + self.doodle = doodle + + # Make a box sizer and put the two grids and the indicator + # window in it. + box = wx.BoxSizer(wx.VERTICAL) + box.Add(cGrid, 0, wx.ALL, spacing) + box.Add(tGrid, 0, wx.ALL, spacing) + box.Add(ci, 0, wx.EXPAND|wx.ALL, spacing) + self.SetSizer(box) + self.SetAutoLayout(True) + + # Resize this window so it is just large enough for the + # minimum requirements of the sizer. + box.Fit(self) + + + + def MakeBitmap(self, colour): + """ + We can create a bitmap of whatever we want by simply selecting + it into a wx.MemoryDC and drawing on it. In this case we just set + a background brush and clear the dc. + """ + bmp = wx.Bitmap(self.BMP_SIZE, self.BMP_SIZE) + dc = wx.MemoryDC() + dc.SelectObject(bmp) + dc.SetBackground(wx.Brush(colour)) + dc.Clear() + dc.SelectObject(wx.NullBitmap) + return bmp + + + def OnSetColour(self, event): + """ + Use the event ID to get the colour, set that colour in the doodle. + """ + colour = self.doodle.menuColours[event.GetId()] + if colour != self.doodle.colour: + # untoggle the old colour button + self.clrBtns[self.doodle.colour].SetToggle(False) + # set the new colour + self.doodle.SetColour(colour) + + + def OnSetThickness(self, event): + """ + Use the event ID to set the thickness in the doodle. + """ + thickness = event.GetId() + if thickness != self.doodle.thickness: + # untoggle the old thickness button + self.thknsBtns[self.doodle.thickness].SetToggle(False) + # set the new colour + self.doodle.SetThickness(thickness) + + + +#---------------------------------------------------------------------- + +class ColourIndicator(wx.Window): + """ + An instance of this class is used on the ControlPanel to show + a sample of what the current doodle line will look like. + """ + def __init__(self, parent): + wx.Window.__init__(self, parent, -1, style=wx.SUNKEN_BORDER) + self.SetBackgroundColour(wx.WHITE) + self.SetMinSize( (45, 45) ) + self.colour = self.thickness = None + self.Bind(wx.EVT_PAINT, self.OnPaint) + + + def Update(self, colour, thickness): + """ + The doodle window calls this method any time the colour + or line thickness changes. + """ + self.colour = colour + self.thickness = thickness + self.Refresh() # generate a paint event + + + def OnPaint(self, event): + """ + This method is called when all or part of the window needs to be + redrawn. + """ + dc = wx.PaintDC(self) + if self.colour: + sz = self.GetClientSize() + pen = wx.Pen(self.colour, self.thickness) + dc.SetPen(pen) + dc.DrawLine(10, sz.height/2, sz.width-10, sz.height/2) + + +#---------------------------------------------------------------------- + +class DoodleAbout(wx.Dialog): + """ An about box that uses an HTML window """ + + text = ''' + +
+SuperDoodle %s |
+
SuperDoodle is a demonstration program for wxPython that +will hopefully teach you a thing or two. Just follow these simple +instructions:
++
SuperDoodle and wxPython are brought to you by +Robin Dunn and Total Control Software, Copyright +© 1997-2011.
+ + +''' + + def __init__(self, parent): + wx.Dialog.__init__(self, parent, -1, 'About SuperDoodle', + size=(420, 380) ) + + html = wx.html.HtmlWindow(self, -1) + import version + html.SetPage(self.text % version.VERSION) + button = wx.Button(self, wx.ID_OK, "Okay") + + # constraints for the html window + lc = wx.LayoutConstraints() + lc.top.SameAs(self, wx.Top, 5) + lc.left.SameAs(self, wx.Left, 5) + lc.bottom.SameAs(button, wx.Top, 5) + lc.right.SameAs(self, wx.Right, 5) + html.SetConstraints(lc) + + # constraints for the button + lc = wx.LayoutConstraints() + lc.bottom.SameAs(self, wx.Bottom, 5) + lc.centreX.SameAs(self, wx.CentreX) + lc.width.AsIs() + lc.height.AsIs() + button.SetConstraints(lc) + + self.SetAutoLayout(True) + self.Layout() + self.CentreOnParent(wx.BOTH) + + +#---------------------------------------------------------------------- +#---------------------------------------------------------------------- + +if not USE_SOFTWARE_UPDATE: + SoftwareUpdate = object + + +class DoodleApp(wx.App, InspectionMixin, SoftwareUpdate): + def OnInit(self): + if USE_SOFTWARE_UPDATE: + BASEURL='http://wxPython.org/software-update-test/' + self.InitUpdates(BASEURL, + BASEURL + 'ChangeLog.txt', + icon=wx.Icon(os.path.join(HERE, 'mondrian.ico'))) + self.Init() # for InspectionMixin + + frame = DoodleFrame(None) + frame.Show(True) + self.SetTopWindow(frame) + self.SetAppDisplayName('SuperDoodle') + return True + +#---------------------------------------------------------------------- + +if __name__ == '__main__': + app = DoodleApp(redirect=False) + app.MainLoop() + diff --git a/samples/doodle/superdoodle.spec b/samples/doodle/superdoodle.spec new file mode 100644 index 00000000..9332e002 --- /dev/null +++ b/samples/doodle/superdoodle.spec @@ -0,0 +1,48 @@ +# -*- mode: python -*- +# +# This is a spec file for PyInstaller. To make a binary distribution of the +# superdoodle application run a command like this: +# +# pyinstaller superdoodle.spec +# +# And then look in the ./dist folder for the results +# + +block_cipher = None + + +a = Analysis(['superdoodle.py'], + pathex=['.'], + binaries=[], + datas=[('mondrian.ico', '.')], + hiddenimports=[], + hookspath=[], + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + [], + exclude_binaries=True, + name='superdoodle', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=False ) +coll = COLLECT(exe, + a.binaries, + a.zipfiles, + a.datas, + strip=False, + upx=True, + name='superdoodle') +app = BUNDLE(coll, + name='superdoodle.app', + icon='mondrian.icns', + bundle_identifier=None) diff --git a/samples/doodle/tmp.ddl b/samples/doodle/tmp.ddl new file mode 100644 index 00000000..ae6b3e98 Binary files /dev/null and b/samples/doodle/tmp.ddl differ diff --git a/samples/doodle/version.py b/samples/doodle/version.py new file mode 100644 index 00000000..0c2831a5 --- /dev/null +++ b/samples/doodle/version.py @@ -0,0 +1 @@ +VERSION='1.0.3'