ࡱ> |}~q` ٬bjbjqPqP L::   fKfKfK8KZL2MLMMMM7TUT/V,$Qh<ĂYS7TYYĂMMقpppY lMMpYppb~^,MvM Ы6fKe Jʁ0XJLp([VVrpmW\WS[V[V[VĂĂhpp[V[V[VYYYYB"JD"J 1.0 Python Python is a relatively modern language by programming standards. It was first released in 1991 (in contrast C is almost forty years old). It has many features typical of a modern language that help computer users write more complex programs in less time. This handout will only teach you a subset of Python. Nevertheless, in doing the program you will acquire skills applicable both to Python and to programming in general. Python has been chosen because it is an increasingly popular language. Writing a program in Python will often take less time than to write the equivalent in most other languages and, because you can work with Python interactively, problems with the program are usually solved more quickly. Python is highly-suited to scientific programming, as well as to writing applications and general-purpose programs. There is a price to pay for the speed with which Python programs are written: they often take longer to run than equivalent programs in other languages. However, except when serious number-crunching is being done, this trade-off is usually worthwhile. Python has been designed to enable programmers to spend more time thinking about their problem and its logical solution, and less time worrying about the details of the language. In this way you will gain generally applicable programming skills that will serve you well in your future, whether it be in academia or elsewhere. All programming languages contain the same types of structures. In this tutorial you will learn about the following: 1. Variable Assignment 2. Input and Output 3. Mathematical Functions 4. Logical Tests 5. Loop structures 1.1 Python Programming When you start up IDLE, you should see the Python editor window. You can always recognize an editor window by because it is empty. Here is an example of a complete Python module. Type it into an editor window and run it by choosing Run from the Run menu (or press the F5 key on your keyboard) HYPERLINK "http://www.pentangle.net/python/handbook/node18.html" \l "foot495" 1.1. print "Please give a number: " a = input() print "And another: " b = input() print "The sum of these numbers is: " print a + b If you get errors then check through your copy for small mistakes like missing punctuation marks. Having run the program it should be apparent how it works. The only thing which might not be obvious are the lines with input(). input() is a function which allows a user to type in a number and returns what they enter for use in the rest of the program: in this case the inputs are stored in a and b. If you are writing a module and you want to save your work, do so by selecting Save from the File menu then type a name for your program in the box. The name you choose should indicate what the program does and consist only of letters, numbers, and ``_'' the underscore character. The name must end with a .py so that it is recognized as a Python module, e.g. prog.py. Furthermore, do NOT use spaces in filenames or directory (folder) names. EXERCISE 1.1 Change the program so it subtracts the two numbers, rather than adds them up. Be sure to test that your program works as it should. 1.2. Variables 1.2.1 Names and Assignment In Section 1.1 we used variables for the first time: a and b in the example. Variables are used to store data; in simple terms they are much like variables in algebra and, as mathematically-literate students, we hope you will find the programming equivalent fairly intuitive. Variables have names like a and b above, or x or fred or z1. Where relevant you should give your variables a descriptive name, such as firstname or height. Variable names must start with a letter and then may consist only of alphanumeric characters (i.e. letters and numbers) and the underscore character, ``_''. There are some reserved words which you cannot use because Python uses them for other things; these are listed in Appendix B. We assign values to variables and then, whenever we refer to a variable later in the program, Python replaces its name with the value we assigned to it. This is best illustrated by a simple example: >>> x = 5 >>> print x 5 You assign by putting the variable name on the left, followed by a single =, followed by what is to be stored. To draw an analogy, you can think of variables as named boxes. What we have done above is to label a box with an ``x'', and then put the number 5 in that box. There are some differences between the syntax of Python and normal algebra which are important. Assignment statements read right to left only. x = 5 is fine, but 5 = x doesn't make sense to Python, which will report a Syntax Error. If you like, you can think of the equals sign as an arrow pointing from the number on the right, to the variable name on the left:  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img1.gif" \* MERGEFORMATINET and read the expression as ``assign 5 to x'' (or, if you prefer, as ``x becomes 5''). However, we can still do many of things you might do in algebra, like: >>> a = b = c = 0 Reading the above right to left we have: ``assign 0 to c, assign c to b, assign b to a''. >>> print a, b, c 0 0 0 There are also statements that are alegbraically nonsense, that are perfectly sensible to Python (and indeed to most other programming languages). The most common example is incrementing a variable: >>> i = 2 >>> i = i + 1 >>> print i 3 The second line in this example is not possible in maths, but makes sense in Python if you think of the equals as an arrow pointing from right to left. To describe the statement in words: on the right-hand side we have looked at what is in the box labelled i, added 1 to it, then stored the result back in the same box.  1.2.2 Types Your variables need not be numeric. There are several types. The most useful are described below: Integer: Any whole number: >>> myinteger = 0 >>> myinteger = 15 >>> myinteger = -23 >>> myinteger = 2378 Float: A floating point number, i.e. a non-integer. >>> myfloat = 0.1 >>> myfloat = 2.0 >>> myfloat = 1.14159256 >>> myfloat = 1.6e-19 >>> myfloat = 3e8 Note that although 2 is an integer, by writing it as 2.0 we indicate that we want it stored as a float, with the precision that entails.1.4 The last examples use exponentials, and in math would be written 1.6 * 10-19 and 3 * 108. If the number is given in exponential form it is stored with the precision of floating point whether or not it is a whole number. String: A string or sequence of characters that can be printed on your screen. They must be enclosed in either single quotes or double quotes--not a mixture of the two, e.g. >>> mystring = "Here is a string" >>> mystring = 'Here is another' Arrays and Lists: These are types which contain more than one element, analogous to vectors and matrices in mathematics. Their discussion is deferred until a later date. For the time being, it is sufficient to know that a list is written by enclosing it in square brackets as follows: mylist = [1, 2, 3, 5] If you are not sure what type a variable is, you can use the type() function to inspect it: >>> type(mystring) 'str' tells you it is a string. You might also get (integer) and (float). EXERCISE 1.2 Use the interactive interpreter to create integer, float and string variables. Once you've created them print them to see how Python stores them. Experiment with the following code snippet to prove to yourself that Python is case-sensitive, i.e. whether a variable named a is the same as one called A: >>> a = 1.2 >>> print A As a beginner you will avoid making mistakes if you restrict yourself to using lower-case for your Python functions and the names of your variables. 1.3 Input and output Computer programs generally involve interaction with the user. This is called input and output. Output involves printing things to the screen (and, as we shall see later, it also involves writing data to files, sending plots to a printer, etc). We have already seen one way of getting input--the input() function in Section 1.2. Functions will be discussed in more detail in Section 1.9, but for now we can use the input() function to get numbers (and only numbers) from the keyboard. You can put a string between the parentheses of input() to give the user a prompt. Hence the example in Section 1.1 could be rewritten as follows: a = input("Please give a number: ") b = input("And another: ") print "The sum of these numbers is:", a + b [Note that in this mode of operation the input() function is actually doing output as well as input!] The print command can print several things, which we separate with a comma, as above. If the print command is asked to print more than one thing, separated by commas, it separates them with a space. You can also concatenate (join) two strings using the + operator (note that no spaces are inserted between concatenated strings): >>> x = "Spanish Inquisition" >>> print "Nobody expects the" + x Nobody expects theSpanish Inquisition input() can read in numbers (integers and floats) only. If you want to read in a string (a word or sentence for instance) from the keyboard, then you should use the raw_input() function; for example: >>> name = raw_input("Please tell me your name: ") EXERCISE 1.3 Copy the example in Section 1.1 into an empty module. Modify it so that it reads in three numbers and adds them up. Further modify the program to ask the user for their name before inputting the three numbers. Then, instead of just outputting the sum, personalize the output message; eg. by first saying: ``name here are your results'' where name is their name. Think carefully about when to use input() and raw_input(). 1.4 Arithmetic The programs you write will nearly always use numbers. Python can manipulate numbers in much the same way as a calculator (as well as in the much more complex and powerful ways you'll use later). Basic arithmetic calculations are expressed using Python's (mostly obvious) arithmetic operators. >>> a = 2 # Set up some variables to play with >>> b = 5 >>> print a + b 7 >>> print a - b # Negative numbers are displayed as expected -3 >>> print a * b # Multiplication is done with a * 10 >>> print a / b # Division is with a forward slash / 0 Yikes! Not what we expected! The problem is that we assign the value 2 to a and 5 to b. Python assumed that this meant that a and b are integers. The result of dividing and integer by and integer is another integer. The result we expected was 2/5 = 0.4. But 0.4 is not an integer. Python simply truncates it (ignores what is behind the decimal point) and calls it 0. If the result had been 0.8, Python would still have called it 0. This can wreak havoc in a program and cause a lot of headaches. One way around it is to be careful and use decimal points when assigning values to floats. (e.g. a = 2. instead of a = 2) and is the only way out in some programming languages. Fortunately, Python offers a fool-resistant way out of this. Simply insert the line from_future_import division at the top of all your python programs. This will tell python that when you enter 2/5 we really mean 2./5 and we expect 0.4 as the result, not 0. Still, it is a good idea to get into the habit of using decimal points unless you are 100% sure you want an integer. In the future, you are likely to use programming languages that do not offer this easy fix. Lets look at some more arithmetic operators: >>> print a ** b # The power operation is done with ** 32 >>> print b % a # Gives the remainder of a division (5/2 = 2*2 +1) 1 >>> print 4.5 % 2 # The % operator works with floats too 0.5 The above session at the interactive interpreter also illustrates comments. This is explanatory text added to programs to help anyone (including yourself!) understand your programs. When Python sees the # symbol it ignores the rest of the line. Here we used comments at the interactive interpreter, which is not something one would normally do, as nothing gets saved. When writing modules you should comment your programs comprehensively, though succinctly. They should describe your program in sufficient detail so that someone who is not familiar with the details of the problem but who understands programming (though not necessarily in Python), can understand how your program works. Examples in this handbook should demonstrate good practice. Although you should write comments from the point of view of someone else reading your program, it is in your own interest to do it effectively. You will often come back to read a program you have written some time later. Well written comments will save you a lot of time. Furthermore, the demonstrators will be able to understand your program more quickly (and therefore mark you more quickly too!). The rules of precedence are much the same as with calculators. ie. Python generally evaluates expressions from left to right, but things enclosed in brackets are calculated first, followed by multiplications and divisions, followed by additions and subtractions. If in doubt add some parentheses: >>> print 2 + 3 * 4 14 >>> print 2 + (3 * 4) 14 >>> print (2 + 3) * 4 20 Parentheses may also be nested, in which case the innermost expressions are evaluated first; ie. >>> print (2 * (3 - 1)) * 4 16 EXERCISE 1.4 Play around with the interactive interpreter for a little while until you are sure you understand how Python deals with arithmetic: ensure that you understand the evaluation precedence of operators. Ask a demonstrator if you need more help with this. Write a program to read the radius of a circle from the keyboard and print its area and circumference to the screen. You need only use an approximate value for  INCLUDEPICTURE "http://www.pentangle.net/python/handbook/img4.gif" \* MERGEFORMATINET . Don't forget comments, and make sure the program's output is descriptive, i.e. the person running the program is not just left with two numbers but with some explanatory text. Again, think about whether to use input() or raw_input(). 1.5 Logical Tests 1.5.1 An example of an if test The if statement executes a nested code block if a condition is true. Here is an example: age = input("Please enter your age: ") if age > 40: print "Wow! You're really old!" Copy this into an empty module and try to work out how if works. Make sure to include the colon and indent as in the example. What Python sees is ``if the variable age is a number greater than 40 then print a suitable comment''. As in maths the symbol ``>'' means ``greater than''. The general structure of an if statement is: if [condition]: [statements to execute if condition is true] [rest of program] Note: The text enclosed in square brackets it not meant to be typed. It merely represents some Python code. Again indentation is important. In the above general form, the indented statements will only be executed if the condition is true but the rest of the program will be executed regardless. Its lack of indentation tells Python that it is nothing to do with the if test. 1.5.2 Comparison tests and Booleans The [condition] is generally written in the same way as in math. The possibilities are shown below: ComparisonWhat it testsa < ba is less than ba <= ba is less than or equal to ba > ba is greater than ba >= ba is greater than or equal to ba == ba is equal to ba != ba is not equal to ba < b < ca is less than b, which is less than cThe == is not a mistake. One = is used for assignment, which is different to testing for equality, so a different symbol is used. Python will complain if you mix them up (for example by doing if a = 4). It will often be the case that you want to execute a block of code if two or more conditions are simultaneously fulfilled. In some cases this is possible using the expression you should be familiar with from algebra: a < b < c. This tests whether a is less than b and b is also less than c. Sometimes you will want to do a more complex comparison. This is done using boolean operators such as and and or: if x == 10 and y > z: print "Some statements which only get executed if" print "x is equal to 10 AND y is greater than z." if x == 10 or y > z: print "Some statements which get executed if either print "x is equal to 10 OR y is greater than z" These comparisons can apply to strings too. The most common way you might use string comparions is to ask a user a yes/no question. answer = raw_input("Evaluate again? ") if answer == "y" or answer == "Y" or answer == "yes": # Do some more stuff EXERCISE 1.5 Write a program to ask for the distance traveled and time take for a journey. If they went faster than some suitably dangerous speed, warn them to go slower next time. 1.6 Loop Structures: In programming a loop is a statement or block of statements that is executed repeatedly. 1.6.1 while loops while loops are used to repeat the nested block following them a number of times. However, the number of times the block is repeated can be variable: the nested block will be repeated whilst a condition is satisfied. At the top of the while loop a condition is tested and if true, the loop is executed. while [condition]: [statements executed if the condition is true] [rest of program] Here is a short example: i = 1 while i < 10: print "i equals:", i i = i + 1 print "i is no longer less than ten" Recall the role of indentation. The last line is not executed each time the while condition is satisfied, but rather once it is not, and Python has jumped to [rest of program]. The [condition] used at the top of the while loop is of the same form as those used in if statements: see Section 1.7.2, ``Comparison tests and Booleans'' Here is a longer example that uses the % (remainder) operator to return the smallest factor of a number entered by a user: print """ This program returns the smallest non-unity factor (except one!) of a number entered by the user """ n = input("number: ") i = 2 # Start at two -- one is a factor of everything while (n % i) != 0: # i.e. as long as the remainder of n / i i = i + 1 # is non-zero, keep incrementing i by 1. # once control has passed to the rest of the program we know # i is a factor. print "The smallest factor of n is:", i This program does something new with strings. If you want to print lines of text and control when the next line is started, enclose the string in three double quotes and type away. This is the most complex program you have seen so far. Make sure you try running it yourself. Convince yourself that it returns sensible answers for small n and try some really big numbers. EXERCISE 1.6 (If you have time!!!!) Modify the above example of while so that it tells the user whether or not the number they have entered is a prime. Hint: think about what can be said about the smallest factor if the number is prime. Some really big primes you could try with your program are 1,299,709 and 15,485,861. Note that this is far from the most efficient way of computing prime numbers! 1.7 Visual Python (Adapted from Vpython tutorial by B. Sherwood, used with permission) Now it is time to have some fun with the unique power of Visual Python 1.7.1 Overview VPython is a programming language that is easy to learn and is well suited to creating 3D interactive models of physical systems. VPython has three components that you will deal with directly: Python, a programming language invented in 1990 by Guido van Rossem, a Dutch computer scientist. Python is a modern, object-oriented language which is easy to learn. Visual, a 3D graphics module for Python created by David Scherer while he was a student at Carnegie Mellon University. Visual allows you to create and animate 3D objects, and to navigate around in a 3D scene by spinning and zooming, using the mouse. IDLE, an interactive editing environment, written by van Rossem and modified by Scherer, which allows you to enter computer code, try your program, and get information about your program. 1.7.2 Your First Program Start IDLE by double-clicking on the snake icon on your desktop. A window labeled Untitled should appear. This is the window in which you will type your program. As the first line of your program, type the following statement: from visual import * This statement instructs Python to use the Visual graphics module. As the second line of your program, type the following statement: sphere ( ) 1.7.3 Save Your Program Save your program by pulling down the File menu and choosing Save As. Give the program a name ending in .py, such as  HYPERLINK http://MyProgram.py MyProgram.py. You must type the .py extension; IDLE will not supply it. Every time you run your program, IDLE will save your code before running. You can undo changes to the program by pressing CTRL-z. You will want to save your program on the desktop. 1.7.4 Running the Program Now run your program by pressing F5 (or by choosing Run program from the Run menu). You will have to save your program. When you run the program, two new windows appear. There is a window titled VPython, in which you should see a white sphere, and a window titled Output. Move the Output window to the bottom of your screen where it is out of the way but you can still see it (you may make it smaller if you wish) . 1.7.5 Spinning and Zooming In the VPython window, hold down the middle mouse button and move the mouse. You should see that you are able to zoom into and out of the scene. (On a 2-button mouse, hold down both left and right buttons; on a 1-button mouse, hold down the control key and the mouse button.) Now try holding down the right mouse button (hold down shift key with a one-button mouse) . You should find that you are able to rotate around the sphere (you can tell that you are moving because the lighting changes) . To avoid confusion about motion in the scene, it is helpful to keep in mind the idea that you are moving a camera around the object. When you zoom and rotate you are moving the camera, not the object. These navigation tools are built into all VPython programs unless specifically disabled by the author of the program. 1.7.6 Stopping the Program Click the close box in the upper right of the display window (VPython window) to stop the program. Unfortunately, the security features of Windows running on a server close all instances of python when you close a program window. I would suggest saving a copy of your program on the desktop so you can immediately open it again by right clicking on it and selecting Edit with Idle. 1.7.7 Modifying Your Program A single white sphere isnt very interesting. Lets change the color, size, and position of the sphere. Change the second line of your program to read: sphere(pos=(-5,0,0), radius=0.5, color=color.red) What does this line of code do? To position objects in the display window we set their 3D cartesian coordinates. The origin of the coordinate system is at the center of the display window. The positive x axis runs to the right, the positive y axis runs up, and the positive z axis comes out of the screen, toward you. The assignment pos=(-5,0,0) sets the position of the sphere by assigning values to the x, y, and z coordinates of the z center of the sphere. The assignment radius=0.5 gives the sphere a radius of 0.5 of the same units. Finally, color = color.red makes the sphere red (there are 8 colors easily accessible by color.xxx: red,green, blue, yellow, magenta, cyan, black, and white) . Now press F5 to run your program. Note that VPython automatically makes the display window an appropriate size, so you can see the sphere in your display. 1.7.7.1 Objects and attributes The sphere created by your program is an object. Properties like pos, radius, and color are called attributes of the object. Now lets create another object. Well make a wall, to the right of the sphere. Add the following line of code at the end of your program. box(pos=(6,0,0), size=(0.2,4,4), color=color.green) Before running your program, try to predict what you will see in your display. Run your program and try it. 1.7.7.2 Naming objects In order to refer to objects such as the sphere and the box, we need to give them names. To name the sphere ball, change the statement that creates the red sphere to this: ball = sphere(pos=(-5,0,0), radius=0.5, color=color.red) Similarly, give the box the name wallR (for right wall) . Your program should now look like this: from visual import * sphere(pos=(-5,0,0), radius=0.5, color=color.red) wallR = box(pos=(6,0,0),size=(0.2,4,4),color=color.green) If you run your program you should find that it runs as it did before. 1.7.8 Order of Execution You may already know that when a computer program runs, the computer starts at the beginning of the program and executes each statement in the order in which it is encountered. In Python, each new statement begins on a new line. Thus, in your program the computer first draws a red sphere, then draws a green box (of course, this happens fast enough that it appears to you as if everything was done simultaneously). When we add more statements to the program, well add them in the order in which we want them to be executed. Occasionally well go back and insert statements near the beginning of the program because we want them to be executed before statements that come later. 1.7.9 Animating the Ball We would like to make the red ball move across the screen and bounce off of the green wall. We can think of this as displaying snapshots of the position of the ball at successive times as it moves across the screen. To specify how far the ball moves, we need to specify its velocity and how much time has elapsed. We need to specify a time interval between snapshots. Well call this very short time interval dt. In the context of the program, we are talking about virtual time (i.e. time in our virtual world); a virtual time interval of 1 second may take much less than one second on a fast computer. Type this line at the end of your program: dt = 0.05 We also need to specify the velocity of the ball. We can make the velocity of the ball an attribute of the ball, by calling it ball.velocity. Since the ball will move in three dimensions, we must specify the x, y, and z components of the balls velocity. We do this by making ball.velocity a vector. Type this line at the end of your program: ball.velocity = vector(2,0,0) If you run the program, nothing will happen, because we have not yet given instructions on how to use the velocity to update the balls position. Since distance = speed*time, we can calculate how far the ball moves (the displacement of the ball) in time dt by multiplying ball.velocity by dt. To find the balls new position, we add the displacement to its old position: ball.pos = ball.pos + ball.velocity*dt Note that just as velocity is a vector, so is the position of the ball. 1.7.9.1 The meaning of the equal sign If you are new to programming, the statement ball.pos = ball.pos + ball.velocity*dt may look very odd indeed. Your math teachers would surely have objected had you written a = a + 2. In a Python program (and in many other computer languages), the equal sign means assign a value to this variable. When you write: a = a + 2 you are really giving the following instructions: Find the location in memory where the value of the variable a is stored. Read up that value, add 2 to it, and store the result in the location in memory where the value of a is stored. So the statement: ball.pos = ball.pos + ball.velocity*dt really means: Find the location in memory where the position of the object bal is stored. Read up this value, and add to it the result of the vector expression ball.velocity*dt. Store the result back in the location in memory where the position of the object ball is stored. 1.7.9.2 Running the animation Your program should now look like this: from visual import * ball = sphere(pos=(-5,0,0), radius=0.5, color=color.red) wallR = box(pos=(6,0,0), size=(0.2,4,4), color=color.green) dt = 0.05 ball.velocity = vector(0.2,0,0) ball.pos = ball.pos + ball.velocity*dt Run your program. Not much happens! The problem is that the program only took one time step; we need to take many steps. To accomplish this, we write a while loop. A while loop instructs the computer to keep executing a series of commands over and over again, until we tell it to stop. Delete the last line of your program. Now type: while (1==1): Dont forget the colon! Notice that when you press return, the cursor appears at an indented location after the while. The indented lines following a while statement are inside the loop; that is, they will be repeated over and over. In this case, they will be repeated as long as the number 1 is equal to 1, or forever. We can stop the loop by quitting the program. Indented under the while statement, type this: ball.pos = ball.pos + ball.velocity*dt (Note that if you position your cursor at the end of the while statement, IDLE will automatically indent the next lines when you press ENTER. Alternatively, you can simply press TAB to indent a line.) All indented statements after a while statement will be executed every time the loop is executed. Your program should now look like this: from visual import * ball = sphere(pos=(-5,0,0), radius=0.5, color=color.red) wallR = box(pos=(6,0,0), size=(0.2,4,4), color=color.green) dt = 0.05 ball.velocity = vector(2,0,0) while (1==1): ball.pos = ball.pos + ball.velocity*dt Run your program. You should observe that the ball moves to the right, quite rapidly. To slow it down, insert the following statement inside the loop (after the while statement): rate(100) This specifies that the while loop will not be executed more than 100 times per second. Run your program. You should see the ball move to the right more slowly. However, it keeps on going right through the wall, off into empty space, because this is what we told it to do. 1.7.10 Making the ball bounce: Logical tests To make the ball bounce off the wall, we need to detect a collision between the ball and the wall. A simple approach is to compare the x coordinate of the ball to the x coordinate of the wall, and reverse the x component of the balls velocity if the ball has moved too far to the right. We can use a logical test to do this: if ball.x > wallR.x: ball.velocity.x = -ball.velocity.x The indented line after the if statement will be executed only if the logical test in the previous line gives true for the comparison. If the result of the logical test is false (that is, if the x coordinate of the ball is not greater than the x coordinate of the wall), the indented line will be skipped. However, since we want this logical test to be performed every time the ball is moved, we need to indent both of these lines, so they are inside the while loop. Insert tabs before the lines, or select the lines and use the Indent region option on the Format menu to indent the lines. Your program should now look like this: from visual import * ball = sphere(pos=(-5,0,0), radius=0.5, color=color.red) wallR = box(pos=(6,0,0), size=(0.2,4,4), color=color.green) dt = 0.05 ball.velocity = vector(2,0,0) while (1==1): rate(100) ball.pos = ball.pos + ball.velocity*dt if ball.x > wallR.x: ball.velocity.x = -ball.velocity.x Run your program. You should observe that the ball moves to the right, bounces off the wall,and then moves to the left, continuing off into space. Note that our test is not very sophisticated; because ball.x is at the center of the ball and wallR.x is at the center of the wall, the ball appears to penetrate the wall slightly. Add another wall at the left side of the display, and make the ball bounce off that wall also. Your program should now look something like the following: from visual import * ball = sphere(pos=(-5,0,0), radius=0.5, color=color.red) wallR = box(pos=(6,0,0), size=(0.2,4,4), color=color.green) wallL = box(pos=(-6,0,0), size=(0.2,4,4), color=color.green) dt = 0.05 ball.velocity = vector(2,0,0) while (1==1): rate(100) ball.pos = ball.pos + ball.velocity*dt if ball.x > wallR.x: ball.velocity.x = -ball.velocity.x if ball.x < wallL.x: ball.velocity.x = -ball.velocity.x Note that we inserted the statement to draw the left wall near the beginning of the program, before the while loop. If we had put the statement after the while (inside the loop), a new wall would be created every time the loop was executed. Wed end up with thousands of walls, all at the same location. While we wouldnt be able to see them, the computer would try to draw them, and this would slow the program down considerably. 1.7.11 Making the ball move at an angle To make the program more interesting, lets make the ball move at an angle. Change the balls velocity to make it move in the y direction, as well as in the x direction. Before reading further, try to do this on your own. Since the balls velocity is a vector, all we need to do is give it a nonzero y component. For example, we can change the statement: ball.velocity = vector(2,0,0) to ball.velocity = vector(2,1.5,0) Now the ball moves at an angle. Unfortunately, it now misses the wall! However, you can fix this later by extending the wall, or by adding a horizontal wall above the other walls. 1.7.12 Visualizing velocity We will often want to visualize vector quantities, such as the balls velocity. We can use an arrow to visualize the velocity of the ball. Before the while statement, but after the program statement setting the balls velocity, ball.velocity = vector(2,1.5,1) we can create an arrow: bv = arrow(pos=ball.pos, axis=ball.velocity, color=color.yellow) Its important to create the arrow before the while loop. If we put this statement in the indented code after the while, we would create a new arrow in every iteration. We would soon have thousands of arrows, all at the same location! This would make our program run very slowly. Run your program. You should see a yellow arrow with its tail located at the balls initial position, pointing in the direction of the balls initial velocity. However, this arrow doesnt change when the ball moves. We need to update the position and axis of the velocity vector every time we move the ball. Inside the while loop, after the last line of code, add these lines: bv.pos = ball.pos bv.axis = ball.velocity The first of these lines moves the tail of the arrow to the location of the center of the ball. The second aligns the arrow with the current velocity of the ball. Lets also make the walls a bit bigger, by saying size= ( 0.2, 12,12 ), so the ball will hit them. Your program should now look like this: from visual import * ball = sphere(pos=(-5,0,0), radius=0.5, color=color.red) wallR = box(pos=(6,0,0), size=(0.2,12,12), color=color.green) wallL = box(pos=(-6,0,0), size=(0.2,12,12), color=color.green) dt = 0.05 ball.velocity = vector(2,1.5,1) bv = arrow(pos=ball.pos, axis=ball.velocity, color=color.yellow) while (1==1): rate(100) ball.pos = ball.pos + ball.velocity*dt if ball.x > wallR.x: ball.velocity.x = -ball.velocity.x if ball.x < wallL.x: ball.velocity.x = -ball.velocity.x bv.pos = ball.pos bv.axis = ball.velocity Run the program. The arrow representing the balls velocity should move with the ball, and should change direction every time the ball collides with a wall. 1.7.13 Leaving a trail Sometimes we are interested in the trajectory of a moving object, and would like to have it leave a trail. We can make a trail out of a curve object. A curve is an ordered list of points, which are connected by a line (actually a thin tube) . Well create the curve before the loop, and add a point to it every time we move the ball. After creating the ball, but before the loop, add the following line: ball.trail = curve(color=ball.color) This creates a curve object whose color is the same as the color of the ball, but without any points in the curve. At the end of the loop, add the following statement (indented) : ball.trail.append(pos=ball.pos) This statement adds a point to the trail. The position of the point is the same as the current position of the ball. Your program should now look like this: from visual import * ball = sphere(pos=(-5,0,0), radius=0.5, color=color.red) wallR = box(pos=(6,0,0), size=(0.2,12,12), color=color.green) wallL = box(pos=(-6,0,0), size=(0.2,12,12), color=color.green) dt = 0.05 ball.velocity = vector(2,1.5,1) bv = arrow(pos=ball.pos, axis=ball.velocity, color=color.yellow) ball.trail = curve(color=ball.color) while (1==1): rate(100) ball.pos = ball.pos + ball.velocity*dt if ball.x > wallR.x: ball.velocity.x = -ball.velocity.x if ball.x < wallL.x: ball.velocity.x = -ball.velocity.x bv.pos = ball.pos bv.axis = ball.velocity ball.trail.append(pos=ball.pos) Run your program. You should see a red trail behind the ball. 1.7.14 How your program works In your while loop you continually change the position of the ball (ball.pos); you could also have changed its color or its radius. While your code is running, VPython runs another program (a parallel thread) which periodically gets information about the attributes of your objects, such as ball.pos and ball.radius. This program does the necessary computations to figure out how to draw your scene on the computer screen, and instructs the computer to draw this picture. This happens many times per second, so the animation appears continuous. 1.7.15 Making the ball bounce around inside a large box You are now at a point where you can try the following modifications to your program. Add top and bottom Walls. Expand all the walls so they touch, forming part of a large box. Add a back wall, and an invisible front wall. That is, do not draw a front wall, but include an if statement to prevent the ball from coming through the front. Give your ball a component of velocity in the z direction as well, and make it bounce off the back and front walls. Make the surface of the ball collide with the surface of the wall. Add an acceleration of gravity of -9.8 m/s2 pointing in the negative z direction Make the collisions with the walls partially elastic Create and model a total of 10 balls in the box. Model the interactions between the balls. Appendix A. Errors When there is a problem with your code, Python responds with an error message. This is its attempt at explaining the problem. It might look something like this: >>> print x Traceback (most recent call last): File "", line 1, in ? print x NameError: name 'x' is not defined The first few lines sometimes contain useful information about where Python thinks the error occured. If you are typing a module (rather than working interactively), click and hold the right mouse button and select go to file/line. This will take you to the line Python thinks is the problem. This is not always where the actual problem lies so analyze the last line of the error message too. This Appendix attempts to help you understand these messages. A.1 Attribute Errors, Key Errors, Index Errors Messages starting ``AttributeError:'', ``KeyError:'' or ``IndexError:'' generally indicate you were trying to reference or manipulate part of a multi-element variable (lists and arrays) but that element didn't exist. For example: >>> xx = array([1,2]) >>> print xx[5] Traceback (most recent call last): File "", line 1, in ? print xx[5 IndexError: index out of bounds A.2 Name Errors Name errors indicate that a variable you have referred to does not exist. Check your spelling. You might have mis-typed a function, e.g. primt x. Check you haven't attempted to do something with a variable before assigning a value to it, e.g. typing only the following into a module will not work: print x x = 5 A.3 Syntax Errors These suggest there is a sufficiently severe problem with the way your code is written that Python cannot understand it. Common examples are missing out the colon at the end of a line containing a for, if or while loop; writing a condition with just one =, e.g. if x = 5: print "x is equal to five" Check that you haven't forgotten to end any strings with quotes and that you have the right number of parentheses. Missing out parentheses can lead to a syntax error on the next line. You will get a SyntaxError when you run your program if the user does not respond to an input() function. Incorrectly indenting your program might also cause SyntaxErrors A.4 Type Errors You have tried to do something to a variable of the wrong type. There are many forms: TypeError: illegal argument type for built-in operation You asked Python to do a built-in operation on the wrong type of variable. For example, you tried to add a number to a string. TypeError: not enough arguments; expected 1, got 0 You used a function without supplying the correct number of parameters. TypeError: unsubscriptable object You tried to reference a variable that did not have more than one element (e.g. a float or integer) by offset: >>> x = 5 >>> print x[0]  Python is named after the 1970s TV series Monty Python's Flying Circus, so variables in examples are often named after sketches in the series. Don't be surprised to see spam, lumberjack, and shrubbery if you read up on Python on the web. As this is a document written by deadly serious scientists we will avoid this convention (mostly). However, it's something to be aware of if you take your interest in Python further.          ~  ] d qu{w~ϲϲϲzooh^aPh2 0JCJh^aPh2 CJh^aPh2 0JCJH*jh^aPh2 CJUh^aPh2 0JCJh^aPh2 0JCJh^aPh2 CJhh2 5hh2 6CJ] h2 CJjhh2 0JCJUhh2 CJh^aPh2 CJ,h2 h2 CJ,)  N K 3M^q )9Sc.|gd2 ^gd2 [$\$^gd2 gd2 gd2 άج$%*+})*P`c|DMQWhlqrx~=뾰뾤hI9h2 CJh^aPh2 CJ h ]h2 CJ(hI9h2 5CJ\h^aPh2 0J5CJ\h^aPh2 5CJ\h^aPh2 0JCJh^aPh2 0JCJh^aPh2 0JCJh^aPh2 CJh^aPh2 6CJ]5u=M_gvMeq9I]ow*F^wgd2 ^gd2 gd2 gd2 =gIJ VW9<`aef$%)*3489BCGHMq9wxy*1Fd h^aPh2 5CJ\h^aPh2 CJ jKh^aPh2 CJUjh^aPh2 CJU h2 CJh^aPh2 6CJ]h^aPh2 0JCJh^aPh2 CJh^aPh2 CJ@ 0 L d !|"""#\$u$$$%-&=&M&&&(r)))gd2 gd2 gd2 ^gd2  9!K>>>C?D?E?F?@!@%@0@2@3@ݿݔݿݿxxhxjh^aPh2 5CJU\jh^aPh2 5CJU\hI9h2 5CJ\h^aPh2 0JCJh^aPh2 CJOJQJ^J h^aPh2 CJOJQJ^JaJh^aPh2 CJh^aPh2 6CJ]h^aPh2 CJ,h^aPh2 CJh^aPh2 0J5CJ\h^aPh2 5CJ\'5!6$6l6n6669-;W<o<v<<<<<=:=A=K>3@4@G@g@@@Agd2 ^gd2 gd2 gd2 3@4@G@g@k@m@@,AcAeAAA+B,BcBeBuBBBFCJDLDTDyD}DDDDDDDDEEEEEEEEE4E5E6E7EEOEPEQEREXEYEZEwExEyEzEEEϻ㤙h^aPh2 CJaJh^aPh2 5CJ\h^aPh2 0JCJh^aPh2 0J5CJ\ h2 CJh^aPh2 CJh^aPh2 0JCJh^aPh2 CJh^aPh2 CJ h^aPh2 h2 <A,AAuBBBBBHCTDyDDDD $Ifgd gd2 gd2 ^gd2 DDEEzqq $Ifgd kd$$IfT40!064abpTEEE6E|ss $Ifgd kd$$IfT0!064abpT6E7E=EQE|ss $Ifgd kd<$$IfT0!064abpTQEREYEyE|ss $Ifgd kd$$IfT0!064abpTyEzEEE|ss $Ifgd kd$$IfT0!064abpTEEEEEEEEEEEEEEEEEEEEEEEEEE FF9FAFFFGGGGGGGGGGGGH#H6H9H>H@HCHlIIIIzJJJ0K2KGKXK\KKKK̺hI9h2 CJ(hI9h2 5CJ\h^aPh2 5CJ\ h2 CJh^aPh2 CJh^aPh2 6CJ]h^aPh2 CJaJh^aPh2 CJh^aPh2 0JCJAEEEE|ss $Ifgd kdp$$IfT0!064abpTEEEE|ss $Ifgd kd, $$IfT0!064abpTEEFGCH_HHHH2IlIIJ|wwwnnnnnnwn^gd2 gd2 kd $$IfT0!064abpT JJ[JzJ1K2KGKKKLL1M2MHMbMlM~MMMMMN)OOOOgd2 ^gd2 gd2 gd2 gd2 ^gd2 KLLLHMbMMyNNNNNNNOPOQOOQRRSSSTTTTTTTTCURUUV}V$Wtith ]h2 @CJh ]h2 @CJh ]h2 @CJ&h ]h2 5@CJOJQJ\^J h^aPh2 hh2 5CJaJ h2 5CJ(h^aPh2 5CJ(hI9h2 5CJ\h^aPh2 5CJ\hI9h2 CJh^aPh2 CJh^aPh2 0JCJh^aPh2 CJ%OO P%P-PHPPPP QUQpQQRRSTTTCURUVV & F1$7$8$]gd2 lgd2 Dgd2 gd2 gd2 gd2 ^gd2 $WWWXqXuXvXXXXX/YqYY ZZZZ0ZZZZZZZZZZ6[[[[[[[˺ˬ˺maY˺h2 @CJh ]h2 >*@CJ#j h ]h2 @CJUjh ]h2 @CJUh ]h2 @CJ$h ]h2 @CJOJQJ^JaJjh2 UmHnHu h2 5@CJOJQJ\^J&h ]h2 5@CJOJQJ\^Jh ]h2 @CJh ]h2 @CJh ]h2 @CJ"VWpXqXX0YqYYYY ZZZ0Z| & Fl1$7$8$gd2 ^gd2 d@gd2 d@^gd2 $ & Fl1$7$8$a$gd2 $ & Fl1$7$8$]a$gd2 gd2 $ & F1$7$8$]a$gd2 $ & F1$7$8$]a$gd2 0Z[[c\]]]^_f```{b|bbclgd2 gd2 $D1$7$8$]a$gd2 $l1$7$8$a$gd2 gd2 l`gd2 $ & FH1$7$8$`a$gd2 $la$gd2 gd2 [a\b\c\\\\\>]?]]]]]]]_`e`f````[azb|bbc1cdceccc dd.d/dփxih ]h2 CJOJQJ^Jh ]h2 @CJh2 @CJjh2 UmHnHu h2 5@CJOJQJ\^Jh2 @CJh ]h2 5@CJ\h ]h2 @CJh ]h2 @CJh ]h2 @CJ&h ]h2 5@CJOJQJ\^Jh ]h2 @CJ$c2cdcecdde@eKeeeffffff gd2 $ & F l1$7$8$a$gd2 ^gd2 ^gd2 $`a$gd2 gd2 dh1$7$8$]^gd2  & Fdh1$7$8$]gd2 /d1dUdVdXdedwdydddddeeee@eKeeeeeeafffffffڻڠڊڻڻyq]K#h ]h2 5@CJOJQJ^J&h ]h2 5@CJOJQJ\^Jh2 @CJ h ]h2 @CJOJQJ^J*h ]h2 6@CJOJQJ]^JaJh ]h2 6@CJ]aJh ]h2 @CJh ]h2 CJOJQJ^Jh ]h2 6@CJ]aJh ]h2 @CJh ]h2 @CJh ]h2 6@CJ]aJffggggg&g,g0g6gAgLgghhhhhKiiiikjjjj{hR*h1[h2 5@CJOJQJ\^JaJ$jh ]h2 CJUmHnHu#h ]h2 5@CJOJQJ^J&h ]h2 5@CJOJQJ\^Jh ]h2 6@CJ]aJh ]h2 CJOJQJ^J h ]h2 @CJOJQJ^Jh ]h2 6@CJ]aJh ]h2 @CJh ]h2 @CJh ]h2 @f[gghhhKiiiii1jkjlj~~u^gd2 ^gd2 gd2  & F xdh1$7$8$]xgd2 l^gd2  & F l1$7$8$gd2 Hgd2  & F hd1$7$8$]hgd2  & F `dh1$7$8$]`gd2 `gd2 l`gd2 ljjjltmummnop$pTqqq/r0rss9s`gd2  & Fl1$7$8$gd2 l^gd2  & Fl1$7$8$gd2 $`a$gd2 gd2 $la$gd2 gd2 ^gd2 jjk lZl[llumymzmmnnznn?o@oop$pppqqqr0rrs9s:sMshsssssַ֒|֒֒tlh2 @CJh2 @CJh ]h2 @CJh ]h2 @CJh ]h2 CJOJQJ^J*h1[h2 5@CJOJQJ\^JaJ&h ]h2 5@CJOJQJ\^Jh ]h2 @CJh ]h2 @CJh ]h2 @CJ&h ]h2 5@OJQJ\^JaJ$9s:sssssattttuuvv+w,w$a$gd2 $Da$gd2 ^gd2 `gd2 (d]^`(gd2 Z(d]Z^`(gd2  d]gd2  d`gd2 gd2 ssssssVtatttt^u_uaukuuuuuvvbvcvgvvvòã×|n×f[K[h ]h2 6@CJ]aJh ]h2 @CJh2 @CJh ]h2 6CJ]aJh ]h2 6@CJ]aJh ]h2 @CJh2 CJOJQJ^Jh ]h2 CJOJQJ^J h ]h2 @CJOJQJ^Jh ]h2 @CJ h ]h2 @CJOJQJ^Jh2 @CJOJQJ^J#h ]h2 5@CJOJQJ^Jvvvvvw w,w0w3w4wJwrwwwPxbxxxxxxHyyyy귥wfw[[K[wh ]h2 6@CJ]aJh ]h2 @CJ h ]h2 @CJOJQJ^Jh ]h2 CJOJQJ^J h ]h2 @CJOJQJ^Jh2 @CJOJQJ^J#h ]h2 5@CJOJQJ^J&h ]h2 5@CJOJQJ\^Jh ]h2 6CJ]aJ h ]h2 @CJOJQJ^Jh ]h2 @CJh ]h2 @CJ,wJwrwwww x)xPxbxoyyyy{ $`a$gd2 gd2 dh1$7$8$]gd2  & Fdh1$7$8$gd2 $la$gd2  & Fl1$7$8$gd2 H^`Hgd2 ^gd2 lgd2  gd2 yy zzz{M{t{{{{{{Z|]|c||}T}}}~R~X~d~n~~~~K!4ͫvb&h ]h2 5@OJQJ\^JaJ*h1[h2 5@CJOJQJ\^JaJ&h ]h2 5@CJOJQJ\^Jh ]h2 @CJ h ]h2 @CJOJQJ^J h ]h2 @CJOJQJ^Jh ]h2 CJOJQJ^Jh ]h2 @CJh ]h2 @CJjh2 UmHnHu#{M{t{||||}T}^}|}}}~d~ & F !H1$7$8$gd2  & F !dh1$7$8$gd2 @^@gd2 ^gd2 H^`Hgd2 ^gd2 gd2 $`a$gd2 l^gd2  & Fl1$7$8$gd2 d~n~o~~~ ,-eă$H]H`a$gd2 $H]Ha$gd2 @^@gd2 $Hl]Ha$gd2 gd2 HD]H`gd2  & Fl1$7$8$gd2 ^gd2 gd2  !l^gd2 46TV~,-܁݁&')eՂւSăŃ<=>HI߄CDĆ֤֤֤օ}h2 @CJ h ]h2 @CJOJQJ^Jh2 @CJOJQJ^Jh2 CJOJQJ^Jh ]h2 @CJh ]h2 6@CJ]aJh ]h2 @CJh ]h2 CJOJQJ^Jh ]h2 @CJh ]h2 6@CJ]aJ1=Hgu߄(ÆĆنN & Fl1$7$8$gd2 $la$gd2  & F1$7$8$gd2 8^8gd2 @^@gd2 ^gd2 gd2 ĆbcوڈN=ڊ܊ËW,LRҍCնըըՓwlնl[l h ]h2 @CJOJQJ^Jh ]h2 @CJ h ]h2 @CJOJQJ^Jh ]h2 @CJ(jh ]h2 @CJUmHnHuh ]h2 6CJ]aJ&h ]h2 5@CJOJQJ\^Jh ]h2 @CJh ]h2 @CJ h ]h2 @CJOJQJ^Jh ]h2 CJOJQJ^J#ˇ*?bc=Ë  ] ^gd2 gd2 Hl]Hgd2  & F l1$7$8$] gd2 lgd2 gd2 $Da$gd2 l1$7$8$gd2 ^gd2 8^8gd2 @^@gd2 P]P^gd2 ËҍӍ/AdӐv l^gd2  & Fl1$7$8$gd2 $la$gd2  & Fl1$7$8$gd2 $a$gd2 Hpl]H^`pgd2 H]H`gd2 gd2 ^gd2 CIdA8ouӐ%ē˔̔BCSTtih ]h2 @CJ$jh ]h2 CJUmHnHu&h ]h2 5@CJOJQJ\^J h ]h2 @CJOJQJ^Jh2 @CJh ]h2 @CJh ]h2 @CJ h ]h2 @CJOJQJ^Jh ]h2 @CJh ]h2 @CJh ]h2 CJOJQJ^J$vّP͒ג8FPwē & Fl1$7$8$]gd2 L]^`Lgd2 ^gd2 8^8gd2 @^@gd2 gd2 ^gd2 ˔`9YZ FØ͘.STb^gd2  & Fl1$7$8$gd2 gd2 l^gd2  & Fl1$7$8$gd2 $la$gd2 gd2 TZcdj`9ZӗSTlә\ǚ'ߜʝ=oTʿʮʝʝىٮٮٿٿىٿـth ]h2 6CJ]h ]h2 CJ&h ]h2 5@CJOJQJ\^J h ]h2 @CJOJQJ^J h ]h2 @CJOJQJ^Jh ]h2 @CJh ]h2 CJOJQJ^Jh ]h2 @CJh ]h2 @CJ h ]h2 @CJOJQJ^J)bl͙ #<\ޜߜn & F D1$7$8$gd2  & F(dh1$7$8$](gd2 $la$gd2  & Fdh1$7$8$]gd2 ]^gd2 gd2 ^`gd2 ^gd2 ɝʝno)*{|%Ǡgd2 gd2 1$7$8$gd2 1$7$8$^gd2 & F"1$7$8$gd2 1$^gd2 & F!1$7$8$gd2 1$gd2  & F D1$7$8$gd2 TU.Udjs{ip./+6t{ƨ0gfC_«ƫȫҫث¬Ĭ˼⏇jh Uh hmh2 0JCJ hmh2 6CJ]hmh2 CJhmh2 CJjhmh2 0JCJUh*? h2 6] h2 0J h2 0Jh2 h2 CJh ]h2 CJh ]h2 CJH*5ǠӠ%HA(@RwϤ 07CdȨ٨0gd2 gd2 ^gd2 fìĬƬǬɬʬ̬ͬάЬѬ$l!  &+D( /`a$$l!  &+D( /`a$gd2 gd2 gd2 ^gd2 gd2 ĬŬǬȬʬˬάϬЬѬҬӬԬլ֬׬ج٬h*?jFh2 Uj"h2 Uhkh2 CJaJh2 j? h2 Uh jh UѬӬԬ֬׬ج٬l'!&+D& ./^nl'!&+D& ./^`ngd2 $1![+ &+D$./a$$1![+ &+D$./a$gd2 21h:p2 / =!"#$% nw].ȴzyII>[PNG  IHDRBB C tEXtSoftwarenoned{xX pHYsgR IDATx}l]yPxP1dxQxQdxi-(zz׸]BZjF,,GDFLr1bXtDlrEjȑ+*1o?wcGG;@^^_cۏm?cۏj|׮]o8I֬مƽ~ˮ5?bݵaMce5koQ43@[+5vcݷڽߍFhkoݷ#E?ًzohk= LOwE}W-w.7z4ٷM343@C m?ڻݵmu?Oֿ=sm3؀u:0xu{`?;_ ف5vq`ƚ:6ֽ4 ~ںN`msm=h;>0{bѶ#ht;HV4ZmA4ю_chvd#Aσ񎏜 .hиwDxt0w<6Xc;n;hfx㿚 4&;v;vw`c'tǮi]f}{{=.z}/z6U"ZU2X ymGϚFAf`aW6 i|40F0ÄdaB j{ ˃a 㱎_7`^!'\GORRRܞE4Xv-uAC5mCgϞ]XX@^8fB,z瓝gfˀzѸOǷq߃&5)4x=aXvp{4]n@cFc;oC h``Ƃ@Cxπ ֢'hhhܧc0zgC2zLhn@ L0-A2@W0{5N t<Ƹ^0q&\ n@m0cx,0L#X4ےY۹ G&mddo9r܆ hW~^Fow}̑j^Bht~'VTWT*R0иc'J#05Lz{{c/m:ƽ ~N? |؂ ƌ[=f.AIuI"˂ H4/1HUjg !V??YW# v?Wtf'Օ'7n Z"nSD B\WOv0^H5۽ۼrySqN-tR '<<^uzY0+] chyfV6N .-0s z0<<)H`\ZRa,.v0"? >i`+\[0+O+Oo*R-8V ƚKˆ-pidmV̝P)jOՁͿ4Ht}'Օ'7x\8o8Kݻ@^xXp?*O+@иc4ے  _rU^QyR]yRH5] ξƭt1f5Օ'Օ'oMuoƽNHF^Ш{5Z҅ƽNВm<Bo q/?6eÿ=<6el~xp}PN~waߕz.epOAK`MɎ.4e{h#]ƽD^]8ڵ {=6}7j$1hѸ)]{и]=hܣˀ]иW?E^&'DןMt=ƽOtG^q_m<6']ѸWCh`/Nu Lu p/3qE/~ȩ7NJa$cۏm?[|[ݕqlǶ~l|6cۿ>GM*K=7wæ۴mhO|ff澁6Om;7o{#>m?~,;r/tl۶_{~]'nŶ~K* {vz mnvnnmny Bbƥ"zF o~a>ϝ ?[y*~&ql/}w >;?~ܙoAc{s xF ^{5K/,rO\~ q.pg}PGo߾lܸx"m!ssǦg>;u~9h3|sp ^;$$ّjыӠh{3[~\a䜾)^Y$޸4CGnzǿH[Ia-[v1:v#l$ 5vO߹y}GO>7Ir`Ns̟?{y|]H|&,},z4ȫWr+o<@{u_y_Aʼ7=}6"y8Kk4wqÃokѯlIa| e'?'SMM?O&0<7ESEVgY:H^k!sWpA+N)+ob@=`|7ip7_0`W ϗ/@쥉fh6Sϝ:['n~/b/Ia|#lN L%kC `|08Ke&[WB޸ z&o4' L7ގ֯1zwû7<ܱs|l0|>urj/,`x8aıΜ;-7()҄^C5h8X8[-~D$Т 4[o7ű[06am{w}pfGQ?ަ:NRy?꫞=G" ab|W'')5>3kF9aLy&$rx{`g2,1#2[U1@pjoy`[s2'_.o//{҅>33CY>Tttth}V`Kn"n4_dUB9`2bL@6Tكx)$⎓['np p"^M* y|'''&:M> *EnN u` !qi%JW*F/VxQhxK :-B .!I)1s2pJT)4; 0+E:Â\ 8턜,%wcY^чxC@kKi q%T#,^<:-A0R:gJ*-r?\f澈g ګ/E%KW.Q^/9L°MR0N+lC P+4 ltzI7gΌ8w)]욿b \[9Ƽ1m/0n}Kz4^Zi]`4t60/|*^bsxnN5!<ǭ[[-.Ia;0nsPCN<4B1cX ^(JBԩK6\$\:EH$k~i%(CP`d#$b 6f%Gw"}0^Hxǎ<~ҕ d&°Xf Yfi!N)q>#N^SG.fB ELb&$==T~? O@(}qi.Q\{:n80h/˥sy:@꥛ǥ#7\v+vy:5.& T>|ø(m)u|0̮x>Y7&exu)@lI%k +L P 87b.)8dp\]$E23*8UDɨN;A0fcUbyg+L Ba4"{844`,¯bfA?9$]ɍ]{k(_RyD~`4k<SbG=ǬzB{)Sr9 jǨ%Pjʂ`"z,V:͐]J}|q:]T'I*gd, ?3W ]3Yص+b''S\`brRyFFFdJKQѴU"11وJa}G*NK& "w άB7vt]!!DrRyEƨ\1ycV*l QX%1q| fH]7V>ZZ7ֵnX?O;TB|,f5$e'$#Žc;5IN*5޽6@=Fj)4m#[!UeeX64]ͥ\C2"*cU~An}5$ӾfO>kJiL*5%FY8=1+=X8=;&.Qj%fkPȑRHu6R1cɯ $OI~2.3d`?ʳ(ZRe;v2#lFz*yJeu/RbbV0cZ4F&Em&-1[Aͭ7urK8l o+#RMhן̾P)J&2!is:`W=N/ƖQث$\@2;]T sa^v7S$7LpGp؏ 2T0-M[t6b*{iFt*Y!KI54դ)"Kj[4aoj|Wki]e\sqk J&,wΣ9ʑ-Fe#re]0vK/>m*olkPucSM7rnR΍[ޗ؋u|YZYP/=*h8yم38sb?h7FRM|b`FhV<:IŒȕ=Qg`nHTD,\-5YmEWc B^#cBXe s7l]'m︭6Pf:1j1 FbpTFsHdHu+BGu IDATܜT:/d-B芛2;zjhO 1T x; 6?M[@N}Bc qٝQeSP>ESI^vҋy^oZs$65ogBm 6 @u@bXe!k̪?0! Ԕ$p*em Řyޘ⍽uc7jz/_K&RmƆT۹1{c<&e;5qxoU(3J:T3ugf6I`l=0ei?IuAtSrS!ٗU36EB.UU/TC]{4uR]gO#C6=UW,If'Y2$@Wa WާQκbEcƦ獛1%Ent?Z.mCoa V\E@i2Ǻ2:G3 ~tЫMpf{`"KD%ղ,‡;Hhs(ra svRcj0c~M"͐W*j3IN+W;v<5#'~+`,usalbvE4+)yj`2RjG&&.D3չxzLwqzA'&P}kѡcM-[rb0% OL/Fƪx tI lǺ'd="}uW]+Sef߾`3eAE F$On|fƌ֩HR9"ousR{j1I{cËbjER c<(0>oא_MY aӢiE^aKx'H\<IMc[(;fnֶJ#CR1j3nsI5aiBr@5-)ErӐq`!eH@ص-$/β_坕V}RjR}@z.Q1TјT^ch<%*Y0+G{jß1 NTO|5-!SrE f9!k!>yɐ82xĝ#21nc\0^n:b+O!k*abqV؇1Ѥ)"I`x=+%BzxǦe˜`0Fz_:nGO'݆}&4TK|IpFljA q5!H\Wz*k 2* Qdùk/Kuuk3*f+RG\Ƿ kG NqGT;ȇz3Y}0P0F]#>ucR 6͘8p؇ͬ9ar42CVA\ݾZ6ȕ[d zb]+f rzX^n^rE/<ͼ ,#[Zc<Ŧ+~'B\S'O;6vO 6𧇥Mx2ƶ2& 9q8cKQYkyqކO6gמ[\ٲUwͅq|ɡ0`4oi `fƈTvMu '!؏m[NV{;0?0zŤX4ՊW)Yt@٬<V}Zua 1!kff$kv3点9oOtLm9iMcbw}Eŕ 㣣&^vJV;;;z$:GS RxSQ!k՞֩ZuVele4!i<6. bg$":䛒D7exr'{.?d^ NO(NԢ0\:-=3!F*=0Ym0M s/͐U+(\gzL^k-(r9Wܩ_^rY mx1s+BTٓkX:eӒW˴ȏRDOM/`\Sd)D$mS1g(*>n%g8%Sw cxhBSØpxAt{8R30l0.8꾾${cB_r|CU hZ BXn\c $J,f54}O9iW3oQA+鱔'ƶ8n!ոwTV_j}P/j5xO1tِDuHbY@f^<ӭ?Ou]%vO-oȸ:LUN9uc@x K)=_Bk|ƸMbøj~1dD%dݦڇqK*nLؔ )Lw0 ܕv2(x[^g]'Ƒ)ʼ1nHJ%UP߲y *ՠ:TL1r)ƩA@&P܇HA< P{9Z vME<{EL;4Ȱ!.zO1s({n7/|#薸H5%*IVa\ -l3Mf!c)ol-58tqZM`D 994%0Ep'7RMes]/)kus"ِX+2cRk& -u>,N8G50l-ۣZ9byϓ7>^yo\ ƔX"cyX|۸pweu& 2lِP"4107 E#)=θh`S)FXBj@|5-ح68Ęt`|`1Ym{6Ha̤f0f9Xۃq~-k-ҙ0^ ǰ&Ა`XE)qv )b^(Νf qw*1nza\ N1! L*kWڲ뉔]ِuxɐZYukHwCRq` ݕl8?g4xف]Zsy4QltTaTi%^6x֭7i-@jƝ{0!1sR r_PKPe'ghNnmcיrZGg56Qz۔`+Q-اWWyXQU#&+'6وSHal)!1+RO͏wTLJE F\m\NƺxuV@ص#:vw6/d>bT9f7bӿuD$?X3,7'haMd qَ]&@M8å %@m1>pN $0.xo?NBR:d3ua6kBص*9dS!$ל[FEK][13Ln/;g2{ v>VjS6\6/ yjXfud$99s+f}%0 4:D|ĘjMR'`^5_sɸ )_^./'ivHaaA/vV-0ǖ!~aM_>M"\ m߬˰nqgv2K.Yn-[:hZQWx^^K.|J>3&R}4+umQh x0*RO͏wnӻ`q:aN1N QW c3{c'DnkƩk*v0\Jj vPX3tιz/Wc#.joj:5$$RY*ΌcF/#1g&j(!jڒl)1̊턅0+X1iT tqk}x_Ƕ'={{cd,ƫEx5#c)VE'3]KVl#cHyQ4@>~oV%^a8F3g>?h.n̨[R}a83?zw``޸j]{?{1=fǬD=& ^ Bl캘]`ւM$Q4]˒rf3,̮n)9v(`sal6eur6oYF𿅍³E&Kf^o;0$\^P>=/za4sMNcP=:x_q'7nڈ?gwOoYȞW:d'ɢ)`Du2.ėU@'Iiq2VϠJ"@ CF"#aBZBLǢ.a,^P&BݵcmƛN8u+e̞r,Zv݊[́VUd;*6gJևyOンefC_<:$'Ƹ;nQ EMnMV71=yo19󁯉ث_` KKu&Q<x*@P1ûO& w~Ǯ'vٹr.vVkh]+DĮ[]ۊ|^ncnFN1,BTX{D噩Pƺ~ 3*"Ț*U~x,ޚg*°09-j&]. 9`77Bu&c:Qj#D~^>@*aܹjZvK]dCCֲĮW6`%Mr]kLsbYT_t|;k3g=Lw,=;"%ye%ZikziBm"OLo4%ƓpMb}*a'c];wax2@!Zaiiٵ/bv-n9?v-MVǴA>6lvˊcSckmӮ`HA3)rEHs{GiGy: QWTZht@Cwmɪ163`eO Y sWRq|2r&Nz6=?? Դ@J+ /:m6/VsbUj-7&ihI)4#kE\Һji*#[9P^j>Y0F#\;}X79O ٱZs_!źp`tŮu4Ma1g׾ڢZq.(FXlBhH"Ao20gwʬʤKSB}quc4M=p+Pฑm!xn1n4Z!d˜t O1՘3Y bULsZ[눗laJwm]k_}MOؒh$"z勽-M3˷e9K0He8s'짲d68'!CɤK̅qIᇙK#ԸIpşo硿:|}V+FKV+>9E+O.Y|2 H-k S5k]c\eMGa3{y5=E ]YhvVkC `D/V7?BHBVHƀ6CF\KwDb"RB֢M҆\KyCVX YGH- W-D[  Ss}Λd|q̙{y=G~~"۸~VrwQ{Ewok%xwPnFyO(o^[]CY__\VV,by\]ZZZZ\ZŋzEq=~ۗsnyyybblw{?` TM|SӧOO~mӳ3(sgQ/ϡϣ//./,^ZDY'`ia *WPɐ- =)(xzdKk\#ەVPC[+k+kR=5<(-PR#mV] PǷ?M.*.#m-1h;cI=|蟞sRzøjtntqo-ߢ_k,2Q.-ݽ0cdzζ&1 ^͓fyoϜ9uCٳffPhs/_E[W.]Q0N`t#W@rH&Rd~:Qn}3 o9ΞfyKEW̡N#IO 㝻tU~cay4Kv~2m^= S&a&> +7WVVV7 __<|߹?Z|{jF*>K7'@2QSSӧ>t:1# =&IH&Exv v]E j4E:,O3JQ8' IέUPӎ`3\~K˃cͫL[fȴ(`pi\_Ź̂VHr1?4ޭ KW~ށ[kztdg] Gydϓ{&NNMPWZy `<鬓}Zl<<̀kv` Ei (>'Gi`U&2`Yfhژ0FiNB}fL=&,OWr׮`r/v <]c] MHFӲlWP׮A]RZ.P#ʼnEt`؂q`e92T r9E,etb!NX8.b9wJ.MyXޡ̥/[0sson y|lHxLgN;]a|ni93v ;HR42d`_] bS~8HZ2 IѢ~ 79_Fޣ#duWGZZǯ ՜5saޣGt0oY3 Wi\>s0R10FМuNB2k9+&,_̮"F9 sl`#K^2g8-<#?O" g-Tܨ`,<31VIX}Ap+xb"GVHțN0P 㲃ᎼE$¥^;wȈø.`L> ev]˳kErī}oYcۘfg^VJ ;ǮcHcG"vgh%i8mB*sݘ{ Ǡ^WĭRh>a|/%Wpaq%0*>3'Q[v?cQO|/I~2y rkt\ŮC E&.[΁9Vii_ FA U{R >Mq~FQT|&CHn%QgJp㝽Zl|p냜\Cy%%&]/>tז%eˎW*^~1<3_;Iq}ZugttH>NCdso&IFN+$\bנ(bv=/4L/&2}B 0<=?B-4;V[Fə3l64?H.olh5{2,M5Ke(׺P)fs;ʓ"Sf]8驒JYBDWJ^r Wrg tٳ< 1.q<᎝1xA $wa R5yBt :}ݒyB(1&0S"J9`~hhcDaLsۜu[% ;iV}/:n2V\Icfu/߫qĴDB3auKL4p׉KOhS &jK(mmm#d9'Zunl0Gx;a`ǥ<[Ox,.[ԣmЊGa=V,VTo'r'B*Gˎ4tihz$D`X<ӳS'#C#m[6!Q\:0F:2$`qAE:$NJ|YDdRz1iY0Məi-ٹn3Ҳ`[H 4wR9f1*сKWZ eW+Y~.d=ZA%|'Xo\ =" W(Կ) IX}1ϾwK4/N}'owI3%F0F'EMadI.kQe㜌Ԍ-0ƙqa~I/6A:x;yiZ{LsV:b{8:0x9: etOƸ޼DlҸ}gXf!A\j0`aOݕ0T`^س("\QT,e$+֙9\)kW`ْQQeX*+>m8}}~ǡJ\ wzf*~X]>a̩)<ιMQ\j0F/AN>>|H> CPɓd4-FdPdj!4D5-hJ9="[Seckovn dV#?kZج+0鯤g{LjQe;9rQNDD¥e)= \Zpi8cxms={\0Fٶmw:LjZ0 8k\,ćPXc@|׭h6r 5;i+3cNjcK~Xaγ@Z#yYrܺI& {ru=FX*{F{</hy{yr{ #WKKϜ :ufL&c1hhmd,8Q}m1@2Mf :wk4;aY J9${5;f0L삸R2i\"[JVDGBQ\0z_( ]VB y0(4$ҞKAq&^|6]\OٲmA)UOIbe!7?}SdYʟ5VPhˊ_rq qFLJ0{a?Ӌ|t訰kNɣgjLe(+0~lu֓}BSX.'!k^@;fY@G%c b]<:j~M1 Ïs}`abb¯9A +C1.5 ZдG]۔+{1.yg5xwu董PZeYw-:0gi$f{GlSǥ>X֮Xr$/F x&Y\Lv7d5iЯ594"}' ĥ"[ iٺa\9${ŋ!2YD@Ǜt$-hv^xnatS 9fM LHQ"yxySnO'7p/ /92uUX%>;;d{O.y`hÃGu^Xi%dsSf 9®0 FD?̦xT+H<RWm$b妿3~?Ru> UvzaW{}eA9Wp1@$CCoKưU%][p+?c5 <E"B.LTֱeWheo2Y٨hV;ϯdv=.]^ٯ浄hAc {TCYz!% J&"h} [~ fkx:Co40xx)lϴ&<4#1*U#voV^K9m?wŠ4{| Bi=pZ`c} \ z3, aq<g0?uƒn9BdTs< YM,GD-L;ƳIZWXR;ܱ$v#.>PqLY՜1g}}M|wq%ރ׍.\d 9hp B~q޲e kBr 3DlL^d/_"]gϸAF!IWo4 Yo+4S73paٞjV׊TD-FN,6UNLo!*GK"roCrmmK>%X/rA838b3Dś'Xa?^#}֥ 'axT)QTVZٻ[)%(| ^/ ,}r)K_~"yQ>vS6#vRpbߗslF="IշD%L2OR~2v{ {]f0S o! y.0FqzvJ~p>qSm!(F@+"}ft0gdooM͉A~1 X޶l6Qzs97fVPz%[cJEHaJvpJL=rF?vϸoE?ӓ|\0~\}PO4o"dn3F YQmqkc۱m[aXL;Y-l\b2u. ~ߩ˲.ET,, Y~ހP=KƿQ}Nf<8H˰dyHo)7 HžJ[$4& + LکcU|' zgY1(aB668Fc$Gt=ٕ<hooVҒH xtI?LIg ;PKY.f33¡ @ ԙg始̟,YAuB> 9?y<-j%jeF:1kH`.m#9?IIŢB:]Ž?Ǟ -2-WNN @}kB-h(:+98 wZ;v$?導6\0^Ǧ1#];wC(R֣5gsF$YJ$}+_iFA% TpI^ ?YP| Kl =h'a@ ߦN/VJ!rcw zwcosWg]Ǧ]06mGO'C +264X_n wB7G+NaB9>880 V)e{6&&S?˄3}!;!zqX՗w}F߀.yDEyguttt} -{,? 4pVz؂2PB=2ddL>HZ D5~dB828A>O{{qU~OlOa\0ɹ"[(B lCCI"g=E#p2Wk*؇ΡFd Wp2=4K[X3z7$/wmM>nl4<n;|`P=^Vl<`T {ZɁsdHF< &hqųbaYBTyFz1 ğ^:_~/*t֍;?35:lal?u;Ø-"y@Fb>vO riC1Ss"w!k,3݃S!lx,el<ؽm|uS BlzxysW++(Мeh4:;:۹k|[KDܹю]k}m N|EhF2H(xY5HnWF/uv|oN'푇`K70 ۶~v+VGtOcO׿gawWx\# G%DjWOpv| 7G?s<ژdlcu7 JW PbxB)[Ĵ_{.y[_϶)o>ގX' ;޲%A]55㒇u <=n al:u|ki%c[Ƿ_K#.y[Ƿo:uZq:u|҈K[ǷoF\0o:u|4⒇u|[ǯ<[Ƿo:~-al:u|ki%c[Ƿ_K#.y[Ƿo:uZq:u|҈K[ǷoF\0o:u|4⒇u|[ǯ<[Ƿo:~-al:u|ki%c[Ƿ_K#.y[Ƿo:uZq:u|҈K[ǷoF\0o:u|4⒇u|[ǯ<[Ƿo:~-al:u|ki%c[Ƿ_K#.y[Ƿo:uZq:u|҈K[ǷoF\0o:u|4⒇u|[ǯ<[Ƿo:~-al:u|ki%c[Ƿ_K#.y[Ƿo:uZq:u|҈K[ǷoF\0o:u|4⒇u|[ǯ<[Ƿo:~-al:u|ki%c[Ƿ_K#.y[Ƿo:uZq:u|҈K[ǷoF\0o:u|4⒇u|[ǯ<[Ƿo:~-al:u|ki%c[Ƿ_K#.y[Ƿo:uZq:u|҈K[ǷoF\SSS؋"۸j[Ƿo:u a"۸j[Ƿo:u| F"۸j[Ƿo:u|M1Cm\oA_[Ƿo:u|d16ǯw[Ƿo:l?WɕIENDB`nY/`![6PNG  IHDRB@F tEXtSoftwarenoned{xX pHYsgREIDATxqhuKrH)##dl [GD4ٖҲuk-)gKn=!dB 2x A 6x[p6Ax 2}֕$9oG^y+/ݹsg}}}mmmfl4yMHirs$7R4uS˳۪^*Mn^KyYjyyyz췗UWUձXntYUWS w57+/UՉDnNҨY}b쟫VVK3T&7{+jn*4޹\:j5ռh-MjuUn.)ruZuK[K3*[TuAsUU-^qeJWU77լl׷TkZ@ek?V}Uis*[UT~د4uӽW*[Vz6Rl4ou}tJ3kKek虜FFU7zw:=4G|v1>f4iJRƚ'TK)iiuМm=y}`uପ}[AU *[S*UOUz}Zek57PUҬ_jFek^~1*[KUUU|mu*[}^lm3WTҬZkYW9ѿ~EJ>FҼjl57Ҩ:*[Vz7lG[QUH'Tsib.*^KdgB\79Z7O:ħT mݴT/@QRUnݚ=u;bY/]WZ˗o=MOwD纝gUe}IVBK=5eSCiU>]7N=ǸFzx/ƶ}}#ƽAszq/>|7z}X^c|>1^1!bͻ[m7>`7olm ݣ;vLeR(1V>PZÇקmd;T+yxs޺YѡZW)G*[іU8?,C늚]xoEUb A뼱Ҕ`O?׳my~~s=]C_h ;'Cy~ԵZx>:s}]c⢥ w7n ʯ_)wk~v]8:/T 'k֕g57\[W?T?Ttգ}VIV˕]xoEUb\l-;pIlW=uߡU}[ޓ+y-?T?T{qOM?շUov;Tۋa=m'z@]7:N[sR:z@Stj1I:YN63ƪ:uڊ/6ǸuX{W%Ÿu{ݻU/]q#o͇w+eUekWZQ~՝NGqRm=|gYwݾs#9;뾷Mp?Tʕfk̹o=1Tޏ܃~ݸ=ڧ}ڧ}̡qR췺G=ii 3|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}b| SztTۨ>>F-OBJGSz+OOjJgSz9jjڧ}ڧ}/Uq-M*N齔)jJr?&iiw1*)$;*[z[W}V9ϋ9LO?.g?V_9JS* ҵ.3?>>v1VuV2oߛaa֧=ߦ$}=Քz)Iq{OOb^sه?PٚW]!\m/唖iia T>8W Eݠ;mCWC/==XJQiirH9vmbZ7Kc_!_J_$ iiHƷU$|.jfjUyd}9^>Wϥ4=i\>>7!1V*z:srUqٍ{܍X\C,ڍ_O7sr2>Xb||K1.IޞT[unƊq'iOO;$zG?PgcmvZ.1lv[y^k=[A:)̈́dMO?CbR(j_U,o7x]32H;N|;ƴOO#]u6Vo7byn>!\_ k+֩^1}ڧ}!1IX!Ԧ9)!,v.kt4,gm:Q1~τ?T>>pa{l۲ejzڱYC֗?zwu3D}қ)u"φ1>h^0TIVUycEZV{6a;K Ubs&jڧ}ڧcO/hdzLdꐬ*ڜ+~xmU>X7k֙Rz-?;1;/4KO?FjH:k/sfeRɴYaCl%"mۯк*_U,mdҫ♔^ Ov>>NNN2Sڈ^QsiX_-]L~I<OO'X=YU&f6Xi-xUjrz2x>~JJUJy}ڧ}-c3`|UVEZ7H+ՊJuQ`eXO)=%1>bˊUAUUnʧlɧhczz1Rۣ}ڧ}ڧncU+ozkժ҇*`@JۯNv`˰(}ڧ}CUzܥ[O4Z*mڷU_OWRz"oӴOOrvq|l֮jՇ*[Jij$H>>Ӿ밽Ÿ4z#&G8ii<`mUtur`ڧ}ڧ}W}[}ڧ}ڧ} cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii}1>>L cڧ}ڧ}>ƴOO3%|iiigJ>>Ӿϔ1}ڧ}ڧ})cLOO>Sǘii} f?OO]͛7WVVf?OOɋuH>>Ӿr.&IENDB`n @KpPNG  IHDR04$ tEXtSoftwarenoned{xX pHYsgRIDATxquKLqI,KMhh]bLTV%M1.v.R  *1D)cl}\P!RXA )B .7sߎFG9oޏ>MTym}>iiKG]~]J>IOOO%X[[~JUrnn1c?XR4QciKi}2tJBӤN-LwJ4?jyjgaZi{LfA5xP̸y`iަi}gR5M<:3xxi><8kgUMS5U -N;ji5.z]o拋ӏ-'-jybi0XZ7Z5Z_P5MSTO_P5͸9~ip`Y4,QfE4Շ_]Q5M\<28\MS˃WTUqsjphe0wY4+4UU ZG呪ihj6Mկ^^~084ojmձ>P57|O~@*?y,}JU'SLN=QQ7۔8_8 8u UݨNJ/VM?0iX5i7^2Y%sJT ?{f*{0F!zUEU7q,PiByU|Aus yszߛu ,{sQUəT-NqqFj}lI5X,<8[yBX̪(͹j <7 dn4^gR*skNf^+*Rc9z*re'oW롷UUr@wTUj0T&6͟GQ U9(7 dW|0F+o8rPU5Jq(Qyw\}w7䣏~/>k?pt@7*UUQ oJd:ScenșP87fI5_PUQyMnUDo UP sX6F Fe= 57 ;v% 7Ԭ d*97D}=PvR̬c.mHҥ4G\O4V?Ȫ>ҜhG=jgGU̩Wcǔ{nVunnn!ȷ3\Qi^z9//* ?v|o\o!s&#kGȺ@۷O T5ʕ+6U侳@N`u}rQe'F9M@z#;9H5O:yYGTBTƁ['X*YkȚ3Y}2IjNV25#{dH s?_3hx#{m=u܄d ȺY'Ys,󯗪& dGw#B7{ֿk]1M_67j~~LUMGw#t@n[VMӧê1`ɥO.1 #kG֫W...U9{t# C{HvgO@Ys 41 #d[8Ϊc2A ÿ5#.²2kjŹyU^۽fU^[ז憪z}QCU̽x~%U^Ͽ\MS5_??z+4UsXu~y /.̽za^jӴ>y¼ j8n\T ,7|/.ϫVZZ<*~y-U^U+9kVSgex\zK4TMS. O/ OO_֚𻪼<\P՟QYmߪVSݯP_צ#U^o7k*wUU惘陼MK>[W~yӷC~Ϸ>>~zyy=ΥTym}>iiwf7^ Hڧ}ڧ}گiihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>&SzMהeN}ڧ}ϥCܲ&Hy?S5%tX>>(>ћCܲ&WR׼aJCO?c@U^W ;*^Mڧ}/yVnbȜ;4y 4KOh?nF>~4eΡ}ڧ} Y7\ii7ϥwO2fiis}a ݸ?0ii@76όx UO RQҩ> 9-hi;y4/u KڧG%nHMJ:Uv[>Ó }ڧ.ڣϞ}/xԤyg@><62:WwK?wy ?> #kǥ;iQY]>{iQ>Oݷ=vϻ~>O o>@Ri3e{g@><*z HڧGRI_/t\3| i ]֎Kw$~¿q}/xTG֎Kw$~¿q}/xTwY;.>O .kǥ;iQe{g@><*zX Ii9 u3)cr'>o¿q΢|6S/)]St5AJK%>8#z,H NiTZJ*?M)s}I-=,z,]+OܴKTSժO-X ڧR1R^HiCU+*S[L+v~¿q΢Tm,=HiUJޒTɳhK]֎KwN_UwR¤Υ}d{geh ]֎Kw$~¿q}/xTwY;.>O .kǥ;iQe{g@><*z HڧGRI_v\3| i ŀKw$~¿q}/xTwY;.>O q}/xTwY;.>O .kǥ;iQe{g@><*z HڧGRI_v\3| i ]֎Kw$~¿q}/xT:.>O .kǥ;iQe{g@><*#kǥΫm&/>)vrB(k?v{5ڧ}M ]qvÜLO7 Eywi7hOw뻬Kii.ٻ,R _ڧ}ڧ>{;]Cڧ}/pDowYHOʱxse-Ô:iiBމ!?>>f=U^Gii=P(#I)OOE Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z@>>Ӿ-| iiiߍ>OOF Hڧ}ڧ}w$>>iihIOOn}ڧ}ڧ}7Z;kkkHv[?iiig?@6]I=Ρ}ڧ}ڧ}~drIENDB`KDdn  S JA "img1$x \leftarrow 5$bpׯ]Ym"vȮxeD#n]pׯ]Ym"vȮxPNG  IHDR.ig0PLTExxxlll```TTTHHH<<<000$$$ *]tRNS#]bKGDH cmPPJCmp0712OmIDAT(c0P.#ydq{x>`y?S~[h?YӇſ}b~|Cߣds0t5#+%{?P|N։(gr2[-b+$ IENDB`Dd!<P  3 3"((DdX  S 4A  img4$\pi$b.4:=⼝.J +#n4:=⼝.JPNG  IHDR&:G0PLTExxx```TTTHHH<<<000 B%tRNSEbKGDH cmPPJCmp0712Om=IDATc  $W00Җn%@:u[-[ \}mZ}QݻOhIENDB`$$If!vh55Q #v#vQ :V 406,5/ 4pT$$If!vh55Q #v#vQ :V 06,5/ 4pT$$If!vh55Q #v#vQ :V 06,5/ 4pT$$If!vh55Q #v#vQ :V 06,5/ 4pT$$If!vh55Q #v#vQ :V 06,5/ 4pT$$If!vh55Q #v#vQ :V 06,5/ 4pT$$If!vh55Q #v#vQ :V 06,5/ 4pT$$If!vh55Q #v#vQ :V 06,5/ 4pTDyK yK (http://MyProgram.pyTDd - P  S A"bCRIȈ2)寧 nCRIȈ2)寧PNG  IHDR*8cF) tEXtSoftwarenoned{xX pHYsgRmIDATxQgyb9XDq)X[CQ\dmBMC Z(bٲ )BX0sh.TB 3%B^K[H/ ->|3?;yw|6⹭s7-rs X'wym,fq}k<̳Ǯ=ݜsg羻v.~ȱ>Ws>ヽx<o ůؘhcl?^9xqэn/d '^ȑ|cr̟1͜{[9n̟Os/7翛S|s8bs^όgoVyLŭ7˹R6_Ylsq~vk/op3+YlͿ9j[Ücs|-5c?1o:֫Üs:x{~1W,~8_丝Oܹcw9Ο?X,rMDN^?ko+yիY- L;7]yMwwqb,c=te_ɀ䘊b+9b(=Ș嘊H2r-|{צezҦ+gy{Td6ק"Ge7k]"Sl E'm*^z/vY3rM,S^EMv>grdҦbo3rCrc)2`CTl "#6'x㜑S7Sq{Ȱٛ,x)^5~CWos~yi [cq7Ÿfqic|uxʅ^ȌzZ_r a{-=o,{}#_~oh}w768bZ_/7n 8߮7t[Ͻ4|CtOyVCarM^ܹsS2`?~M!K[CX ·/?|?|7>3g)~o8^^~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}S~׾[m=ڗZfӾr~3}u'x}k_'@'yo7z|}kvz?~廟}bGw|}kvخT쿲}?yM9`+}kX69 |}k;9afA9|}k_wx\'v+?k_0O׾lkxDd;׾}O}W>~׾ݺ<Ț)̧}OE͵}k[׾t<ܻ?}k_~+\׾.(n}k_K |j_+L>ok_~+\׾.(J7׾ wn}k_KJ7׾ ?͵}k?t}k͵}k|tsk__wӾODkYޫW1oWG[;[v]k?hVk~=8;xvѾF^m[ԣڕ~|?ԾO+xLkgrױ+;!NxcB 1χZdޏZjzݏ3?l~$HovS 2ueqLnڋ= >ۭ}ퟔsYSv9wgoǗrM>ُO=қ}ퟴwh6~W5$O~Ƿޏw>t׻◟g~?<y1\o#})Lk_ڧ;~ e]~|1~1l<;䫹&6Z>xx`V/ so/,?kzrl[{} tw wzU-Ös뼞暍rkmó0}if7Fxh~&̑iz ^ɕ־,#GzN3kVJ?p=Gctbϻ>ҾOF9/S.Z{0Gk=?Olq9r|ڼ#o䟅?[:h_'wb`'v[x^]=xg:]}ퟄQ'~+\Y1nU\׾t~}k͵}kJ7׾ wn}k_KJ7׾ +\׾.(V}/]P>~+\׾.(otsk__w}J7׾ ?͵}kO>ok_\׾tA͵}k[׾tAg>W}/]Ptsk__|V}/]Pϕn}k_KW3k_/n}k_Ksk_}+?w}祳=sCcg>}k?K~|}oo ~.-?Hk_~cļ}=zO׾\Ӿ}\?lԾn~siδ}k7ri_׾϶}O?i_(i}}k_N>C/}kl?S׾W|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}Sţ|}kQ>~׾O(?k_ڧx}ScO9yw}~k_׾p7ܹ!?U}k_?ڻO׾ЩXdOIENDB`#Dd   P  S A"bQ#;Cc A-#n$n%#;Cc APNG  IHDR8BV tEXtSoftwarenoned{xX pHYsgR IDATxq\ua Y#/AI.EMQ㥤(=8vu$nn4Z+6Nb5V #'h۸DjwiJT]DlDd6q`Mupsϻw훹wf̛7ߛ}ğ7FtmG|4G >~cc㭷j ^_pk:Rr&$;Ib6r$㤱8t@{I'=CIblMkq>x/H8yFc!Il`9xD8o&\h|)^mrqG&QIMVxlj4[uyln$+4'i$JJتFui|}63$98kvN6F&4'.5Nj5_jҸ;&Mpk*Ʒ.<8}qZ$I,^nsI'~NmM4Oj5ѭIbh5Yk|׭IxJíW4qvOW4$Nh4d|Uí\ŦPEi5wo&pkDI]b׊[y$U n='qq:^wNk5I*3Ec&Il&?-d1Ih,V4%X&IeMvIծLeϙ-[hToYJʬRUín]?TWcYínM5 sޭqA#IwT.hT4p]][> jj?pk*pk:~ ej=I4⤱V=nMCnMתkhk$IuAíܮj5pk\Ө^=M4D#pk:?h}39zP:tc#M}MLkX)kҔ2MiXƉluBCe'*E]h]SqrƩ]DSM6IXS3Ojx<=x\z{USV*):q6XZ[U|[CscɞXӿ-O-6]}Jݥi&4]d% ,OA,[?U8}yZ uZ*3N8'w;wӰ&J/j{.j*w JSV*?vM j<[}pgZj-sU^|y4Ӱ*ID%/Mz[m5 nɵW_ЈU[r}ѭq]sZR!nM/r^Rdo/闝B_]Zpk\]\YjK2vRt|xpkV5*L+z˚;wFmK#TOI5e9Pc6) յ3 5SB](TM]Q+is;l*Xb~"WG#U+gsնYL:})T5ܚϟ?_\‚[ݚ88ӷQ5}C- &wezjՍ*KvF_[qB?ҏ[hUQݞ8PFۦ@7Ijŕvi$BUwNd$ҭݵZkw޵;W~qǛ*W7F'׏?~ECey;~Jtꪮw;G?ҏ3fjU UӪՕP_|`z'M}ͽk?UЫc1-k]Pj,A?ҏ3!Tw5b Q:&]4WvlMw.ш˪q_w|I?ҏ[qHQsmjw,qR~)ՇL5v=~|]Ɖ.y\XWgXK*K?N諪pyUUBՈuԾ= 5y*Mnvכx=yrpҏoF#DBMYCMBfxhKox}G5 U[ӹFnxHP7<Џ2pk:w1&Kuwt^iz_5)ԬP>9: qbUJox}[pk:m_?ձy|aJ}G_R3s|4G|4?DíEh>yv>*{|4GW#zh>"zh>"zh>"zh>"zh>"zh>"zh>"zh>"zh>"zh>"zh>"zh>ˢ V a(@|4GkK; uUí"_Zu\۱t4GWgDhdB[EΉ7Ĝch>=.=dřKBo"EZE|4Z*=RB&rcSs݌#h>T*-P/qSs݌#h>[>ZŽyh>ԩԵr sVDAkG| 5=NnՏw%Wsrގh>#wr ս=֤h>OeʲVG|48񖽣h>=-SߎVZul*EӒ ՟h>xTZ7I}I@|4'^ e} ax!g`4GGvPBM30#;3 5u[;h>젴78v%T1{!|4}}Y;~`4G?[tz/nvh>g*n-P>@~F|4'޲wn{{h>V=tO}z}%z?0P|o7oGLEB}ۭ&gGy'^ǛfYjTAcKRzh><‰tB뛥~F|!`o}_EF>q뛥fV|4\"&ޒCx}r}nƑ|4Ăzi뛥FW|4ȳx(ԑ`R&2vD'Kͨ {!N[F5ܚQ^,5^4JRCw X>qo:j9Yjg`4?s$NjiYjg`4?CI}Yj轾#:8o:jɽYjh~xw' ^,5;s$nƑW5~NJK$s"u UjQ39OڰVmD^^5BE C/T^o6}'ao{}GʚCn$ K/T4+C/Tzo*}GE e"noG }GE CQ齾zކ*7TC?ކi7<{}z׭ h~W{}C haJ ]7<ކ{}C56 }Gj腊{^^P {K п={{}C540B訵ۥV!o/ C5^_zofg3:P<owTzofprnY^\,w v`EwbJ 8˯~)oR^,jgz/7T}?*˕bO47dߜXN$7Zę^^Х I%q;}9{}齾ռOjk.чg!n7;HmQ+ }GjU:!?iҴP/4⎚u3\8  h"ěh!d/B+3.wTzf_ѳmB]>k!׫n$͏gJݼzhzS{ew8@Km=C:,R˄ϐuxW)o;*׷y4g^wo`*7Riϲz&N?#"nM/|4? K8=Gd49{fS?wTz}C&ԣG^װϐnGF C/TzJSmҭz|4OCeVCOY/o>CvJp@wTN̼MKiޠ?K#O^l^_裻k}Cz3{/\#G^׈i$H65^_*y9{$DOz/veWq&?T^nȆUVoiˎ< ќڜlGF_1B9_yKJ54Y9PҢ+0HmQŞn轾<^YYRtUJ5t"ZAft8<^_'ԟX5wBu}%*ԟ%K" "_zx}͜,"#rMIjU5UdY$ٚh׵a7{}ysGϊ[ [JUЫ&+fqwTrƶ|}.[jhs`]*n_zx}uD#$bS}'UCwTƪRuƠwC햣"' yʊSoM}%UڵmREƹ^Ry}ՙTUc"d3AxgDǠh*Wzn/2!qrS^[vv+"\(@|z/\mg응=dvkRCQ|owTI3^ P|o s}C5/mz/jt Cn$J}酊eJ6 חs}C56 }G\P P|o s}C5/mz/vѷgGEۿ2s}|o 뛩{SCQ|owTfozކ*7TC?ކ{}C5oϠކ^P 6 P齾6 חha;*7TC/T40BjG_40^_zo{{}C haJ ]7<ކ{}C56 }Gj腊{^^P {K п={{}C540BwT40^_zoކ^P P|o }|o{}齾z/mJ ]7<ކ*7t{K wT40*mz{}C5/mz/7TC mJ |o JQ|o{}齾{{}C5BE C/Tzo~E Cj轾ha;*7t{^^%zmz/7TCQ|owTzo^haJ Џha轾^P 3ha;*7TCox@ C/Tzo*}GE Cj;*mJ 6 P齾6 חކ^%zmz{}C ha轾^P }GE CQ齾zކ*7TC?ކ{}C5oϠކiJjlGF_|^^KNEíEw齾C|[뫿ݖu3R;ꐯݖJoJGF}*Pzח~Eo'zՉu3{Bg`zouݑu3{Bg`zﰷߛGu3yzbMח/?c&k~ċɚ齾C?>ozo+}@ցāo(D^лzW_\J-ח/?FTg`zo#30׷g ċ#k<{}x|(30׷%zWpx|4yz6QN4Ov,G;. LmO~\7h>m<30׷3|4?9R n d?*EMQKՉwW%82gUꍾI2/}/E,5齾HRzh~J*R{}'^4 Lh>?]ؗ7KMOѫG=Kj@2KK|4Th_j3~'L_RƋ#?pl30ח~E Lh>_ţNjc@=o}/G*t^_^d^_gh>4oY/ċ@t3R4Gނ^_z/vj^ψMGF|4?;xy}/E|4QW zh> E9"}.U󃼷חh>߿bv{;W?p^h>gǜ_JovN:T&rގh>?/h[IDAT'KK|4x|4ujux"/#8bx"Gќ=0gUhhO>OחՀh~!f'KK|4/ܴbޞh>?n^_/x}'^4GDŽ=Oחh>?>R?p>^4Gn3py4Ga \^/}/E|4e?E|4ͷKtBx|4GSiz.חh>Koudqd4G \"U1h>ݯ #'Ls*E|4sYs wD#jqd4G|4?k]D/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cYD/T4G|4?cY[yA>G|4/T+++KKKnM/|4G|4_ x4G|4?SQF_[yA>G|4vAd'WIENDB`3Dd  %&P  S A"b-3*B+ݺ~6c 3-Gn3*B+ݺ~6cPNG  IHDRB@F tEXtSoftwarenoned{xX pHYsgR IDATx}quCLa0*PeB`#BPc!eL׎DBZPα)-*T+9d#R*5`%!  WHʅ ;֨VGPpnǷoow733k]p:'տl|6>!D09 3cڞ֯:vcNcm/:DkDud_ l@ #1H0?vvg Qή5Du0@TCA2s럁 c!#۝`\d-2 QCՑ}ۅ; MH0CTǶwATGx~{ dQۓ?aal;"?Dtpw A<3Ózx7d(;sfQzΣk0vx 3y`R]o[n{7#c]B{#k ^Ķ_<'@m6[߁X߅xW?nl5~#ۯ{2n{o̸{On8ddd~1ɨx#36<]>éU4>tg!cr_g4^o=3s83wv =>H;33o"OVK̎h1gdgLޗqx0FEg` g2zYDR !OnO'իTקq)8WnLMc[Ql6&ՙ}ԟdևmv`O']LX29IEcoiʍjcͥCj ٹ:3߄@.}߱2O*'.&ilm ?<#'KiY!vq)ixQmAil>6T/CR7z);7o_Zs?r}]J1 H9Ja>6TZR?hxO> '؆?6?|Rm#>}4HQۨElS}CNݻr!c6?#=O $tmս^Ba.jj)4mJ9jIͩv$Dulg`06ad:qI%޸e#3p6Ʒ [[ih 0 [[q+ӃۂN8}v38w7{_ o93;cpك_~2+޸wy`x=`x򕳃{#3ƽg#ƑṃGyܖom wnpt03G 6dp` ATӃ O`xA`gigl4QӘgi1gD1Oc6>g㧉bl|6>O&yl|6>?M4fl|6~(igl4QӘ_ǧߗ^Ofk1sr$Ll6>ykm<5*zS^r!&Z~ l|*y{c4>9E-"6Oc6L##:xMټ H-):yg?ur#Ҳmᘧ1V!/Ә"y縥F:5dx6~piƟᰲ*I.$&y绫דDʛS\~9dx6~k@iƟFy'ouYC^yYz o'?g8a3o*S3Oc6~8nj(U4:RL (y4f7Od)8G`e6~Hio4=<겎kMуWd`l Z7 g/vyAPVgת'/'?}io דSƜlo7b}y[=!Ft(61}D ,gu ,eT~r@~ '"HwZV3`l| (zNkKu1|\/D6D0P7Of6?ic%cnu܃}f#fE5e"g<͓ ol|.zC~80+wʫ"C!co.}*)򐯫i "4_yY6`h3DMgfF}B7l|y[zQ#2+!B&iwEӊOfocl|6EKֲkys0H7#f70EOYig7h #I\NMuP4fϞ;'?>'(YiƚWk|Vd cM6Oc6>,&x<3c&~i&J`qy룎.N JN1_~XǙ4^@<P4fϞu됨ZsiQK#m c"}By l4f,mgth*#'1Is{n}s(ig㗟jDT'=?Q'#v2H 'qIH<"r-8ig㗟E#0u2`oA|-\Mbpxïp~94`6~gl|6 1GLDE 4{1F5cL&@1?š5"C_"aF/fGy(rywhȽ?~ !?ӘƟr/9'!wV[5pƉ|׽5Rk0U4n WԴORh/}nm`Ϛ1l| 62p= 6Oc6>qTݟUv|HP4f@5z`n"y!Kl˧ n(y[pZF_;Y 4fCGʘO&# *y?L_|P:~AZB=C?ljYI1 #:h q'e8Tظk5C_v4n}"k=9۾3ZTƂ XH\2"qXbB#V`* Q(uh8Z!^e-@` f? y+#ۏ$ N6_-yy7oy"]`Q@j&]2VPy3? {&g4n(,O{ȟoq)t0rgZ/&"p L9n1OѴ y!_VJ8 it$ jSD"NgZc Ca @`TpeM✏kS+aOnI V|rϪUs霃|C:|\u<oD~WA&״zWm/]$o`_!r1HYiۨ~?*BC]qiӸgaE>~X krKk h4V@k7L+.}2 Do܂ mSiV/+Q=2΅S|۸z<#yҿ,߮rUc z>hCr t><'GKF^/ϊ NBת_8;:1Ic*B<{f~uD->.M7P~~k3x( ]4Cc~u?Dt tE̅Nc»58vUb[+*iCagp5@c|aƧk6:fV1:UOB{=S%x1pB0m+3!BRb&8m]1@aCQ^W$u|1_Cdj/t%jkFq}Ν~]Vȟ(f?H݅#7cR Y'UXShԽ} ?X:VZ,MK7a!:GcdSGBm`XqHE_盧/!h@QcN<Z5d+|%iRܡrKDZz$ (Lh+NcϨ~u S8d5Tn*N8Slm`T^DR!#X'A}\eC/`?fz#I ۘ|`V1L= @DNӸ:U1z75IurB}J $U0z Zu*|qHSaX&LCyEhS!8pϳLsf= .P 4֟X ^7i*άq:DcFB n$8E']qXVÿzsf*N8 ;C p)tl t=0c-ғGc\3+4u 8)Q'UXm6/C3lj0q+<ᮯ[}CTe:>ⴀ8C H;)tlՖǗAIuiMRwF~+j:>4j1'Xq)b"4F4~'nպR4йC4FJxНhYJ<ݨRZuT'UV$^Kxr ֤v[ޞj"n֊PIi޽QSUB6& J) ^Vc%xSĕ}g(ħg{Ny/vwH7z^Z Xz^ cƴ2ewn<,滫MK3>opzR 3fV-%ťyTժXTq؞t~V\.bz&:mİ46xf*NX߂/c ; L ?X}XK^fAYbk=V]LG(@TOӡWC.Vj;/1t<. +j:>$Ě`{uSHu"gR(r3B;绻7ul/1uJ&u/fu|Ri15F)}˙B6ƙtb܊b>vwo^bc.GEDul{]I'!Vy ^PY^Ka┏FRmc%/|OFM~P'UesxE2BW\Uo^n(ݛ:PhE*΂qVsEB/{ ; LXd22KNUfRTqj8F [L ; nyq/ GFw r8)BC.ZV31~ w@QX3ڸWMct3Ro 3u|Ri"rjgOB/t7U1D'Q `P<+"O2dfcmU1ahź`4FHWNnйCY@s疣1366^WX jEZ'U$qʾxȁ~J2V#Ax8#\`4yDcȁq`po$9i^cojX߂R' tV\6ԸLz"C?`cФ/@ "4c'):>$icd+ c7'rxu#x)i yWS;{(}r[m84uӫ$v_F|ա漈z^uTqR,yШBmft ?ԪlաR'Q]YIg8~Z\#w=dja\2? 4~o ^Wx-U WW&ӦO8s qWf[]|utDW2cWxz&n9()իա1DH$O8yܱ+#0*`l:W{vȍ.̪s։t:vSc?=7siL*) xhz;DuUoTq*|vޘսȟ{16%Z}IDATM +[,]`R'}W@=v5[hIg)t,$ hi;7Ť-X vYIi3ՊK&z?/5 w5i$ptZu*΂q11A.VNդ1D3k2bO8 1O4PCz r94ѿ+K)dժjTqcuޚ9MVTq*|д3>;Dbv[}RS":HtSc{2pي'խ%nZ}7ZkEu|RũȇxBm`$ k\B4zqiVem{NX_SbqycsuR4.}Ëj;v'hfCN[!S T׶./?!aSifLTqrg>mUufݞ]^6~Nq6[o+.wwNN?vxTwƥsJc:>@/?;oSq[=% GF66n ]>f ,g@*ݞZ TuWh "z:5߭5cjml~ӏғ]qx 5<[4R̯mR7@J3",+uiˮ`{2 ] ! rH,;֚5/@T6IvJ0:DctZ.ur6*ԏWw;mxή66?XraylB>懗'qxhl~`tƐI tYhzK3.Ϩ-c..uZ4v3k滦$-}ovhiŮΊKA=lsV{j#Ʊ-_;to14]0_K,ts1IuqN5ln:AJR0ԏ+hL`` K#ܞ2~I%Hc~<9W\t|۬ƧOXTC*Db[ო/54/(& D5zBQvKA ^j*nn_j_a=zGi KRuPiKujV\.:9HeMS}j6:uBҸ6o~~Xs/ m~B֦=h=!O\t4o*`L1rq7TϨ+.uƺij${k60njW6', KwiCx97n)tS?!fq$tLz^ݥ1]~5an)[lև.ݥ1$i9;E[Cޤ4׊]gT_4uCO6‡._:. NX׾ W{y ũio3 Zu6F{|txԹ9`Nu4!A t?&@x/0ԩ].un;o4MHjwY1߿5ա4/=vsfkd66?Oi 汫Smv0?̢1g5@cL-+!adп ^IO3˕SK:h!1gt7@c srtowDn1fabnN^S;!\4n2@c &I:/ma`!Ze#ұquv0lsX4N٦+ұ1$,utnlȬ؞O.~_4 Kf4kcdb_Wy? \`.WLcd=rڠ1Ɵt~0d8yTk0|4yT ۞I581ӘƧc_۰91OB_,{ӘƧ綧f(yT@?֐9-igSþES1].671O/ݞ|x[ӘƧ@F4fyxW|4Ϳu[Ә!S;OͿ9qӘ!}m!`wy=5Qj`igïQml~q71O9+"nDc71O-nONl ƟN4fIn~il|6> Vi:`.h-JM->E 4f/N\hnO3ښ$y @ω y ̰2j.?A4f5dl|6>3k{,l4QӘoRcl|6~a{C2Oc6>u@c̬f,y&uPig4OS2Oc6>u@__6~Xigl4QӘgi1gD1Oc6>g㧉bl|6>O&yl|6>?M4fl|6~(igl4QӘgi1gD1Oc6>g㧉bl|6>O&yl|6>?M4fl|6~(igl4QӘgi1gD1Oc6>g㧉bl|6>O&yl|6>?M4fl|6~(igl4QӘgi1gD1Oc6>g㧉bl|6>O&yl|6>?M; c{Ygl|f !c{Ygl|@cAT7gl|GšyfIENDB`@`@ 2 NormalCJ_HaJmH sH tH R`R 2 Heading 1dd@&[$\$5CJ0KH$\aJ0N`"N 2 Heading 2dd@&[$\$5CJ$\aJ$DA@D Default Paragraph FontRi@R  Table Normal4 l4a (k(No ListB^`B 2 Normal (Web)dd[$\$Bb`B 2 HTML CodeCJOJPJQJ^JaJ$o$ 2 textsf4U`!4 2 Hyperlink >*phJd`1J 2 HTML KeyboardCJOJPJQJ^JaJe`B 2 HTML Preformatted7 2( Px 4 #\'*.25@9CJOJQJ^JaJ8h`Q8 2 HTML Variable6] oa 2 note>`r> 2 Footnote TextCJaJ@&`@ 2 Footnote ReferenceH*٤ ٤ ٤ $ NK3M^q )9Sc. | u=M_gvMeq9I]ow*F^w0Ld|\u-=M r!!!!Q"###$$%%&&'8(F(Z(`(((((*)0)----!.$.l.n...1-3W4o4v444445:5A5K63848G8g8889,99u:::::H;T<y<<<<<====6=7===Q=R=Y=y=z==========>?C@_@@@@2AlAABB[BzB1C2CGCCCDD1E2EHEbElE~EEEEEF)GGGGG H%H-HHHHHH IUIpIIRJKLLLCMRMNNOpPqPP0QqQQQQ RRR0RSScTUUUVWfXXX{Z|ZZ[2[d[e[\\]@]K]]]^^^^^^[__```Kaaaaa1bkblbbbdteueefgh$hTiii/j0jkk9k:kkkkkallllmmnn+o,oJoroooo p)pPpbpoqqqqsMststtttuTu^u|uuuvdvnvovvvwwxx y,y-yez{{{{=|H|g|u||||||(~~~~~~N*?bc=Ã҅Ӆ/AdӈvىP͊׊8FPwċˌ`9YZ FÐ͐.STbl͑ #<\ޔߔnɕʕno)*{|%ǘӘ%HA(@RwϜ 07CdȠ٠0fäĤƤǤɤʤ̤ͤΤФѤӤԤ֤פڤ@0@0@0@0@0@0@0@0@0@0@0@0@0@0q@0q@0q@0q@0q@0q@0q@0q@0q0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0 @0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@ 0@ 0@ 0@0@0@ 0@ 0@0@0@0@ 0@0@0@0@0@0@0@ 0@0@0@0@0@0@0@0@0@0@0@0@ 0@0@0@0@0@0@0@0@0@0@0@ 0@0@0@0@0@0@0@ 0@ 0@0@ 0@0@ 0@0@0@0@0@0@0@0@0@0@0@0@0@0@ 0@0@0@ 0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@ 0@0@ 0@0@0@0@ 0@0@0@0@0@0@0@0@0@0@0@0@ 0@ 0@0@0@0@ 0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@ 0@0@ 0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@ 0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@ 0@0@ 0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@ 0@0@0@! 0@0@0@" 0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@# 0@0@0@0@0@0@$ 0@% 0@% 0@0@& 0@0@' 0@0@' 0@0@' 0@0@' 0@0@' 0@0@' 0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0@0000000000@0@000@0I00=@0I00=@0I00=@0I00=I00L=@0@0@0H00@0H0000 cTUUUVWfXXڤJ00J00 J00J00@U J00J00J00J00 00 = &.3@EK$W[/dfjsvy4ĆCTTĬ٬WZ\^_acjoqtvwz|})5ADE6EQEyEEEEJOV0Zcflj9s,w{d~ËvbǠѬ٬X[]`bdefghiklmnprsuxy{~جY9;6C7E7RRR٤XCCX?b$].ȴzyII>[w4$b$Y/`![6b$ @Kp@z(    |. 0e``TT`TT3"    .0e0e0e``TT`TT#"    .0eN0e``TT`TT#"    <A0e0e0e0e C"`  6A0e0e0e0eC"`  6A0e0eC"`B S  ?PXaqˌ٤ *,6Jm""..J! R-J@*#Y.J!.-J@#eT. )J@ tex2html3 _Hlt138860304 _Hlt138860305 tex2html6 _Hlt138862491SECTION004710000000000000000SECTION006100000000000000000SECTION006200000000000000000SECTION006300000000000000000SECTION006400000000000000000%38ϜȠڤ@@@ %e8?ޜ.נڤ MNMkMUM|MlM~QMTTMDMTUMl M\wai 6COOO$OdRTڤ  el :CO#O.O.OgRTڤ > *urn:schemas-microsoft-com:office:smarttags PersonName9 *urn:schemas-microsoft-com:office:smarttagsplace=*urn:schemas-microsoft-com:office:smarttags PlaceName=*urn:schemas-microsoft-com:office:smarttags PlaceType    a c DMmnopCDSTWXmnowxyPYhq ":AV]ks#$$$$$9&;&&&3,E,l3n355%8.8::@#@:@=@AAB BfEgEvEwEEEEEEEEEEELHMHHHHHHHHHIIaIbIIILLRMYMMMPNVNOORRRRRRTTUUXX6Y=YY[b[[[]]]]]]K^R^ ``yaaaa&b/b1b6b^bib,g.ghhhh;iHiiijjjjjjkkk%k(k5k6k8kkkkkkkkkmmmnnnnnnnnnooooooop pp)p1p4p|@|I|V|||||||||||||||||6}>}}}}}ALNS~)-36=?NRaÃЃӅՅˆň҈ENPUˊ͊ϊ׊"*6PX[cfstvz‹ɋ؋܋ `jy9JOW;DFKwÐŐ͐ڐ  ,.8GQltwˑܑ֑ߑ "#*-:<MRZY`ߓӘܘ%.Ucjr{T]NQin+6Ơ09foqääĤĤƤǤɤʤ̤ͤΤڤtv 18=B[bglw } W\PYhq ":AV]<Afk| EJ & !!z!!!!!!""$$$$$$=&?&&&|))))**++,,-.(.-...5161l3n3_4d4668 8g8m88888 99:F:`:e:{:}:::::F<L<==??@#@I@K@i@n@@@@@@A|@|Y|`|g|l|u|z|||||:}>}~~~~NS*,"ӃڃӅՅPU͊ϊ8=FKtvwyŒms9K FKÐŐݐ;ATYbgӑՑ<N˘И".0LO 9;INtzil ääĤĤƤǤɤʤ̤ͤΤڤ333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333ڤ¤ääĤŤƤȤɤˤ̤ͤڤ" <> Z&dh}L߉0 u"'g#NM^Xt>'$"$Fd*tD{mujoy_2*; Z9g@'$I4 i+Bz+!Qdw&/pb/h`QoQ1!o`$85Ђ?a,r1DLL1>FbEk);K(JTaJ{[ۨZ^CMDdluW&iq2@-i&:-oiFMku tkΰn-jHW~Oh(h^h`(B*OJQJ^Jo(ph p ^ `pB*OJQJ^Jo(ph^B*OJQJ^Jo(ph>H^`HB*OJQJ^Jo(ph>`B*OJQJ^Jo(ph>`B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph> ^ `B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>`B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>h(h^h`(B*OJQJ^Jo(ph`B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph> p ^ `pB*OJQJ^Jo(ph`B*OJQJ^Jo(ph>h(h^h`(B*OJQJ^Jo(ph^B*OJQJ^Jo(ph> ^B*OJQJ^Jo(ph^B*OJQJ^Jo(ph>H^`HB*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>^B*OJQJ^Jo(ph>"w&/^FdMDd-iЂ?jHW~oQ1b/"J{[oyh}+oiD{ 'gNMFMk'1D tk`$8@'1>Fn4 i+*; &i );K""[R*?2 <<<<====6=7===Q=R=Y=y=z==========ڤ@֋ ٤@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier New;Wingdings"1h$&WS(WS(#4ĢĢ2qHX ?2 21nonenone"                           ! Oh+'0h  $ 0 <HPX`1noneNormalnone1Microsoft Office Word@G@ȿ6@`6W՜.+,D՜.+,0 hp  none(SĢ' 1 TitleX 8@ _PID_HLINKSA S http://myprogram.py/ v&5http://www.pentangle.net/python/handbook/node18.htmlfoot495  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&')*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkmnopqrsuvwxyz{Root Entry F6Data z1Table(WordDocumentLSummaryInformation(lDocumentSummaryInformation8tCompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89q