##// END OF EJS Templates
Merged ipython-frontend branch. All changes in IPython.frontend except for updates to IPython.kernel.engineservice.ThreadedEngineService and associated tests.
Barry Wark -
r1294:defe9154 merge
parent child Browse files
Show More
1 NO CONTENT: new file 100644
1 NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644
@@ -0,0 +1,425 b''
1 # encoding: utf-8
2 # -*- test-case-name: IPython.frontend.cocoa.tests.test_cocoa_frontend -*-
3
4 """PyObjC classes to provide a Cocoa frontend to the
5 IPython.kernel.engineservice.IEngineBase.
6
7 To add an IPython interpreter to a cocoa app, instantiate an
8 IPythonCocoaController in a XIB and connect its textView outlet to an
9 NSTextView instance in your UI. That's it.
10
11 Author: Barry Wark
12 """
13
14 __docformat__ = "restructuredtext en"
15
16 #-----------------------------------------------------------------------------
17 # Copyright (C) 2008 The IPython Development Team
18 #
19 # Distributed under the terms of the BSD License. The full license is in
20 # the file COPYING, distributed as part of this software.
21 #-----------------------------------------------------------------------------
22
23 #-----------------------------------------------------------------------------
24 # Imports
25 #-----------------------------------------------------------------------------
26
27 import objc
28 import uuid
29
30 from Foundation import NSObject, NSMutableArray, NSMutableDictionary,\
31 NSLog, NSNotificationCenter, NSMakeRange,\
32 NSLocalizedString, NSIntersectionRange
33
34 from AppKit import NSApplicationWillTerminateNotification, NSBeep,\
35 NSTextView, NSRulerView, NSVerticalRuler
36
37 from pprint import saferepr
38
39 import IPython
40 from IPython.kernel.engineservice import ThreadedEngineService
41 from IPython.frontend.frontendbase import FrontEndBase
42
43 from twisted.internet.threads import blockingCallFromThread
44 from twisted.python.failure import Failure
45
46 #------------------------------------------------------------------------------
47 # Classes to implement the Cocoa frontend
48 #------------------------------------------------------------------------------
49
50 # TODO:
51 # 1. use MultiEngineClient and out-of-process engine rather than
52 # ThreadedEngineService?
53 # 2. integrate Xgrid launching of engines
54
55
56
57
58 class IPythonCocoaController(NSObject, FrontEndBase):
59 userNS = objc.ivar() #mirror of engine.user_ns (key=>str(value))
60 waitingForEngine = objc.ivar().bool()
61 textView = objc.IBOutlet()
62
63 def init(self):
64 self = super(IPythonCocoaController, self).init()
65 FrontEndBase.__init__(self, engine=ThreadedEngineService())
66 if(self != None):
67 self._common_init()
68
69 return self
70
71 def _common_init(self):
72 """_common_init"""
73
74 self.userNS = NSMutableDictionary.dictionary()
75 self.waitingForEngine = False
76
77 self.lines = {}
78 self.tabSpaces = 4
79 self.tabUsesSpaces = True
80 self.currentBlockID = self.next_block_ID()
81 self.blockRanges = {} # blockID=>NSRange
82
83
84 def awakeFromNib(self):
85 """awakeFromNib"""
86
87 self._common_init()
88
89 # Start the IPython engine
90 self.engine.startService()
91 NSLog('IPython engine started')
92
93 # Register for app termination
94 nc = NSNotificationCenter.defaultCenter()
95 nc.addObserver_selector_name_object_(
96 self,
97 'appWillTerminate:',
98 NSApplicationWillTerminateNotification,
99 None)
100
101 self.textView.setDelegate_(self)
102 self.textView.enclosingScrollView().setHasVerticalRuler_(True)
103 r = NSRulerView.alloc().initWithScrollView_orientation_(
104 self.textView.enclosingScrollView(),
105 NSVerticalRuler)
106 self.verticalRulerView = r
107 self.verticalRulerView.setClientView_(self.textView)
108 self._start_cli_banner()
109
110
111 def appWillTerminate_(self, notification):
112 """appWillTerminate"""
113
114 self.engine.stopService()
115
116
117 def complete(self, token):
118 """Complete token in engine's user_ns
119
120 Parameters
121 ----------
122 token : string
123
124 Result
125 ------
126 Deferred result of
127 IPython.kernel.engineservice.IEngineBase.complete
128 """
129
130 return self.engine.complete(token)
131
132
133 def execute(self, block, blockID=None):
134 self.waitingForEngine = True
135 self.willChangeValueForKey_('commandHistory')
136 d = super(IPythonCocoaController, self).execute(block, blockID)
137 d.addBoth(self._engine_done)
138 d.addCallback(self._update_user_ns)
139
140 return d
141
142
143 def _engine_done(self, x):
144 self.waitingForEngine = False
145 self.didChangeValueForKey_('commandHistory')
146 return x
147
148 def _update_user_ns(self, result):
149 """Update self.userNS from self.engine's namespace"""
150 d = self.engine.keys()
151 d.addCallback(self._get_engine_namespace_values_for_keys)
152
153 return result
154
155
156 def _get_engine_namespace_values_for_keys(self, keys):
157 d = self.engine.pull(keys)
158 d.addCallback(self._store_engine_namespace_values, keys=keys)
159
160
161 def _store_engine_namespace_values(self, values, keys=[]):
162 assert(len(values) == len(keys))
163 self.willChangeValueForKey_('userNS')
164 for (k,v) in zip(keys,values):
165 self.userNS[k] = saferepr(v)
166 self.didChangeValueForKey_('userNS')
167
168
169 def update_cell_prompt(self, result):
170 if(isinstance(result, Failure)):
171 blockID = result.blockID
172 else:
173 blockID = result['blockID']
174
175
176 self.insert_text(self.input_prompt(result=result),
177 textRange=NSMakeRange(self.blockRanges[blockID].location,0),
178 scrollToVisible=False
179 )
180
181 return result
182
183
184 def render_result(self, result):
185 blockID = result['blockID']
186 inputRange = self.blockRanges[blockID]
187 del self.blockRanges[blockID]
188
189 #print inputRange,self.current_block_range()
190 self.insert_text('\n' +
191 self.output_prompt(result) +
192 result.get('display',{}).get('pprint','') +
193 '\n\n',
194 textRange=NSMakeRange(inputRange.location+inputRange.length,
195 0))
196 return result
197
198
199 def render_error(self, failure):
200 self.insert_text('\n\n'+str(failure)+'\n\n')
201 self.start_new_block()
202 return failure
203
204
205 def _start_cli_banner(self):
206 """Print banner"""
207
208 banner = """IPython1 %s -- An enhanced Interactive Python.""" % \
209 IPython.__version__
210
211 self.insert_text(banner + '\n\n')
212
213
214 def start_new_block(self):
215 """"""
216
217 self.currentBlockID = self.next_block_ID()
218
219
220
221 def next_block_ID(self):
222
223 return uuid.uuid4()
224
225 def current_block_range(self):
226 return self.blockRanges.get(self.currentBlockID,
227 NSMakeRange(self.textView.textStorage().length(),
228 0))
229
230 def current_block(self):
231 """The current block's text"""
232
233 return self.text_for_range(self.current_block_range())
234
235 def text_for_range(self, textRange):
236 """text_for_range"""
237
238 ts = self.textView.textStorage()
239 return ts.string().substringWithRange_(textRange)
240
241 def current_line(self):
242 block = self.text_for_range(self.current_block_range())
243 block = block.split('\n')
244 return block[-1]
245
246
247 def insert_text(self, string=None, textRange=None, scrollToVisible=True):
248 """Insert text into textView at textRange, updating blockRanges
249 as necessary
250 """
251
252 if(textRange == None):
253 #range for end of text
254 textRange = NSMakeRange(self.textView.textStorage().length(), 0)
255
256 for r in self.blockRanges.itervalues():
257 intersection = NSIntersectionRange(r,textRange)
258 if(intersection.length == 0): #ranges don't intersect
259 if r.location >= textRange.location:
260 r.location += len(string)
261 else: #ranges intersect
262 if(r.location <= textRange.location):
263 assert(intersection.length == textRange.length)
264 r.length += textRange.length
265 else:
266 r.location += intersection.length
267
268 self.textView.replaceCharactersInRange_withString_(
269 textRange, string)
270 self.textView.setSelectedRange_(
271 NSMakeRange(textRange.location+len(string), 0))
272 if(scrollToVisible):
273 self.textView.scrollRangeToVisible_(textRange)
274
275
276
277
278 def replace_current_block_with_string(self, textView, string):
279 textView.replaceCharactersInRange_withString_(
280 self.current_block_range(),
281 string)
282 self.current_block_range().length = len(string)
283 r = NSMakeRange(textView.textStorage().length(), 0)
284 textView.scrollRangeToVisible_(r)
285 textView.setSelectedRange_(r)
286
287
288 def current_indent_string(self):
289 """returns string for indent or None if no indent"""
290
291 if(len(self.current_block()) > 0):
292 lines = self.current_block().split('\n')
293 currentIndent = len(lines[-1]) - len(lines[-1])
294 if(currentIndent == 0):
295 currentIndent = self.tabSpaces
296
297 if(self.tabUsesSpaces):
298 result = ' ' * currentIndent
299 else:
300 result = '\t' * (currentIndent/self.tabSpaces)
301 else:
302 result = None
303
304 return result
305
306
307 # NSTextView delegate methods...
308 def textView_doCommandBySelector_(self, textView, selector):
309 assert(textView == self.textView)
310 NSLog("textView_doCommandBySelector_: "+selector)
311
312
313 if(selector == 'insertNewline:'):
314 indent = self.current_indent_string()
315 if(indent):
316 line = indent + self.current_line()
317 else:
318 line = self.current_line()
319
320 if(self.is_complete(self.current_block())):
321 self.execute(self.current_block(),
322 blockID=self.currentBlockID)
323 self.start_new_block()
324
325 return True
326
327 return False
328
329 elif(selector == 'moveUp:'):
330 prevBlock = self.get_history_previous(self.current_block())
331 if(prevBlock != None):
332 self.replace_current_block_with_string(textView, prevBlock)
333 else:
334 NSBeep()
335 return True
336
337 elif(selector == 'moveDown:'):
338 nextBlock = self.get_history_next()
339 if(nextBlock != None):
340 self.replace_current_block_with_string(textView, nextBlock)
341 else:
342 NSBeep()
343 return True
344
345 elif(selector == 'moveToBeginningOfParagraph:'):
346 textView.setSelectedRange_(NSMakeRange(
347 self.current_block_range().location,
348 0))
349 return True
350 elif(selector == 'moveToEndOfParagraph:'):
351 textView.setSelectedRange_(NSMakeRange(
352 self.current_block_range().location + \
353 self.current_block_range().length, 0))
354 return True
355 elif(selector == 'deleteToEndOfParagraph:'):
356 if(textView.selectedRange().location <= \
357 self.current_block_range().location):
358 # Intersect the selected range with the current line range
359 if(self.current_block_range().length < 0):
360 self.blockRanges[self.currentBlockID].length = 0
361
362 r = NSIntersectionRange(textView.rangesForUserTextChange()[0],
363 self.current_block_range())
364
365 if(r.length > 0): #no intersection
366 textView.setSelectedRange_(r)
367
368 return False # don't actually handle the delete
369
370 elif(selector == 'insertTab:'):
371 if(len(self.current_line().strip()) == 0): #only white space
372 return False
373 else:
374 self.textView.complete_(self)
375 return True
376
377 elif(selector == 'deleteBackward:'):
378 #if we're at the beginning of the current block, ignore
379 if(textView.selectedRange().location == \
380 self.current_block_range().location):
381 return True
382 else:
383 self.current_block_range().length-=1
384 return False
385 return False
386
387
388 def textView_shouldChangeTextInRanges_replacementStrings_(self,
389 textView, ranges, replacementStrings):
390 """
391 Delegate method for NSTextView.
392
393 Refuse change text in ranges not at end, but make those changes at
394 end.
395 """
396
397 assert(len(ranges) == len(replacementStrings))
398 allow = True
399 for r,s in zip(ranges, replacementStrings):
400 r = r.rangeValue()
401 if(textView.textStorage().length() > 0 and
402 r.location < self.current_block_range().location):
403 self.insert_text(s)
404 allow = False
405
406
407 self.blockRanges.setdefault(self.currentBlockID,
408 self.current_block_range()).length +=\
409 len(s)
410
411 return allow
412
413 def textView_completions_forPartialWordRange_indexOfSelectedItem_(self,
414 textView, words, charRange, index):
415 try:
416 ts = textView.textStorage()
417 token = ts.string().substringWithRange_(charRange)
418 completions = blockingCallFromThread(self.complete, token)
419 except:
420 completions = objc.nil
421 NSBeep()
422
423 return (completions,0)
424
425
1 NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
1 NO CONTENT: new file 100644, binary diff hidden
This diff has been collapsed as it changes many lines, (3423 lines changed) Show them Hide them
@@ -0,0 +1,3423 b''
1 <?xml version="1.0" encoding="UTF-8"?>
2 <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.01">
3 <data>
4 <int key="IBDocument.SystemTarget">1050</int>
5 <string key="IBDocument.SystemVersion">9D34</string>
6 <string key="IBDocument.InterfaceBuilderVersion">629</string>
7 <string key="IBDocument.AppKitVersion">949.33</string>
8 <string key="IBDocument.HIToolboxVersion">352.00</string>
9 <object class="NSMutableArray" key="IBDocument.EditedObjectIDs">
10 <bool key="EncodedWithXMLCoder">YES</bool>
11 <integer value="416"/>
12 <integer value="29"/>
13 </object>
14 <object class="NSArray" key="IBDocument.PluginDependencies">
15 <bool key="EncodedWithXMLCoder">YES</bool>
16 <string id="885801228">com.apple.InterfaceBuilderKit</string>
17 <string id="113577022">com.apple.InterfaceBuilder.CocoaPlugin</string>
18 </object>
19 <object class="NSMutableArray" key="IBDocument.RootObjects" id="1048">
20 <bool key="EncodedWithXMLCoder">YES</bool>
21 <object class="NSCustomObject" id="1021">
22 <string key="NSClassName" id="190635311">NSApplication</string>
23 </object>
24 <object class="NSCustomObject" id="1014">
25 <string key="NSClassName">FirstResponder</string>
26 </object>
27 <object class="NSCustomObject" id="1050">
28 <reference key="NSClassName" ref="190635311"/>
29 </object>
30 <object class="NSMenu" id="649796088">
31 <string key="NSTitle">AMainMenu</string>
32 <object class="NSMutableArray" key="NSMenuItems">
33 <bool key="EncodedWithXMLCoder">YES</bool>
34 <object class="NSMenuItem" id="694149608">
35 <reference key="NSMenu" ref="649796088"/>
36 <string key="NSTitle" id="837240250">IPython1Sandbox</string>
37 <string key="NSKeyEquiv" id="255189770"/>
38 <int key="NSKeyEquivModMask">1048576</int>
39 <int key="NSMnemonicLoc">2147483647</int>
40 <object class="NSCustomResource" key="NSOnImage" id="985281305">
41 <string key="NSClassName" id="60114142">NSImage</string>
42 <string key="NSResourceName">NSMenuCheckmark</string>
43 </object>
44 <object class="NSCustomResource" key="NSMixedImage" id="351279908">
45 <reference key="NSClassName" ref="60114142"/>
46 <string key="NSResourceName">NSMenuMixedState</string>
47 </object>
48 <string key="NSAction">submenuAction:</string>
49 <object class="NSMenu" key="NSSubmenu" id="110575045">
50 <reference key="NSTitle" ref="837240250"/>
51 <object class="NSMutableArray" key="NSMenuItems">
52 <bool key="EncodedWithXMLCoder">YES</bool>
53 <object class="NSMenuItem" id="238522557">
54 <reference key="NSMenu" ref="110575045"/>
55 <string key="NSTitle">About IPython1Sandbox</string>
56 <reference key="NSKeyEquiv" ref="255189770"/>
57 <int key="NSMnemonicLoc">2147483647</int>
58 <reference key="NSOnImage" ref="985281305"/>
59 <reference key="NSMixedImage" ref="351279908"/>
60 </object>
61 <object class="NSMenuItem" id="304266470">
62 <reference key="NSMenu" ref="110575045"/>
63 <bool key="NSIsDisabled">YES</bool>
64 <bool key="NSIsSeparator">YES</bool>
65 <reference key="NSTitle" ref="255189770"/>
66 <reference key="NSKeyEquiv" ref="255189770"/>
67 <int key="NSKeyEquivModMask">1048576</int>
68 <int key="NSMnemonicLoc">2147483647</int>
69 <reference key="NSOnImage" ref="985281305"/>
70 <reference key="NSMixedImage" ref="351279908"/>
71 </object>
72 <object class="NSMenuItem" id="609285721">
73 <reference key="NSMenu" ref="110575045"/>
74 <string type="base64-UTF8" key="NSTitle">UHJlZmVyZW5jZXPigKY</string>
75 <string key="NSKeyEquiv">,</string>
76 <int key="NSKeyEquivModMask">1048576</int>
77 <int key="NSMnemonicLoc">2147483647</int>
78 <reference key="NSOnImage" ref="985281305"/>
79 <reference key="NSMixedImage" ref="351279908"/>
80 </object>
81 <object class="NSMenuItem" id="481834944">
82 <reference key="NSMenu" ref="110575045"/>
83 <bool key="NSIsDisabled">YES</bool>
84 <bool key="NSIsSeparator">YES</bool>
85 <reference key="NSTitle" ref="255189770"/>
86 <reference key="NSKeyEquiv" ref="255189770"/>
87 <int key="NSKeyEquivModMask">1048576</int>
88 <int key="NSMnemonicLoc">2147483647</int>
89 <reference key="NSOnImage" ref="985281305"/>
90 <reference key="NSMixedImage" ref="351279908"/>
91 </object>
92 <object class="NSMenuItem" id="1046388886">
93 <reference key="NSMenu" ref="110575045"/>
94 <string key="NSTitle" id="642338826">Services</string>
95 <reference key="NSKeyEquiv" ref="255189770"/>
96 <int key="NSKeyEquivModMask">1048576</int>
97 <int key="NSMnemonicLoc">2147483647</int>
98 <reference key="NSOnImage" ref="985281305"/>
99 <reference key="NSMixedImage" ref="351279908"/>
100 <string key="NSAction">submenuAction:</string>
101 <object class="NSMenu" key="NSSubmenu" id="752062318">
102 <reference key="NSTitle" ref="642338826"/>
103 <object class="NSMutableArray" key="NSMenuItems">
104 <bool key="EncodedWithXMLCoder">YES</bool>
105 </object>
106 <string key="NSName">_NSServicesMenu</string>
107 </object>
108 </object>
109 <object class="NSMenuItem" id="646227648">
110 <reference key="NSMenu" ref="110575045"/>
111 <bool key="NSIsDisabled">YES</bool>
112 <bool key="NSIsSeparator">YES</bool>
113 <reference key="NSTitle" ref="255189770"/>
114 <reference key="NSKeyEquiv" ref="255189770"/>
115 <int key="NSKeyEquivModMask">1048576</int>
116 <int key="NSMnemonicLoc">2147483647</int>
117 <reference key="NSOnImage" ref="985281305"/>
118 <reference key="NSMixedImage" ref="351279908"/>
119 </object>
120 <object class="NSMenuItem" id="755159360">
121 <reference key="NSMenu" ref="110575045"/>
122 <string key="NSTitle">Hide IPython1Sandbox</string>
123 <string key="NSKeyEquiv" id="940330891">h</string>
124 <int key="NSKeyEquivModMask">1048576</int>
125 <int key="NSMnemonicLoc">2147483647</int>
126 <reference key="NSOnImage" ref="985281305"/>
127 <reference key="NSMixedImage" ref="351279908"/>
128 </object>
129 <object class="NSMenuItem" id="342932134">
130 <reference key="NSMenu" ref="110575045"/>
131 <string key="NSTitle">Hide Others</string>
132 <reference key="NSKeyEquiv" ref="940330891"/>
133 <int key="NSKeyEquivModMask">1572864</int>
134 <int key="NSMnemonicLoc">2147483647</int>
135 <reference key="NSOnImage" ref="985281305"/>
136 <reference key="NSMixedImage" ref="351279908"/>
137 </object>
138 <object class="NSMenuItem" id="908899353">
139 <reference key="NSMenu" ref="110575045"/>
140 <string key="NSTitle">Show All</string>
141 <reference key="NSKeyEquiv" ref="255189770"/>
142 <int key="NSKeyEquivModMask">1048576</int>
143 <int key="NSMnemonicLoc">2147483647</int>
144 <reference key="NSOnImage" ref="985281305"/>
145 <reference key="NSMixedImage" ref="351279908"/>
146 </object>
147 <object class="NSMenuItem" id="1056857174">
148 <reference key="NSMenu" ref="110575045"/>
149 <bool key="NSIsDisabled">YES</bool>
150 <bool key="NSIsSeparator">YES</bool>
151 <reference key="NSTitle" ref="255189770"/>
152 <reference key="NSKeyEquiv" ref="255189770"/>
153 <int key="NSKeyEquivModMask">1048576</int>
154 <int key="NSMnemonicLoc">2147483647</int>
155 <reference key="NSOnImage" ref="985281305"/>
156 <reference key="NSMixedImage" ref="351279908"/>
157 </object>
158 <object class="NSMenuItem" id="632727374">
159 <reference key="NSMenu" ref="110575045"/>
160 <string key="NSTitle">Quit IPython1Sandbox</string>
161 <string key="NSKeyEquiv">q</string>
162 <int key="NSKeyEquivModMask">1048576</int>
163 <int key="NSMnemonicLoc">2147483647</int>
164 <reference key="NSOnImage" ref="985281305"/>
165 <reference key="NSMixedImage" ref="351279908"/>
166 </object>
167 </object>
168 <string key="NSName">_NSAppleMenu</string>
169 </object>
170 </object>
171 <object class="NSMenuItem" id="379814623">
172 <reference key="NSMenu" ref="649796088"/>
173 <string key="NSTitle" id="881404960">File</string>
174 <reference key="NSKeyEquiv" ref="255189770"/>
175 <int key="NSKeyEquivModMask">1048576</int>
176 <int key="NSMnemonicLoc">2147483647</int>
177 <reference key="NSOnImage" ref="985281305"/>
178 <reference key="NSMixedImage" ref="351279908"/>
179 <string key="NSAction">submenuAction:</string>
180 <object class="NSMenu" key="NSSubmenu" id="720053764">
181 <reference key="NSTitle" ref="881404960"/>
182 <object class="NSMutableArray" key="NSMenuItems">
183 <bool key="EncodedWithXMLCoder">YES</bool>
184 <object class="NSMenuItem" id="705341025">
185 <reference key="NSMenu" ref="720053764"/>
186 <string key="NSTitle">New</string>
187 <string key="NSKeyEquiv">n</string>
188 <int key="NSKeyEquivModMask">1048576</int>
189 <int key="NSMnemonicLoc">2147483647</int>
190 <reference key="NSOnImage" ref="985281305"/>
191 <reference key="NSMixedImage" ref="351279908"/>
192 </object>
193 <object class="NSMenuItem" id="722745758">
194 <reference key="NSMenu" ref="720053764"/>
195 <string type="base64-UTF8" key="NSTitle">T3BlbuKApg</string>
196 <string key="NSKeyEquiv">o</string>
197 <int key="NSKeyEquivModMask">1048576</int>
198 <int key="NSMnemonicLoc">2147483647</int>
199 <reference key="NSOnImage" ref="985281305"/>
200 <reference key="NSMixedImage" ref="351279908"/>
201 </object>
202 <object class="NSMenuItem" id="1025936716">
203 <reference key="NSMenu" ref="720053764"/>
204 <string key="NSTitle" id="975517829">Open Recent</string>
205 <reference key="NSKeyEquiv" ref="255189770"/>
206 <int key="NSKeyEquivModMask">1048576</int>
207 <int key="NSMnemonicLoc">2147483647</int>
208 <reference key="NSOnImage" ref="985281305"/>
209 <reference key="NSMixedImage" ref="351279908"/>
210 <string key="NSAction">submenuAction:</string>
211 <object class="NSMenu" key="NSSubmenu" id="1065607017">
212 <reference key="NSTitle" ref="975517829"/>
213 <object class="NSMutableArray" key="NSMenuItems">
214 <bool key="EncodedWithXMLCoder">YES</bool>
215 <object class="NSMenuItem" id="759406840">
216 <reference key="NSMenu" ref="1065607017"/>
217 <string key="NSTitle">Clear Menu</string>
218 <reference key="NSKeyEquiv" ref="255189770"/>
219 <int key="NSKeyEquivModMask">1048576</int>
220 <int key="NSMnemonicLoc">2147483647</int>
221 <reference key="NSOnImage" ref="985281305"/>
222 <reference key="NSMixedImage" ref="351279908"/>
223 </object>
224 </object>
225 <string key="NSName">_NSRecentDocumentsMenu</string>
226 </object>
227 </object>
228 <object class="NSMenuItem" id="425164168">
229 <reference key="NSMenu" ref="720053764"/>
230 <bool key="NSIsDisabled">YES</bool>
231 <bool key="NSIsSeparator">YES</bool>
232 <reference key="NSTitle" ref="255189770"/>
233 <reference key="NSKeyEquiv" ref="255189770"/>
234 <int key="NSKeyEquivModMask">1048576</int>
235 <int key="NSMnemonicLoc">2147483647</int>
236 <reference key="NSOnImage" ref="985281305"/>
237 <reference key="NSMixedImage" ref="351279908"/>
238 </object>
239 <object class="NSMenuItem" id="776162233">
240 <reference key="NSMenu" ref="720053764"/>
241 <string key="NSTitle">Close</string>
242 <string key="NSKeyEquiv">w</string>
243 <int key="NSKeyEquivModMask">1048576</int>
244 <int key="NSMnemonicLoc">2147483647</int>
245 <reference key="NSOnImage" ref="985281305"/>
246 <reference key="NSMixedImage" ref="351279908"/>
247 </object>
248 <object class="NSMenuItem" id="1023925487">
249 <reference key="NSMenu" ref="720053764"/>
250 <string key="NSTitle">Save</string>
251 <string key="NSKeyEquiv">s</string>
252 <int key="NSKeyEquivModMask">1048576</int>
253 <int key="NSMnemonicLoc">2147483647</int>
254 <reference key="NSOnImage" ref="985281305"/>
255 <reference key="NSMixedImage" ref="351279908"/>
256 </object>
257 <object class="NSMenuItem" id="117038363">
258 <reference key="NSMenu" ref="720053764"/>
259 <string type="base64-UTF8" key="NSTitle">U2F2ZSBBc+KApg</string>
260 <string key="NSKeyEquiv">S</string>
261 <int key="NSKeyEquivModMask">1179648</int>
262 <int key="NSMnemonicLoc">2147483647</int>
263 <reference key="NSOnImage" ref="985281305"/>
264 <reference key="NSMixedImage" ref="351279908"/>
265 </object>
266 <object class="NSMenuItem" id="579971712">
267 <reference key="NSMenu" ref="720053764"/>
268 <string key="NSTitle">Revert to Saved</string>
269 <reference key="NSKeyEquiv" ref="255189770"/>
270 <int key="NSMnemonicLoc">2147483647</int>
271 <reference key="NSOnImage" ref="985281305"/>
272 <reference key="NSMixedImage" ref="351279908"/>
273 </object>
274 <object class="NSMenuItem" id="1010469920">
275 <reference key="NSMenu" ref="720053764"/>
276 <bool key="NSIsDisabled">YES</bool>
277 <bool key="NSIsSeparator">YES</bool>
278 <reference key="NSTitle" ref="255189770"/>
279 <reference key="NSKeyEquiv" ref="255189770"/>
280 <int key="NSKeyEquivModMask">1048576</int>
281 <int key="NSMnemonicLoc">2147483647</int>
282 <reference key="NSOnImage" ref="985281305"/>
283 <reference key="NSMixedImage" ref="351279908"/>
284 </object>
285 <object class="NSMenuItem" id="294629803">
286 <reference key="NSMenu" ref="720053764"/>
287 <string key="NSTitle">Page Setup...</string>
288 <string key="NSKeyEquiv">P</string>
289 <int key="NSKeyEquivModMask">1179648</int>
290 <int key="NSMnemonicLoc">2147483647</int>
291 <reference key="NSOnImage" ref="985281305"/>
292 <reference key="NSMixedImage" ref="351279908"/>
293 <reference key="NSToolTip" ref="255189770"/>
294 </object>
295 <object class="NSMenuItem" id="49223823">
296 <reference key="NSMenu" ref="720053764"/>
297 <string type="base64-UTF8" key="NSTitle">UHJpbnTigKY</string>
298 <string key="NSKeyEquiv">p</string>
299 <int key="NSKeyEquivModMask">1048576</int>
300 <int key="NSMnemonicLoc">2147483647</int>
301 <reference key="NSOnImage" ref="985281305"/>
302 <reference key="NSMixedImage" ref="351279908"/>
303 </object>
304 </object>
305 </object>
306 </object>
307 <object class="NSMenuItem" id="952259628">
308 <reference key="NSMenu" ref="649796088"/>
309 <string key="NSTitle" id="1037326483">Edit</string>
310 <reference key="NSKeyEquiv" ref="255189770"/>
311 <int key="NSKeyEquivModMask">1048576</int>
312 <int key="NSMnemonicLoc">2147483647</int>
313 <reference key="NSOnImage" ref="985281305"/>
314 <reference key="NSMixedImage" ref="351279908"/>
315 <string key="NSAction">submenuAction:</string>
316 <object class="NSMenu" key="NSSubmenu" id="789758025">
317 <reference key="NSTitle" ref="1037326483"/>
318 <object class="NSMutableArray" key="NSMenuItems">
319 <bool key="EncodedWithXMLCoder">YES</bool>
320 <object class="NSMenuItem" id="1058277027">
321 <reference key="NSMenu" ref="789758025"/>
322 <string key="NSTitle">Undo</string>
323 <string key="NSKeyEquiv">z</string>
324 <int key="NSKeyEquivModMask">1048576</int>
325 <int key="NSMnemonicLoc">2147483647</int>
326 <reference key="NSOnImage" ref="985281305"/>
327 <reference key="NSMixedImage" ref="351279908"/>
328 </object>
329 <object class="NSMenuItem" id="790794224">
330 <reference key="NSMenu" ref="789758025"/>
331 <string key="NSTitle">Redo</string>
332 <string key="NSKeyEquiv">Z</string>
333 <int key="NSKeyEquivModMask">1179648</int>
334 <int key="NSMnemonicLoc">2147483647</int>
335 <reference key="NSOnImage" ref="985281305"/>
336 <reference key="NSMixedImage" ref="351279908"/>
337 </object>
338 <object class="NSMenuItem" id="1040322652">
339 <reference key="NSMenu" ref="789758025"/>
340 <bool key="NSIsDisabled">YES</bool>
341 <bool key="NSIsSeparator">YES</bool>
342 <reference key="NSTitle" ref="255189770"/>
343 <reference key="NSKeyEquiv" ref="255189770"/>
344 <int key="NSKeyEquivModMask">1048576</int>
345 <int key="NSMnemonicLoc">2147483647</int>
346 <reference key="NSOnImage" ref="985281305"/>
347 <reference key="NSMixedImage" ref="351279908"/>
348 </object>
349 <object class="NSMenuItem" id="296257095">
350 <reference key="NSMenu" ref="789758025"/>
351 <string key="NSTitle">Cut</string>
352 <string key="NSKeyEquiv">x</string>
353 <int key="NSKeyEquivModMask">1048576</int>
354 <int key="NSMnemonicLoc">2147483647</int>
355 <reference key="NSOnImage" ref="985281305"/>
356 <reference key="NSMixedImage" ref="351279908"/>
357 </object>
358 <object class="NSMenuItem" id="860595796">
359 <reference key="NSMenu" ref="789758025"/>
360 <string key="NSTitle">Copy</string>
361 <string key="NSKeyEquiv">c</string>
362 <int key="NSKeyEquivModMask">1048576</int>
363 <int key="NSMnemonicLoc">2147483647</int>
364 <reference key="NSOnImage" ref="985281305"/>
365 <reference key="NSMixedImage" ref="351279908"/>
366 </object>
367 <object class="NSMenuItem" id="29853731">
368 <reference key="NSMenu" ref="789758025"/>
369 <string key="NSTitle">Paste</string>
370 <string key="NSKeyEquiv">v</string>
371 <int key="NSKeyEquivModMask">1048576</int>
372 <int key="NSMnemonicLoc">2147483647</int>
373 <reference key="NSOnImage" ref="985281305"/>
374 <reference key="NSMixedImage" ref="351279908"/>
375 </object>
376 <object class="NSMenuItem" id="437104165">
377 <reference key="NSMenu" ref="789758025"/>
378 <string key="NSTitle">Delete</string>
379 <reference key="NSKeyEquiv" ref="255189770"/>
380 <int key="NSKeyEquivModMask">1048576</int>
381 <int key="NSMnemonicLoc">2147483647</int>
382 <reference key="NSOnImage" ref="985281305"/>
383 <reference key="NSMixedImage" ref="351279908"/>
384 </object>
385 <object class="NSMenuItem" id="583158037">
386 <reference key="NSMenu" ref="789758025"/>
387 <string key="NSTitle">Select All</string>
388 <string key="NSKeyEquiv">a</string>
389 <int key="NSKeyEquivModMask">1048576</int>
390 <int key="NSMnemonicLoc">2147483647</int>
391 <reference key="NSOnImage" ref="985281305"/>
392 <reference key="NSMixedImage" ref="351279908"/>
393 </object>
394 <object class="NSMenuItem" id="212016141">
395 <reference key="NSMenu" ref="789758025"/>
396 <bool key="NSIsDisabled">YES</bool>
397 <bool key="NSIsSeparator">YES</bool>
398 <reference key="NSTitle" ref="255189770"/>
399 <reference key="NSKeyEquiv" ref="255189770"/>
400 <int key="NSKeyEquivModMask">1048576</int>
401 <int key="NSMnemonicLoc">2147483647</int>
402 <reference key="NSOnImage" ref="985281305"/>
403 <reference key="NSMixedImage" ref="351279908"/>
404 </object>
405 <object class="NSMenuItem" id="892235320">
406 <reference key="NSMenu" ref="789758025"/>
407 <string key="NSTitle" id="688083180">Find</string>
408 <reference key="NSKeyEquiv" ref="255189770"/>
409 <int key="NSKeyEquivModMask">1048576</int>
410 <int key="NSMnemonicLoc">2147483647</int>
411 <reference key="NSOnImage" ref="985281305"/>
412 <reference key="NSMixedImage" ref="351279908"/>
413 <string key="NSAction">submenuAction:</string>
414 <object class="NSMenu" key="NSSubmenu" id="963351320">
415 <reference key="NSTitle" ref="688083180"/>
416 <object class="NSMutableArray" key="NSMenuItems">
417 <bool key="EncodedWithXMLCoder">YES</bool>
418 <object class="NSMenuItem" id="447796847">
419 <reference key="NSMenu" ref="963351320"/>
420 <string type="base64-UTF8" key="NSTitle">RmluZOKApg</string>
421 <string key="NSKeyEquiv" id="469505129">f</string>
422 <int key="NSKeyEquivModMask">1048576</int>
423 <int key="NSMnemonicLoc">2147483647</int>
424 <reference key="NSOnImage" ref="985281305"/>
425 <reference key="NSMixedImage" ref="351279908"/>
426 <int key="NSTag">1</int>
427 </object>
428 <object class="NSMenuItem" id="326711663">
429 <reference key="NSMenu" ref="963351320"/>
430 <string key="NSTitle">Find Next</string>
431 <string key="NSKeyEquiv" id="762398675">g</string>
432 <int key="NSKeyEquivModMask">1048576</int>
433 <int key="NSMnemonicLoc">2147483647</int>
434 <reference key="NSOnImage" ref="985281305"/>
435 <reference key="NSMixedImage" ref="351279908"/>
436 <int key="NSTag">2</int>
437 </object>
438 <object class="NSMenuItem" id="270902937">
439 <reference key="NSMenu" ref="963351320"/>
440 <string key="NSTitle">Find Previous</string>
441 <string key="NSKeyEquiv" id="819654342">G</string>
442 <int key="NSKeyEquivModMask">1179648</int>
443 <int key="NSMnemonicLoc">2147483647</int>
444 <reference key="NSOnImage" ref="985281305"/>
445 <reference key="NSMixedImage" ref="351279908"/>
446 <int key="NSTag">3</int>
447 </object>
448 <object class="NSMenuItem" id="159080638">
449 <reference key="NSMenu" ref="963351320"/>
450 <string key="NSTitle">Use Selection for Find</string>
451 <string key="NSKeyEquiv">e</string>
452 <int key="NSKeyEquivModMask">1048576</int>
453 <int key="NSMnemonicLoc">2147483647</int>
454 <reference key="NSOnImage" ref="985281305"/>
455 <reference key="NSMixedImage" ref="351279908"/>
456 <int key="NSTag">7</int>
457 </object>
458 <object class="NSMenuItem" id="88285865">
459 <reference key="NSMenu" ref="963351320"/>
460 <string key="NSTitle">Jump to Selection</string>
461 <string key="NSKeyEquiv">j</string>
462 <int key="NSKeyEquivModMask">1048576</int>
463 <int key="NSMnemonicLoc">2147483647</int>
464 <reference key="NSOnImage" ref="985281305"/>
465 <reference key="NSMixedImage" ref="351279908"/>
466 </object>
467 </object>
468 </object>
469 </object>
470 <object class="NSMenuItem" id="972420730">
471 <reference key="NSMenu" ref="789758025"/>
472 <string key="NSTitle" id="739167250">Spelling and Grammar</string>
473 <reference key="NSKeyEquiv" ref="255189770"/>
474 <int key="NSKeyEquivModMask">1048576</int>
475 <int key="NSMnemonicLoc">2147483647</int>
476 <reference key="NSOnImage" ref="985281305"/>
477 <reference key="NSMixedImage" ref="351279908"/>
478 <string key="NSAction">submenuAction:</string>
479 <object class="NSMenu" key="NSSubmenu" id="769623530">
480 <reference key="NSTitle" ref="739167250"/>
481 <object class="NSMutableArray" key="NSMenuItems">
482 <bool key="EncodedWithXMLCoder">YES</bool>
483 <object class="NSMenuItem" id="679648819">
484 <reference key="NSMenu" ref="769623530"/>
485 <string type="base64-UTF8" key="NSTitle">U2hvdyBTcGVsbGluZ+KApg</string>
486 <string key="NSKeyEquiv">:</string>
487 <int key="NSKeyEquivModMask">1048576</int>
488 <int key="NSMnemonicLoc">2147483647</int>
489 <reference key="NSOnImage" ref="985281305"/>
490 <reference key="NSMixedImage" ref="351279908"/>
491 </object>
492 <object class="NSMenuItem" id="96193923">
493 <reference key="NSMenu" ref="769623530"/>
494 <string key="NSTitle">Check Spelling</string>
495 <string key="NSKeyEquiv">;</string>
496 <int key="NSKeyEquivModMask">1048576</int>
497 <int key="NSMnemonicLoc">2147483647</int>
498 <reference key="NSOnImage" ref="985281305"/>
499 <reference key="NSMixedImage" ref="351279908"/>
500 </object>
501 <object class="NSMenuItem" id="948374510">
502 <reference key="NSMenu" ref="769623530"/>
503 <string key="NSTitle">Check Spelling While Typing</string>
504 <reference key="NSKeyEquiv" ref="255189770"/>
505 <int key="NSKeyEquivModMask">1048576</int>
506 <int key="NSMnemonicLoc">2147483647</int>
507 <reference key="NSOnImage" ref="985281305"/>
508 <reference key="NSMixedImage" ref="351279908"/>
509 </object>
510 <object class="NSMenuItem" id="967646866">
511 <reference key="NSMenu" ref="769623530"/>
512 <string key="NSTitle">Check Grammar With Spelling</string>
513 <reference key="NSKeyEquiv" ref="255189770"/>
514 <int key="NSKeyEquivModMask">1048576</int>
515 <int key="NSMnemonicLoc">2147483647</int>
516 <reference key="NSOnImage" ref="985281305"/>
517 <reference key="NSMixedImage" ref="351279908"/>
518 </object>
519 </object>
520 </object>
521 </object>
522 <object class="NSMenuItem" id="507821607">
523 <reference key="NSMenu" ref="789758025"/>
524 <string key="NSTitle" id="904739598">Substitutions</string>
525 <reference key="NSKeyEquiv" ref="255189770"/>
526 <int key="NSKeyEquivModMask">1048576</int>
527 <int key="NSMnemonicLoc">2147483647</int>
528 <reference key="NSOnImage" ref="985281305"/>
529 <reference key="NSMixedImage" ref="351279908"/>
530 <string key="NSAction">submenuAction:</string>
531 <object class="NSMenu" key="NSSubmenu" id="698887838">
532 <reference key="NSTitle" ref="904739598"/>
533 <object class="NSMutableArray" key="NSMenuItems">
534 <bool key="EncodedWithXMLCoder">YES</bool>
535 <object class="NSMenuItem" id="605118523">
536 <reference key="NSMenu" ref="698887838"/>
537 <string key="NSTitle">Smart Copy/Paste</string>
538 <reference key="NSKeyEquiv" ref="469505129"/>
539 <int key="NSKeyEquivModMask">1048576</int>
540 <int key="NSMnemonicLoc">2147483647</int>
541 <reference key="NSOnImage" ref="985281305"/>
542 <reference key="NSMixedImage" ref="351279908"/>
543 <int key="NSTag">1</int>
544 </object>
545 <object class="NSMenuItem" id="197661976">
546 <reference key="NSMenu" ref="698887838"/>
547 <string key="NSTitle">Smart Quotes</string>
548 <reference key="NSKeyEquiv" ref="762398675"/>
549 <int key="NSKeyEquivModMask">1048576</int>
550 <int key="NSMnemonicLoc">2147483647</int>
551 <reference key="NSOnImage" ref="985281305"/>
552 <reference key="NSMixedImage" ref="351279908"/>
553 <int key="NSTag">2</int>
554 </object>
555 <object class="NSMenuItem" id="708854459">
556 <reference key="NSMenu" ref="698887838"/>
557 <string key="NSTitle">Smart Links</string>
558 <reference key="NSKeyEquiv" ref="819654342"/>
559 <int key="NSKeyEquivModMask">1179648</int>
560 <int key="NSMnemonicLoc">2147483647</int>
561 <reference key="NSOnImage" ref="985281305"/>
562 <reference key="NSMixedImage" ref="351279908"/>
563 <int key="NSTag">3</int>
564 </object>
565 </object>
566 </object>
567 </object>
568 <object class="NSMenuItem" id="676164635">
569 <reference key="NSMenu" ref="789758025"/>
570 <string key="NSTitle" id="812002426">Speech</string>
571 <reference key="NSKeyEquiv" ref="255189770"/>
572 <int key="NSKeyEquivModMask">1048576</int>
573 <int key="NSMnemonicLoc">2147483647</int>
574 <reference key="NSOnImage" ref="985281305"/>
575 <reference key="NSMixedImage" ref="351279908"/>
576 <string key="NSAction">submenuAction:</string>
577 <object class="NSMenu" key="NSSubmenu" id="785027613">
578 <reference key="NSTitle" ref="812002426"/>
579 <object class="NSMutableArray" key="NSMenuItems">
580 <bool key="EncodedWithXMLCoder">YES</bool>
581 <object class="NSMenuItem" id="731782645">
582 <reference key="NSMenu" ref="785027613"/>
583 <string key="NSTitle">Start Speaking</string>
584 <reference key="NSKeyEquiv" ref="255189770"/>
585 <int key="NSKeyEquivModMask">1048576</int>
586 <int key="NSMnemonicLoc">2147483647</int>
587 <reference key="NSOnImage" ref="985281305"/>
588 <reference key="NSMixedImage" ref="351279908"/>
589 </object>
590 <object class="NSMenuItem" id="680220178">
591 <reference key="NSMenu" ref="785027613"/>
592 <string key="NSTitle">Stop Speaking</string>
593 <reference key="NSKeyEquiv" ref="255189770"/>
594 <int key="NSKeyEquivModMask">1048576</int>
595 <int key="NSMnemonicLoc">2147483647</int>
596 <reference key="NSOnImage" ref="985281305"/>
597 <reference key="NSMixedImage" ref="351279908"/>
598 </object>
599 </object>
600 </object>
601 </object>
602 </object>
603 </object>
604 </object>
605 <object class="NSMenuItem" id="626404410">
606 <reference key="NSMenu" ref="649796088"/>
607 <string key="NSTitle" id="241242548">Format</string>
608 <reference key="NSKeyEquiv" ref="255189770"/>
609 <int key="NSKeyEquivModMask">1048576</int>
610 <int key="NSMnemonicLoc">2147483647</int>
611 <reference key="NSOnImage" ref="985281305"/>
612 <reference key="NSMixedImage" ref="351279908"/>
613 <string key="NSAction">submenuAction:</string>
614 <object class="NSMenu" key="NSSubmenu" id="502084290">
615 <reference key="NSTitle" ref="241242548"/>
616 <object class="NSMutableArray" key="NSMenuItems">
617 <bool key="EncodedWithXMLCoder">YES</bool>
618 <object class="NSMenuItem" id="519768076">
619 <reference key="NSMenu" ref="502084290"/>
620 <string key="NSTitle">Show Fonts</string>
621 <string key="NSKeyEquiv" id="806579634">t</string>
622 <int key="NSKeyEquivModMask">1048576</int>
623 <int key="NSMnemonicLoc">2147483647</int>
624 <reference key="NSOnImage" ref="985281305"/>
625 <reference key="NSMixedImage" ref="351279908"/>
626 </object>
627 <object class="NSMenuItem" id="1028416764">
628 <reference key="NSMenu" ref="502084290"/>
629 <string key="NSTitle">Show Colors</string>
630 <string key="NSKeyEquiv">C</string>
631 <int key="NSKeyEquivModMask">1179648</int>
632 <int key="NSMnemonicLoc">2147483647</int>
633 <reference key="NSOnImage" ref="985281305"/>
634 <reference key="NSMixedImage" ref="351279908"/>
635 </object>
636 </object>
637 </object>
638 </object>
639 <object class="NSMenuItem" id="586577488">
640 <reference key="NSMenu" ref="649796088"/>
641 <string key="NSTitle" id="809723865">View</string>
642 <reference key="NSKeyEquiv" ref="255189770"/>
643 <int key="NSKeyEquivModMask">1048576</int>
644 <int key="NSMnemonicLoc">2147483647</int>
645 <reference key="NSOnImage" ref="985281305"/>
646 <reference key="NSMixedImage" ref="351279908"/>
647 <string key="NSAction">submenuAction:</string>
648 <object class="NSMenu" key="NSSubmenu" id="466310130">
649 <reference key="NSTitle" ref="809723865"/>
650 <object class="NSMutableArray" key="NSMenuItems">
651 <bool key="EncodedWithXMLCoder">YES</bool>
652 <object class="NSMenuItem" id="102151532">
653 <reference key="NSMenu" ref="466310130"/>
654 <string key="NSTitle">Show Toolbar</string>
655 <reference key="NSKeyEquiv" ref="806579634"/>
656 <int key="NSKeyEquivModMask">1572864</int>
657 <int key="NSMnemonicLoc">2147483647</int>
658 <reference key="NSOnImage" ref="985281305"/>
659 <reference key="NSMixedImage" ref="351279908"/>
660 </object>
661 <object class="NSMenuItem" id="237841660">
662 <reference key="NSMenu" ref="466310130"/>
663 <string type="base64-UTF8" key="NSTitle">Q3VzdG9taXplIFRvb2xiYXLigKY</string>
664 <reference key="NSKeyEquiv" ref="255189770"/>
665 <int key="NSKeyEquivModMask">1048576</int>
666 <int key="NSMnemonicLoc">2147483647</int>
667 <reference key="NSOnImage" ref="985281305"/>
668 <reference key="NSMixedImage" ref="351279908"/>
669 </object>
670 </object>
671 </object>
672 </object>
673 <object class="NSMenuItem" id="713487014">
674 <reference key="NSMenu" ref="649796088"/>
675 <string key="NSTitle" id="64165424">Window</string>
676 <reference key="NSKeyEquiv" ref="255189770"/>
677 <int key="NSKeyEquivModMask">1048576</int>
678 <int key="NSMnemonicLoc">2147483647</int>
679 <reference key="NSOnImage" ref="985281305"/>
680 <reference key="NSMixedImage" ref="351279908"/>
681 <string key="NSAction">submenuAction:</string>
682 <object class="NSMenu" key="NSSubmenu" id="835318025">
683 <reference key="NSTitle" ref="64165424"/>
684 <object class="NSMutableArray" key="NSMenuItems">
685 <bool key="EncodedWithXMLCoder">YES</bool>
686 <object class="NSMenuItem" id="1011231497">
687 <reference key="NSMenu" ref="835318025"/>
688 <string key="NSTitle">Minimize</string>
689 <string key="NSKeyEquiv">m</string>
690 <int key="NSKeyEquivModMask">1048576</int>
691 <int key="NSMnemonicLoc">2147483647</int>
692 <reference key="NSOnImage" ref="985281305"/>
693 <reference key="NSMixedImage" ref="351279908"/>
694 </object>
695 <object class="NSMenuItem" id="575023229">
696 <reference key="NSMenu" ref="835318025"/>
697 <string key="NSTitle">Zoom</string>
698 <reference key="NSKeyEquiv" ref="255189770"/>
699 <int key="NSKeyEquivModMask">1048576</int>
700 <int key="NSMnemonicLoc">2147483647</int>
701 <reference key="NSOnImage" ref="985281305"/>
702 <reference key="NSMixedImage" ref="351279908"/>
703 </object>
704 <object class="NSMenuItem" id="299356726">
705 <reference key="NSMenu" ref="835318025"/>
706 <bool key="NSIsDisabled">YES</bool>
707 <bool key="NSIsSeparator">YES</bool>
708 <reference key="NSTitle" ref="255189770"/>
709 <reference key="NSKeyEquiv" ref="255189770"/>
710 <int key="NSKeyEquivModMask">1048576</int>
711 <int key="NSMnemonicLoc">2147483647</int>
712 <reference key="NSOnImage" ref="985281305"/>
713 <reference key="NSMixedImage" ref="351279908"/>
714 </object>
715 <object class="NSMenuItem" id="625202149">
716 <reference key="NSMenu" ref="835318025"/>
717 <string key="NSTitle">Bring All to Front</string>
718 <reference key="NSKeyEquiv" ref="255189770"/>
719 <int key="NSKeyEquivModMask">1048576</int>
720 <int key="NSMnemonicLoc">2147483647</int>
721 <reference key="NSOnImage" ref="985281305"/>
722 <reference key="NSMixedImage" ref="351279908"/>
723 </object>
724 </object>
725 <string key="NSName">_NSWindowsMenu</string>
726 </object>
727 </object>
728 <object class="NSMenuItem" id="391199113">
729 <reference key="NSMenu" ref="649796088"/>
730 <string key="NSTitle" id="461919786">Help</string>
731 <reference key="NSKeyEquiv" ref="255189770"/>
732 <int key="NSKeyEquivModMask">1048576</int>
733 <int key="NSMnemonicLoc">2147483647</int>
734 <reference key="NSOnImage" ref="985281305"/>
735 <reference key="NSMixedImage" ref="351279908"/>
736 <string key="NSAction">submenuAction:</string>
737 <object class="NSMenu" key="NSSubmenu" id="374024848">
738 <reference key="NSTitle" ref="461919786"/>
739 <object class="NSMutableArray" key="NSMenuItems">
740 <bool key="EncodedWithXMLCoder">YES</bool>
741 <object class="NSMenuItem" id="238773614">
742 <reference key="NSMenu" ref="374024848"/>
743 <string key="NSTitle">IPython1Sandbox Help</string>
744 <string key="NSKeyEquiv">?</string>
745 <int key="NSKeyEquivModMask">1048576</int>
746 <int key="NSMnemonicLoc">2147483647</int>
747 <reference key="NSOnImage" ref="985281305"/>
748 <reference key="NSMixedImage" ref="351279908"/>
749 </object>
750 </object>
751 </object>
752 </object>
753 </object>
754 <string key="NSName">_NSMainMenu</string>
755 </object>
756 <object class="NSWindowTemplate" id="972006081">
757 <int key="NSWindowStyleMask">15</int>
758 <int key="NSWindowBacking">2</int>
759 <string key="NSWindowRect">{{335, 413}, {725, 337}}</string>
760 <int key="NSWTFlags">1946157056</int>
761 <string key="NSWindowTitle">IPython1 (Cocoa)</string>
762 <string key="NSWindowClass">NSWindow</string>
763 <nil key="NSViewClass"/>
764 <object class="NSView" key="NSWindowView" id="439893737">
765 <reference key="NSNextResponder"/>
766 <int key="NSvFlags">256</int>
767 <object class="NSMutableArray" key="NSSubviews">
768 <bool key="EncodedWithXMLCoder">YES</bool>
769 <object class="NSSplitView" id="741760375">
770 <reference key="NSNextResponder" ref="439893737"/>
771 <int key="NSvFlags">274</int>
772 <object class="NSMutableArray" key="NSSubviews">
773 <bool key="EncodedWithXMLCoder">YES</bool>
774 <object class="NSBox" id="554641139">
775 <reference key="NSNextResponder" ref="741760375"/>
776 <int key="NSvFlags">22</int>
777 <object class="NSMutableArray" key="NSSubviews">
778 <bool key="EncodedWithXMLCoder">YES</bool>
779 <object class="NSView" id="597872307">
780 <reference key="NSNextResponder" ref="554641139"/>
781 <int key="NSvFlags">256</int>
782 <object class="NSMutableArray" key="NSSubviews">
783 <bool key="EncodedWithXMLCoder">YES</bool>
784 <object class="NSScrollView" id="188193463">
785 <reference key="NSNextResponder" ref="597872307"/>
786 <int key="NSvFlags">274</int>
787 <object class="NSMutableArray" key="NSSubviews">
788 <bool key="EncodedWithXMLCoder">YES</bool>
789 <object class="NSClipView" id="638544389">
790 <reference key="NSNextResponder" ref="188193463"/>
791 <int key="NSvFlags">2304</int>
792 <object class="NSMutableArray" key="NSSubviews">
793 <bool key="EncodedWithXMLCoder">YES</bool>
794 <object class="NSTextView" id="163417131">
795 <reference key="NSNextResponder" ref="638544389"/>
796 <int key="NSvFlags">2322</int>
797 <object class="NSMutableSet" key="NSDragTypes">
798 <bool key="EncodedWithXMLCoder">YES</bool>
799 <object class="NSMutableArray" key="set.sortedObjects">
800 <bool key="EncodedWithXMLCoder">YES</bool>
801 <string>Apple HTML pasteboard type</string>
802 <string>Apple PDF pasteboard type</string>
803 <string>Apple PICT pasteboard type</string>
804 <string>Apple PNG pasteboard type</string>
805 <string>Apple URL pasteboard type</string>
806 <string>CorePasteboardFlavorType 0x6D6F6F76</string>
807 <string>CorePasteboardFlavorType 0x75726C20</string>
808 <string>NSColor pasteboard type</string>
809 <string>NSFilenamesPboardType</string>
810 <string>NSStringPboardType</string>
811 <string>NeXT Encapsulated PostScript v1.2 pasteboard type</string>
812 <string>NeXT RTFD pasteboard type</string>
813 <string>NeXT Rich Text Format v1.0 pasteboard type</string>
814 <string>NeXT TIFF v4.0 pasteboard type</string>
815 <string>NeXT font pasteboard type</string>
816 <string>NeXT ruler pasteboard type</string>
817 <string>WebURLsWithTitlesPboardType</string>
818 </object>
819 </object>
820 <string key="NSFrame">{{0, 38}, {433, 14}}</string>
821 <reference key="NSSuperview" ref="638544389"/>
822 <reference key="NSWindow"/>
823 <object class="NSTextContainer" key="NSTextContainer" id="662117317">
824 <object class="NSLayoutManager" key="NSLayoutManager">
825 <object class="NSTextStorage" key="NSTextStorage">
826 <object class="NSMutableString" key="NSString">
827 <characters key="NS.bytes"/>
828 </object>
829 <nil key="NSDelegate"/>
830 </object>
831 <object class="NSMutableArray" key="NSTextContainers">
832 <bool key="EncodedWithXMLCoder">YES</bool>
833 <reference ref="662117317"/>
834 </object>
835 <int key="NSLMFlags">6</int>
836 <nil key="NSDelegate"/>
837 </object>
838 <reference key="NSTextView" ref="163417131"/>
839 <double key="NSWidth">4.330000e+02</double>
840 <int key="NSTCFlags">1</int>
841 </object>
842 <object class="NSTextViewSharedData" key="NSSharedData">
843 <int key="NSFlags">346991</int>
844 <object class="NSColor" key="NSBackgroundColor">
845 <int key="NSColorSpace">2</int>
846 <bytes key="NSRGB">MSAwLjk1Mjk0MTI0IDAuODUwOTgwNDYAA</bytes>
847 </object>
848 <object class="NSColor" key="NSInsertionColor" id="555789289">
849 <int key="NSColorSpace">3</int>
850 <bytes key="NSWhite">MAA</bytes>
851 </object>
852 <object class="NSDictionary" key="NSSelectedAttributes">
853 <bool key="EncodedWithXMLCoder">YES</bool>
854 <object class="NSMutableArray" key="dict.sortedKeys">
855 <bool key="EncodedWithXMLCoder">YES</bool>
856 <string>NSBackgroundColor</string>
857 <string id="19777717">NSColor</string>
858 </object>
859 <object class="NSMutableArray" key="dict.values">
860 <bool key="EncodedWithXMLCoder">YES</bool>
861 <object class="NSColor">
862 <int key="NSColorSpace">6</int>
863 <string key="NSCatalogName" id="945274157">System</string>
864 <string key="NSColorName">selectedTextBackgroundColor</string>
865 <object class="NSColor" key="NSColor" id="377165725">
866 <int key="NSColorSpace">3</int>
867 <bytes key="NSWhite">MC42NjY2NjY2OQA</bytes>
868 </object>
869 </object>
870 <object class="NSColor">
871 <int key="NSColorSpace">6</int>
872 <reference key="NSCatalogName" ref="945274157"/>
873 <string key="NSColorName">selectedTextColor</string>
874 <reference key="NSColor" ref="555789289"/>
875 </object>
876 </object>
877 </object>
878 <nil key="NSMarkedAttributes"/>
879 <object class="NSDictionary" key="NSLinkAttributes">
880 <bool key="EncodedWithXMLCoder">YES</bool>
881 <object class="NSMutableArray" key="dict.sortedKeys">
882 <bool key="EncodedWithXMLCoder">YES</bool>
883 <reference ref="19777717"/>
884 <string>NSUnderline</string>
885 </object>
886 <object class="NSMutableArray" key="dict.values">
887 <bool key="EncodedWithXMLCoder">YES</bool>
888 <object class="NSColor">
889 <int key="NSColorSpace">1</int>
890 <bytes key="NSRGB">MCAwIDEAA</bytes>
891 </object>
892 <integer value="1" id="9"/>
893 </object>
894 </object>
895 <nil key="NSDefaultParagraphStyle"/>
896 </object>
897 <int key="NSTVFlags">6</int>
898 <string key="NSMaxSize">{480, 1e+07}</string>
899 <string key="NSMinize">{84, 0}</string>
900 <nil key="NSDelegate"/>
901 </object>
902 </object>
903 <string key="NSFrame">{{1, 1}, {433, 231}}</string>
904 <string key="NSBounds">{{0, 38}, {433, 231}}</string>
905 <reference key="NSSuperview" ref="188193463"/>
906 <reference key="NSWindow"/>
907 <reference key="NSNextKeyView" ref="163417131"/>
908 <reference key="NSDocView" ref="163417131"/>
909 <object class="NSColor" key="NSBGColor" id="521347521">
910 <int key="NSColorSpace">3</int>
911 <bytes key="NSWhite">MQA</bytes>
912 </object>
913 <object class="NSCursor" key="NSCursor">
914 <string key="NSHotSpot">{4, -5}</string>
915 <int key="NSCursorType">1</int>
916 </object>
917 <int key="NScvFlags">4</int>
918 </object>
919 <object class="NSScroller" id="418410897">
920 <reference key="NSNextResponder" ref="188193463"/>
921 <int key="NSvFlags">-2147483392</int>
922 <string key="NSFrame">{{427, 1}, {15, 263}}</string>
923 <reference key="NSSuperview" ref="188193463"/>
924 <reference key="NSWindow"/>
925 <reference key="NSTarget" ref="188193463"/>
926 <string key="NSAction" id="688920982">_doScroller:</string>
927 <double key="NSPercent">3.389175e-01</double>
928 </object>
929 <object class="NSScroller" id="936733673">
930 <reference key="NSNextResponder" ref="188193463"/>
931 <int key="NSvFlags">256</int>
932 <string key="NSFrame">{{-100, -100}, {87, 18}}</string>
933 <reference key="NSSuperview" ref="188193463"/>
934 <reference key="NSWindow"/>
935 <int key="NSsFlags">1</int>
936 <reference key="NSTarget" ref="188193463"/>
937 <reference key="NSAction" ref="688920982"/>
938 <double key="NSCurValue">1.000000e+00</double>
939 <double key="NSPercent">9.456522e-01</double>
940 </object>
941 </object>
942 <string key="NSFrame">{{18, 14}, {435, 233}}</string>
943 <reference key="NSSuperview" ref="597872307"/>
944 <reference key="NSWindow"/>
945 <reference key="NSNextKeyView" ref="638544389"/>
946 <int key="NSsFlags">530</int>
947 <reference key="NSVScroller" ref="418410897"/>
948 <reference key="NSHScroller" ref="936733673"/>
949 <reference key="NSContentView" ref="638544389"/>
950 </object>
951 </object>
952 <string key="NSFrame">{{1, 1}, {471, 257}}</string>
953 <reference key="NSSuperview" ref="554641139"/>
954 <reference key="NSWindow"/>
955 </object>
956 </object>
957 <string key="NSFrameSize">{473, 273}</string>
958 <reference key="NSSuperview" ref="741760375"/>
959 <reference key="NSWindow"/>
960 <string key="NSOffsets" id="1055927954">{0, 0}</string>
961 <object class="NSTextFieldCell" key="NSTitleCell">
962 <int key="NSCellFlags">67239424</int>
963 <int key="NSCellFlags2">0</int>
964 <string key="NSContents">Console</string>
965 <object class="NSFont" key="NSSupport" id="26">
966 <string key="NSName" id="257617473">LucidaGrande</string>
967 <double key="NSSize">1.100000e+01</double>
968 <int key="NSfFlags">3100</int>
969 </object>
970 <object class="NSColor" key="NSBackgroundColor" id="131515055">
971 <int key="NSColorSpace">6</int>
972 <reference key="NSCatalogName" ref="945274157"/>
973 <string key="NSColorName">textBackgroundColor</string>
974 <reference key="NSColor" ref="521347521"/>
975 </object>
976 <object class="NSColor" key="NSTextColor">
977 <int key="NSColorSpace">3</int>
978 <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
979 </object>
980 </object>
981 <reference key="NSContentView" ref="597872307"/>
982 <int key="NSBorderType">1</int>
983 <int key="NSBoxType">0</int>
984 <int key="NSTitlePosition">2</int>
985 <bool key="NSTransparent">NO</bool>
986 </object>
987 <object class="NSBox" id="764100755">
988 <reference key="NSNextResponder" ref="741760375"/>
989 <int key="NSvFlags">51</int>
990 <object class="NSMutableArray" key="NSSubviews">
991 <bool key="EncodedWithXMLCoder">YES</bool>
992 <object class="NSView" id="581281551">
993 <reference key="NSNextResponder" ref="764100755"/>
994 <int key="NSvFlags">256</int>
995 <object class="NSMutableArray" key="NSSubviews">
996 <bool key="EncodedWithXMLCoder">YES</bool>
997 <object class="NSScrollView" id="516244966">
998 <reference key="NSNextResponder" ref="581281551"/>
999 <int key="NSvFlags">274</int>
1000 <object class="NSMutableArray" key="NSSubviews">
1001 <bool key="EncodedWithXMLCoder">YES</bool>
1002 <object class="NSClipView" id="119083427">
1003 <reference key="NSNextResponder" ref="516244966"/>
1004 <int key="NSvFlags">2304</int>
1005 <object class="NSMutableArray" key="NSSubviews">
1006 <bool key="EncodedWithXMLCoder">YES</bool>
1007 <object class="NSTableView" id="23853726">
1008 <reference key="NSNextResponder" ref="119083427"/>
1009 <int key="NSvFlags">256</int>
1010 <string key="NSFrameSize">{156, 200}</string>
1011 <reference key="NSSuperview" ref="119083427"/>
1012 <reference key="NSWindow"/>
1013 <bool key="NSEnabled">YES</bool>
1014 <object class="NSTableHeaderView" key="NSHeaderView" id="1048357090">
1015 <reference key="NSNextResponder" ref="746968320"/>
1016 <int key="NSvFlags">256</int>
1017 <string key="NSFrameSize">{156, 17}</string>
1018 <reference key="NSSuperview" ref="746968320"/>
1019 <reference key="NSWindow"/>
1020 <reference key="NSTableView" ref="23853726"/>
1021 </object>
1022 <object class="_NSCornerView" key="NSCornerView" id="212282722">
1023 <reference key="NSNextResponder" ref="516244966"/>
1024 <int key="NSvFlags">256</int>
1025 <string key="NSFrame">{{157, 0}, {16, 17}}</string>
1026 <reference key="NSSuperview" ref="516244966"/>
1027 <reference key="NSWindow"/>
1028 </object>
1029 <object class="NSMutableArray" key="NSTableColumns">
1030 <bool key="EncodedWithXMLCoder">YES</bool>
1031 <object class="NSTableColumn" id="920426212">
1032 <double key="NSWidth">7.100000e+01</double>
1033 <double key="NSMinWidth">4.000000e+01</double>
1034 <double key="NSMaxWidth">1.000000e+03</double>
1035 <object class="NSTableHeaderCell" key="NSHeaderCell">
1036 <int key="NSCellFlags">75628032</int>
1037 <int key="NSCellFlags2">0</int>
1038 <string key="NSContents">Variable</string>
1039 <reference key="NSSupport" ref="26"/>
1040 <object class="NSColor" key="NSBackgroundColor" id="890615311">
1041 <int key="NSColorSpace">3</int>
1042 <bytes key="NSWhite">MC4zMzMzMzI5OQA</bytes>
1043 </object>
1044 <object class="NSColor" key="NSTextColor" id="866628999">
1045 <int key="NSColorSpace">6</int>
1046 <reference key="NSCatalogName" ref="945274157"/>
1047 <string key="NSColorName">headerTextColor</string>
1048 <reference key="NSColor" ref="555789289"/>
1049 </object>
1050 </object>
1051 <object class="NSTextFieldCell" key="NSDataCell" id="525071236">
1052 <int key="NSCellFlags">337772096</int>
1053 <int key="NSCellFlags2">2048</int>
1054 <string key="NSContents" id="590184478">Text Cell</string>
1055 <object class="NSFont" key="NSSupport" id="8196371">
1056 <reference key="NSName" ref="257617473"/>
1057 <double key="NSSize">1.300000e+01</double>
1058 <int key="NSfFlags">1044</int>
1059 </object>
1060 <reference key="NSControlView" ref="23853726"/>
1061 <object class="NSColor" key="NSBackgroundColor" id="224028609">
1062 <int key="NSColorSpace">6</int>
1063 <reference key="NSCatalogName" ref="945274157"/>
1064 <string key="NSColorName">controlBackgroundColor</string>
1065 <reference key="NSColor" ref="377165725"/>
1066 </object>
1067 <object class="NSColor" key="NSTextColor" id="205104690">
1068 <int key="NSColorSpace">6</int>
1069 <reference key="NSCatalogName" ref="945274157"/>
1070 <string key="NSColorName">controlTextColor</string>
1071 <reference key="NSColor" ref="555789289"/>
1072 </object>
1073 </object>
1074 <int key="NSResizingMask">3</int>
1075 <bool key="NSIsResizeable">YES</bool>
1076 <bool key="NSIsEditable">YES</bool>
1077 <reference key="NSTableView" ref="23853726"/>
1078 </object>
1079 <object class="NSTableColumn" id="857054683">
1080 <double key="NSWidth">7.900000e+01</double>
1081 <double key="NSMinWidth">4.000000e+01</double>
1082 <double key="NSMaxWidth">1.000000e+03</double>
1083 <object class="NSTableHeaderCell" key="NSHeaderCell">
1084 <int key="NSCellFlags">75628032</int>
1085 <int key="NSCellFlags2">0</int>
1086 <string key="NSContents">Value</string>
1087 <reference key="NSSupport" ref="26"/>
1088 <reference key="NSBackgroundColor" ref="890615311"/>
1089 <reference key="NSTextColor" ref="866628999"/>
1090 </object>
1091 <object class="NSTextFieldCell" key="NSDataCell" id="377147224">
1092 <int key="NSCellFlags">337772096</int>
1093 <int key="NSCellFlags2">2048</int>
1094 <reference key="NSContents" ref="590184478"/>
1095 <reference key="NSSupport" ref="8196371"/>
1096 <reference key="NSControlView" ref="23853726"/>
1097 <reference key="NSBackgroundColor" ref="224028609"/>
1098 <reference key="NSTextColor" ref="205104690"/>
1099 </object>
1100 <int key="NSResizingMask">3</int>
1101 <bool key="NSIsResizeable">YES</bool>
1102 <bool key="NSIsEditable">YES</bool>
1103 <reference key="NSTableView" ref="23853726"/>
1104 </object>
1105 </object>
1106 <double key="NSIntercellSpacingWidth">3.000000e+00</double>
1107 <double key="NSIntercellSpacingHeight">2.000000e+00</double>
1108 <reference key="NSBackgroundColor" ref="521347521"/>
1109 <object class="NSColor" key="NSGridColor">
1110 <int key="NSColorSpace">6</int>
1111 <reference key="NSCatalogName" ref="945274157"/>
1112 <string key="NSColorName">gridColor</string>
1113 <object class="NSColor" key="NSColor">
1114 <int key="NSColorSpace">3</int>
1115 <bytes key="NSWhite">MC41AA</bytes>
1116 </object>
1117 </object>
1118 <double key="NSRowHeight">1.700000e+01</double>
1119 <int key="NSTvFlags">-692060160</int>
1120 <int key="NSGridStyleMask">1</int>
1121 <int key="NSColumnAutoresizingStyle">4</int>
1122 <int key="NSDraggingSourceMaskForLocal">15</int>
1123 <int key="NSDraggingSourceMaskForNonLocal">0</int>
1124 <bool key="NSAllowsTypeSelect">YES</bool>
1125 </object>
1126 </object>
1127 <string key="NSFrame">{{1, 17}, {156, 200}}</string>
1128 <reference key="NSSuperview" ref="516244966"/>
1129 <reference key="NSWindow"/>
1130 <reference key="NSNextKeyView" ref="23853726"/>
1131 <reference key="NSDocView" ref="23853726"/>
1132 <reference key="NSBGColor" ref="224028609"/>
1133 <int key="NScvFlags">4</int>
1134 </object>
1135 <object class="NSScroller" id="512953560">
1136 <reference key="NSNextResponder" ref="516244966"/>
1137 <int key="NSvFlags">256</int>
1138 <string key="NSFrame">{{157, 17}, {15, 200}}</string>
1139 <reference key="NSSuperview" ref="516244966"/>
1140 <reference key="NSWindow"/>
1141 <reference key="NSTarget" ref="516244966"/>
1142 <reference key="NSAction" ref="688920982"/>
1143 <double key="NSPercent">9.961240e-01</double>
1144 </object>
1145 <object class="NSScroller" id="47103270">
1146 <reference key="NSNextResponder" ref="516244966"/>
1147 <int key="NSvFlags">256</int>
1148 <string key="NSFrame">{{1, 217}, {156, 15}}</string>
1149 <reference key="NSSuperview" ref="516244966"/>
1150 <reference key="NSWindow"/>
1151 <int key="NSsFlags">1</int>
1152 <reference key="NSTarget" ref="516244966"/>
1153 <reference key="NSAction" ref="688920982"/>
1154 <double key="NSPercent">7.179487e-01</double>
1155 </object>
1156 <object class="NSClipView" id="746968320">
1157 <reference key="NSNextResponder" ref="516244966"/>
1158 <int key="NSvFlags">2304</int>
1159 <object class="NSMutableArray" key="NSSubviews">
1160 <bool key="EncodedWithXMLCoder">YES</bool>
1161 <reference ref="1048357090"/>
1162 </object>
1163 <string key="NSFrame">{{1, 0}, {156, 17}}</string>
1164 <reference key="NSSuperview" ref="516244966"/>
1165 <reference key="NSWindow"/>
1166 <reference key="NSNextKeyView" ref="1048357090"/>
1167 <reference key="NSDocView" ref="1048357090"/>
1168 <reference key="NSBGColor" ref="224028609"/>
1169 <int key="NScvFlags">4</int>
1170 </object>
1171 <reference ref="212282722"/>
1172 </object>
1173 <string key="NSFrame">{{18, 14}, {173, 233}}</string>
1174 <reference key="NSSuperview" ref="581281551"/>
1175 <reference key="NSWindow"/>
1176 <reference key="NSNextKeyView" ref="119083427"/>
1177 <int key="NSsFlags">50</int>
1178 <reference key="NSVScroller" ref="512953560"/>
1179 <reference key="NSHScroller" ref="47103270"/>
1180 <reference key="NSContentView" ref="119083427"/>
1181 <reference key="NSHeaderClipView" ref="746968320"/>
1182 <reference key="NSCornerView" ref="212282722"/>
1183 <bytes key="NSScrollAmts">QSAAAEEgAABBmAAAQZgAAA</bytes>
1184 </object>
1185 </object>
1186 <string key="NSFrame">{{1, 1}, {209, 257}}</string>
1187 <reference key="NSSuperview" ref="764100755"/>
1188 <reference key="NSWindow"/>
1189 </object>
1190 </object>
1191 <string key="NSFrame">{{474, 0}, {211, 273}}</string>
1192 <reference key="NSSuperview" ref="741760375"/>
1193 <reference key="NSWindow"/>
1194 <reference key="NSOffsets" ref="1055927954"/>
1195 <object class="NSTextFieldCell" key="NSTitleCell">
1196 <int key="NSCellFlags">67239424</int>
1197 <int key="NSCellFlags2">0</int>
1198 <string key="NSContents">Workspace</string>
1199 <reference key="NSSupport" ref="26"/>
1200 <reference key="NSBackgroundColor" ref="131515055"/>
1201 <object class="NSColor" key="NSTextColor">
1202 <int key="NSColorSpace">3</int>
1203 <bytes key="NSWhite">MCAwLjgwMDAwMDAxAA</bytes>
1204 </object>
1205 </object>
1206 <reference key="NSContentView" ref="581281551"/>
1207 <int key="NSBorderType">1</int>
1208 <int key="NSBoxType">0</int>
1209 <int key="NSTitlePosition">2</int>
1210 <bool key="NSTransparent">NO</bool>
1211 </object>
1212 </object>
1213 <string key="NSFrame">{{20, 44}, {685, 273}}</string>
1214 <reference key="NSSuperview" ref="439893737"/>
1215 <reference key="NSWindow"/>
1216 <bool key="NSIsVertical">YES</bool>
1217 <int key="NSDividerStyle">2</int>
1218 <string key="NSAutosaveName">ipython1_console_workspace_split</string>
1219 </object>
1220 <object class="NSProgressIndicator" id="74807016">
1221 <reference key="NSNextResponder" ref="439893737"/>
1222 <int key="NSvFlags">1313</int>
1223 <object class="NSPSMatrix" key="NSDrawMatrix"/>
1224 <string key="NSFrame">{{689, 20}, {16, 16}}</string>
1225 <reference key="NSSuperview" ref="439893737"/>
1226 <reference key="NSWindow"/>
1227 <int key="NSpiFlags">28938</int>
1228 <double key="NSMinValue">1.600000e+01</double>
1229 <double key="NSMaxValue">1.000000e+02</double>
1230 </object>
1231 </object>
1232 <string key="NSFrameSize">{725, 337}</string>
1233 <reference key="NSSuperview"/>
1234 <reference key="NSWindow"/>
1235 </object>
1236 <string key="NSScreenRect">{{0, 0}, {1280, 778}}</string>
1237 <string key="NSFrameAutosaveName">ipython1_sandbox</string>
1238 </object>
1239 <object class="NSCustomObject" id="610635028">
1240 <string key="NSClassName" id="982950837">IPython1SandboxAppDelegate</string>
1241 </object>
1242 <object class="NSDictionaryController" id="808393665">
1243 <object class="NSMutableArray" key="NSDeclaredKeys">
1244 <bool key="EncodedWithXMLCoder">YES</bool>
1245 <string>keys</string>
1246 <string id="181461860">key</string>
1247 <string id="276523235">value</string>
1248 </object>
1249 <bool key="NSEditable">YES</bool>
1250 <bool key="NSAvoidsEmptySelection">YES</bool>
1251 <bool key="NSPreservesSelection">YES</bool>
1252 <bool key="NSSelectsInsertedObjects">YES</bool>
1253 <bool key="NSFilterRestrictsInsertion">YES</bool>
1254 <object class="NSArray" key="NSSortDescriptors">
1255 <bool key="EncodedWithXMLCoder">YES</bool>
1256 <object class="NSSortDescriptor">
1257 <reference key="NSKey" ref="181461860"/>
1258 <bool key="NSAscending">YES</bool>
1259 <string key="NSSelector">compare:</string>
1260 </object>
1261 </object>
1262 <bool key="NSClearsFilterPredicateOnInsertion">YES</bool>
1263 <reference key="NSInitialKey" ref="181461860"/>
1264 <reference key="NSInitialValue" ref="276523235"/>
1265 </object>
1266 <object class="NSCustomObject" id="631572152">
1267 <string key="NSClassName" id="695797635">IPythonCocoaController</string>
1268 </object>
1269 </object>
1270 <object class="IBObjectContainer" key="IBDocument.Objects">
1271 <object class="NSMutableArray" key="connectionRecords">
1272 <bool key="EncodedWithXMLCoder">YES</bool>
1273 <object class="IBConnectionRecord">
1274 <object class="IBActionConnection" key="connection">
1275 <string key="label">performMiniaturize:</string>
1276 <reference key="source" ref="1014"/>
1277 <reference key="destination" ref="1011231497"/>
1278 </object>
1279 <int key="connectionID">37</int>
1280 </object>
1281 <object class="IBConnectionRecord">
1282 <object class="IBActionConnection" key="connection">
1283 <string key="label">arrangeInFront:</string>
1284 <reference key="source" ref="1014"/>
1285 <reference key="destination" ref="625202149"/>
1286 </object>
1287 <int key="connectionID">39</int>
1288 </object>
1289 <object class="IBConnectionRecord">
1290 <object class="IBActionConnection" key="connection">
1291 <string key="label">print:</string>
1292 <reference key="source" ref="1014"/>
1293 <reference key="destination" ref="49223823"/>
1294 </object>
1295 <int key="connectionID">86</int>
1296 </object>
1297 <object class="IBConnectionRecord">
1298 <object class="IBActionConnection" key="connection">
1299 <string key="label">runPageLayout:</string>
1300 <reference key="source" ref="1014"/>
1301 <reference key="destination" ref="294629803"/>
1302 </object>
1303 <int key="connectionID">87</int>
1304 </object>
1305 <object class="IBConnectionRecord">
1306 <object class="IBActionConnection" key="connection">
1307 <string key="label">clearRecentDocuments:</string>
1308 <reference key="source" ref="1014"/>
1309 <reference key="destination" ref="759406840"/>
1310 </object>
1311 <int key="connectionID">127</int>
1312 </object>
1313 <object class="IBConnectionRecord">
1314 <object class="IBActionConnection" key="connection">
1315 <string key="label">orderFrontStandardAboutPanel:</string>
1316 <reference key="source" ref="1021"/>
1317 <reference key="destination" ref="238522557"/>
1318 </object>
1319 <int key="connectionID">142</int>
1320 </object>
1321 <object class="IBConnectionRecord">
1322 <object class="IBActionConnection" key="connection">
1323 <string key="label">performClose:</string>
1324 <reference key="source" ref="1014"/>
1325 <reference key="destination" ref="776162233"/>
1326 </object>
1327 <int key="connectionID">193</int>
1328 </object>
1329 <object class="IBConnectionRecord">
1330 <object class="IBActionConnection" key="connection">
1331 <string key="label">toggleContinuousSpellChecking:</string>
1332 <reference key="source" ref="1014"/>
1333 <reference key="destination" ref="948374510"/>
1334 </object>
1335 <int key="connectionID">222</int>
1336 </object>
1337 <object class="IBConnectionRecord">
1338 <object class="IBActionConnection" key="connection">
1339 <string key="label">undo:</string>
1340 <reference key="source" ref="1014"/>
1341 <reference key="destination" ref="1058277027"/>
1342 </object>
1343 <int key="connectionID">223</int>
1344 </object>
1345 <object class="IBConnectionRecord">
1346 <object class="IBActionConnection" key="connection">
1347 <string key="label">copy:</string>
1348 <reference key="source" ref="1014"/>
1349 <reference key="destination" ref="860595796"/>
1350 </object>
1351 <int key="connectionID">224</int>
1352 </object>
1353 <object class="IBConnectionRecord">
1354 <object class="IBActionConnection" key="connection">
1355 <string key="label">checkSpelling:</string>
1356 <reference key="source" ref="1014"/>
1357 <reference key="destination" ref="96193923"/>
1358 </object>
1359 <int key="connectionID">225</int>
1360 </object>
1361 <object class="IBConnectionRecord">
1362 <object class="IBActionConnection" key="connection">
1363 <string key="label">paste:</string>
1364 <reference key="source" ref="1014"/>
1365 <reference key="destination" ref="29853731"/>
1366 </object>
1367 <int key="connectionID">226</int>
1368 </object>
1369 <object class="IBConnectionRecord">
1370 <object class="IBActionConnection" key="connection">
1371 <string key="label">stopSpeaking:</string>
1372 <reference key="source" ref="1014"/>
1373 <reference key="destination" ref="680220178"/>
1374 </object>
1375 <int key="connectionID">227</int>
1376 </object>
1377 <object class="IBConnectionRecord">
1378 <object class="IBActionConnection" key="connection">
1379 <string key="label">cut:</string>
1380 <reference key="source" ref="1014"/>
1381 <reference key="destination" ref="296257095"/>
1382 </object>
1383 <int key="connectionID">228</int>
1384 </object>
1385 <object class="IBConnectionRecord">
1386 <object class="IBActionConnection" key="connection">
1387 <string key="label">showGuessPanel:</string>
1388 <reference key="source" ref="1014"/>
1389 <reference key="destination" ref="679648819"/>
1390 </object>
1391 <int key="connectionID">230</int>
1392 </object>
1393 <object class="IBConnectionRecord">
1394 <object class="IBActionConnection" key="connection">
1395 <string key="label">redo:</string>
1396 <reference key="source" ref="1014"/>
1397 <reference key="destination" ref="790794224"/>
1398 </object>
1399 <int key="connectionID">231</int>
1400 </object>
1401 <object class="IBConnectionRecord">
1402 <object class="IBActionConnection" key="connection">
1403 <string key="label">selectAll:</string>
1404 <reference key="source" ref="1014"/>
1405 <reference key="destination" ref="583158037"/>
1406 </object>
1407 <int key="connectionID">232</int>
1408 </object>
1409 <object class="IBConnectionRecord">
1410 <object class="IBActionConnection" key="connection">
1411 <string key="label">startSpeaking:</string>
1412 <reference key="source" ref="1014"/>
1413 <reference key="destination" ref="731782645"/>
1414 </object>
1415 <int key="connectionID">233</int>
1416 </object>
1417 <object class="IBConnectionRecord">
1418 <object class="IBActionConnection" key="connection">
1419 <string key="label">delete:</string>
1420 <reference key="source" ref="1014"/>
1421 <reference key="destination" ref="437104165"/>
1422 </object>
1423 <int key="connectionID">235</int>
1424 </object>
1425 <object class="IBConnectionRecord">
1426 <object class="IBActionConnection" key="connection">
1427 <string key="label">performZoom:</string>
1428 <reference key="source" ref="1014"/>
1429 <reference key="destination" ref="575023229"/>
1430 </object>
1431 <int key="connectionID">240</int>
1432 </object>
1433 <object class="IBConnectionRecord">
1434 <object class="IBActionConnection" key="connection">
1435 <string key="label">performFindPanelAction:</string>
1436 <reference key="source" ref="1014"/>
1437 <reference key="destination" ref="447796847"/>
1438 </object>
1439 <int key="connectionID">241</int>
1440 </object>
1441 <object class="IBConnectionRecord">
1442 <object class="IBActionConnection" key="connection">
1443 <string key="label">centerSelectionInVisibleArea:</string>
1444 <reference key="source" ref="1014"/>
1445 <reference key="destination" ref="88285865"/>
1446 </object>
1447 <int key="connectionID">245</int>
1448 </object>
1449 <object class="IBConnectionRecord">
1450 <object class="IBActionConnection" key="connection">
1451 <string key="label">toggleGrammarChecking:</string>
1452 <reference key="source" ref="1014"/>
1453 <reference key="destination" ref="967646866"/>
1454 </object>
1455 <int key="connectionID">347</int>
1456 </object>
1457 <object class="IBConnectionRecord">
1458 <object class="IBActionConnection" key="connection">
1459 <string key="label">toggleSmartInsertDelete:</string>
1460 <reference key="source" ref="1014"/>
1461 <reference key="destination" ref="605118523"/>
1462 </object>
1463 <int key="connectionID">355</int>
1464 </object>
1465 <object class="IBConnectionRecord">
1466 <object class="IBActionConnection" key="connection">
1467 <string key="label">toggleAutomaticQuoteSubstitution:</string>
1468 <reference key="source" ref="1014"/>
1469 <reference key="destination" ref="197661976"/>
1470 </object>
1471 <int key="connectionID">356</int>
1472 </object>
1473 <object class="IBConnectionRecord">
1474 <object class="IBActionConnection" key="connection">
1475 <string key="label">toggleAutomaticLinkDetection:</string>
1476 <reference key="source" ref="1014"/>
1477 <reference key="destination" ref="708854459"/>
1478 </object>
1479 <int key="connectionID">357</int>
1480 </object>
1481 <object class="IBConnectionRecord">
1482 <object class="IBActionConnection" key="connection">
1483 <string key="label">showHelp:</string>
1484 <reference key="source" ref="1014"/>
1485 <reference key="destination" ref="238773614"/>
1486 </object>
1487 <int key="connectionID">360</int>
1488 </object>
1489 <object class="IBConnectionRecord">
1490 <object class="IBActionConnection" key="connection">
1491 <string key="label">orderFrontColorPanel:</string>
1492 <reference key="source" ref="1014"/>
1493 <reference key="destination" ref="1028416764"/>
1494 </object>
1495 <int key="connectionID">361</int>
1496 </object>
1497 <object class="IBConnectionRecord">
1498 <object class="IBActionConnection" key="connection">
1499 <string key="label">saveDocument:</string>
1500 <reference key="source" ref="1014"/>
1501 <reference key="destination" ref="1023925487"/>
1502 </object>
1503 <int key="connectionID">362</int>
1504 </object>
1505 <object class="IBConnectionRecord">
1506 <object class="IBActionConnection" key="connection">
1507 <string key="label">saveDocumentAs:</string>
1508 <reference key="source" ref="1014"/>
1509 <reference key="destination" ref="117038363"/>
1510 </object>
1511 <int key="connectionID">363</int>
1512 </object>
1513 <object class="IBConnectionRecord">
1514 <object class="IBActionConnection" key="connection">
1515 <string key="label">revertDocumentToSaved:</string>
1516 <reference key="source" ref="1014"/>
1517 <reference key="destination" ref="579971712"/>
1518 </object>
1519 <int key="connectionID">364</int>
1520 </object>
1521 <object class="IBConnectionRecord">
1522 <object class="IBActionConnection" key="connection">
1523 <string key="label">runToolbarCustomizationPalette:</string>
1524 <reference key="source" ref="1014"/>
1525 <reference key="destination" ref="237841660"/>
1526 </object>
1527 <int key="connectionID">365</int>
1528 </object>
1529 <object class="IBConnectionRecord">
1530 <object class="IBActionConnection" key="connection">
1531 <string key="label">toggleToolbarShown:</string>
1532 <reference key="source" ref="1014"/>
1533 <reference key="destination" ref="102151532"/>
1534 </object>
1535 <int key="connectionID">366</int>
1536 </object>
1537 <object class="IBConnectionRecord">
1538 <object class="IBActionConnection" key="connection">
1539 <string key="label">hide:</string>
1540 <reference key="source" ref="1014"/>
1541 <reference key="destination" ref="755159360"/>
1542 </object>
1543 <int key="connectionID">367</int>
1544 </object>
1545 <object class="IBConnectionRecord">
1546 <object class="IBActionConnection" key="connection">
1547 <string key="label">hideOtherApplications:</string>
1548 <reference key="source" ref="1014"/>
1549 <reference key="destination" ref="342932134"/>
1550 </object>
1551 <int key="connectionID">368</int>
1552 </object>
1553 <object class="IBConnectionRecord">
1554 <object class="IBActionConnection" key="connection">
1555 <string key="label">terminate:</string>
1556 <reference key="source" ref="1014"/>
1557 <reference key="destination" ref="632727374"/>
1558 </object>
1559 <int key="connectionID">369</int>
1560 </object>
1561 <object class="IBConnectionRecord">
1562 <object class="IBActionConnection" key="connection">
1563 <string key="label">unhideAllApplications:</string>
1564 <reference key="source" ref="1014"/>
1565 <reference key="destination" ref="908899353"/>
1566 </object>
1567 <int key="connectionID">370</int>
1568 </object>
1569 <object class="IBConnectionRecord">
1570 <object class="IBOutletConnection" key="connection">
1571 <string key="label" id="606168085">delegate</string>
1572 <reference key="source" ref="1050"/>
1573 <reference key="destination" ref="610635028"/>
1574 </object>
1575 <int key="connectionID">374</int>
1576 </object>
1577 <object class="IBConnectionRecord">
1578 <object class="IBBindingConnection" key="connection">
1579 <string key="label" id="187454546">contentDictionary: userNS</string>
1580 <reference key="source" ref="808393665"/>
1581 <reference key="destination" ref="631572152"/>
1582 <object class="NSNibBindingConnector" key="connector">
1583 <reference key="NSSource" ref="808393665"/>
1584 <reference key="NSDestination" ref="631572152"/>
1585 <reference key="NSLabel" ref="187454546"/>
1586 <string key="NSBinding">contentDictionary</string>
1587 <string key="NSKeyPath">userNS</string>
1588 <int key="NSNibBindingConnectorVersion">2</int>
1589 </object>
1590 </object>
1591 <int key="connectionID">424</int>
1592 </object>
1593 <object class="IBConnectionRecord">
1594 <object class="IBBindingConnection" key="connection">
1595 <string key="label" id="688370141">value: arrangedObjects.value</string>
1596 <reference key="source" ref="857054683"/>
1597 <reference key="destination" ref="808393665"/>
1598 <object class="NSNibBindingConnector" key="connector">
1599 <reference key="NSSource" ref="857054683"/>
1600 <reference key="NSDestination" ref="808393665"/>
1601 <reference key="NSLabel" ref="688370141"/>
1602 <reference key="NSBinding" ref="276523235"/>
1603 <string key="NSKeyPath">arrangedObjects.value</string>
1604 <int key="NSNibBindingConnectorVersion">2</int>
1605 </object>
1606 </object>
1607 <int key="connectionID">427</int>
1608 </object>
1609 <object class="IBConnectionRecord">
1610 <object class="IBBindingConnection" key="connection">
1611 <string key="label" id="764859820">value: arrangedObjects.key</string>
1612 <reference key="source" ref="920426212"/>
1613 <reference key="destination" ref="808393665"/>
1614 <object class="NSNibBindingConnector" key="connector">
1615 <reference key="NSSource" ref="920426212"/>
1616 <reference key="NSDestination" ref="808393665"/>
1617 <reference key="NSLabel" ref="764859820"/>
1618 <reference key="NSBinding" ref="276523235"/>
1619 <string key="NSKeyPath">arrangedObjects.key</string>
1620 <int key="NSNibBindingConnectorVersion">2</int>
1621 </object>
1622 </object>
1623 <int key="connectionID">428</int>
1624 </object>
1625 <object class="IBConnectionRecord">
1626 <object class="IBOutletConnection" key="connection">
1627 <reference key="label" ref="606168085"/>
1628 <reference key="source" ref="972006081"/>
1629 <reference key="destination" ref="631572152"/>
1630 </object>
1631 <int key="connectionID">429</int>
1632 </object>
1633 <object class="IBConnectionRecord">
1634 <object class="IBBindingConnection" key="connection">
1635 <string key="label" id="97087091">animate: waitingForEngine</string>
1636 <reference key="source" ref="74807016"/>
1637 <reference key="destination" ref="631572152"/>
1638 <object class="NSNibBindingConnector" key="connector">
1639 <reference key="NSSource" ref="74807016"/>
1640 <reference key="NSDestination" ref="631572152"/>
1641 <reference key="NSLabel" ref="97087091"/>
1642 <string key="NSBinding">animate</string>
1643 <string key="NSKeyPath">waitingForEngine</string>
1644 <int key="NSNibBindingConnectorVersion">2</int>
1645 </object>
1646 </object>
1647 <int key="connectionID">437</int>
1648 </object>
1649 <object class="IBConnectionRecord">
1650 <object class="IBBindingConnection" key="connection">
1651 <string key="label" id="289275654">filterPredicate: workspaceFilterPredicate</string>
1652 <reference key="source" ref="808393665"/>
1653 <reference key="destination" ref="610635028"/>
1654 <object class="NSNibBindingConnector" key="connector">
1655 <reference key="NSSource" ref="808393665"/>
1656 <reference key="NSDestination" ref="610635028"/>
1657 <reference key="NSLabel" ref="289275654"/>
1658 <string key="NSBinding">filterPredicate</string>
1659 <string key="NSKeyPath">workspaceFilterPredicate</string>
1660 <int key="NSNibBindingConnectorVersion">2</int>
1661 </object>
1662 </object>
1663 <int key="connectionID">440</int>
1664 </object>
1665 <object class="IBConnectionRecord">
1666 <object class="IBOutletConnection" key="connection">
1667 <string key="label">ipythonController</string>
1668 <reference key="source" ref="610635028"/>
1669 <reference key="destination" ref="631572152"/>
1670 </object>
1671 <int key="connectionID">441</int>
1672 </object>
1673 <object class="IBConnectionRecord">
1674 <object class="IBOutletConnection" key="connection">
1675 <string key="label" id="684042788">textView</string>
1676 <reference key="source" ref="631572152"/>
1677 <reference key="destination" ref="163417131"/>
1678 </object>
1679 <int key="connectionID">444</int>
1680 </object>
1681 <object class="IBConnectionRecord">
1682 <object class="IBOutletConnection" key="connection">
1683 <string key="label">initialFirstResponder</string>
1684 <reference key="source" ref="972006081"/>
1685 <reference key="destination" ref="163417131"/>
1686 </object>
1687 <int key="connectionID">445</int>
1688 </object>
1689 </object>
1690 <object class="IBMutableOrderedSet" key="objectRecords">
1691 <object class="NSArray" key="orderedObjects">
1692 <bool key="EncodedWithXMLCoder">YES</bool>
1693 <object class="IBObjectRecord">
1694 <int key="objectID">0</int>
1695 <object class="NSArray" key="object" id="1049">
1696 <bool key="EncodedWithXMLCoder">YES</bool>
1697 </object>
1698 <reference key="children" ref="1048"/>
1699 <nil key="parent"/>
1700 </object>
1701 <object class="IBObjectRecord">
1702 <int key="objectID">-2</int>
1703 <reference key="object" ref="1021"/>
1704 <reference key="parent" ref="1049"/>
1705 <string type="base64-UTF8" key="objectName">RmlsZSdzIE93bmVyA</string>
1706 </object>
1707 <object class="IBObjectRecord">
1708 <int key="objectID">-1</int>
1709 <reference key="object" ref="1014"/>
1710 <reference key="parent" ref="1049"/>
1711 <string key="objectName">First Responder</string>
1712 </object>
1713 <object class="IBObjectRecord">
1714 <int key="objectID">-3</int>
1715 <reference key="object" ref="1050"/>
1716 <reference key="parent" ref="1049"/>
1717 <string key="objectName">Application</string>
1718 </object>
1719 <object class="IBObjectRecord">
1720 <int key="objectID">29</int>
1721 <reference key="object" ref="649796088"/>
1722 <object class="NSMutableArray" key="children">
1723 <bool key="EncodedWithXMLCoder">YES</bool>
1724 <reference ref="713487014"/>
1725 <reference ref="694149608"/>
1726 <reference ref="391199113"/>
1727 <reference ref="952259628"/>
1728 <reference ref="379814623"/>
1729 <reference ref="586577488"/>
1730 <reference ref="626404410"/>
1731 </object>
1732 <reference key="parent" ref="1049"/>
1733 <string key="objectName">MainMenu</string>
1734 </object>
1735 <object class="IBObjectRecord">
1736 <int key="objectID">19</int>
1737 <reference key="object" ref="713487014"/>
1738 <object class="NSMutableArray" key="children">
1739 <bool key="EncodedWithXMLCoder">YES</bool>
1740 <reference ref="835318025"/>
1741 </object>
1742 <reference key="parent" ref="649796088"/>
1743 </object>
1744 <object class="IBObjectRecord">
1745 <int key="objectID">56</int>
1746 <reference key="object" ref="694149608"/>
1747 <object class="NSMutableArray" key="children">
1748 <bool key="EncodedWithXMLCoder">YES</bool>
1749 <reference ref="110575045"/>
1750 </object>
1751 <reference key="parent" ref="649796088"/>
1752 </object>
1753 <object class="IBObjectRecord">
1754 <int key="objectID">103</int>
1755 <reference key="object" ref="391199113"/>
1756 <object class="NSMutableArray" key="children">
1757 <bool key="EncodedWithXMLCoder">YES</bool>
1758 <reference ref="374024848"/>
1759 </object>
1760 <reference key="parent" ref="649796088"/>
1761 <string key="objectName" id="508169456">1</string>
1762 </object>
1763 <object class="IBObjectRecord">
1764 <int key="objectID">217</int>
1765 <reference key="object" ref="952259628"/>
1766 <object class="NSMutableArray" key="children">
1767 <bool key="EncodedWithXMLCoder">YES</bool>
1768 <reference ref="789758025"/>
1769 </object>
1770 <reference key="parent" ref="649796088"/>
1771 </object>
1772 <object class="IBObjectRecord">
1773 <int key="objectID">83</int>
1774 <reference key="object" ref="379814623"/>
1775 <object class="NSMutableArray" key="children">
1776 <bool key="EncodedWithXMLCoder">YES</bool>
1777 <reference ref="720053764"/>
1778 </object>
1779 <reference key="parent" ref="649796088"/>
1780 </object>
1781 <object class="IBObjectRecord">
1782 <int key="objectID">81</int>
1783 <reference key="object" ref="720053764"/>
1784 <object class="NSMutableArray" key="children">
1785 <bool key="EncodedWithXMLCoder">YES</bool>
1786 <reference ref="1023925487"/>
1787 <reference ref="117038363"/>
1788 <reference ref="49223823"/>
1789 <reference ref="722745758"/>
1790 <reference ref="705341025"/>
1791 <reference ref="1025936716"/>
1792 <reference ref="294629803"/>
1793 <reference ref="776162233"/>
1794 <reference ref="425164168"/>
1795 <reference ref="579971712"/>
1796 <reference ref="1010469920"/>
1797 </object>
1798 <reference key="parent" ref="379814623"/>
1799 </object>
1800 <object class="IBObjectRecord">
1801 <int key="objectID">75</int>
1802 <reference key="object" ref="1023925487"/>
1803 <reference key="parent" ref="720053764"/>
1804 <string key="objectName">3</string>
1805 </object>
1806 <object class="IBObjectRecord">
1807 <int key="objectID">80</int>
1808 <reference key="object" ref="117038363"/>
1809 <reference key="parent" ref="720053764"/>
1810 <string key="objectName">8</string>
1811 </object>
1812 <object class="IBObjectRecord">
1813 <int key="objectID">78</int>
1814 <reference key="object" ref="49223823"/>
1815 <reference key="parent" ref="720053764"/>
1816 <string key="objectName">6</string>
1817 </object>
1818 <object class="IBObjectRecord">
1819 <int key="objectID">72</int>
1820 <reference key="object" ref="722745758"/>
1821 <reference key="parent" ref="720053764"/>
1822 </object>
1823 <object class="IBObjectRecord">
1824 <int key="objectID">82</int>
1825 <reference key="object" ref="705341025"/>
1826 <reference key="parent" ref="720053764"/>
1827 <string key="objectName">9</string>
1828 </object>
1829 <object class="IBObjectRecord">
1830 <int key="objectID">124</int>
1831 <reference key="object" ref="1025936716"/>
1832 <object class="NSMutableArray" key="children">
1833 <bool key="EncodedWithXMLCoder">YES</bool>
1834 <reference ref="1065607017"/>
1835 </object>
1836 <reference key="parent" ref="720053764"/>
1837 </object>
1838 <object class="IBObjectRecord">
1839 <int key="objectID">77</int>
1840 <reference key="object" ref="294629803"/>
1841 <reference key="parent" ref="720053764"/>
1842 <string key="objectName">5</string>
1843 </object>
1844 <object class="IBObjectRecord">
1845 <int key="objectID">73</int>
1846 <reference key="object" ref="776162233"/>
1847 <reference key="parent" ref="720053764"/>
1848 <reference key="objectName" ref="508169456"/>
1849 </object>
1850 <object class="IBObjectRecord">
1851 <int key="objectID">79</int>
1852 <reference key="object" ref="425164168"/>
1853 <reference key="parent" ref="720053764"/>
1854 <string key="objectName">7</string>
1855 </object>
1856 <object class="IBObjectRecord">
1857 <int key="objectID">112</int>
1858 <reference key="object" ref="579971712"/>
1859 <reference key="parent" ref="720053764"/>
1860 <string key="objectName">10</string>
1861 </object>
1862 <object class="IBObjectRecord">
1863 <int key="objectID">74</int>
1864 <reference key="object" ref="1010469920"/>
1865 <reference key="parent" ref="720053764"/>
1866 <string key="objectName" id="464456376">2</string>
1867 </object>
1868 <object class="IBObjectRecord">
1869 <int key="objectID">125</int>
1870 <reference key="object" ref="1065607017"/>
1871 <object class="NSMutableArray" key="children">
1872 <bool key="EncodedWithXMLCoder">YES</bool>
1873 <reference ref="759406840"/>
1874 </object>
1875 <reference key="parent" ref="1025936716"/>
1876 </object>
1877 <object class="IBObjectRecord">
1878 <int key="objectID">126</int>
1879 <reference key="object" ref="759406840"/>
1880 <reference key="parent" ref="1065607017"/>
1881 </object>
1882 <object class="IBObjectRecord">
1883 <int key="objectID">205</int>
1884 <reference key="object" ref="789758025"/>
1885 <object class="NSMutableArray" key="children">
1886 <bool key="EncodedWithXMLCoder">YES</bool>
1887 <reference ref="437104165"/>
1888 <reference ref="583158037"/>
1889 <reference ref="1058277027"/>
1890 <reference ref="212016141"/>
1891 <reference ref="296257095"/>
1892 <reference ref="29853731"/>
1893 <reference ref="860595796"/>
1894 <reference ref="1040322652"/>
1895 <reference ref="790794224"/>
1896 <reference ref="892235320"/>
1897 <reference ref="972420730"/>
1898 <reference ref="676164635"/>
1899 <reference ref="507821607"/>
1900 </object>
1901 <reference key="parent" ref="952259628"/>
1902 </object>
1903 <object class="IBObjectRecord">
1904 <int key="objectID">202</int>
1905 <reference key="object" ref="437104165"/>
1906 <reference key="parent" ref="789758025"/>
1907 </object>
1908 <object class="IBObjectRecord">
1909 <int key="objectID">198</int>
1910 <reference key="object" ref="583158037"/>
1911 <reference key="parent" ref="789758025"/>
1912 </object>
1913 <object class="IBObjectRecord">
1914 <int key="objectID">207</int>
1915 <reference key="object" ref="1058277027"/>
1916 <reference key="parent" ref="789758025"/>
1917 </object>
1918 <object class="IBObjectRecord">
1919 <int key="objectID">214</int>
1920 <reference key="object" ref="212016141"/>
1921 <reference key="parent" ref="789758025"/>
1922 </object>
1923 <object class="IBObjectRecord">
1924 <int key="objectID">199</int>
1925 <reference key="object" ref="296257095"/>
1926 <reference key="parent" ref="789758025"/>
1927 </object>
1928 <object class="IBObjectRecord">
1929 <int key="objectID">203</int>
1930 <reference key="object" ref="29853731"/>
1931 <reference key="parent" ref="789758025"/>
1932 </object>
1933 <object class="IBObjectRecord">
1934 <int key="objectID">197</int>
1935 <reference key="object" ref="860595796"/>
1936 <reference key="parent" ref="789758025"/>
1937 </object>
1938 <object class="IBObjectRecord">
1939 <int key="objectID">206</int>
1940 <reference key="object" ref="1040322652"/>
1941 <reference key="parent" ref="789758025"/>
1942 </object>
1943 <object class="IBObjectRecord">
1944 <int key="objectID">215</int>
1945 <reference key="object" ref="790794224"/>
1946 <reference key="parent" ref="789758025"/>
1947 </object>
1948 <object class="IBObjectRecord">
1949 <int key="objectID">218</int>
1950 <reference key="object" ref="892235320"/>
1951 <object class="NSMutableArray" key="children">
1952 <bool key="EncodedWithXMLCoder">YES</bool>
1953 <reference ref="963351320"/>
1954 </object>
1955 <reference key="parent" ref="789758025"/>
1956 </object>
1957 <object class="IBObjectRecord">
1958 <int key="objectID">216</int>
1959 <reference key="object" ref="972420730"/>
1960 <object class="NSMutableArray" key="children">
1961 <bool key="EncodedWithXMLCoder">YES</bool>
1962 <reference ref="769623530"/>
1963 </object>
1964 <reference key="parent" ref="789758025"/>
1965 </object>
1966 <object class="IBObjectRecord">
1967 <int key="objectID">200</int>
1968 <reference key="object" ref="769623530"/>
1969 <object class="NSMutableArray" key="children">
1970 <bool key="EncodedWithXMLCoder">YES</bool>
1971 <reference ref="948374510"/>
1972 <reference ref="96193923"/>
1973 <reference ref="679648819"/>
1974 <reference ref="967646866"/>
1975 </object>
1976 <reference key="parent" ref="972420730"/>
1977 </object>
1978 <object class="IBObjectRecord">
1979 <int key="objectID">219</int>
1980 <reference key="object" ref="948374510"/>
1981 <reference key="parent" ref="769623530"/>
1982 </object>
1983 <object class="IBObjectRecord">
1984 <int key="objectID">201</int>
1985 <reference key="object" ref="96193923"/>
1986 <reference key="parent" ref="769623530"/>
1987 </object>
1988 <object class="IBObjectRecord">
1989 <int key="objectID">204</int>
1990 <reference key="object" ref="679648819"/>
1991 <reference key="parent" ref="769623530"/>
1992 </object>
1993 <object class="IBObjectRecord">
1994 <int key="objectID">220</int>
1995 <reference key="object" ref="963351320"/>
1996 <object class="NSMutableArray" key="children">
1997 <bool key="EncodedWithXMLCoder">YES</bool>
1998 <reference ref="270902937"/>
1999 <reference ref="88285865"/>
2000 <reference ref="159080638"/>
2001 <reference ref="326711663"/>
2002 <reference ref="447796847"/>
2003 </object>
2004 <reference key="parent" ref="892235320"/>
2005 </object>
2006 <object class="IBObjectRecord">
2007 <int key="objectID">213</int>
2008 <reference key="object" ref="270902937"/>
2009 <reference key="parent" ref="963351320"/>
2010 </object>
2011 <object class="IBObjectRecord">
2012 <int key="objectID">210</int>
2013 <reference key="object" ref="88285865"/>
2014 <reference key="parent" ref="963351320"/>
2015 </object>
2016 <object class="IBObjectRecord">
2017 <int key="objectID">221</int>
2018 <reference key="object" ref="159080638"/>
2019 <reference key="parent" ref="963351320"/>
2020 </object>
2021 <object class="IBObjectRecord">
2022 <int key="objectID">208</int>
2023 <reference key="object" ref="326711663"/>
2024 <reference key="parent" ref="963351320"/>
2025 </object>
2026 <object class="IBObjectRecord">
2027 <int key="objectID">209</int>
2028 <reference key="object" ref="447796847"/>
2029 <reference key="parent" ref="963351320"/>
2030 </object>
2031 <object class="IBObjectRecord">
2032 <int key="objectID">106</int>
2033 <reference key="object" ref="374024848"/>
2034 <object class="NSMutableArray" key="children">
2035 <bool key="EncodedWithXMLCoder">YES</bool>
2036 <reference ref="238773614"/>
2037 </object>
2038 <reference key="parent" ref="391199113"/>
2039 <reference key="objectName" ref="464456376"/>
2040 </object>
2041 <object class="IBObjectRecord">
2042 <int key="objectID">111</int>
2043 <reference key="object" ref="238773614"/>
2044 <reference key="parent" ref="374024848"/>
2045 </object>
2046 <object class="IBObjectRecord">
2047 <int key="objectID">57</int>
2048 <reference key="object" ref="110575045"/>
2049 <object class="NSMutableArray" key="children">
2050 <bool key="EncodedWithXMLCoder">YES</bool>
2051 <reference ref="238522557"/>
2052 <reference ref="755159360"/>
2053 <reference ref="908899353"/>
2054 <reference ref="632727374"/>
2055 <reference ref="646227648"/>
2056 <reference ref="609285721"/>
2057 <reference ref="481834944"/>
2058 <reference ref="304266470"/>
2059 <reference ref="1046388886"/>
2060 <reference ref="1056857174"/>
2061 <reference ref="342932134"/>
2062 </object>
2063 <reference key="parent" ref="694149608"/>
2064 </object>
2065 <object class="IBObjectRecord">
2066 <int key="objectID">58</int>
2067 <reference key="object" ref="238522557"/>
2068 <reference key="parent" ref="110575045"/>
2069 </object>
2070 <object class="IBObjectRecord">
2071 <int key="objectID">134</int>
2072 <reference key="object" ref="755159360"/>
2073 <reference key="parent" ref="110575045"/>
2074 </object>
2075 <object class="IBObjectRecord">
2076 <int key="objectID">150</int>
2077 <reference key="object" ref="908899353"/>
2078 <reference key="parent" ref="110575045"/>
2079 </object>
2080 <object class="IBObjectRecord">
2081 <int key="objectID">136</int>
2082 <reference key="object" ref="632727374"/>
2083 <reference key="parent" ref="110575045"/>
2084 <string key="objectName">1111</string>
2085 </object>
2086 <object class="IBObjectRecord">
2087 <int key="objectID">144</int>
2088 <reference key="object" ref="646227648"/>
2089 <reference key="parent" ref="110575045"/>
2090 </object>
2091 <object class="IBObjectRecord">
2092 <int key="objectID">129</int>
2093 <reference key="object" ref="609285721"/>
2094 <reference key="parent" ref="110575045"/>
2095 <string key="objectName">121</string>
2096 </object>
2097 <object class="IBObjectRecord">
2098 <int key="objectID">143</int>
2099 <reference key="object" ref="481834944"/>
2100 <reference key="parent" ref="110575045"/>
2101 </object>
2102 <object class="IBObjectRecord">
2103 <int key="objectID">236</int>
2104 <reference key="object" ref="304266470"/>
2105 <reference key="parent" ref="110575045"/>
2106 </object>
2107 <object class="IBObjectRecord">
2108 <int key="objectID">131</int>
2109 <reference key="object" ref="1046388886"/>
2110 <object class="NSMutableArray" key="children">
2111 <bool key="EncodedWithXMLCoder">YES</bool>
2112 <reference ref="752062318"/>
2113 </object>
2114 <reference key="parent" ref="110575045"/>
2115 </object>
2116 <object class="IBObjectRecord">
2117 <int key="objectID">149</int>
2118 <reference key="object" ref="1056857174"/>
2119 <reference key="parent" ref="110575045"/>
2120 </object>
2121 <object class="IBObjectRecord">
2122 <int key="objectID">145</int>
2123 <reference key="object" ref="342932134"/>
2124 <reference key="parent" ref="110575045"/>
2125 </object>
2126 <object class="IBObjectRecord">
2127 <int key="objectID">130</int>
2128 <reference key="object" ref="752062318"/>
2129 <reference key="parent" ref="1046388886"/>
2130 </object>
2131 <object class="IBObjectRecord">
2132 <int key="objectID">24</int>
2133 <reference key="object" ref="835318025"/>
2134 <object class="NSMutableArray" key="children">
2135 <bool key="EncodedWithXMLCoder">YES</bool>
2136 <reference ref="299356726"/>
2137 <reference ref="625202149"/>
2138 <reference ref="575023229"/>
2139 <reference ref="1011231497"/>
2140 </object>
2141 <reference key="parent" ref="713487014"/>
2142 </object>
2143 <object class="IBObjectRecord">
2144 <int key="objectID">92</int>
2145 <reference key="object" ref="299356726"/>
2146 <reference key="parent" ref="835318025"/>
2147 </object>
2148 <object class="IBObjectRecord">
2149 <int key="objectID">5</int>
2150 <reference key="object" ref="625202149"/>
2151 <reference key="parent" ref="835318025"/>
2152 </object>
2153 <object class="IBObjectRecord">
2154 <int key="objectID">239</int>
2155 <reference key="object" ref="575023229"/>
2156 <reference key="parent" ref="835318025"/>
2157 </object>
2158 <object class="IBObjectRecord">
2159 <int key="objectID">23</int>
2160 <reference key="object" ref="1011231497"/>
2161 <reference key="parent" ref="835318025"/>
2162 </object>
2163 <object class="IBObjectRecord">
2164 <int key="objectID">295</int>
2165 <reference key="object" ref="586577488"/>
2166 <object class="NSMutableArray" key="children">
2167 <bool key="EncodedWithXMLCoder">YES</bool>
2168 <reference ref="466310130"/>
2169 </object>
2170 <reference key="parent" ref="649796088"/>
2171 </object>
2172 <object class="IBObjectRecord">
2173 <int key="objectID">296</int>
2174 <reference key="object" ref="466310130"/>
2175 <object class="NSMutableArray" key="children">
2176 <bool key="EncodedWithXMLCoder">YES</bool>
2177 <reference ref="102151532"/>
2178 <reference ref="237841660"/>
2179 </object>
2180 <reference key="parent" ref="586577488"/>
2181 </object>
2182 <object class="IBObjectRecord">
2183 <int key="objectID">297</int>
2184 <reference key="object" ref="102151532"/>
2185 <reference key="parent" ref="466310130"/>
2186 </object>
2187 <object class="IBObjectRecord">
2188 <int key="objectID">298</int>
2189 <reference key="object" ref="237841660"/>
2190 <reference key="parent" ref="466310130"/>
2191 </object>
2192 <object class="IBObjectRecord">
2193 <int key="objectID">299</int>
2194 <reference key="object" ref="626404410"/>
2195 <object class="NSMutableArray" key="children">
2196 <bool key="EncodedWithXMLCoder">YES</bool>
2197 <reference ref="502084290"/>
2198 </object>
2199 <reference key="parent" ref="649796088"/>
2200 </object>
2201 <object class="IBObjectRecord">
2202 <int key="objectID">300</int>
2203 <reference key="object" ref="502084290"/>
2204 <object class="NSMutableArray" key="children">
2205 <bool key="EncodedWithXMLCoder">YES</bool>
2206 <reference ref="519768076"/>
2207 <reference ref="1028416764"/>
2208 </object>
2209 <reference key="parent" ref="626404410"/>
2210 </object>
2211 <object class="IBObjectRecord">
2212 <int key="objectID">344</int>
2213 <reference key="object" ref="519768076"/>
2214 <reference key="parent" ref="502084290"/>
2215 </object>
2216 <object class="IBObjectRecord">
2217 <int key="objectID">345</int>
2218 <reference key="object" ref="1028416764"/>
2219 <reference key="parent" ref="502084290"/>
2220 </object>
2221 <object class="IBObjectRecord">
2222 <int key="objectID">211</int>
2223 <reference key="object" ref="676164635"/>
2224 <object class="NSMutableArray" key="children">
2225 <bool key="EncodedWithXMLCoder">YES</bool>
2226 <reference ref="785027613"/>
2227 </object>
2228 <reference key="parent" ref="789758025"/>
2229 </object>
2230 <object class="IBObjectRecord">
2231 <int key="objectID">212</int>
2232 <reference key="object" ref="785027613"/>
2233 <object class="NSMutableArray" key="children">
2234 <bool key="EncodedWithXMLCoder">YES</bool>
2235 <reference ref="680220178"/>
2236 <reference ref="731782645"/>
2237 </object>
2238 <reference key="parent" ref="676164635"/>
2239 </object>
2240 <object class="IBObjectRecord">
2241 <int key="objectID">195</int>
2242 <reference key="object" ref="680220178"/>
2243 <reference key="parent" ref="785027613"/>
2244 </object>
2245 <object class="IBObjectRecord">
2246 <int key="objectID">196</int>
2247 <reference key="object" ref="731782645"/>
2248 <reference key="parent" ref="785027613"/>
2249 </object>
2250 <object class="IBObjectRecord">
2251 <int key="objectID">346</int>
2252 <reference key="object" ref="967646866"/>
2253 <reference key="parent" ref="769623530"/>
2254 </object>
2255 <object class="IBObjectRecord">
2256 <int key="objectID">348</int>
2257 <reference key="object" ref="507821607"/>
2258 <object class="NSMutableArray" key="children">
2259 <bool key="EncodedWithXMLCoder">YES</bool>
2260 <reference ref="698887838"/>
2261 </object>
2262 <reference key="parent" ref="789758025"/>
2263 </object>
2264 <object class="IBObjectRecord">
2265 <int key="objectID">349</int>
2266 <reference key="object" ref="698887838"/>
2267 <object class="NSMutableArray" key="children">
2268 <bool key="EncodedWithXMLCoder">YES</bool>
2269 <reference ref="605118523"/>
2270 <reference ref="197661976"/>
2271 <reference ref="708854459"/>
2272 </object>
2273 <reference key="parent" ref="507821607"/>
2274 </object>
2275 <object class="IBObjectRecord">
2276 <int key="objectID">350</int>
2277 <reference key="object" ref="605118523"/>
2278 <reference key="parent" ref="698887838"/>
2279 </object>
2280 <object class="IBObjectRecord">
2281 <int key="objectID">351</int>
2282 <reference key="object" ref="197661976"/>
2283 <reference key="parent" ref="698887838"/>
2284 </object>
2285 <object class="IBObjectRecord">
2286 <int key="objectID">354</int>
2287 <reference key="object" ref="708854459"/>
2288 <reference key="parent" ref="698887838"/>
2289 </object>
2290 <object class="IBObjectRecord">
2291 <int key="objectID">371</int>
2292 <reference key="object" ref="972006081"/>
2293 <object class="NSMutableArray" key="children">
2294 <bool key="EncodedWithXMLCoder">YES</bool>
2295 <reference ref="439893737"/>
2296 </object>
2297 <reference key="parent" ref="1049"/>
2298 </object>
2299 <object class="IBObjectRecord">
2300 <int key="objectID">372</int>
2301 <reference key="object" ref="439893737"/>
2302 <object class="NSMutableArray" key="children">
2303 <bool key="EncodedWithXMLCoder">YES</bool>
2304 <reference ref="741760375"/>
2305 <reference ref="74807016"/>
2306 </object>
2307 <reference key="parent" ref="972006081"/>
2308 </object>
2309 <object class="IBObjectRecord">
2310 <int key="objectID">373</int>
2311 <reference key="object" ref="610635028"/>
2312 <reference key="parent" ref="1049"/>
2313 <reference key="objectName" ref="982950837"/>
2314 </object>
2315 <object class="IBObjectRecord">
2316 <int key="objectID">385</int>
2317 <reference key="object" ref="808393665"/>
2318 <reference key="parent" ref="1049"/>
2319 <string key="objectName">User Namespace Controller</string>
2320 </object>
2321 <object class="IBObjectRecord">
2322 <int key="objectID">421</int>
2323 <reference key="object" ref="741760375"/>
2324 <object class="NSMutableArray" key="children">
2325 <bool key="EncodedWithXMLCoder">YES</bool>
2326 <reference ref="554641139"/>
2327 <reference ref="764100755"/>
2328 </object>
2329 <reference key="parent" ref="439893737"/>
2330 </object>
2331 <object class="IBObjectRecord">
2332 <int key="objectID">420</int>
2333 <reference key="object" ref="554641139"/>
2334 <object class="NSMutableArray" key="children">
2335 <bool key="EncodedWithXMLCoder">YES</bool>
2336 <reference ref="188193463"/>
2337 </object>
2338 <reference key="parent" ref="741760375"/>
2339 </object>
2340 <object class="IBObjectRecord">
2341 <int key="objectID">416</int>
2342 <reference key="object" ref="188193463"/>
2343 <object class="NSMutableArray" key="children">
2344 <bool key="EncodedWithXMLCoder">YES</bool>
2345 <reference ref="418410897"/>
2346 <reference ref="936733673"/>
2347 <reference ref="163417131"/>
2348 </object>
2349 <reference key="parent" ref="554641139"/>
2350 </object>
2351 <object class="IBObjectRecord">
2352 <int key="objectID">417</int>
2353 <reference key="object" ref="418410897"/>
2354 <reference key="parent" ref="188193463"/>
2355 </object>
2356 <object class="IBObjectRecord">
2357 <int key="objectID">418</int>
2358 <reference key="object" ref="936733673"/>
2359 <reference key="parent" ref="188193463"/>
2360 </object>
2361 <object class="IBObjectRecord">
2362 <int key="objectID">419</int>
2363 <reference key="object" ref="163417131"/>
2364 <reference key="parent" ref="188193463"/>
2365 </object>
2366 <object class="IBObjectRecord">
2367 <int key="objectID">406</int>
2368 <reference key="object" ref="764100755"/>
2369 <object class="NSMutableArray" key="children">
2370 <bool key="EncodedWithXMLCoder">YES</bool>
2371 <reference ref="516244966"/>
2372 </object>
2373 <reference key="parent" ref="741760375"/>
2374 </object>
2375 <object class="IBObjectRecord">
2376 <int key="objectID">407</int>
2377 <reference key="object" ref="516244966"/>
2378 <object class="NSMutableArray" key="children">
2379 <bool key="EncodedWithXMLCoder">YES</bool>
2380 <reference ref="23853726"/>
2381 <reference ref="47103270"/>
2382 <reference ref="512953560"/>
2383 <reference ref="1048357090"/>
2384 </object>
2385 <reference key="parent" ref="764100755"/>
2386 </object>
2387 <object class="IBObjectRecord">
2388 <int key="objectID">411</int>
2389 <reference key="object" ref="23853726"/>
2390 <object class="NSMutableArray" key="children">
2391 <bool key="EncodedWithXMLCoder">YES</bool>
2392 <reference ref="857054683"/>
2393 <reference ref="920426212"/>
2394 </object>
2395 <reference key="parent" ref="516244966"/>
2396 </object>
2397 <object class="IBObjectRecord">
2398 <int key="objectID">410</int>
2399 <reference key="object" ref="47103270"/>
2400 <reference key="parent" ref="516244966"/>
2401 </object>
2402 <object class="IBObjectRecord">
2403 <int key="objectID">409</int>
2404 <reference key="object" ref="512953560"/>
2405 <reference key="parent" ref="516244966"/>
2406 </object>
2407 <object class="IBObjectRecord">
2408 <int key="objectID">408</int>
2409 <reference key="object" ref="1048357090"/>
2410 <reference key="parent" ref="516244966"/>
2411 </object>
2412 <object class="IBObjectRecord">
2413 <int key="objectID">413</int>
2414 <reference key="object" ref="857054683"/>
2415 <object class="NSMutableArray" key="children">
2416 <bool key="EncodedWithXMLCoder">YES</bool>
2417 <reference ref="377147224"/>
2418 </object>
2419 <reference key="parent" ref="23853726"/>
2420 </object>
2421 <object class="IBObjectRecord">
2422 <int key="objectID">412</int>
2423 <reference key="object" ref="920426212"/>
2424 <object class="NSMutableArray" key="children">
2425 <bool key="EncodedWithXMLCoder">YES</bool>
2426 <reference ref="525071236"/>
2427 </object>
2428 <reference key="parent" ref="23853726"/>
2429 </object>
2430 <object class="IBObjectRecord">
2431 <int key="objectID">415</int>
2432 <reference key="object" ref="525071236"/>
2433 <reference key="parent" ref="920426212"/>
2434 </object>
2435 <object class="IBObjectRecord">
2436 <int key="objectID">414</int>
2437 <reference key="object" ref="377147224"/>
2438 <reference key="parent" ref="857054683"/>
2439 </object>
2440 <object class="IBObjectRecord">
2441 <int key="objectID">422</int>
2442 <reference key="object" ref="631572152"/>
2443 <reference key="parent" ref="1049"/>
2444 </object>
2445 <object class="IBObjectRecord">
2446 <int key="objectID">436</int>
2447 <reference key="object" ref="74807016"/>
2448 <reference key="parent" ref="439893737"/>
2449 </object>
2450 </object>
2451 </object>
2452 <object class="NSMutableDictionary" key="flattenedProperties">
2453 <bool key="EncodedWithXMLCoder">YES</bool>
2454 <object class="NSMutableArray" key="dict.sortedKeys">
2455 <bool key="EncodedWithXMLCoder">YES</bool>
2456 <string>-1.IBPluginDependency</string>
2457 <string>-2.IBPluginDependency</string>
2458 <string>-3.IBPluginDependency</string>
2459 <string>103.IBPluginDependency</string>
2460 <string>103.ImportedFromIB2</string>
2461 <string>106.IBPluginDependency</string>
2462 <string>106.ImportedFromIB2</string>
2463 <string>106.editorWindowContentRectSynchronizationRect</string>
2464 <string>111.IBPluginDependency</string>
2465 <string>111.ImportedFromIB2</string>
2466 <string>112.IBPluginDependency</string>
2467 <string>112.ImportedFromIB2</string>
2468 <string>124.IBPluginDependency</string>
2469 <string>124.ImportedFromIB2</string>
2470 <string>125.IBPluginDependency</string>
2471 <string>125.ImportedFromIB2</string>
2472 <string>125.editorWindowContentRectSynchronizationRect</string>
2473 <string>126.IBPluginDependency</string>
2474 <string>126.ImportedFromIB2</string>
2475 <string>129.IBPluginDependency</string>
2476 <string>129.ImportedFromIB2</string>
2477 <string>130.IBPluginDependency</string>
2478 <string>130.ImportedFromIB2</string>
2479 <string>130.editorWindowContentRectSynchronizationRect</string>
2480 <string>131.IBPluginDependency</string>
2481 <string>131.ImportedFromIB2</string>
2482 <string>134.IBPluginDependency</string>
2483 <string>134.ImportedFromIB2</string>
2484 <string>136.IBPluginDependency</string>
2485 <string>136.ImportedFromIB2</string>
2486 <string>143.IBPluginDependency</string>
2487 <string>143.ImportedFromIB2</string>
2488 <string>144.IBPluginDependency</string>
2489 <string>144.ImportedFromIB2</string>
2490 <string>145.IBPluginDependency</string>
2491 <string>145.ImportedFromIB2</string>
2492 <string>149.IBPluginDependency</string>
2493 <string>149.ImportedFromIB2</string>
2494 <string>150.IBPluginDependency</string>
2495 <string>150.ImportedFromIB2</string>
2496 <string>19.IBPluginDependency</string>
2497 <string>19.ImportedFromIB2</string>
2498 <string>195.IBPluginDependency</string>
2499 <string>195.ImportedFromIB2</string>
2500 <string>196.IBPluginDependency</string>
2501 <string>196.ImportedFromIB2</string>
2502 <string>197.IBPluginDependency</string>
2503 <string>197.ImportedFromIB2</string>
2504 <string>198.IBPluginDependency</string>
2505 <string>198.ImportedFromIB2</string>
2506 <string>199.IBPluginDependency</string>
2507 <string>199.ImportedFromIB2</string>
2508 <string>200.IBPluginDependency</string>
2509 <string>200.ImportedFromIB2</string>
2510 <string>200.editorWindowContentRectSynchronizationRect</string>
2511 <string>201.IBPluginDependency</string>
2512 <string>201.ImportedFromIB2</string>
2513 <string>202.IBPluginDependency</string>
2514 <string>202.ImportedFromIB2</string>
2515 <string>203.IBPluginDependency</string>
2516 <string>203.ImportedFromIB2</string>
2517 <string>204.IBPluginDependency</string>
2518 <string>204.ImportedFromIB2</string>
2519 <string>205.IBPluginDependency</string>
2520 <string>205.ImportedFromIB2</string>
2521 <string>205.editorWindowContentRectSynchronizationRect</string>
2522 <string>206.IBPluginDependency</string>
2523 <string>206.ImportedFromIB2</string>
2524 <string>207.IBPluginDependency</string>
2525 <string>207.ImportedFromIB2</string>
2526 <string>208.IBPluginDependency</string>
2527 <string>208.ImportedFromIB2</string>
2528 <string>209.IBPluginDependency</string>
2529 <string>209.ImportedFromIB2</string>
2530 <string>210.IBPluginDependency</string>
2531 <string>210.ImportedFromIB2</string>
2532 <string>211.IBPluginDependency</string>
2533 <string>211.ImportedFromIB2</string>
2534 <string>212.IBPluginDependency</string>
2535 <string>212.ImportedFromIB2</string>
2536 <string>212.editorWindowContentRectSynchronizationRect</string>
2537 <string>213.IBPluginDependency</string>
2538 <string>213.ImportedFromIB2</string>
2539 <string>214.IBPluginDependency</string>
2540 <string>214.ImportedFromIB2</string>
2541 <string>215.IBPluginDependency</string>
2542 <string>215.ImportedFromIB2</string>
2543 <string>216.IBPluginDependency</string>
2544 <string>216.ImportedFromIB2</string>
2545 <string>217.IBPluginDependency</string>
2546 <string>217.ImportedFromIB2</string>
2547 <string>218.IBPluginDependency</string>
2548 <string>218.ImportedFromIB2</string>
2549 <string>219.IBPluginDependency</string>
2550 <string>219.ImportedFromIB2</string>
2551 <string>220.IBPluginDependency</string>
2552 <string>220.ImportedFromIB2</string>
2553 <string>220.editorWindowContentRectSynchronizationRect</string>
2554 <string>221.IBPluginDependency</string>
2555 <string>221.ImportedFromIB2</string>
2556 <string>23.IBPluginDependency</string>
2557 <string>23.ImportedFromIB2</string>
2558 <string>236.IBPluginDependency</string>
2559 <string>236.ImportedFromIB2</string>
2560 <string>239.IBPluginDependency</string>
2561 <string>239.ImportedFromIB2</string>
2562 <string>24.IBPluginDependency</string>
2563 <string>24.ImportedFromIB2</string>
2564 <string>24.editorWindowContentRectSynchronizationRect</string>
2565 <string>29.IBPluginDependency</string>
2566 <string>29.ImportedFromIB2</string>
2567 <string>29.WindowOrigin</string>
2568 <string>29.editorWindowContentRectSynchronizationRect</string>
2569 <string>295.IBPluginDependency</string>
2570 <string>296.IBPluginDependency</string>
2571 <string>296.editorWindowContentRectSynchronizationRect</string>
2572 <string>297.IBPluginDependency</string>
2573 <string>298.IBPluginDependency</string>
2574 <string>299.IBPluginDependency</string>
2575 <string>300.IBPluginDependency</string>
2576 <string>300.editorWindowContentRectSynchronizationRect</string>
2577 <string>344.IBPluginDependency</string>
2578 <string>345.IBPluginDependency</string>
2579 <string>346.IBPluginDependency</string>
2580 <string>346.ImportedFromIB2</string>
2581 <string>348.IBPluginDependency</string>
2582 <string>348.ImportedFromIB2</string>
2583 <string>349.IBPluginDependency</string>
2584 <string>349.ImportedFromIB2</string>
2585 <string>349.editorWindowContentRectSynchronizationRect</string>
2586 <string>350.IBPluginDependency</string>
2587 <string>350.ImportedFromIB2</string>
2588 <string>351.IBPluginDependency</string>
2589 <string>351.ImportedFromIB2</string>
2590 <string>354.IBPluginDependency</string>
2591 <string>354.ImportedFromIB2</string>
2592 <string>371.IBPluginDependency</string>
2593 <string>371.IBViewEditorWindowController.showingLayoutRectangles</string>
2594 <string>371.IBWindowTemplateEditedContentRect</string>
2595 <string>371.NSWindowTemplate.visibleAtLaunch</string>
2596 <string>371.editorWindowContentRectSynchronizationRect</string>
2597 <string>372.IBPluginDependency</string>
2598 <string>373.IBPluginDependency</string>
2599 <string>385.IBPluginDependency</string>
2600 <string>407.IBPluginDependency</string>
2601 <string>409.IBPluginDependency</string>
2602 <string>410.IBPluginDependency</string>
2603 <string>411.IBPluginDependency</string>
2604 <string>412.IBPluginDependency</string>
2605 <string>413.IBPluginDependency</string>
2606 <string>414.IBPluginDependency</string>
2607 <string>415.IBPluginDependency</string>
2608 <string>416.IBPluginDependency</string>
2609 <string>417.IBPluginDependency</string>
2610 <string>418.IBPluginDependency</string>
2611 <string>419.IBAttributePlaceholdersKey</string>
2612 <string>419.IBPluginDependency</string>
2613 <string>422.IBPluginDependency</string>
2614 <string>436.IBPluginDependency</string>
2615 <string>5.IBPluginDependency</string>
2616 <string>5.ImportedFromIB2</string>
2617 <string>56.IBPluginDependency</string>
2618 <string>56.ImportedFromIB2</string>
2619 <string>57.IBPluginDependency</string>
2620 <string>57.ImportedFromIB2</string>
2621 <string>57.editorWindowContentRectSynchronizationRect</string>
2622 <string>58.IBPluginDependency</string>
2623 <string>58.ImportedFromIB2</string>
2624 <string>72.IBPluginDependency</string>
2625 <string>72.ImportedFromIB2</string>
2626 <string>73.IBPluginDependency</string>
2627 <string>73.ImportedFromIB2</string>
2628 <string>74.IBPluginDependency</string>
2629 <string>74.ImportedFromIB2</string>
2630 <string>75.IBPluginDependency</string>
2631 <string>75.ImportedFromIB2</string>
2632 <string>77.IBPluginDependency</string>
2633 <string>77.ImportedFromIB2</string>
2634 <string>78.IBPluginDependency</string>
2635 <string>78.ImportedFromIB2</string>
2636 <string>79.IBPluginDependency</string>
2637 <string>79.ImportedFromIB2</string>
2638 <string>80.IBPluginDependency</string>
2639 <string>80.ImportedFromIB2</string>
2640 <string>81.IBPluginDependency</string>
2641 <string>81.ImportedFromIB2</string>
2642 <string>81.editorWindowContentRectSynchronizationRect</string>
2643 <string>82.IBPluginDependency</string>
2644 <string>82.ImportedFromIB2</string>
2645 <string>83.IBPluginDependency</string>
2646 <string>83.ImportedFromIB2</string>
2647 <string>92.IBPluginDependency</string>
2648 <string>92.ImportedFromIB2</string>
2649 </object>
2650 <object class="NSMutableArray" key="dict.values">
2651 <bool key="EncodedWithXMLCoder">YES</bool>
2652 <reference ref="113577022"/>
2653 <reference ref="885801228"/>
2654 <reference ref="885801228"/>
2655 <reference ref="113577022"/>
2656 <reference ref="9"/>
2657 <reference ref="113577022"/>
2658 <reference ref="9"/>
2659 <string>{{596, 852}, {216, 23}}</string>
2660 <reference ref="113577022"/>
2661 <reference ref="9"/>
2662 <reference ref="113577022"/>
2663 <reference ref="9"/>
2664 <reference ref="113577022"/>
2665 <reference ref="9"/>
2666 <reference ref="113577022"/>
2667 <reference ref="9"/>
2668 <string>{{522, 812}, {146, 23}}</string>
2669 <reference ref="113577022"/>
2670 <reference ref="9"/>
2671 <reference ref="113577022"/>
2672 <reference ref="9"/>
2673 <reference ref="113577022"/>
2674 <reference ref="9"/>
2675 <string>{{436, 809}, {64, 6}}</string>
2676 <reference ref="113577022"/>
2677 <reference ref="9"/>
2678 <reference ref="113577022"/>
2679 <reference ref="9"/>
2680 <reference ref="113577022"/>
2681 <reference ref="9"/>
2682 <reference ref="113577022"/>
2683 <reference ref="9"/>
2684 <reference ref="113577022"/>
2685 <reference ref="9"/>
2686 <reference ref="113577022"/>
2687 <reference ref="9"/>
2688 <reference ref="113577022"/>
2689 <reference ref="9"/>
2690 <reference ref="113577022"/>
2691 <reference ref="9"/>
2692 <reference ref="113577022"/>
2693 <reference ref="9"/>
2694 <reference ref="113577022"/>
2695 <reference ref="9"/>
2696 <reference ref="113577022"/>
2697 <reference ref="9"/>
2698 <reference ref="113577022"/>
2699 <reference ref="9"/>
2700 <reference ref="113577022"/>
2701 <reference ref="9"/>
2702 <reference ref="113577022"/>
2703 <reference ref="9"/>
2704 <reference ref="113577022"/>
2705 <reference ref="9"/>
2706 <string>{{608, 612}, {275, 83}}</string>
2707 <reference ref="113577022"/>
2708 <reference ref="9"/>
2709 <reference ref="113577022"/>
2710 <reference ref="9"/>
2711 <reference ref="113577022"/>
2712 <reference ref="9"/>
2713 <reference ref="113577022"/>
2714 <reference ref="9"/>
2715 <reference ref="113577022"/>
2716 <reference ref="9"/>
2717 <string>{{365, 632}, {243, 243}}</string>
2718 <reference ref="113577022"/>
2719 <reference ref="9"/>
2720 <reference ref="113577022"/>
2721 <reference ref="9"/>
2722 <reference ref="113577022"/>
2723 <reference ref="9"/>
2724 <reference ref="113577022"/>
2725 <reference ref="9"/>
2726 <reference ref="113577022"/>
2727 <reference ref="9"/>
2728 <reference ref="113577022"/>
2729 <reference ref="9"/>
2730 <reference ref="113577022"/>
2731 <reference ref="9"/>
2732 <string>{{608, 612}, {167, 43}}</string>
2733 <reference ref="113577022"/>
2734 <reference ref="9"/>
2735 <reference ref="113577022"/>
2736 <reference ref="9"/>
2737 <reference ref="113577022"/>
2738 <reference ref="9"/>
2739 <reference ref="113577022"/>
2740 <reference ref="9"/>
2741 <reference ref="113577022"/>
2742 <reference ref="9"/>
2743 <reference ref="113577022"/>
2744 <reference ref="9"/>
2745 <reference ref="113577022"/>
2746 <reference ref="9"/>
2747 <reference ref="113577022"/>
2748 <reference ref="9"/>
2749 <string>{{608, 612}, {241, 103}}</string>
2750 <reference ref="113577022"/>
2751 <reference ref="9"/>
2752 <reference ref="113577022"/>
2753 <reference ref="9"/>
2754 <reference ref="113577022"/>
2755 <reference ref="9"/>
2756 <reference ref="113577022"/>
2757 <reference ref="9"/>
2758 <reference ref="113577022"/>
2759 <reference ref="9"/>
2760 <string>{{525, 802}, {197, 73}}</string>
2761 <reference ref="113577022"/>
2762 <reference ref="9"/>
2763 <string>{74, 862}</string>
2764 <string>{{11, 736}, {489, 20}}</string>
2765 <reference ref="113577022"/>
2766 <reference ref="113577022"/>
2767 <string>{{475, 832}, {234, 43}}</string>
2768 <reference ref="113577022"/>
2769 <reference ref="113577022"/>
2770 <reference ref="113577022"/>
2771 <reference ref="113577022"/>
2772 <string>{{409, 832}, {176, 43}}</string>
2773 <reference ref="113577022"/>
2774 <reference ref="113577022"/>
2775 <reference ref="113577022"/>
2776 <reference ref="9"/>
2777 <reference ref="113577022"/>
2778 <reference ref="9"/>
2779 <reference ref="113577022"/>
2780 <reference ref="9"/>
2781 <string>{{608, 612}, {215, 63}}</string>
2782 <reference ref="113577022"/>
2783 <reference ref="9"/>
2784 <reference ref="113577022"/>
2785 <reference ref="9"/>
2786 <reference ref="113577022"/>
2787 <reference ref="9"/>
2788 <reference ref="113577022"/>
2789 <integer value="0"/>
2790 <string>{{108, 368}, {725, 337}}</string>
2791 <reference ref="9"/>
2792 <string>{{108, 368}, {725, 337}}</string>
2793 <reference ref="113577022"/>
2794 <reference ref="113577022"/>
2795 <reference ref="113577022"/>
2796 <reference ref="113577022"/>
2797 <reference ref="113577022"/>
2798 <reference ref="113577022"/>
2799 <reference ref="113577022"/>
2800 <reference ref="113577022"/>
2801 <reference ref="113577022"/>
2802 <reference ref="113577022"/>
2803 <reference ref="113577022"/>
2804 <reference ref="113577022"/>
2805 <reference ref="113577022"/>
2806 <reference ref="113577022"/>
2807 <object class="NSMutableDictionary">
2808 <bool key="EncodedWithXMLCoder">YES</bool>
2809 <object class="NSArray" key="dict.sortedKeys">
2810 <bool key="EncodedWithXMLCoder">YES</bool>
2811 </object>
2812 <object class="NSMutableArray" key="dict.values">
2813 <bool key="EncodedWithXMLCoder">YES</bool>
2814 </object>
2815 </object>
2816 <reference ref="113577022"/>
2817 <reference ref="113577022"/>
2818 <reference ref="113577022"/>
2819 <reference ref="113577022"/>
2820 <reference ref="9"/>
2821 <reference ref="113577022"/>
2822 <reference ref="9"/>
2823 <reference ref="113577022"/>
2824 <reference ref="9"/>
2825 <string>{{23, 794}, {245, 183}}</string>
2826 <reference ref="113577022"/>
2827 <reference ref="9"/>
2828 <reference ref="113577022"/>
2829 <reference ref="9"/>
2830 <reference ref="113577022"/>
2831 <reference ref="9"/>
2832 <reference ref="113577022"/>
2833 <reference ref="9"/>
2834 <reference ref="113577022"/>
2835 <reference ref="9"/>
2836 <reference ref="113577022"/>
2837 <reference ref="9"/>
2838 <reference ref="113577022"/>
2839 <reference ref="9"/>
2840 <reference ref="113577022"/>
2841 <reference ref="9"/>
2842 <reference ref="113577022"/>
2843 <reference ref="9"/>
2844 <reference ref="113577022"/>
2845 <reference ref="9"/>
2846 <string>{{323, 672}, {199, 203}}</string>
2847 <reference ref="113577022"/>
2848 <reference ref="9"/>
2849 <reference ref="113577022"/>
2850 <reference ref="9"/>
2851 <reference ref="113577022"/>
2852 <reference ref="9"/>
2853 </object>
2854 </object>
2855 <object class="NSMutableDictionary" key="unlocalizedProperties">
2856 <bool key="EncodedWithXMLCoder">YES</bool>
2857 <object class="NSArray" key="dict.sortedKeys">
2858 <bool key="EncodedWithXMLCoder">YES</bool>
2859 </object>
2860 <object class="NSMutableArray" key="dict.values">
2861 <bool key="EncodedWithXMLCoder">YES</bool>
2862 </object>
2863 </object>
2864 <nil key="activeLocalization"/>
2865 <object class="NSMutableDictionary" key="localizations">
2866 <bool key="EncodedWithXMLCoder">YES</bool>
2867 <object class="NSArray" key="dict.sortedKeys">
2868 <bool key="EncodedWithXMLCoder">YES</bool>
2869 </object>
2870 <object class="NSMutableArray" key="dict.values">
2871 <bool key="EncodedWithXMLCoder">YES</bool>
2872 </object>
2873 </object>
2874 <nil key="sourceID"/>
2875 <int key="maxID">445</int>
2876 </object>
2877 <object class="IBClassDescriber" key="IBDocument.Classes">
2878 <object class="NSMutableArray" key="referencedPartialClassDescriptions">
2879 <bool key="EncodedWithXMLCoder">YES</bool>
2880 <object class="IBPartialClassDescription">
2881 <string key="className">IPython1SandboxAppDelegate</string>
2882 <string key="superclassName">NSObject</string>
2883 <object class="NSMutableDictionary" key="actions">
2884 <bool key="EncodedWithXMLCoder">YES</bool>
2885 <object class="NSArray" key="dict.sortedKeys">
2886 <bool key="EncodedWithXMLCoder">YES</bool>
2887 </object>
2888 <object class="NSMutableArray" key="dict.values">
2889 <bool key="EncodedWithXMLCoder">YES</bool>
2890 </object>
2891 </object>
2892 <object class="NSMutableDictionary" key="outlets">
2893 <string key="NS.key.0">ipythonController</string>
2894 <string key="NS.object.0">id</string>
2895 </object>
2896 <object class="IBClassDescriptionSource" key="sourceIdentifier">
2897 <string key="majorKey">IBProjectSource</string>
2898 <string key="minorKey">IPython1SandboxAppDelegate.py</string>
2899 </object>
2900 </object>
2901 <object class="IBPartialClassDescription">
2902 <reference key="className" ref="695797635"/>
2903 <nil key="superclassName"/>
2904 <object class="NSMutableDictionary" key="actions">
2905 <bool key="EncodedWithXMLCoder">YES</bool>
2906 <object class="NSArray" key="dict.sortedKeys">
2907 <bool key="EncodedWithXMLCoder">YES</bool>
2908 </object>
2909 <object class="NSMutableArray" key="dict.values">
2910 <bool key="EncodedWithXMLCoder">YES</bool>
2911 </object>
2912 </object>
2913 <object class="NSMutableDictionary" key="outlets">
2914 <reference key="NS.key.0" ref="684042788"/>
2915 <string key="NS.object.0">NSTextView</string>
2916 </object>
2917 <object class="IBClassDescriptionSource" key="sourceIdentifier">
2918 <string key="majorKey">IBUserSource</string>
2919 <reference key="minorKey" ref="255189770"/>
2920 </object>
2921 </object>
2922 </object>
2923 </object>
2924 <int key="IBDocument.localizationMode">0</int>
2925 <string key="IBDocument.LastKnownRelativeProjectPath">../../IPython1Sandbox.xcodeproj</string>
2926 <int key="IBDocument.defaultPropertyAccessControl">3</int>
2927 <object class="NSMutableData" key="IBDocument.RunnableNib">
2928 <bytes key="NS.bytes">YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA
2929 AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEC/gALAAwAMQA1ADYAPAA9
2930 AEIAWABZAFoAWwALAGgAbQB7AIAAlQCZAKAApAC0ALoAzQDRAOYA+gD7APwA/QD+AP8BAAEBAQIBAwEE
2931 AQUBBgEHAQgBCQEKAQsBDwEQARkBIQEmASoBLQExATUBOQE7AT0BTQFSAVUBWgFBAVQBYwFqAWsBbAFv
2932 AXQBdQF4AYAAkAGBAYQBhwGIAYkBjgGPAZABkwGYAZkBmwGeAasBrAGtAbEBvAG9Ab4BwQHCAcQBxQHG
2933 AdIB0wHbAdwB3wHkAeUB6AHtAfAB/AIAAgcCCwIdAiUCLwIzAlECUgJaAmQCZQJoAm4CbwJyAncCiAKP
2934 ApACkwKYApkCnAKmAqcCrAKxArICtwK4ArsCwwLJAsoC0QLWAtcC2gLcAt0C5gLnAvAC8QL1AvYC9wL4
2935 AvkC/wMAAwIDAwMEAwcDFgMYAxsDHAMfAAsDIAMhAyIDJQNXA10DbgNzA3QDdQN6A3sDfAN/A4MDhAOH
2936 A4gDjAOQA5cDmwOcA50DngOiA6kDqgOrA6wDsAO3A7sDvAO9A74DwgPJA80DzgPPA9AD1APcA90D3gPf
2937 A+MD6wPwA/ED8gPzA/cD/gQCBAMEBAQFBAkEEAQRBBIEEwQXBB4EHwQgBCQEKwQvASkEMAQxBDcEOgQ7
2938 BDwEPwRDBEoESwRMBFAEVwRcBF0EXgRfBGMEagRrBGwEcAR3BHgEeQR9BIQEhQSGBIcEjASTBJQElQSZ
2939 BKAEpASlBKYEpwSrBLIEswS0BLUEuQTABMEEwgTGBM0EzgTPBNME2gTbBNwE3QThBOgE6QTqBOsE7wT2
2940 BPcE+AT5BP0FBAUFBQYFBwUMBQ8FEAURBRUFHAUdBR4FIgUpBSoFKwUsBTAFNwU7BTwFPQU+BUMFRgVK
2941 BVEFUgVTBVcFXgViBWMFZAVlBWkFcAV1BXYFdwV7BYIFgwWEBYgFjwWQBZEFkgWXBZgFnQWeBaIFqwWs
2942 Ba0FrgWyBbkFugW7BbwFwAXHBcgFyQXNBdQF1QXWBeAF9gX8Bf0F/gX/BgMGCwYMBg8GEQYXBhgGGQYc
2943 BiMGJAYlBiYGLQYuBi8GNgY3BjgGOQZABkEGQgZDBq0Gtwa4BrkGvgbABskGuAbKBs4GzwbYBrgG2Qbf
2944 BuQG5QbvBvgGuAb5BwcHEgcZBxoHGwckBy0GuAcuBzMHNgc3B0AHSQdKB1MGuAdUB2IHaQdqB2sHcgdz
2945 B3QHfQeGB48GuAeQB6AHqQeyB7sGuAe8B8QHywfMB9MH1AfcB90H3gfnBrgH6AfvB/gGuAf5B/4IBQgG
2946 CA8GuAgQCBUIHga4CB8IJggvCDAIOQa4CDoIPgg/CKkJFAl/CYAJgQmCCYMJhAmFCYYJhwmICYkJigmL
2947 CYwJjQmOCY8JkAmRCZIJkwmUCZUJlgmXCZgJmQmaCZsJnAmdCZ4JnwmgCaEJogmjCaQJpQmmCacJqAmp
2948 CaoJqwmsCa0JrgmvCbAJsQmyCbMJtAm1CbYJtwm4CbkJugm7CbwJvQm+Cb8JwAnBCcIJwwnECcUJxgnH
2949 CcgJyQnKCcsJzAnNCc4JzwnQCdEJ0gnTCdQJ1QnWCdcJ2AnZCdoJ2wncCd0J3gnfCeAJ4QniCeMJ5Anl
2950 CeYJ6QnsCoYLIAshCyILIwskCyULJgsnCygLKQsqCysLLAstCy4LLwswCzELMgszCzQLNQs2CzcLOAs5
2951 CzoLOws8Cz0LPgs/C0ALQQtCC0MLRAtFC0YLRwtIC0kLSgtLC0wLTQtOC08LUAtRC1ILUwtUC1ULVgtX
2952 C1gLWQtaC1sLXAtdC14LXwtgC2ELYgtjC2QLZQtmC2cLaAtpC2oLawtsC20LbgtvC3ALcQtyC3MLdAt1
2953 C3YLdwt4C3kLegt7C3wLfQt+C38LgAuBC4ILgwuEC4ULhguHC4gLiQuKC4sLjAuNC44LjwuQC5ELkguT
2954 C5QLlQuWC5cLmAuZC5oLmwucC50LngufC6ALoQuiC6MLpAulC6YLpwuoC6kLqgurC6wLrQuuC68LsAux
2955 C7ILswu0C7ULtgu3C7oLvQvAVSRudWxs3xASAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwA
2956 HQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwVk5TUm9vdFYkY2xhc3NdTlNPYmpl
2957 Y3RzS2V5c18QD05TQ2xhc3Nlc1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0eU9pZHNWYWx1ZXNdTlNDb25u
2958 ZWN0aW9uc1tOU05hbWVzS2V5c1tOU0ZyYW1ld29ya11OU0NsYXNzZXNLZXlzWk5TT2lkc0tleXNdTlNO
2959 YW1lc1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0eUNvbm5lY3RvcnNdTlNGb250TWFuYWdlcl8QEE5TVmlz
2960 aWJsZVdpbmRvd3NfEA9OU09iamVjdHNWYWx1ZXNfEBdOU0FjY2Vzc2liaWxpdHlPaWRzS2V5c1lOU05l
2961 eHRPaWRcTlNPaWRzVmFsdWVzgAKBAv2BAZuBAmCBAvyArYEB9oAFgQJfgQJhgQH3gQL6gACABoEB9YEC
2962 +xEBv4ECYtIADgAyADMANFtOU0NsYXNzTmFtZYAEgANdTlNBcHBsaWNhdGlvbtIANwA4ADkAOlgkY2xh
2963 c3Nlc1okY2xhc3NuYW1logA6ADteTlNDdXN0b21PYmplY3RYTlNPYmplY3RfEBBJQkNvY29hRnJhbWV3
2964 b3Jr0gAOAD4APwBAWk5TLm9iamVjdHOAK6EAQYAH2wBDAA4ARABFAEYARwBIAEkASgBLAEwATQBOAE8A
2965 UABRAFIAUwBUAFUAVgArXE5TV2luZG93Vmlld1xOU1NjcmVlblJlY3RfEBNOU0ZyYW1lQXV0b3NhdmVO
2966 YW1lXU5TV2luZG93VGl0bGVZTlNXVEZsYWdzXU5TV2luZG93Q2xhc3NcTlNXaW5kb3dSZWN0XxAPTlNX
2967 aW5kb3dCYWNraW5nXxARTlNXaW5kb3dTdHlsZU1hc2tbTlNWaWV3Q2xhc3OAC4CsgKqAq4AJEnQAAACA
2968 CoAIEAIQD4AAXxAYe3szMzUsIDQxM30sIHs3MjUsIDMzN319XxAQSVB5dGhvbjEgKENvY29hKVhOU1dp
2969 bmRvd9cAXAAOAF0AXgBfAFoAYABhAGIAYwBkAGUAYQBnXxAPTlNOZXh0UmVzcG9uZGVyWk5TU3Vidmll
2970 d3NYTlN2RmxhZ3NbTlNGcmFtZVNpemVbTlNTdXBlcnZpZXeADIBdgA0RAQCAqIAMgKnSAA4APgBpAGqA
2971 NKIAawBsgA6Ao9oAXAAOAG4AXQBeAG8AcABaAGAAcQBNAHMAdAB1AHYAdwBVAGEATQB6V05TRnJhbWVe
2972 TlNBdXRvc2F2ZU5hbWVeTlNEaXZpZGVyU3R5bGVcTlNJc1ZlcnRpY2FsgAuAooCggA8RARKAoYAMgAsJ
2973 0gAOAD4AaQB9gDSiAH4Af4AQgGreAFwAgQAOAIIAgwBdAF4AXwCEAFoAhQCGAGAAhwBrAIkAigCLAIwA
2974 jQCOAI8AkABhAJIAVQBrAJRZTlNCb3hUeXBlW05TVGl0bGVDZWxsXU5TVHJhbnNwYXJlbnRcTlNCb3Jk
2975 ZXJUeXBlWU5TT2Zmc2V0c18QD05TVGl0bGVQb3NpdGlvbl1OU0NvbnRlbnRWaWV3gA4QAIBpgGAIgBEQ
2976 FoBeEAGADIBfgA6AEtIADgA+AGkAl4A0oQCUgBLXAFwADgBuAF0AXgBaAGAAfgBiAJwAnQBkAGEAfoAQ
2977 gF2AXIATgAyAENIADgA+AGkAooA0oQCjgBTcAFwApQAOAG4ApgBdAF4AWgBgAKcAqACHAJQAqgCrAKwA
2978 rQCuAHYAYQCUALEAsgCyW05TSFNjcm9sbGVyWE5Tc0ZsYWdzW05TVlNjcm9sbGVyXU5TTmV4dEtleVZp
2979 ZXeAEoBYgFuAWhECEoAVgAyAEoBUgBaAFtIADgA+AGkAtoA0owCyALEAqoAWgFSAWN0AXAAOAG4AuwC8
2980 AL0AXQBeAL4AWgC/AGAAqACjAMEAwgDDAMQAxQDGAMcAyABhAMoAowDIWE5TQm91bmRzWE5TQ3Vyc29y
2981 WU5TY3ZGbGFnc1lOU0RvY1ZpZXdZTlNCR0NvbG9ygBSAU4BNgE6AUBAEgBcRCQCAGIAMgE+AFIAY0gAO
2982 AD4AaQDPgDShAMiAGN0AXAAOAG4A0gDTANQA1QBeANYAWgDXAGAA2ACyANoA2wDcAN0A3gDfAOAA4QBh
2983 AOMAsgArXxAPTlNUZXh0Q29udGFpbmVyWU5TVFZGbGFnc1xOU1NoYXJlZERhdGFbTlNEcmFnVHlwZXNZ
2984 TlNNYXhTaXplWE5TTWluaXplWk5TRGVsZWdhdGWAFoBMgCyALRAGgDeAGREJEoBKgAyAS4AWgADSAA4A
2985 PgA/AOiAK68QEQDpAOoA6wDsAO0A7gDvAPAA8QDyAPMA9AD1APYA9wD4APmAGoAbgByAHYAegB+AIIAh
2986 gCKAI4AkgCWAJoAngCiAKYAqXxAZTmVYVCBSVEZEIHBhc3RlYm9hcmQgdHlwZV8QEk5TU3RyaW5nUGJv
2987 YXJkVHlwZV8QGk5lWFQgcnVsZXIgcGFzdGVib2FyZCB0eXBlXxAeTmVYVCBUSUZGIHY0LjAgcGFzdGVi
2988 b2FyZCB0eXBlXxAZQXBwbGUgVVJMIHBhc3RlYm9hcmQgdHlwZV8QI0NvcmVQYXN0ZWJvYXJkRmxhdm9y
2989 VHlwZSAweDZENkY2Rjc2XxAjQ29yZVBhc3RlYm9hcmRGbGF2b3JUeXBlIDB4NzU3MjZDMjBfEBtXZWJV
2990 UkxzV2l0aFRpdGxlc1Bib2FyZFR5cGVfEBlBcHBsZSBQREYgcGFzdGVib2FyZCB0eXBlXxAZQXBwbGUg
2991 UE5HIHBhc3RlYm9hcmQgdHlwZV8QGkFwcGxlIEhUTUwgcGFzdGVib2FyZCB0eXBlXxAVTlNGaWxlbmFt
2992 ZXNQYm9hcmRUeXBlXxAXTlNDb2xvciBwYXN0ZWJvYXJkIHR5cGVfEDFOZVhUIEVuY2Fwc3VsYXRlZCBQ
2993 b3N0U2NyaXB0IHYxLjIgcGFzdGVib2FyZCB0eXBlXxAaQXBwbGUgUElDVCBwYXN0ZWJvYXJkIHR5cGVf
2994 EBlOZVhUIGZvbnQgcGFzdGVib2FyZCB0eXBlXxAqTmVYVCBSaWNoIFRleHQgRm9ybWF0IHYxLjAgcGFz
2995 dGVib2FyZCB0eXBl0gA3ADgBDAENowENAQ4AO1xOU011dGFibGVTZXRVTlNTZXRfEBR7ezAsIDM4fSwg
2996 ezQzMywgMTR9fdUBEQAOARIBEwEUAJABFQDIARcBGFlOU1RDRmxhZ3NaTlNUZXh0Vmlld1dOU1dpZHRo
2997 XxAPTlNMYXlvdXRNYW5hZ2VygDaAGCNAexAAAAAAAIAu1QAOARoBGwEcANgBHQEeAR8A3QArXxAQTlNU
2998 ZXh0Q29udGFpbmVyc11OU1RleHRTdG9yYWdlWU5TTE1GbGFnc4A1gDOAL4AA0wAOASIA2AEjASQAK1hO
2999 U1N0cmluZ4AygDCAANIADgEnASgBKVlOUy5zdHJpbmeAMVDSADcAOAErASyjASwBIgA7XxAPTlNNdXRh
3000 YmxlU3RyaW5n0gA3ADgBLgEbpAEbAS8BMAA7XxAZTlNNdXRhYmxlQXR0cmlidXRlZFN0cmluZ18QEk5T
3001 QXR0cmlidXRlZFN0cmluZ9IADgA+AGkBM4A0oQDcgC3SADcAOAE2ATejATcBOAA7Xk5TTXV0YWJsZUFy
3002 cmF5V05TQXJyYXnSADcAOAE6ARSiARQAO9IANwA4ATwA0qIA0gA72AAOAT4BPwFAAUEBQgFDAUQBRQFG
3003 ACsBSAFJAUoAKwFMV05TRmxhZ3NfEBdOU0RlZmF1bHRQYXJhZ3JhcGhTdHlsZV8QEE5TSW5zZXJ0aW9u
3004 Q29sb3JfEBFOU0JhY2tncm91bmRDb2xvcl8QFE5TU2VsZWN0ZWRBdHRyaWJ1dGVzXxASTlNNYXJrZWRB
3005 dHRyaWJ1dGVzXxAQTlNMaW5rQXR0cmlidXRlc4BJEgAFS2+AAIA6gDiAO4AAgEXTAA4BTgFPAVAAVQFR
3006 XE5TQ29sb3JTcGFjZVVOU1JHQoA5TxAYMSAwLjk1Mjk0MTI0IDAuODUwOTgwNDYA0gA3ADgBUwFUogFU
3007 ADtXTlNDb2xvctMADgFOAVYBUAFYAVlXTlNXaGl0ZYA5EANCMADTAA4BWwA+AVwBXQFgV05TLmtleXOA
3008 RKIBXgFfgDyAPaIBYQFigD6AQtUADgFUAU4BZAFlAVABZwDdAWgBaVtOU0NvbG9yTmFtZV1OU0NhdGFs
3009 b2dOYW1lgDmAQYBAgD9WU3lzdGVtXxAbc2VsZWN0ZWRUZXh0QmFja2dyb3VuZENvbG9y0wAOAU4BVgFQ
3010 AVgBboA5SzAuNjY2NjY2NjkA1QAOAVQBTgFkAWUBUAFIAN0BcgFpgDmAOoBDgD9fEBFzZWxlY3RlZFRl
3011 eHRDb2xvctIANwA4AXYBd6IBdwA7XE5TRGljdGlvbmFyedMADgFbAD4BXAF6AX2ARKIBewFfgEaAPaIB
3012 fgF/gEeASFtOU1VuZGVybGluZdMADgFOAU8BUACQAYOAOUYwIDAgMQDSADcAOAGFAYaiAYYAO18QFE5T
3013 VGV4dFZpZXdTaGFyZWREYXRhXHs0ODAsIDFlKzA3fVd7ODQsIDB90gA3ADgBigESpQESAYsBjAGNADtW
3014 TlNUZXh0Vk5TVmlld1tOU1Jlc3BvbmRlcl8QFHt7MSwgMX0sIHs0MzMsIDIzMX19XxAVe3swLCAzOH0s
3015 IHs0MzMsIDIzMX190wAOAU4BVgFQAVgBkoA5QjEA0wAOAZQBlQGWAZcAkFlOU0hvdFNwb3RcTlNDdXJz
3016 b3JUeXBlgFKAUVd7NCwgLTV90gA3ADgBmgC8ogC8ADvSADcAOAGcAZ2kAZ0BjAGNADtaTlNDbGlwVmll
3017 d9kAXAGfAA4AbgBeAFoBoABgAaEAowCjAaQBpQGmAGEBqACjAapYTlNUYXJnZXRYTlNBY3Rpb25ZTlNQ
3018 ZXJjZW50gBSAFIBXgFUT/////4AAAQCADIBWgBQjP9Ww0wAAAABfEBV7ezQyNywgMX0sIHsxNSwgMjYz
3019 fX1cX2RvU2Nyb2xsZXI60gA3ADgBrgGvpQGvAbABjAGNADtaTlNTY3JvbGxlcllOU0NvbnRyb2zbAFwB
3020 nwAOAG4ApgBeAFoBoABgAbIBoQCjAKMBpAG2AJAAZABhAagAowG6AbtaTlNDdXJWYWx1ZYAUgBSAV4BZ
3021 gAyAVoAUIz/wAAAAAAAAIz/uQshgAAAAXxAYe3stMTAwLCAtMTAwfSwgezg3LCAxOH19XxAWe3sxOCwg
3022 MTR9LCB7NDM1LCAyMzN9fdIANwA4Ab8BwKQBwAGMAY0AO1xOU1Njcm9sbFZpZXdfEBR7ezEsIDF9LCB7
3023 NDcxLCAyNTd9fdIANwA4AcMBjKMBjAGNADtaezQ3MywgMjczfVZ7MCwgMH3XAccADgFBAcgByQHKAcsB
3024 zAHNAc4BzwHQAIkB0VtOU0NlbGxGbGFnc1pOU0NvbnRlbnRzWU5TU3VwcG9ydFxOU0NlbGxGbGFnczJb
3025 TlNUZXh0Q29sb3ISBAH+AIBogGWAYYBigGdXQ29uc29sZdQADgHUAdUB1gHXAdgB2QHaVk5TU2l6ZVZO
3026 U05hbWVYTlNmRmxhZ3OAZCNAJgAAAAAAAIBjEQwcXEx1Y2lkYUdyYW5kZdIANwA4Ad0B3qIB3gA7Vk5T
3027 Rm9udNUADgFUAU4BZAFlAVAAygDdAeIBaYA5gE+AZoA/XxATdGV4dEJhY2tncm91bmRDb2xvctMADgFO
3028 AVYBUAFYAeeAOU0wIDAuODAwMDAwMDEA0gA3ADgB6QHqpAHqAesB7AA7XxAPTlNUZXh0RmllbGRDZWxs
3029 XE5TQWN0aW9uQ2VsbFZOU0NlbGzSADcAOAHuAe+kAe8BjAGNADtVTlNCb3jeAFwAgQAOAIIAbgCDAF0A
3030 XgCEAFoAhQCGAGAAhwBrAIkAigHzAfQAjAH2AfcAkABhAJIAVQBrAfuADoBpgJ2AnAiAaxAzgAyAX4AO
3031 gGzSAA4APgBpAf6ANKEB+4Bs1wBcAA4AbgBdAF4AWgBgAH8AYgIDAgQAZABhAH+AaoBdgJuAbYAMgGrS
3032 AA4APgBpAgmANKECCoBu3xAPAFwApQAOAG4ApgIMAg0AXQIOAF4AWgBgAKcAqACHAfsCEACrAhICEwIU
3033 AhUCFgIXAHYAYQH7AhoCGwIbXE5TQ29ybmVyVmlld18QEE5TSGVhZGVyQ2xpcFZpZXdcTlNTY3JvbGxB
3034 bXRzgGyAloBbgJoQMoB4gHWAb08QEEEgAABBIAAAQZgAAEGYAACADIBsgJSAcIBw0gAOAD4AaQIfgDSl
3035 AhsCGgIQAhUCFIBwgJSAloB1gHjbAFwADgBuAL0AXQBeAL4AWgC/AGAAqAIKAMECKADFAikAxwIqAGEC
3036 LAIKAiqAboBTgJOAcYBygAyAhoBugHLSAA4APgBpAjGANKECKoBy3xAVAFwCNAAOAjUCNgFBAjcCDAI4
3037 AjkCOgBeAF8COwBaAjwCPQBgAj4CPwJAAhsAiQJCAkMCRADKAHoCFAJIAMUCSQBkAkoAegBhAk0AkAIb
3038 Ak8AVgJQXxAfTlNEcmFnZ2luZ1NvdXJjZU1hc2tGb3JOb25Mb2NhbFlOU1R2RmxhZ3NcTlNIZWFkZXJW
3039 aWV3XxASTlNBbGxvd3NUeXBlU2VsZWN0XxAXTlNJbnRlcmNlbGxTcGFjaW5nV2lkdGhfEBlOU0NvbHVt
3040 bkF1dG9yZXNpemluZ1N0eWxlXxAYTlNJbnRlcmNlbGxTcGFjaW5nSGVpZ2h0WU5TRW5hYmxlZFtOU0dy
3041 aWRDb2xvcl8QD05TR3JpZFN0eWxlTWFza15OU1RhYmxlQ29sdW1uc18QHE5TRHJhZ2dpbmdTb3VyY2VN
3042 YXNrRm9yTG9jYWxbTlNSb3dIZWlnaHSAcICSE//////WwAAAgHSATwmAeCNACAAAAAAAACNAAAAAAAAA
3043 AIBzCYAMgI+AcIB7I0AxAAAAAAAAWnsxNTYsIDIwMH3XAFwADgBeAF8AWgBgAlMCFQJVAGQCVgBhAhUC
3044 KltOU1RhYmxlVmlld4B1gHeAdoAMgHWActsAXAAOAG4AvQBdAF4AvgBaAL8AYACoAgoAwQJdAMUCXgDH
3045 AkQAYQIsAgoCRIBugFOAmYCYgHSADICGgG6AdFl7MTU2LCAxN33SADcAOAJmAmekAmcBjAGNADtfEBFO
3046 U1RhYmxlSGVhZGVyVmlld9YAXAAOAG4AXgBaAGACCgJqAmsAZABhAgqAboB6gHmADIBuXxAUe3sxNTcs
3047 IDB9LCB7MTYsIDE3fX3SADcAOAJwAnGkAnEBjAGNADtdX05TQ29ybmVyVmlld9IADgA+AGkCdIA0ogJ1
3048 AnaAfICL2gJ4AA4CeQETAnoCewJ8An0CfgJTAHoCgAKBAoICgwFYAoQChQB6AipeTlNJc1Jlc2l6ZWFi
3049 bGVcTlNIZWFkZXJDZWxsWk5TRGF0YUNlbGxeTlNSZXNpemluZ01hc2taTlNNaW5XaWR0aFpOU01heFdp
3050 ZHRoXE5TSXNFZGl0YWJsZQmAioB9I0BRwAAAAAAAgIMjQEQAAAAAAAAjQI9AAAAAAAAJgHLXAccADgFB
3051 AcgByQHKAcsCiQKKAosCjAHQAIkCjhIEgf4AgIKAf4B+gGKAgFhWYXJpYWJsZdMADgFOAVYBUAFYApKA
3052 OUswLjMzMzMzMjk5ANUADgFUAU4BZAFlAVABSADdApYBaYA5gDqAgYA/XxAPaGVhZGVyVGV4dENvbG9y
3053 0gA3ADgCmgKbpQKbAeoB6wHsADtfEBFOU1RhYmxlSGVhZGVyQ2VsbNgBxwAOAUEByAHJAp0BygHLAp4B
3054 zQIsAqECogIqAqQCpV1OU0NvbnRyb2xWaWV3EhQh/kCAaICGgISAhYByEQgAgIhZVGV4dCBDZWxs1AAO
3055 AdQB1QHWAdcCqQHZAquAZCNAKgAAAAAAAIBjEQQU1QAOAVQBTgFkAWUBUAFnAN0CrwFpgDmAQYCHgD9f
3056 EBZjb250cm9sQmFja2dyb3VuZENvbG9y1QAOAVQBTgFkAWUBUAFIAN0CtQFpgDmAOoCJgD9fEBBjb250
3057 cm9sVGV4dENvbG9y0gA3ADgCuQK6ogK6ADtdTlNUYWJsZUNvbHVtbtoCeAAOAnkBEwJ6AnsCfAJ9An4C
3058 UwB6AoACvgK/AsABWAKEAoUAegIqCYCKgIwjQFPAAAAAAACAjgmActcBxwAOAUEByAHJAcoBywKJAooC
3059 iwLGAdAAiQKOgIKAf4CNgGKAgFVWYWx1ZdgBxwAOAUEByAHJAp0BygHLAp4BzQIsAqECogIqAqQCpYBo
3060 gIaAhICFgHKAiNUADgFUAU4BZAFlAVAC0wDdAtQBaYA5gJGAkIA/WWdyaWRDb2xvctMADgFOAVYBUAFY
3061 AtmAOUQwLjUA0gA3ADgC2wJTpQJTAbABjAGNADtfEBV7ezEsIDE3fSwgezE1NiwgMjAwfX3ZAFwBnwAO
3062 AG4AXgBaAaAAYAGhAgoCCgGkAuEAZABhAagCCgLlgG6AboBXgJWADIBWgG4jP+/gP4AAAABfEBZ7ezE1
3063 NywgMTd9LCB7MTUsIDIwMH192gBcAZ8ADgBuAKYAXgBaAaAAYAGhAgoCCgGkAusAkABkAGEBqAIKAu+A
3064 boBugFeAl4AMgFaAbiM/5vlvoAAAAF8QFXt7MSwgMjE3fSwgezE1NiwgMTV9fdIADgA+AGkC84A0oQJE
3065 gHRfEBN7ezEsIDB9LCB7MTU2LCAxN319XxAWe3sxOCwgMTR9LCB7MTczLCAyMzN9fV8QFHt7MSwgMX0s
3066 IHsyMDksIDI1N319XxAWe3s0NzQsIDB9LCB7MjExLCAyNzN9fdcBxwAOAUEByAHJAcoBywHMAc0BzgL8
3067 AdAAiQL+gGiAZYCegGKAn1lXb3Jrc3BhY2XTAA4BTgFWAVABWAHngDlfEBZ7ezIwLCA0NH0sIHs2ODUs
3068 IDI3M319XxAgaXB5dGhvbjFfY29uc29sZV93b3Jrc3BhY2Vfc3BsaXTSADcAOAMFAwakAwYBjAGNADtb
3069 TlNTcGxpdFZpZXfaAFwADgBuAwgDCQBeAFoDCgBgAwsATQMNAw4DDwMQAxEAYQMTAE0DFVpOU01heFZh
3070 bHVlWk5TTWluVmFsdWVZTlNwaUZsYWdzXE5TRHJhd01hdHJpeIALgKeApiNAWQAAAAAAACNAMAAAAAAA
3071 ABEFIYAMEXEKgAuApNEADgMXgKXSADcAOAMZAxqiAxoAO1pOU1BTTWF0cml4XxAVe3s2ODksIDIwfSwg
3072 ezE2LCAxNn190gA3ADgDHQMepAMeAYwBjQA7XxATTlNQcm9ncmVzc0luZGljYXRvclp7NzI1LCAzMzd9
3073 XxAVe3swLCAwfSwgezEyODAsIDc3OH19XxAQaXB5dGhvbjFfc2FuZGJveNIANwA4AyMDJKIDJAA7XxAQ
3074 TlNXaW5kb3dUZW1wbGF0ZdIADgA+AGkDJ4A0rxAvAygDKQMqAysDLAMtAy4DLwMwAzEDMgMzAzQDNQM2
3075 AzcDOAM5AzoDOwM8Az0DPgM/A0ADQQNCA0MDRANFA0YDRwNIA0kDSgNLA0wDTQNOA08DUANRA1IDUwNU
3076 A1UDVoCugLyAwoDHgM2A04DYgN6A5IDpgO2A84D4gPyBAQKBAQaBAQqBAQ+BAROBARmBAR6BASKBASaB
3077 ASuBATCBATWBATqBAT6BAUKBAUeBAU2BAU+BAVOBAVmBAV6BAWKBAWeBAWmBAWuBAXCBAXWBAXmBAX2B
3078 AYyBAZCBAZOBAZfTAA4DWANZA1oDWwNcWE5TU291cmNlV05TTGFiZWyAu4CvgLrZAA4DXgNfA2ADYQNi
3079 A2MDZANlA2YDZwNoA2kDagNrA2wDbQBVV05TVGl0bGVfEBFOU0tleUVxdWl2TW9kTWFza1pOU0tleUVx
3080 dWl2XU5TTW5lbW9uaWNMb2NZTlNPbkltYWdlXE5TTWl4ZWRJbWFnZVZOU01lbnVVTlNUYWeAuYCxEgAQ
3081 AACAshJ/////gLOAt4Cw0wAOA14DbwNwA3EDcltOU01lbnVJdGVtc4EBoIEBp4EBqVxTbWFydCBRdW90
3082 ZXNRZ9MADgAyA3YDdwN4A3leTlNSZXNvdXJjZU5hbWWAtoC0gLVXTlNJbWFnZV8QD05TTWVudUNoZWNr
3083 bWFya9IANwA4A30DfqIDfgA7XxAQTlNDdXN0b21SZXNvdXJjZdMADgAyA3YDdwN4A4KAtoC0gLhfEBBO
3084 U01lbnVNaXhlZFN0YXRl0gA3ADgDhQOGogOGADtaTlNNZW51SXRlbV8QIXRvZ2dsZUF1dG9tYXRpY1F1
3085 b3RlU3Vic3RpdHV0aW9uOtIANwA4A4kDiqMDigOLADtfEBVOU05pYkNvbnRyb2xDb25uZWN0b3JeTlNO
3086 aWJDb25uZWN0b3LTAA4DWANZA1oDjgOPgLuAvYDB2AAOA14DXwNgA2EDYgNjA2QDZgOSA2gDkwNqA2sD
3087 bAOWgLmAv4DAgLOAt4C+0wAOA14DbwNwA5kDmoEBoIEB0oEB1F8QEUp1bXAgdG8gU2VsZWN0aW9uUWpf
3088 EB1jZW50ZXJTZWxlY3Rpb25JblZpc2libGVBcmVhOtMADgNYA1kDWgOgA6GAu4DDgMbZAA4DXgNfA2AD
3089 YQNiA2MDZANlA2YDpANoA6UDagNrA2wDbQCQgLmAxIDFgLOAt4CwXxAQU21hcnQgQ29weS9QYXN0ZVFm
3090 XxAYdG9nZ2xlU21hcnRJbnNlcnREZWxldGU60wAOA1gDWQNaA64Dr4C7gMiAzNgADgNeA18DYANhA2ID
3091 YwNkA2YDsgNoA7MDagNrA2wDtoC5gMqAy4CzgLeAydMADgNeA28DcAO5A7qBAaCBAcCBAcJUU2F2ZVFz
3092 XXNhdmVEb2N1bWVudDrTAA4DWANZA1oDwAPBgLuAzoDS2AAOA14DXwNgA2EDYgNjA2QDZgPEA2gDxQNq
3093 A2sDbAPIgLmA0IDRgLOAt4DP0wAOA14DbwNwA8sDzIEBoIEBzIEBzlRVbmRvUXpVdW5kbzrTAA4DWANZ
3094 A1oD0gPTgLuA1IDX2AAOA14DXwNgA2EDYgNjA2QDZgPWA9cD2ANqA2sDbAPIgLmA1RIAEgAAgNaAs4C3
3095 gM9UUmVkb1FaVXJlZG860wAOA1gDWQNaA+ED4oC7gNmA3dgADgNeA18DYANhA2IDYwNkA2YD5QPmA+cD
3096 agNrA2wD6oC5gNsSABgAAIDcgLOAt4Da1AAOA14B1QNvA3AD7QPuA++BAaCBAa6BAb6BAbBbSGlkZSBP
3097 dGhlcnNRaF8QFmhpZGVPdGhlckFwcGxpY2F0aW9uczrTAA4DWANZA1oD9QP2gLuA34Dj2AAOA14DXwNg
3098 A2EDYgNjA2QDZgP5A9cD+gNqA2sDbAP9gLmA4YDigLOAt4Dg0wAOA14DbwNwBAAEAYEBoIEB4YEB41tT
3099 aG93IENvbG9yc1FDXxAVb3JkZXJGcm9udENvbG9yUGFuZWw60wAOA1gDWQNaBAcECIC7gOWA6NgADgNe
3100 A18DYANhA2IDYwNkA2YECwNoBAwDagNrA2wDyIC5gOaA54CzgLeAz1VQYXN0ZVF2VnBhc3RlOtMADgNY
3101 A1kDWgQVBBaAu4DqgOzZAA4DXgNfA2ADYQNiA2MDZANlA2YEGQNoA6UDagNrA2wDlgCQgLmA64DFgLOA
3102 t4C+ZQBGAGkAbgBkICZfEBdwZXJmb3JtRmluZFBhbmVsQWN0aW9uOtMADgNYA1kDWgQiBCOAu4DugPLY
3103 AA4DXgNfA2ADYQNiA2MDZANmBCYDaAQnA2oDawNsBCqAuYDwgPGAs4C3gO/TAA4DXgNvA3AELQQugQGg
3104 gQGdgQGfXVN0b3AgU3BlYWtpbmddc3RvcFNwZWFraW5nOtQADgQyA1gDWQQzBDQAQQQ2XU5TRGVzdGlu
3105 YXRpb26A94D0gAeA9tIADgAyADMEOYAEgPVfEBZJUHl0aG9uQ29jb2FDb250cm9sbGVyWGRlbGVnYXRl
3106 0gA3ADgEPQQ+owQ+A4sAO18QFE5TTmliT3V0bGV0Q29ubmVjdG9y0wAOA1gDWQNaBEEEQoC7gPmA+9gA
3107 DgNeA18DYANhA2IDYwNkA2YERQNoBCcDagNrA2wDyIC5gPqA8YCzgLeAz1ZEZWxldGVXZGVsZXRlOtMA
3108 DgNYA1kDWgROBE+Au4D9gQEB2AAOA14DXwNgA2EDYgNjA2QDZgRSA2gEUwNqA2sDbARWgLmA/4EBAICz
3109 gLeA/tQADgNeAdUDbwNwBFkEWgRbgQGggQHrgQHvgQHtWE1pbmltaXplUW1fEBNwZXJmb3JtTWluaWF0
3110 dXJpemU60wAOA1gDWQNaBGEEYoC7gQEDgQEF2AAOA14DXwNgA2EDYgNjA2QDZgRlA2gEJwNqA2sDbARW
3111 gLmBAQSA8YCzgLeA/l8QEkJyaW5nIEFsbCB0byBGcm9udF8QD2FycmFuZ2VJbkZyb250OtMADgNYA1kD
3112 WgRuBG+Au4EBB4EBCdgADgNeA18DYANhA2IDYwNkA2YEcgNoBCcDagNrA2wD6oC5gQEIgPGAs4C3gNpY
3113 U2hvdyBBbGxfEBZ1bmhpZGVBbGxBcHBsaWNhdGlvbnM60wAOA1gDWQNaBHsEfIC7gQELgQEO2AAOA14D
3114 XwNgA2EDYgNjA2QDZgR/A2gEgANqA2sDbAO2gLmBAQyBAQ2As4C3gMlVQ2xvc2VRd11wZXJmb3JtQ2xv
3115 c2U61AAOBDIDWANZA1oAHwSKBIuAu4ACgQEQgQES1wAOA14DYANhA2IDYwNkA2YEjgQnA2oDawNsA+qA
3116 uYEBEYDxgLOAt4DaXxAVQWJvdXQgSVB5dGhvbjFTYW5kYm94XxAdb3JkZXJGcm9udFN0YW5kYXJkQWJv
3117 dXRQYW5lbDrTAA4DWANZA1oElwSYgLuBARSBARjYAA4DXgNfA2ADYQNiA2MDZANmBJsDaAScA2oDawNs
3118 BJ+AuYEBFoEBF4CzgLeBARXTAA4DXgNvA3AEogSjgQGggQHdgQHfXkNoZWNrIFNwZWxsaW5nUTteY2hl
3119 Y2tTcGVsbGluZzrTAA4DWANZA1oEqQSqgLuBARqBAR3YAA4DXgNfA2ADYQNiA2MDZANmBK0DaASuA2oD
3120 awNsA8iAuYEBG4EBHICzgLeAz1pTZWxlY3QgQWxsUWFac2VsZWN0QWxsOtMADgNYA1kDWgS3BLiAu4EB
3121 H4EBIdgADgNeA18DYANhA2IDYwNkA2YEuwNoA+cDagNrA2wD6oC5gQEggNyAs4C3gNpfEBRIaWRlIElQ
3122 eXRob24xU2FuZGJveFVoaWRlOtMADgNYA1kDWgTEBMWAu4EBI4EBJdgADgNeA18DYANhA2IDYwNkA2YE
3123 yANoBCcDagNrA2wEn4C5gQEkgPGAs4C3gQEVXxAbQ2hlY2sgU3BlbGxpbmcgV2hpbGUgVHlwaW5nXxAe
3124 dG9nZ2xlQ29udGludW91c1NwZWxsQ2hlY2tpbmc60wAOA1gDWQNaBNEE0oC7gQEngQEq2AAOA14DXwNg
3125 A2EDYgNjA2QDZgTVA2gE1gNqA2sDbAO2gLmBASiBASmAs4C3gMlmAFAAcgBpAG4AdCAmUXBWcHJpbnQ6
3126 0wAOA1gDWQNaBN8E4IC7gQEsgQEv2AAOA14DXwNgA2EDYgNjA2QDZgTjA9cE5ANqA2sDbAO2gLmBAS2B
3127 AS6As4C3gMloAFMAYQB2AGUAIABBAHMgJlFTXxAPc2F2ZURvY3VtZW50QXM60wAOA1gDWQNaBO0E7oC7
3128 gQExgQE02AAOA14DXwNgA2EDYgNjA2QDZgTxA2gE8gNqA2sDbAPqgLmBATKBATOAs4C3gNpfEBRRdWl0
3129 IElQeXRob24xU2FuZGJveFFxWnRlcm1pbmF0ZTrTAA4DWANZA1oE+wT8gLuBATaBATnZAA4DXgNfA2AD
3130 YQNiA2MDZANlA2YE/wPXBQADagNrA2wDbQFYgLmBATeBATiAs4C3gLBbU21hcnQgTGlua3NRR18QHXRv
3131 Z2dsZUF1dG9tYXRpY0xpbmtEZXRlY3Rpb2461AAOBDIDWANZBDMENAUKBQuA94D0gQE7gQE90gAOADIA
3132 MwUOgASBATxfEBpJUHl0aG9uMVNhbmRib3hBcHBEZWxlZ2F0ZV8QEWlweXRob25Db250cm9sbGVy0wAO
3133 A1gDWQNaBRMFFIC7gQE/gQFB2AAOA14DXwNgA2EDYgNjA2QDZgUXA2gEJwNqA2sDbARWgLmBAUCA8YCz
3134 gLeA/lRab29tXHBlcmZvcm1ab29tOtMADgNYA1kDWgUgBSGAu4EBQ4EBRtgADgNeA18DYANhA2IDYwNk
3135 A2YFJANoBSUDagNrA2wDyIC5gQFEgQFFgLOAt4DPVENvcHlRY1Vjb3B5OtMADgNYA1kDWgUuBS+Au4EB
3136 SIEBTNgADgNeA18DYANhA2IDYwNkA2YFMgPmBTMDagNrA2wFNoC5gQFKgQFLgLOAt4EBSdMADgNeA28D
3137 cAU5BTqBAaCBAeeBAelcU2hvdyBUb29sYmFyUXRfEBN0b2dnbGVUb29sYmFyU2hvd2461AAOBDIDWANZ
3138 BDMFCgVBBDaA94EBO4EBToD20gAOADIAMwA0gASAA9MADgNYA1kDWgVIBUmAu4EBUIEBUtgADgNeA18D
3139 YANhA2IDYwNkA2YFTANoBCcDagNrA2wEKoC5gQFRgPGAs4C3gO9eU3RhcnQgU3BlYWtpbmdec3RhcnRT
3140 cGVha2luZzrTAA4DWANZA1oFVQVWgLuBAVSBAVjYAA4DXgNfA2ADYQNiA2MDZANmBVkDaAVaA2oDawNs
3141 BV2AuYEBVoEBV4CzgLeBAVXTAA4DXgNvA3AFYAVhgQGggQHxgQHzXxAUSVB5dGhvbjFTYW5kYm94IEhl
3142 bHBRP1lzaG93SGVscDrTAA4DWANZA1oFZwVogLuBAVqBAV3YAA4DXgNfA2ADYQNiA2MDZANmBWsDaAQn
3143 A2oDawNsBW+AuYEBXIDxgLOAt4EBW9QADgNeAdUDbwNwBXIFcwV0gQGggQGigQGlgQGkWkNsZWFyIE1l
3144 bnVfEBVjbGVhclJlY2VudERvY3VtZW50czrTAA4DWANZA1oFeQV6gLuBAV+BAWHYAA4DXgNfA2ADYQNi
3145 A2MDZANmBX0DaAQnA2oDawNsBTaAuYEBYIDxgLOAt4EBSW8QEgBDAHUAcwB0AG8AbQBpAHoAZQAgAFQA
3146 bwBvAGwAYgBhAHIgJl8QH3J1blRvb2xiYXJDdXN0b21pemF0aW9uUGFsZXR0ZTrTAA4DWANZA1oFhgWH
3147 gLuBAWOBAWbYAA4DXgNfA2ADYQNiA2MDZANmBYoDaAWLA2oDawNsA8iAuYEBZIEBZYCzgLeAz1NDdXRR
3148 eFRjdXQ61AAOBDIDWANZBDMAyAQ0BZaA94AYgPSBAWhYdGV4dFZpZXfUAA4EMgNYA1kEMwDIAEEFnID3
3149 gBiAB4EBal8QFWluaXRpYWxGaXJzdFJlc3BvbmRlctMADgNYA1kDWgWgBaGAu4EBbIEBb9kADgWjA14D
3150 XwNgA2EDYgNjA2QDZgQnBaYD1wWnA2oDawNsA7ZZTlNUb29sVGlwgLmA8YEBbYEBboCzgLeAyV1QYWdl
3151 IFNldHVwLi4uUVBecnVuUGFnZUxheW91dDrTAA4DWANZA1oFsAWxgLuBAXGBAXTYAA4DXgNfA2ADYQNi
3152 A2MDZANmBbQDaAW1A2oDawNsBJ+AuYEBcoEBc4CzgLeBARVuAFMAaABvAHcAIABTAHAAZQBsAGwAaQBu
3153 AGcgJlE6XxAPc2hvd0d1ZXNzUGFuZWw60wAOA1gDWQNaBb4Fv4C7gQF2gQF41wAOA14DYANhA2IDYwNk
3154 A2YFwgQnA2oDawNsA7aAuYEBd4DxgLOAt4DJXxAPUmV2ZXJ0IHRvIFNhdmVkXxAWcmV2ZXJ0RG9jdW1l
3155 bnRUb1NhdmVkOtMADgNYA1kDWgXLBcyAu4EBeoEBfNgADgNeA18DYANhA2IDYwNkA2YFzwNoBCcDagNr
3156 A2wEn4C5gQF7gPGAs4C3gQEVXxAbQ2hlY2sgR3JhbW1hciBXaXRoIFNwZWxsaW5nXxAWdG9nZ2xlR3Jh
3157 bW1hckNoZWNraW5nOtcADgQyBdcF2ANYA1kF2QXaBdsF3AXdAnUF3wBVWU5TS2V5UGF0aFlOU0JpbmRp
3158 bmdfEBxOU05pYkJpbmRpbmdDb25uZWN0b3JWZXJzaW9ugQGLgQF+gQGKgQGCgHyBAYnbBeEADgXiBeMF
3159 5AXlBeYF5wXoBekF6gB6BewAegXuAHoF8AXdAHoAegB6BfVfEBpOU0ZpbHRlclJlc3RyaWN0c0luc2Vy
3160 dGlvbl8QFE5TUHJlc2VydmVzU2VsZWN0aW9uXE5TSW5pdGlhbEtleVpOU0VkaXRhYmxlXk5TRGVjbGFy
3161 ZWRLZXlzXk5TSW5pdGlhbFZhbHVlXxAiTlNDbGVhcnNGaWx0ZXJQcmVkaWNhdGVPbkluc2VydGlvbl8Q
3162 GE5TU2VsZWN0c0luc2VydGVkT2JqZWN0c18QFk5TQXZvaWRzRW1wdHlTZWxlY3Rpb25fEBFOU1NvcnRE
3163 ZXNjcmlwdG9ycwmBAYgJgQGBCYEBf4EBggkJCYEBg9IADgA+AGkF+IA0owX5Be4F3YEBgIEBgYEBglRr
3164 ZXlzU2tleVV2YWx1ZdIADgA+BgAGAYEBh6EGAoEBhNQADgYEBgUGBgYHBe4GCQB6VU5TS2V5Wk5TU2Vs
3165 ZWN0b3JbTlNBc2NlbmRpbmeBAYaBAYGBAYUJWGNvbXBhcmU60gA3ADgGDQYOogYOADtfEBBOU1NvcnRE
3166 ZXNjcmlwdG9y0gA3ADgGEAE4ogE4ADvSADcAOAYSBhOlBhMGFAYVBhYAO18QFk5TRGljdGlvbmFyeUNv
3167 bnRyb2xsZXJfEBFOU0FycmF5Q29udHJvbGxlcl8QEk5TT2JqZWN0Q29udHJvbGxlclxOU0NvbnRyb2xs
3168 ZXJfEBp2YWx1ZTogYXJyYW5nZWRPYmplY3RzLmtleV8QE2FycmFuZ2VkT2JqZWN0cy5rZXnSADcAOAYa
3169 BhujBhsDiwA7XxAVTlNOaWJCaW5kaW5nQ29ubmVjdG9y1wAOBDIF1wXYA1gDWQXZBdoENAYfBiAF2wYi
3170 AFWBAYuA9IEBj4EBjoEBfoEBjV8QGWNvbnRlbnREaWN0aW9uYXJ5OiB1c2VyTlNfEBFjb250ZW50RGlj
3171 dGlvbmFyeVZ1c2VyTlPXAA4EMgXXBdgDWANZBdkF2gXbBikF3QJ2BiwAVYEBi4EBfoEBkoEBgoCLgQGR
3172 XxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy52YWx1ZV8QFWFycmFuZ2VkT2JqZWN0cy52YWx1ZdcADgQy
3173 BdcF2ANYA1kF2QXaBQoGMgYzBdsGNQBVgQGLgQE7gQGWgQGVgQF+gQGUXxApZmlsdGVyUHJlZGljYXRl
3174 OiB3b3Jrc3BhY2VGaWx0ZXJQcmVkaWNhdGVfEA9maWx0ZXJQcmVkaWNhdGVfEBh3b3Jrc3BhY2VGaWx0
3175 ZXJQcmVkaWNhdGXXAA4EMgXXBdgDWANZBdkF2gQ0BjwGPQBsBj8AVYEBi4D0gQGagQGZgKOBAZhfEBlh
3176 bmltYXRlOiB3YWl0aW5nRm9yRW5naW5lV2FuaW1hdGVfEBB3YWl0aW5nRm9yRW5naW5l0gAOAD4GAAZF
3177 gQGHrxBnA1sGRwTfAkQCdQZLBIoEQQUgBW8GUATRBbAFywZUBFYFLgZXBYYGWQIKA20GXATtBl4GXwS3
3178 BmEGYgBNBdsAawVVBHsFoAZpBmoAyAUKBGEGbgSpBnAAbAZyBBUD9QIaA8gAfwPqAnYEIgZ7BJcGfQOO
3179 Bn8GgAV5AioGgwSfAhAETgPSBogEBwCqBb4D4QaNBo4D/QLAA64AfgaTBG4FEwTEAKMFXQT7BpoGmwOg
3180 BTYDlgafBWcEKgPABDQFQQKDAEEAsQaoBqkFSAO2BqyAr4EBnIEBLIB0gHyBAaGBARCA+YEBQ4EBW4EB
3181 poEBJ4EBcYEBeoEBqoD+gQFIgQHDgQFjgQHwgG6AsIEB2YEBMYEBv4EBz4EBH4EB5oEB5IALgQF+gA6B
3182 AVSBAQuBAWyBAbaBAbWAGIEBO4EBA4EB6oEBGoEBxoCjgQG9gOqA34CUgM+AaoDagIuA7oEBrYEBFIEB
3183 y4C9gQHQgQHugQFfgHKBAbGBARWAloD9gNSBAdGA5YBYgQF2gNmBAdeBAbyA4ICOgMiAEIEB1YEBB4EB
3184 P4EBI4AUgQFVgQE2gQHcgQGygMOBAUmAvoEB4IEBWoDvgM6A9IEBToCDgAeAVIEBuYEByoEBUIDJgQHJ
3185 2gAOBq4DXgNfA2ADYQNiA2MDZAGgA2YEKgQtA2gEJwNqA2sDbAPIBrZZTlNTdWJtZW51gLmA74EBnYDx
3186 gLOAt4DPgQGeVlNwZWVjaF5zdWJtZW51QWN0aW9uOtIADgA+AGkGu4A0ogVIBCKBAVCA7tIANwA4Br8D
3187 ZKIDZAA72gAOBq4DXgNfA2ADYQNiA2MDZAGgA2YFbwVyA2gEJwNqA2sDbAO2BsiAuYEBW4EBooDxgLOA
3188 t4DJgQGjW09wZW4gUmVjZW500gAOAD4AaQbMgDShBWeBAVpfEBZfTlNSZWNlbnREb2N1bWVudHNNZW51
3189 2gAOBq4DXgNfA2ADYQNiA2MDZAGgA2YDbQNxA2gEJwNqA2sDbAPIBteAuYCwgQGngPGAs4C3gM+BAahd
3190 U3Vic3RpdHV0aW9uc9IADgA+AGkG24A0owOgA1sE+4DDgK+BATbUAA4DXgHVA28DcAbhBuIG44EBoIEB
3191 q4EB9IEBrFlBTWFpbk1lbnXSAA4APgBpBueANKcGewZeBn0GnwZhBm4GWYEBrYEBv4EBy4EB4IEB5oEB
3192 6oEB8NoADgauA14DXwNgA2EDYgNjA2QBoANmA+oD7QNoBCcDagNrA2wGVAb3gLmA2oEBroDxgLOAt4EB
3193 qoEBr18QD0lQeXRob24xU2FuZGJveNIADgA+AGkG+4A0qwSKBoMGmwZqBmkGjgS3A+EEbgZyBO2BARCB
3194 AbGBAbKBAbWBAbaBAbyBAR+A2YEBB4EBvYEBMdoADgNeA18HCANgBwkDYQNiA2MDZANmBCcDaAB6BCcA
3195 egNqA2sDbAPqXU5TSXNTZXBhcmF0b3JcTlNJc0Rpc2FibGVkgLmA8QmA8QmAs4C3gNrYAA4DXgNfA2AD
3196 YQNiA2MDZANmBxQDaAcVA2oDawNsA+qAuYEBs4EBtICzgLeA2mwAUAByAGUAZgBlAHIAZQBuAGMAZQBz
3197 ICZRLNoADgNeA18HCANgBwkDYQNiA2MDZANmBCcDaAB6BCcAegNqA2sDbAPqgLmA8QmA8QmAs4C3gNra
3198 AA4GrgNeA18DYANhA2IDYwNkAaADZgaoBycDaAQnA2oDawNsA+oHLIC5gQG5gQG3gPGAs4C3gNqBAbhY
3199 U2VydmljZXPUAA4DXgHVA28DcAcnBzEHMoEBoIEBt4EBu4EButIADgA+AGkHNYA0oF8QD19OU1NlcnZp
3200 Y2VzTWVuddoADgNeA18HCANgBwkDYQNiA2MDZANmBCcDaAB6BCcAegNqA2sDbAPqgLmA8QmA8QmAs4C3
3201 gNraAA4DXgNfBwgDYAcJA2EDYgNjA2QDZgQnA2gAegQnAHoDagNrA2wD6oC5gPEJgPEJgLOAt4DaXF9O
3202 U0FwcGxlTWVuddoADgauA14DXwNgA2EDYgNjA2QBoANmA7YDuQNoBCcDagNrA2wGVAdSgLmAyYEBwIDx
3203 gLOAt4EBqoEBwVRGaWxl0gAOAD4AaQdWgDSrBlcGcAZLBqwEewOuBN8FvgapBaAE0YEBw4EBxoEBoYEB
3204 yYEBC4DIgQEsgQF2gQHKgQFsgQEn2AAOA14DXwNgA2EDYgNjA2QDZgdkA2gHZQNqA2sDbAO2gLmBAcSB
3205 AcWAs4C3gMlTTmV3UW7YAA4DXgNfA2ADYQNiA2MDZANmB20DaAduA2oDawNsA7aAuYEBx4EByICzgLeA
3206 yWUATwBwAGUAbiAmUW/aAA4DXgNfBwgDYAcJA2EDYgNjA2QDZgQnA2gAegQnAHoDagNrA2wDtoC5gPEJ
3207 gPEJgLOAt4DJ2gAOA14DXwcIA2AHCQNhA2IDYwNkA2YEJwNoAHoEJwB6A2oDawNsA7aAuYDxCYDxCYCz
3208 gLeAydoADgauA14DXwNgA2EDYgNjA2QBoANmA8gDywNoBCcDagNrA2wGVAeOgLmAz4EBzIDxgLOAt4EB
3209 qoEBzVRFZGl00gAOAD4AaQeSgDStA8AD0gZfBYYFIAQHBEEEqQZ/BogGmgZQBkeAzoDUgQHPgQFjgQFD
3210 gOWA+YEBGoEB0IEB0YEB3IEBpoEBnNoADgNeA18HCANgBwkDYQNiA2MDZANmBCcDaAB6BCcAegNqA2sD
3211 bAPIgLmA8QmA8QmAs4C3gM/aAA4DXgNfBwgDYAcJA2EDYgNjA2QDZgQnA2gAegQnAHoDagNrA2wDyIC5
3212 gPEJgPEJgLOAt4DP2gAOBq4DXgNfA2ADYQNiA2MDZAGgA2YDlgOZA2gEJwNqA2sDbAPIB7qAuYC+gQHS
3213 gPGAs4C3gM+BAdNURmluZNIADgA+AGkHvoA0pQQVBpMGjQZcA46A6oEB1YEB14EB2YC92QAOA14DXwNg
3214 A2EDYgNjA2QDZQNmB8YDaANpA2oDawNsA5YAVYC5gQHWgLKAs4C3gL5ZRmluZCBOZXh02QAOA14DXwNg
3215 A2EDYgNjA2QDZQNmB84D1wUAA2oDawNsA5YBWIC5gQHYgQE4gLOAt4C+XUZpbmQgUHJldmlvdXPZAA4D
3216 XgNfA2ADYQNiA2MDZANlA2YH1gNoB9cDagNrA2wDlgfbgLmBAdqBAduAs4C3gL4QB18QFlVzZSBTZWxl
3217 Y3Rpb24gZm9yIEZpbmRRZdoADgauA14DXwNgA2EDYgNjA2QBoANmBJ8EogNoBCcDagNrA2wDyAfmgLmB
3218 ARWBAd2A8YCzgLeAz4EB3l8QFFNwZWxsaW5nIGFuZCBHcmFtbWFy0gAOAD4AaQfqgDSkBbAElwTEBcuB
3219 AXGBARSBASOBAXraAA4GrgNeA18DYANhA2IDYwNkAaADZgP9BAADaAQnA2oDawNsBlQH94C5gOCBAeGA
3220 8YCzgLeBAaqBAeJWRm9ybWF00gAOAD4AaQf7gDSiBmID9YEB5IDf2AAOA14DXwNgA2EDYgNjA2QDZggA
3221 A2gFMwNqA2sDbAP9gLmBAeWBAUuAs4C3gOBaU2hvdyBGb250c9oADgauA14DXwNgA2EDYgNjA2QBoANm
3222 BTYFOQNoBCcDagNrA2wGVAgOgLmBAUmBAeeA8YCzgLeBAaqBAehUVmlld9IADgA+AGkIEoA0ogUuBXmB
3223 AUiBAV/aAA4GrgNeA18DYANhA2IDYwNkAaADZgRWBFkDaAQnA2oDawNsBlQIHYC5gP6BAeuA8YCzgLeB
3224 AaqBAexWV2luZG930gAOAD4AaQghgDSkBE4FEwaABGGA/YEBP4EB7oEBA9oADgNeA18HCANgBwkDYQNi
3225 A2MDZANmBCcDaAB6BCcAegNqA2sDbARWgLmA8QmA8QmAs4C3gP5eX05TV2luZG93c01lbnXaAA4GrgNe
3226 A18DYANhA2IDYwNkAaADZgVdBWADaAQnA2oDawNsBlQIOIC5gQFVgQHxgPGAs4C3gQGqgQHyVEhlbHDS
3227 AA4APgBpCDyANKEFVYEBVFtfTlNNYWluTWVuddIADgA+BgAIQYEBh68QZwNtA8gDtgIKAioDtgPqA8gD
3228 yAZLA8gDtgSfBJ8AHwZuBTYDtgPIBlQAfwZQA5YD6gZUA8gD6gZUA/0AQQAfAE0FXQO2A7YD6gPqAKMA
3229 HwRWBlQDyAO2AE0D6gOWA/0CCgZ9AGsGewIqBCoGVASfBlQDlgPIBFYFNgIKA+oGmgIKBFYDyAPIA8gA
3230 owO2A+oDlgPqBp8CdgO2AGsDlgPqBFYEnwB+BlkDbQPIA+oDbQZhBogGVAVvBkcDyAAfAB8CdQAfAKMG
3231 aQO2BCoGXgO2gLCAz4DJgG6AcoDJgNqAz4DPgQGhgM+AyYEBFYEBFYACgQHqgQFJgMmAz4EBqoBqgQGm
3232 gL6A2oEBqoDPgNqBAaqA4IAHgAKAC4EBVYDJgMmA2oDagBSAAoD+gQGqgM+AyYALgNqAvoDggG6BAcuA
3233 DoEBrYBygO+BAaqBARWBAaqAvoDPgP6BAUmAboDagQHcgG6A/oDPgM+Az4AUgMmA2oC+gNqBAeCAi4DJ
3234 gA6AvoDagP6BARWAEIEB8ICwgM+A2oCwgQHmgQHRgQGqgQFbgQGcgM+AAoACgHyAAoAUgQG2gMmA74EB
3235 v4DJ0gAOAD4GAAirgQGHrxBoA1sGRwTfAkQCdQZLBIoEQQUgBW8E0QZQBbAFywUuBlQEVgZXBYYGWQIK
3236 A20GXATtBl4GXwS3BmEGYgBNBdsAawVVBHsFoAZpBmoAyAUKBGEGbgZwBKkAbAZyBBUD9QIaA8gD6gB/
3237 BCICdgZ7BJcGfQOOBn8GgAV5AioGgwSfAhAETgPSBogEBwCqBb4D4QaNBo4D/QLAA64AfgaTBG4FEwTE
3238 AKMFXQT7AB8GmgabBTYDoAafA5YFZwQqBDQDwAVBAoMAQQCxBqkGqAVIA7YGrICvgQGcgQEsgHSAfIEB
3239 oYEBEID5gQFDgQFbgQEngQGmgQFxgQF6gQFIgQGqgP6BAcOBAWOBAfCAboCwgQHZgQExgQG/gQHPgQEf
3240 gQHmgQHkgAuBAX6ADoEBVIEBC4EBbIEBtoEBtYAYgQE7gQEDgQHqgQHGgQEagKOBAb2A6oDfgJSAz4Da
3241 gGqA7oCLgQGtgQEUgQHLgL2BAdCBAe6BAV+AcoEBsYEBFYCWgP2A1IEB0YDlgFiBAXaA2YEB14EBvIDg
3242 gI6AyIAQgQHVgQEHgQE/gQEjgBSBAVWBATaAAoEB3IEBsoEBSYDDgQHggL6BAVqA74D0gM6BAU6Ag4AH
3243 gFSBAcqBAbmBAVCAyYEBydIADgA+BgAJFoEBh68QaAkXCRgJGQkaCRsJHAkdCR4JHwkgCSEJIgkjCSQJ
3244 JQkmCScJKAkpCSoJKwksCS0JLgkvCTAJMQkyCTMJNAk1CTYJNwk4CTkJOgk7CTwFDgk+CT8JQAlBCUIJ
3245 QwlECUUJRglHCUgJSQlKCUsJTAlNCU4JTwlQCVEJUglTCVQJVQlWCVcJWAlZCVoJWwlcCV0JXglfCWAJ
3246 YQliCWMJZAllCWYJZwloCWkJaglrCWwJbQluCW8JcAlxCXIJcwl0CXUJdgl3CXgJeQl6CXsJfAl9CX6B
3247 AfiBAfmBAfqBAfuBAfyBAf2BAf6BAf+BAgCBAgGBAgKBAgOBAgSBAgWBAgaBAgeBAgiBAgmBAgqBAguB
3248 AgyBAg2BAg6BAg+BAhCBAhGBAhKBAhOBAhSBAhWBAhaBAheBAhiBAhmBAhqBAhuBAhyBAh2BATyBAh6B
3249 Ah+BAiCBAiGBAiKBAiOBAiSBAiWBAiaBAieBAiiBAimBAiqBAiuBAiyBAi2BAi6BAi+BAjCBAjGBAjKB
3250 AjOBAjSBAjWBAjaBAjeBAjiBAjmBAjqBAjuBAjyBAj2BAj6BAj+BAkCBAkGBAkKBAkOBAkSBAkWBAkaB
3251 AkeBAkiBAkmBAkqBAkuBAkyBAk2BAk6BAk+BAlCBAlGBAlKBAlOBAlSBAlWBAlaBAleBAliBAlmBAlqB
3252 AluBAlyBAl2BAl5fEBhNZW51IEl0ZW0gKFNtYXJ0IFF1b3RlcylfEBJNZW51IEl0ZW0gKFNwZWVjaClR
3253 OF8QEVRhYmxlIEhlYWRlciBWaWV3XxAXVGFibGUgQ29sdW1uIChWYXJpYWJsZSlfEBdNZW51IEl0ZW0g
3254 KE9wZW4gUmVjZW50KV8QIU1lbnUgSXRlbSAoQWJvdXQgSVB5dGhvbjFTYW5kYm94KV8QEk1lbnUgSXRl
3255 bSAoRGVsZXRlKV8QEE1lbnUgSXRlbSAoQ29weSlfEBJNZW51IChPcGVuIFJlY2VudClRNl8QGU1lbnUg
3256 SXRlbSAoU3Vic3RpdHV0aW9ucylvEBoATQBlAG4AdQAgAEkAdABlAG0AIAAoAFMAaABvAHcAIABTAHAA
3257 ZQBsAGwAaQBuAGcgJgApXxAnTWVudSBJdGVtIChDaGVjayBHcmFtbWFyIFdpdGggU3BlbGxpbmcpXxAY
3258 TWVudSBJdGVtIChTaG93IFRvb2xiYXIpWE1haW5NZW51XU1lbnUgKFdpbmRvdylROV8QD01lbnUgSXRl
3259 bSAoQ3V0KVExW1Njcm9sbCBWaWV3XxAUTWVudSAoU3Vic3RpdHV0aW9ucylfECJNZW51IEl0ZW0gKFVz
3260 ZSBTZWxlY3Rpb24gZm9yIEZpbmQpVDExMTFfEBBNZW51IEl0ZW0gKEZpbGUpW1NlcGFyYXRvci01XxAg
3261 TWVudSBJdGVtIChIaWRlIElQeXRob24xU2FuZGJveClfEBBNZW51IEl0ZW0gKFZpZXcpXxAWTWVudSBJ
3262 dGVtIChTaG93IEZvbnRzKVxDb250ZW50IFZpZXdfEBlVc2VyIE5hbWVzcGFjZSBDb250cm9sbGVyWlNw
3263 bGl0IFZpZXdfECBNZW51IEl0ZW0gKElQeXRob24xU2FuZGJveCBIZWxwKVMxLTFRNV8QFE1lbnUgSXRl
3264 bSAoU2VydmljZXMpW1NlcGFyYXRvci0xWVRleHQgVmlld18QHk1lbnUgSXRlbSAoQnJpbmcgQWxsIHRv
3265 IEZyb250KV8QEk1lbnUgSXRlbSAoV2luZG93KW8QEQBNAGUAbgB1ACAASQB0AGUAbQAgACgATwBwAGUA
3266 biAmAClfEBZNZW51IEl0ZW0gKFNlbGVjdCBBbGwpXEFzeW5jIEFycm93c1tTZXBhcmF0b3ItMm8QEQBN
3267 AGUAbgB1ACAASQB0AGUAbQAgACgARgBpAG4AZCAmAClfEBdNZW51IEl0ZW0gKFNob3cgQ29sb3JzKV8Q
3268 EVZlcnRpY2FsIFNjcm9sbGVyW01lbnUgKEVkaXQpXxAWTWVudSAoSVB5dGhvbjFTYW5kYm94KV8QD0Jv
3269 eCAoV29ya3NwYWNlKV8QGU1lbnUgSXRlbSAoU3RvcCBTcGVha2luZylfEBRUYWJsZSBDb2x1bW4gKFZh
3270 bHVlKV8QG01lbnUgSXRlbSAoSVB5dGhvbjFTYW5kYm94KV8QGk1lbnUgSXRlbSAoQ2hlY2sgU3BlbGxp
3271 bmcpXxAQTWVudSBJdGVtIChFZGl0KV8QHU1lbnUgSXRlbSAoSnVtcCB0byBTZWxlY3Rpb24pW1NlcGFy
3272 YXRvci02WVNlcGFyYXRvcm8QHgBNAGUAbgB1ACAASQB0AGUAbQAgACgAQwB1AHMAdABvAG0AaQB6AGUA
3273 IABUAG8AbwBsAGIAYQByICYAKV8QHFRhYmxlIFZpZXcgKFZhcmlhYmxlLCBWYWx1ZSlbU2VwYXJhdG9y
3274 LTNfEBtNZW51IChTcGVsbGluZyBhbmQgR3JhbW1hcilfEBNIb3Jpem9udGFsIFNjcm9sbGVyXxAUTWVu
3275 dSBJdGVtIChNaW5pbWl6ZSlfEBBNZW51IEl0ZW0gKFJlZG8pXxAQTWVudSBJdGVtIChGaW5kKV8QEU1l
3276 bnUgSXRlbSAoUGFzdGUpXxAVSG9yaXpvbnRhbCBTY3JvbGxlci0xUjEwXxAXTWVudSBJdGVtIChIaWRl
3277 IE90aGVycylfEBlNZW51IEl0ZW0gKEZpbmQgUHJldmlvdXMpW1NlcGFyYXRvci00XU1lbnUgKEZvcm1h
3278 dClfEB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktMVEzXUJveCAoQ29uc29sZSlfEBVNZW51IEl0
3279 ZW0gKEZpbmQgTmV4dClfEBRNZW51IEl0ZW0gKFNob3cgQWxsKV8QEE1lbnUgSXRlbSAoWm9vbSlfECdN
3280 ZW51IEl0ZW0gKENoZWNrIFNwZWxsaW5nIFdoaWxlIFR5cGluZyldU2Nyb2xsIFZpZXctMVEyXxAXTWVu
3281 dSBJdGVtIChTbWFydCBMaW5rcylcRmlsZSdzIE93bmVyXxAgTWVudSBJdGVtIChTcGVsbGluZyBhbmQg
3282 R3JhbW1hcilTMTIxW01lbnUgKFZpZXcpXxAcTWVudSBJdGVtIChTbWFydCBDb3B5L1Bhc3RlKV8QEk1l
3283 bnUgSXRlbSAoRm9ybWF0KVtNZW51IChGaW5kKV8QFk1lbnUgSXRlbSAoQ2xlYXIgTWVudSldTWVudSAo
3284 U3BlZWNoKV8QF1B5dGhvbiBDb2NvYSBDb250cm9sbGVyXxAQTWVudSBJdGVtIChVbmRvKVtBcHBsaWNh
3285 dGlvbl8QG1RleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKV8QGVdpbmRvdyAoSVB5dGhvbjEgKENvY29h
3286 KSlfEBNWZXJ0aWNhbCBTY3JvbGxlci0xUzItMV8QD01lbnUgKFNlcnZpY2VzKV8QGk1lbnUgSXRlbSAo
3287 U3RhcnQgU3BlYWtpbmcpW01lbnUgKEZpbGUpUTfSAA4APgYACeiBAYeg0gAOAD4GAAnrgQGHoNIADgA+
3288 BgAJ7oEBh68QlwNUA1sGRwNBA0kE3wJEAnUGSwSKBEEFIAVvA0IGUATRA0QDMgNOBbADMQNRA0sFywM+
3289 AzoGVARWBS4GVwNNBYYGWQMwAgoDbQZcBO0GXgZfAzkDOAS3AywDTAZhBmIDLwBNBdsDQAM0AGsFVQR7
3290 BaAGaQZqAMgDKwUKBGEGbgSpBnAAbANHBnIEFQP1AhoDyAB/A+oCdgQiAz8GewSXBn0DjgZ/A0oDVgaA
3291 A1UFeQIqA0MGgwSfAhADKgROA9IGiAQHAKoDOwNIBb4D4QaNAzYDPAaOA0UD/QMoAsADrgMzAH4GkwRu
3292 BRMExACjA1IDKQVdBPsAHwaaBpsDoAU2A5YGnwMuBWcDUAQqA8AENANGBUEDNQKDA08AQQCxBqgGqQM3
3293 Az0DUwMtBUgDtgasgQGQgK+BAZyBATWBAVmBASyAdIB8gQGhgQEQgPmBAUOBAVuBATqBAaaBASeBAUKA
3294 7YEBa4EBcYDpgQF5gQFigQF6gQEmgQETgQGqgP6BAUiBAcOBAWmBAWOBAfCA5IBugLCBAdmBATGBAb+B
3295 Ac+BAQ+BAQqBAR+AzYEBZ4EB5oEB5IDegAuBAX6BATCA+IAOgQFUgQELgQFsgQG2gQG1gBiAx4EBO4EB
3296 A4EB6oEBGoEBxoCjgQFPgQG9gOqA34CUgM+AaoDagIuA7oEBK4EBrYEBFIEBy4C9gQHQgQFegQGXgQHu
3297 gQGTgQFfgHKBAT6BAbGBARWAloDCgP2A1IEB0YDlgFiBARmBAVOBAXaA2YEB14EBAoEBHoEBvIEBR4Dg
3298 gK6AjoDIgPOAEIEB1YEBB4EBP4EBI4AUgQF9gLyBAVWBATaAAoEB3IEBsoDDgQFJgL6BAeCA2IEBWoEB
3299 dYDvgM6A9IEBTYEBToD8gIOBAXCAB4BUgQG5gQHKgQEGgQEigQGMgNOBAVCAyYEBydIADgA+BgAKiIEB
3300 h68QlwqJCooKiwqMCo0KjgqPCpAKkQqSCpMKlAqVCpYKlwqYCpkKmgqbCpwKnQqeCp8KoAqhCqIKowqk
3301 CqUKpgqnCqgKqQqqCqsKrAqtCq4KrwqwCrEKsgqzCrQKtQq2CrcKuAq5CroKuwq8Cr0Kvgq/CsAKwQrC
3302 CsMKxArFCsYKxwrICskKygrLCswKzQrOCs8K0ArRCtIK0wrUCtUK1grXCtgK2QraCtsK3ArdCt4K3wrg
3303 CuEK4grjCuQK5QrmCucK6ArpCuoK6wrsCu0K7grvCvAK8QryCvMK9Ar1CvYK9wr4CvkK+gr7CvwK/Qr+
3304 Cv8LAAsBCwILAwsECwULBgsHCwgLCQsKCwsLDAsNCw4LDwsQCxELEgsTCxQLFQsWCxcLGAsZCxoLGwsc
3305 Cx0LHgsfgQJjgQJkgQJlgQJmgQJngQJogQJpgQJqgQJrgQJsgQJtgQJugQJvgQJwgQJxgQJygQJzgQJ0
3306 gQJ1gQJ2gQJ3gQJ4gQJ5gQJ6gQJ7gQJ8gQJ9gQJ+gQJ/gQKAgQKBgQKCgQKDgQKEgQKFgQKGgQKHgQKI
3307 gQKJgQKKgQKLgQKMgQKNgQKOgQKPgQKQgQKRgQKSgQKTgQKUgQKVgQKWgQKXgQKYgQKZgQKagQKbgQKc
3308 gQKdgQKegQKfgQKggQKhgQKigQKjgQKkgQKlgQKmgQKngQKogQKpgQKqgQKrgQKsgQKtgQKugQKvgQKw
3309 gQKxgQKygQKzgQK0gQK1gQK2gQK3gQK4gQK5gQK6gQK7gQK8gQK9gQK+gQK/gQLAgQLBgQLCgQLDgQLE
3310 gQLFgQLGgQLHgQLIgQLJgQLKgQLLgQLMgQLNgQLOgQLPgQLQgQLRgQLSgQLTgQLUgQLVgQLWgQLXgQLY
3311 gQLZgQLagQLbgQLcgQLdgQLegQLfgQLggQLhgQLigQLjgQLkgQLlgQLmgQLngQLogQLpgQLqgQLrgQLs
3312 gQLtgQLugQLvgQLwgQLxgQLygQLzgQL0gQL1gQL2gQL3gQL4gQL5EQGrEQFfENMRAWUQfxBQEQGYEQGc
3313 EHwQOhDKEMUQfREBuREBXBBOEOAQ4xBXEMwQ8REBWxDkEQFaEFYQ4RAdEBgRASkQUhEBvRDHEGcQ4hEB
3314 lxEBXRDdEIgQUxDOEI4QwRCGEN8RAbwRAScRAVgRAWkRAXQRAYERAXEQ6xEBpRBvEEkQTRCDEI8RAaMR
3315 AWoRAXUQBRATEMYQSBEBtBDpEJUQ0REBWREBmRDNEQGWEDkRAZ0QwxEBaxA4EMkQ2RDSENYRAW0RAbUQ
3316 XBEBuBEBKhEBmxDwEOwQyBEBmhEBYxAXENcQ2hDLEQGiEOgRAWgQcBCRENUQJxEBbxCQEQFuEQEsEQFk
3317 EQGeEEsRAa0RAaQQ0BCWEO8Q2xEBoBEBrBD1EGoRAWIRAb4Q2BCBEQFeEQEoENwRASsRAXAQfhEBbBDU
3318 EM8RAaYRAXYT//////////0QJREBnxDmEQFzEQGhEIIQShEBchDeEQGoEOcQxBBREE/SAA4APgBpC7mA
3319 NKDSAA4APgYAC7yBAYeg0gAOAD4GAAu/gQGHoNIANwA4C8ELwqILwgA7Xk5TSUJPYmplY3REYXRhAAgA
3320 GQAiACcAMQA6AD8ARABSAFQAZgZmBmwGtwa+BsUG0wblBwEHDwcbBycHNQdAB04Hagd4B4sHnQe3B8EH
3321 zgfQB9MH1gfZB9wH3gfhB+MH5gfpB+wH7wfxB/MH9gf5B/wH/wgICBQIFggYCCYILwg4CEMISAhXCGAI
3322 cwh8CIcIiQiMCI4IuwjICNUI6wj5CQMJEQkeCTAJRAlQCVIJVAlWCVgJWglfCWEJYwllCWcJaQmECZcJ
3323 oAm9Cc8J2gnjCe8J+wn9Cf8KAQoECgYKCAoKChMKFQoaChwKHgpHCk8KXgptCnoKfAp+CoAKggqFCocK
3324 iQqLCowKlQqXCpwKngqgCtkK4wrvCv0LCgsUCyYLNAs2CzgLOgs8Cz0LPwtBC0MLRQtHC0kLSwtNC1YL
3325 WAtbC10Legt8C34LgAuCC4QLhguPC5ELlAuWC8cL0wvcC+gL9gv4C/oL/Av+DAEMAwwFDAcMCQwLDA0M
3326 FgwYDB8MIQwjDCUMWgxjDGwMdgyADIoMjAyODJAMkgyUDJYMmAybDJ0MnwyhDKMMpQyuDLAMswy1DOoM
3327 /A0GDRMNHw0pDTINPQ0/DUENQw1FDUcNSQ1LDU4NUA1SDVQNVg1YDWENYw2IDYoNjA2ODZANkg2UDZYN
3328 mA2aDZwNng2gDaINpA2mDagNqg3GDdsN+A4ZDjUOWw6BDp8Ouw7XDvQPDA8mD1oPdw+TD8APyQ/QD90P
3329 4w/6EA8QGRAkECwQPhBAEEIQSxBNEGIQdRCDEI0QjxCREJMQlRCiEKsQrRCvELEQuhDEEMYQxxDQENcQ
3330 6RDyEPsRFxEsETURNxE6ETwRRRFMEVsRYxFsEXERehF/EaARqBHCEdUR6RIAEhUSKBIqEi8SMRIzEjUS
3331 NxI5EjsSSBJVElsSXRJ4EoEShhKOEpsSoxKlEqcSqhK3Er8SwRLGEsgSyhLPEtES0xLoEvQTAhMEEwYT
3332 CBMKExETLxM8Ez4TShNfE2ETYxNlE2cTexOEE4kTlhOjE6UTqhOsE64TsxO1E7cTwxPQE9IT2RPiE+cT
3333 /hQLFBMUHBQnFC4UNRRBFFgUcBR9FH8UghSPFJkUphSoFKoUshS7FMAUyRTSFN0VAhULFRQVHhUgFSIV
3334 JBUmFS8VMRUzFTUVPhVWFWMVbBV3FYIVjBW5FcQVxhXIFcoVzBXOFdAV0hXbFeQV/xYYFiEWKhY3Fk4W
3335 VxZeFmkWcBaNFpkWpBauFrsWxxbMFs4W0BbSFtQW1hbeFu8W9hb9FwYXCBcRFxMXFhcjFywXMRc4F00X
3336 TxdRF1MXVRdrF3gXeheIF5EXmhesF7kXwBfJF9IX2BgRGBMYFRgXGBkYGhgcGB4YIBgiGCQYJhgvGDEY
3337 NBg2GFMYVRhXGFkYWxhdGF8YaBhqGG0YbxiuGLsYzhjbGN0Y3xjhGOMY5RjnGOkY6xj+GQAZAhkEGQYZ
3338 CBkRGRMZHhkgGSIZJBkmGSgZVRlXGVkZWxldGV8ZYRljGWUZZxlwGXIZdRl3Gc4Z8Bn6GgcaHBo2GlIa
3339 bRp3GoMalRqkGsMazxrRGtMa3BreGuAa4RrjGuwa9Rr3Gvga+hr8Gv4bABsJGxQbMRs9Gz8bQRtDG0Ub
3340 RxtJG3YbeBt6G3wbfhuAG4IbhBuGG4gbkhubG6QbuBvRG9Mb1RvXG9kb2xvyG/scBBwSHBscHRwiHCQc
3341 JhxPHF4caxx2HIUckBybHKgcqRyrHK0cthy4HMEcyhzLHM0c6hzvHPEc8xz1HPcc+R0CHQ8dER0dHTId
3342 NB02HTgdOh1MHVUdYB10HZUdox2oHaodrB2uHbAdsh21HbcdwR3SHdQd3R3fHeId9x35Hfsd/R3/Hhge
3343 LR4vHjEeMx41HkgeUR5WHmQejR6OHpAekh6bHp0enh6gHr0evx7BHsMexR7HHs0e7h7wHvIe9B72Hvge
3344 +h8PHxEfEx8VHxcfIR8uHzAfNR8+H0kfYR+GH4gfih+MH44fkB+SH5QfnR+2H98f4R/jH+Uf5x/pH+sf
3345 7R/2IA4gFyAZIBwgHiA0IE0gZCB9IJognCCeIKAgoiCkIK4guyC9INYg+SECIQshFyFAIUshViFgIW0h
3346 byFxIXMhfCGFIYghiiGNIY8hkSGWIZghoSGmIbEhySHSIdsh8SH8IhQiJyIwIjUiSCJRIlMitCK2Irgi
3347 uiK8Ir4iwCLCIsQixiLIIsoizCLOItAi0yLWItki3CLfIuIi5SLoIusi7iLxIvQi9yL6Iv0jACMDIwYj
3348 CSMMIw8jEiMVIxgjGyMeIyEjJCMnIyojLSMwIzMjQCNJI1EjUyNVI1cjfCOEI5gjoyOxI7sjyCPPI9Uj
3349 1yPZI94j4CPlI+cj6SPrI/gkBCQHJAokDSQaJBwkKSQ4JDokPCQ+JEYkWCRhJGYkeSSGJIgkiiSMJJ8k
3350 qCStJLgk3CTlJOwlBCUTJSAlIiUkJSYlRyVJJUslTSVPJVElUyVgJWMlZiVpJX0lfyWfJawlriWwJbIl
3351 1yXZJdsl3SXfJeEl4yX2JfgmEyYgJiImJCYmJkcmSSZLJk0mTyZRJlMmYCZjJmYmaSZuJnAmfiaLJo0m
3352 jyaRJrImtCa2Jrgmuia8Jr4myybOJtEm1CbZJtsm4SbuJvAm8ib0JxUnFycZJx4nICciJyQnJicrJy0n
3353 MydAJ0InRCdGJ2cnaSdrJ3Ancid0J3YneCeJJ4wnjyeSJ5UnoSejJ7wnySfLJ80nzyfwJ/In9Cf2J/gn
3354 +if8KAkoDCgPKBIoHiggKDgoRShHKEkoSyhsKG4ocChyKHQodih4KH4ogCiHKJQoliiYKJoovyjBKMMo
3355 xSjHKMkoyyjWKPAo/Sj/KQEpAykkKSYpKCkqKSwpLikwKT0pQClDKUYpVCliKXMpgSmDKYUphymJKZIp
3356 lCmWKa8puCnBKcgp3ynsKe4p8CnyKhMqFSoXKhkqGyodKh8qJiouKjsqPSo/KkIqYyplKmcqaipsKm4q
3357 cCqBKoQqhyqKKo0qliqYKq4quyq9KsAqwyrkKuYq6SrrKu0q7yrxKwYrGCslKycrKistK04rUCtTK1Ur
3358 VytZK1srZCt9K4orjCuPK5Irsyu1K7gruyu9K78rwSvHK8kr1yvoK+or7CvvK/IsDywRLBQsFiwYLBos
3359 HCw0LFQsYSxjLGYsaSyKLIwsjyySLJQsliyZLKYsqSysLK8svizALM8s3CzeLOEs5C0FLQctCi0NLQ8t
3360 ES0TLR4tIC0rLTgtOi09LUAtYS1jLWYtaC1qLWwtbi2FLYstmC2aLZ0toC3BLcMtxi3ILcotzC3PLe0u
3361 Di4bLh0uIC4jLkQuRi5JLkwuTi5QLlIuXy5hLmgudS53LnoufS6eLqAuoy6mLqguqi6sLr0uvy7RLt4u
3362 4C7jLuYvBy8JLwwvDy8RLxMvFS8sLy4vOS9GL0gvSy9OL3MvdS94L3svfS9/L4EvjS+PL68vwC/CL8Qv
3363 xy/KL9Mv1S/YL/UwCTAWMBgwGzAeMD8wQTBEMEYwSDBKMEwwUTBeMGswbTBwMHMwlDCWMJkwnDCeMKAw
3364 ojCnMKkwrzC8ML4wwTDEMOUw5zDqMO0w7zDxMPQxATEEMQcxCjEXMRkxLzFAMUIxRTFIMUoxUzFVMVcx
3365 ZDFmMWkxbDGNMY8xkjGUMZYxmDGaMakxuDHFMccxyjHNMe4x8DHzMfYx+DH6Mf0yCjINMhAyEzIqMiwy
3366 NjJDMkUySDJLMmwybjJxMnMydTJ3MnoyizKOMpEylDKXMqIyujLHMskyzDLPMvAy8jL1Mvcy+TL7Mv4z
3367 JTNHM1QzVjNZM1wzfTN/M4IzhTOHM4kzizOPM5EzljOnM6kzqzOtM7AzuTPKM8wzzjPQM9Mz6zP4M/oz
3368 /TQANCU0LzQxNDM0NjQ5NDs0PTQ/NE00TzReNGs0bTRwNHM0lDSWNJk0nDSeNKA0ozTANMI01DThNOM0
3369 5jTpNQY1CDULNQ01DzURNRM1JTU+NUs1TTVQNVM1dDV2NXk1ezV9NX81gjWgNbk11jXgNeo2CTYMNg82
3370 EjYVNhc2GjZHNmQ2ezaINpM2ojaxNtY28TcKNx43HzciNyM3JjcnNyo3LTcuNy83MDczNzw3PjdFN0g3
3371 SzdON1M3VzddN2Y3aTdsN283gDeGN5E3nTegN6M3pjenN7A3uTe+N9E32jffN+g38zgMOCA4NThCOF84
3372 dTh+OIU4nTi6OL04vzjCOMU4yDjLOOc4+zkCOR85IjklOSg5KzktOTA5TzlnOYQ5hzmKOY05kDmTOZY5
3373 wjnUOe86DDoPOhE6FDoXOhk6HDo4OkA6UzpcOl87MDsyOzU7ODs6Ozw7PztCO0Q7RztKO007UDtTO1Y7
3374 WTtbO147YTtkO2c7aTtrO247cTt0O3c7ejt9O4A7gjuFO4c7ijuNO5A7kzuWO5g7mzueO6E7pDunO6k7
3375 rDuuO7A7sju0O7Y7uDu6O7w7vzvCO8U7xzvKO8070DvSO9U72DvaO9w73jvhO+M75TvoO+o77TvwO/I7
3376 9Dv2O/g7+zv+PAE8BDwGPAk8DDwPPBI8FDwXPBk8HDwfPCE8IzwlPCg8KjwsPC48MTw0PDc8OTw8PGU8
3377 bzxxPHM8djx4PHo8fDx+PIE8iDyXPKA8ojynPKo8rDy1PLo84zzlPOg86zztPO888TzzPPY9Aj0LPQ09
3378 ED0TPSw9VT1XPVk9XD1ePWA9Yj1kPWc9dT1+PYA9hz2JPYs9jj2fPaI9pT2oPas9tT2+PcA9zz3SPdU9
3379 2D3bPd494T3kPg0+Dz4RPhQ+Fj4YPho+HT4gPjI+Oz49PlQ+Vz5aPl0+YD5jPmY+aT5rPm4+cT50Pp0+
3380 qz64Pro+vD69Pr8+wD7CPsQ+xj7nPuk+7D7vPvE+8z71Pw4/ED85Pzs/PT8+P0A/QT9DP0U/Rz9wP3I/
3381 dT94P3o/fD9+P4A/gz+MP50/oD+jP6Y/qT+yP7Q/tT/HP/A/8j/0P/U/9z/4P/o//D/+QCdAKUArQCxA
3382 LkAvQDFAM0A1QEJAa0BtQG9AckB0QHZAeEB7QH5Ag0CMQI5ApUCoQKtArkCxQLRAtkC5QLxAv0DCQMVA
3383 5kDoQOtA7kDwQPJA9ED4QPpBG0EdQSBBI0ElQSdBKUE0QTZBX0FhQWNBZEFmQWdBaUFrQW1BlkGYQZpB
3384 m0GdQZ5BoEGiQaRBzUHPQdFB1EHWQdhB2kHdQeBB5UHuQfBCC0INQg9CEkIVQhhCGkIcQh9CIkIlQihC
3385 K0IuQldCWUJbQlxCXkJfQmFCY0JlQo5CkEKSQpNClUKWQphCmkKcQsVCx0LJQsxCzkLQQtJC1ELXQtxC
3386 5ULnQvJC9EL3QvpC/UL/QyRDJkMpQytDLUMvQzFDO0NgQ2JDZUNoQ2pDbENuQ3xDoUOjQ6ZDqUOrQ61D
3387 r0OxQ8pDzEP1Q/dD+kP9Q/9EAUQDRAVECEQfRChEKkQzRDZEOUQ8RD9EaERqRGxEb0RxRHNEdUR4RHtE
3388 gkSLRI1EkkSVRJdEuES6RL1EwETCRMRExkTRRPpE/ET/RQJFBEUGRQhFC0UORRNFHEUeRSNFJkUpRVJF
3389 VEVWRVlFW0VdRV9FYkVlRWxFdUV3RYBFgkWFRYhFi0W0RbZFuEW5RbtFvEW+RcBFwkXRRfpF/EX/RgJG
3390 BEYGRghGC0YORhNGHEYeRiFGJEYwRjlGPEcNRw9HEUcTRxVHF0cZRxtHHUcfRyJHJEcmRylHLEcuRzFH
3391 NEc2RzhHO0c9R0BHQkdER0dHSUdLR05HUEdSR1RHVkdZR1tHXUdfR2FHY0dlR2dHakdsR25HcEdyR3RH
3392 dkd4R3tHfUeAR4JHhEeHR4pHjUePR5FHk0eWR5hHmkedR59HoUejR6VHp0epR6tHrUevR7FHtEe2R7hH
3393 uke8R75HwEfDR8VHyEfKR8xHzkfQR9NH1kfZR9xH30fhR+NH5UfnR+lH60fuR/BH8kf1R/dIAEgDSNZI
3394 2EjbSN5I4EjiSOVI6EjqSO1I8EjzSPZI+Uj8SP9JAkkESQdJCkkNSQ9JEUkUSRdJGkkdSSBJI0kmSShJ
3395 K0ktSTBJM0k2STlJPEk+SUFJRElHSUpJTUlPSVJJVElWSVhJWklcSV5JYEliSWVJaElrSW1JcElzSXZJ
3396 eEl7SX5JgEmCSYRJh0mJSYtJjkmQSZNJlkmYSZpJnEmeSaFJpEmnSapJrEmvSbJJtEm3SbpJvUm/ScJJ
3397 xEnHSclJy0nNSdBJ0knUSdZJ2UncSd9J4UnkSe1J8ErDSsZKyUrMSs9K0krVSthK20reSuFK5ErnSupK
3398 7UrwSvNK9kr5SvxK/0sCSwVLCEsLSw5LEUsUSxdLGksdSyBLI0smSylLLEsvSzJLNUs4SztLPktBS0RL
3399 R0tKS01LUEtTS1ZLWUtcS19LYktlS2hLa0tuS3FLdEt3S3pLfUuAS4NLhkuJS4xLj0uSS5VLmEubS55L
3400 oUukS6dLqkutS7BLs0u2S7lLvEu/S8JLxUvIS8tLzkvRS9RL10vaS91L4EvjS+ZL6UvsS+9L8kv1S/hL
3401 +0wWTCtMLUxBTFtMdUyZTK5MwUzWTNhM9E0rTVVNcE15TYdNiU2bTZ1NqU3ATeVN6k39TglOLE4/TlhO
3402 ZU6BToxOr06zTrVOzE7YTuJPA08YTz1PVk9jT29PlE+uT8JPzk/nT/lQFVAsUEpQZ1B6UJpQplCwUO9R
3403 DlEaUThRTlFlUXhRi1GfUbdRulHUUfBR/FIKUipSLFI6UlJSaVJ8UqZStFK2UtBS3VMAUwRTEFMvU0RT
3404 UFNpU3dTkVOkU7BTzlPqVABUBFQWVDNUP1RBVEpUTVROVFdUWlRbVGRUZ1WYVZtVnVWgVaNVplWpVatV
3405 rVWwVbNVtVW4VbtVvlXBVcRVx1XJVcxVz1XRVdRV11XaVd1V4FXjVeVV6FXrVe5V8VX0VfZV+FX6Vf1W
3406 AFYDVgZWCVYMVg9WEVYUVhdWGlYcVh5WIVYkViZWKFYrVi5WMVY0VjdWOVY7Vj5WQVZEVkdWSlZMVk9W
3407 UlZUVlZWWFZaVlxWXlZgVmJWZVZoVmtWblZwVnNWdlZ5VnxWf1aCVoRWh1aKVo1Wj1aRVpNWlVaYVppW
3408 nFafVqJWpVanVqpWrVawVrNWtla4VrpWvFa+VsBWwlbFVshWy1bOVtBW01bVVthW21bdVuBW41blVuhW
3409 6lbtVu9W8lb1VvdW+Vb7Vv5XAVcDVwVXCFcKVwxXD1cSVxVXGFcbVx1XIFciVyVXLlcxWGJYZVhoWGtY
3410 blhxWHRYd1h6WH1YgFiDWIZYiViMWI9YkliVWJhYm1ieWKFYpFinWKpYrViwWLNYtli5WLxYv1jCWMVY
3411 yFjLWM5Y0VjUWNdY2ljdWOBY41jmWOlY7FjvWPJY9Vj4WPtY/lkBWQRZB1kKWQ1ZEFkTWRZZGVkcWR9Z
3412 IlklWShZK1kuWTFZNFk3WTpZPVlAWUNZRllJWUxZT1lSWVVZWFlbWV5ZYVlkWWdZalltWXBZc1l2WXlZ
3413 fFl/WYJZhVmIWYtZjlmRWZRZl1maWZ1ZoFmjWaZZqVmsWa9Zslm1WbhZu1m+WcFZxFnHWcpZzVnQWdNZ
3414 1lnZWdxZ31niWeVZ6FnrWe5Z8Vn0WfdZ+ln9WgBaA1oGWglaDFoPWhJaFVoYWhtaHlohWiRaJ1oqWi1a
3415 L1oyWjRaNlo5WjxaPlpAWkJaRFpGWklaTFpOWlBaUlpUWlZaWFpbWl1aYFpiWmRaZlpoWmtabVpwWnJa
3416 dFp2WnlafFp+WoBaglqEWoZaiFqKWoxaj1qSWpVamFqbWp5aoVqjWqZaqFqqWqxarlqwWrNatlq5Wrta
3417 vVq/WsFaxFrGWshaylrNWtBa0lrVWtda2lrcWt9a4VrjWuVa51rpWuxa71rxWvRa91r6Wvxa/lsAWwNb
3418 BlsIWwpbDFsOWxFbE1sWWxhbGlscWx5bIVsjWyZbKVssWy9bMVs0WzdbOVs7Wz1bP1tCW0VbR1tJW0xb
3419 T1tRW1NbVltZW1tbXlthW2NbZltoW2pbbVtwW3lbe1t+W4Bbg1uGW4hbiluNW49bkluUW5ZbmFuaW6Nb
3420 pVumW69bsluzW7xbv1vAW8lbzgAAAAAAAAICAAAAAAAAC8MAAAAAAAAAAAAAAAAAAFvdA</bytes>
3421 </object>
3422 </data>
3423 </archive>
@@ -0,0 +1,293 b''
1 // !$*UTF8*$!
2 {
3 archiveVersion = 1;
4 classes = {
5 };
6 objectVersion = 44;
7 objects = {
8
9 /* Begin PBXBuildFile section */
10 77631A270C06C501005415CB /* Python.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77631A260C06C501005415CB /* Python.framework */; };
11 77631A3F0C0748CF005415CB /* main.py in Resources */ = {isa = PBXBuildFile; fileRef = 77631A3E0C0748CF005415CB /* main.py */; };
12 7790198F0C07548A00326F66 /* IPython1SandboxAppDelegate.py in Resources */ = {isa = PBXBuildFile; fileRef = 7790198E0C07548A00326F66 /* IPython1SandboxAppDelegate.py */; };
13 77C8C1F90C07829500965286 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 77C8C1F70C07829500965286 /* MainMenu.xib */; };
14 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
15 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
16 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
17 /* End PBXBuildFile section */
18
19 /* Begin PBXFileReference section */
20 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
21 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = "<absolute>"; };
22 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = "<absolute>"; };
23 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
24 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = "<absolute>"; };
25 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = "<absolute>"; };
26 32CA4F630368D1EE00C91783 /* IPython1Sandbox_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IPython1Sandbox_Prefix.pch; sourceTree = "<group>"; };
27 4CA32F870D8879B100311764 /* IPythonCocoaController Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "IPythonCocoaController Tests-Info.plist"; sourceTree = "<group>"; };
28 77631A260C06C501005415CB /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = /System/Library/Frameworks/Python.framework; sourceTree = "<absolute>"; };
29 77631A3E0C0748CF005415CB /* main.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = main.py; sourceTree = "<group>"; };
30 7790198E0C07548A00326F66 /* IPython1SandboxAppDelegate.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = IPython1SandboxAppDelegate.py; sourceTree = "<group>"; };
31 77C8C1F80C07829500965286 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = "<group>"; };
32 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
33 8D1107320486CEB800E47090 /* IPython1Sandbox.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IPython1Sandbox.app; sourceTree = BUILT_PRODUCTS_DIR; };
34 /* End PBXFileReference section */
35
36 /* Begin PBXFrameworksBuildPhase section */
37 8D11072E0486CEB800E47090 /* Frameworks */ = {
38 isa = PBXFrameworksBuildPhase;
39 buildActionMask = 2147483647;
40 files = (
41 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
42 77631A270C06C501005415CB /* Python.framework in Frameworks */,
43 );
44 runOnlyForDeploymentPostprocessing = 0;
45 };
46 /* End PBXFrameworksBuildPhase section */
47
48 /* Begin PBXGroup section */
49 080E96DDFE201D6D7F000001 /* Classes */ = {
50 isa = PBXGroup;
51 children = (
52 7790198E0C07548A00326F66 /* IPython1SandboxAppDelegate.py */,
53 );
54 name = Classes;
55 sourceTree = "<group>";
56 };
57 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
58 isa = PBXGroup;
59 children = (
60 77631A260C06C501005415CB /* Python.framework */,
61 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
62 );
63 name = "Linked Frameworks";
64 sourceTree = "<group>";
65 };
66 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
67 isa = PBXGroup;
68 children = (
69 29B97324FDCFA39411CA2CEA /* AppKit.framework */,
70 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */,
71 29B97325FDCFA39411CA2CEA /* Foundation.framework */,
72 );
73 name = "Other Frameworks";
74 sourceTree = "<group>";
75 };
76 19C28FACFE9D520D11CA2CBB /* Products */ = {
77 isa = PBXGroup;
78 children = (
79 8D1107320486CEB800E47090 /* IPython1Sandbox.app */,
80 );
81 name = Products;
82 sourceTree = "<group>";
83 };
84 29B97314FDCFA39411CA2CEA /* IPython1Sandbox */ = {
85 isa = PBXGroup;
86 children = (
87 080E96DDFE201D6D7F000001 /* Classes */,
88 29B97315FDCFA39411CA2CEA /* Other Sources */,
89 29B97317FDCFA39411CA2CEA /* Resources */,
90 29B97323FDCFA39411CA2CEA /* Frameworks */,
91 19C28FACFE9D520D11CA2CBB /* Products */,
92 4CA32F870D8879B100311764 /* IPythonCocoaController Tests-Info.plist */,
93 );
94 name = IPython1Sandbox;
95 sourceTree = "<group>";
96 };
97 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
98 isa = PBXGroup;
99 children = (
100 32CA4F630368D1EE00C91783 /* IPython1Sandbox_Prefix.pch */,
101 29B97316FDCFA39411CA2CEA /* main.m */,
102 77631A3E0C0748CF005415CB /* main.py */,
103 );
104 name = "Other Sources";
105 sourceTree = "<group>";
106 };
107 29B97317FDCFA39411CA2CEA /* Resources */ = {
108 isa = PBXGroup;
109 children = (
110 77C8C1F70C07829500965286 /* MainMenu.xib */,
111 8D1107310486CEB800E47090 /* Info.plist */,
112 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
113 );
114 name = Resources;
115 sourceTree = "<group>";
116 };
117 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
118 isa = PBXGroup;
119 children = (
120 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
121 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
122 );
123 name = Frameworks;
124 sourceTree = "<group>";
125 };
126 /* End PBXGroup section */
127
128 /* Begin PBXNativeTarget section */
129 8D1107260486CEB800E47090 /* IPython1Sandbox */ = {
130 isa = PBXNativeTarget;
131 buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "IPython1Sandbox" */;
132 buildPhases = (
133 8D1107290486CEB800E47090 /* Resources */,
134 8D11072C0486CEB800E47090 /* Sources */,
135 8D11072E0486CEB800E47090 /* Frameworks */,
136 );
137 buildRules = (
138 );
139 dependencies = (
140 );
141 name = IPython1Sandbox;
142 productInstallPath = "$(HOME)/Applications";
143 productName = IPython1Sandbox;
144 productReference = 8D1107320486CEB800E47090 /* IPython1Sandbox.app */;
145 productType = "com.apple.product-type.application";
146 };
147 /* End PBXNativeTarget section */
148
149 /* Begin PBXProject section */
150 29B97313FDCFA39411CA2CEA /* Project object */ = {
151 isa = PBXProject;
152 buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "IPython1Sandbox" */;
153 compatibilityVersion = "Xcode 3.0";
154 hasScannedForEncodings = 1;
155 mainGroup = 29B97314FDCFA39411CA2CEA /* IPython1Sandbox */;
156 projectDirPath = "";
157 projectRoot = "";
158 targets = (
159 8D1107260486CEB800E47090 /* IPython1Sandbox */,
160 );
161 };
162 /* End PBXProject section */
163
164 /* Begin PBXResourcesBuildPhase section */
165 8D1107290486CEB800E47090 /* Resources */ = {
166 isa = PBXResourcesBuildPhase;
167 buildActionMask = 2147483647;
168 files = (
169 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
170 77631A3F0C0748CF005415CB /* main.py in Resources */,
171 7790198F0C07548A00326F66 /* IPython1SandboxAppDelegate.py in Resources */,
172 77C8C1F90C07829500965286 /* MainMenu.xib in Resources */,
173 );
174 runOnlyForDeploymentPostprocessing = 0;
175 };
176 /* End PBXResourcesBuildPhase section */
177
178 /* Begin PBXSourcesBuildPhase section */
179 8D11072C0486CEB800E47090 /* Sources */ = {
180 isa = PBXSourcesBuildPhase;
181 buildActionMask = 2147483647;
182 files = (
183 8D11072D0486CEB800E47090 /* main.m in Sources */,
184 );
185 runOnlyForDeploymentPostprocessing = 0;
186 };
187 /* End PBXSourcesBuildPhase section */
188
189 /* Begin PBXVariantGroup section */
190 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
191 isa = PBXVariantGroup;
192 children = (
193 089C165DFE840E0CC02AAC07 /* English */,
194 );
195 name = InfoPlist.strings;
196 sourceTree = "<group>";
197 };
198 77C8C1F70C07829500965286 /* MainMenu.xib */ = {
199 isa = PBXVariantGroup;
200 children = (
201 77C8C1F80C07829500965286 /* English */,
202 );
203 name = MainMenu.xib;
204 sourceTree = "<group>";
205 };
206 /* End PBXVariantGroup section */
207
208 /* Begin XCBuildConfiguration section */
209 C01FCF4B08A954540054247B /* Debug */ = {
210 isa = XCBuildConfiguration;
211 buildSettings = {
212 COPY_PHASE_STRIP = NO;
213 CURRENT_PROJECT_VERSION = 1;
214 GCC_DYNAMIC_NO_PIC = NO;
215 GCC_ENABLE_FIX_AND_CONTINUE = YES;
216 GCC_MODEL_TUNING = G5;
217 GCC_OPTIMIZATION_LEVEL = 0;
218 GCC_PRECOMPILE_PREFIX_HEADER = YES;
219 GCC_PREFIX_HEADER = IPython1Sandbox_Prefix.pch;
220 INFOPLIST_FILE = Info.plist;
221 INSTALL_PATH = "$(HOME)/Applications";
222 PRODUCT_NAME = IPython1Sandbox;
223 VERSIONING_SYSTEM = "apple-generic";
224 WRAPPER_EXTENSION = app;
225 ZERO_LINK = YES;
226 };
227 name = Debug;
228 };
229 C01FCF4C08A954540054247B /* Release */ = {
230 isa = XCBuildConfiguration;
231 buildSettings = {
232 CURRENT_PROJECT_VERSION = 1;
233 DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
234 GCC_MODEL_TUNING = G5;
235 GCC_PRECOMPILE_PREFIX_HEADER = YES;
236 GCC_PREFIX_HEADER = IPython1Sandbox_Prefix.pch;
237 INFOPLIST_FILE = Info.plist;
238 INSTALL_PATH = "$(HOME)/Applications";
239 PRODUCT_NAME = IPython1Sandbox;
240 VERSIONING_SYSTEM = "apple-generic";
241 WRAPPER_EXTENSION = app;
242 };
243 name = Release;
244 };
245 C01FCF4F08A954540054247B /* Debug */ = {
246 isa = XCBuildConfiguration;
247 buildSettings = {
248 GCC_WARN_ABOUT_RETURN_TYPE = YES;
249 GCC_WARN_UNUSED_VARIABLE = YES;
250 PREBINDING = NO;
251 SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
252 };
253 name = Debug;
254 };
255 C01FCF5008A954540054247B /* Release */ = {
256 isa = XCBuildConfiguration;
257 buildSettings = {
258 ARCHS = (
259 ppc,
260 i386,
261 );
262 GCC_WARN_ABOUT_RETURN_TYPE = YES;
263 GCC_WARN_UNUSED_VARIABLE = YES;
264 PREBINDING = NO;
265 SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
266 };
267 name = Release;
268 };
269 /* End XCBuildConfiguration section */
270
271 /* Begin XCConfigurationList section */
272 C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "IPython1Sandbox" */ = {
273 isa = XCConfigurationList;
274 buildConfigurations = (
275 C01FCF4B08A954540054247B /* Debug */,
276 C01FCF4C08A954540054247B /* Release */,
277 );
278 defaultConfigurationIsVisible = 0;
279 defaultConfigurationName = Release;
280 };
281 C01FCF4E08A954540054247B /* Build configuration list for PBXProject "IPython1Sandbox" */ = {
282 isa = XCConfigurationList;
283 buildConfigurations = (
284 C01FCF4F08A954540054247B /* Debug */,
285 C01FCF5008A954540054247B /* Release */,
286 );
287 defaultConfigurationIsVisible = 0;
288 defaultConfigurationName = Release;
289 };
290 /* End XCConfigurationList section */
291 };
292 rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
293 }
@@ -0,0 +1,39 b''
1 #
2 # IPython1SandboxAppDelegate.py
3 # IPython1Sandbox
4 #
5 # Created by Barry Wark on 3/4/08.
6 # Copyright __MyCompanyName__ 2008. All rights reserved.
7 #
8
9 from Foundation import NSObject, NSPredicate
10 import objc
11 import threading
12
13 from PyObjCTools import AppHelper
14
15 from twisted.internet import reactor
16
17 class IPython1SandboxAppDelegate(NSObject):
18 ipythonController = objc.IBOutlet()
19
20 def applicationShouldTerminate_(self, sender):
21 if reactor.running:
22 reactor.addSystemEventTrigger(
23 'after', 'shutdown', AppHelper.stopEventLoop)
24 reactor.stop()
25 return False
26 return True
27
28
29 def applicationDidFinishLaunching_(self, sender):
30 reactor.interleave(AppHelper.callAfter)
31 assert(reactor.running)
32
33
34 def workspaceFilterPredicate(self):
35 return NSPredicate.predicateWithFormat_("NOT (self.value BEGINSWITH '<')")
36
37
38
39
@@ -0,0 +1,7 b''
1 //
2 // Prefix header for all source files of the 'IPython1Sandbox' target in the 'IPython1Sandbox' project
3 //
4
5 #ifdef __OBJC__
6 #import <Cocoa/Cocoa.h>
7 #endif
@@ -0,0 +1,20 b''
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 <plist version="1.0">
4 <dict>
5 <key>CFBundleDevelopmentRegion</key>
6 <string>English</string>
7 <key>CFBundleExecutable</key>
8 <string>${EXECUTABLE_NAME}</string>
9 <key>CFBundleIdentifier</key>
10 <string>com.yourcompany.IPythonCocoaController Tests</string>
11 <key>CFBundleInfoDictionaryVersion</key>
12 <string>6.0</string>
13 <key>CFBundlePackageType</key>
14 <string>BNDL</string>
15 <key>CFBundleSignature</key>
16 <string>????</string>
17 <key>CFBundleVersion</key>
18 <string>1.0</string>
19 </dict>
20 </plist>
@@ -0,0 +1,30 b''
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 <plist version="1.0">
4 <dict>
5 <key>CFBundleDevelopmentRegion</key>
6 <string>English</string>
7 <key>CFBundleExecutable</key>
8 <string>${EXECUTABLE_NAME}</string>
9 <key>CFBundleIconFile</key>
10 <string></string>
11 <key>CFBundleIdentifier</key>
12 <string>com.yourcompany.IPython1Sandbox</string>
13 <key>CFBundleInfoDictionaryVersion</key>
14 <string>6.0</string>
15 <key>CFBundleName</key>
16 <string>${PRODUCT_NAME}</string>
17 <key>CFBundlePackageType</key>
18 <string>APPL</string>
19 <key>CFBundleShortVersionString</key>
20 <string>0.1</string>
21 <key>CFBundleSignature</key>
22 <string>????</string>
23 <key>CFBundleVersion</key>
24 <string>1.0</string>
25 <key>NSMainNibFile</key>
26 <string>MainMenu</string>
27 <key>NSPrincipalClass</key>
28 <string>NSApplication</string>
29 </dict>
30 </plist>
@@ -0,0 +1,49 b''
1 //
2 // main.m
3 // IPython1Sandbox
4 //
5 // Created by Barry Wark on 3/4/08.
6 // Copyright __MyCompanyName__ 2008. All rights reserved.
7 //
8
9 #import <Python/Python.h>
10 #import <Cocoa/Cocoa.h>
11
12 int main(int argc, char *argv[])
13 {
14 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
15
16 NSBundle *mainBundle = [NSBundle mainBundle];
17 NSString *resourcePath = [mainBundle resourcePath];
18 NSArray *pythonPathArray = [NSArray arrayWithObjects: resourcePath, [resourcePath stringByAppendingPathComponent:@"PyObjC"], nil];
19
20 setenv("PYTHONPATH", [[pythonPathArray componentsJoinedByString:@":"] UTF8String], 1);
21
22 NSArray *possibleMainExtensions = [NSArray arrayWithObjects: @"py", @"pyc", @"pyo", nil];
23 NSString *mainFilePath = nil;
24
25 for (NSString *possibleMainExtension in possibleMainExtensions) {
26 mainFilePath = [mainBundle pathForResource: @"main" ofType: possibleMainExtension];
27 if ( mainFilePath != nil ) break;
28 }
29
30 if ( !mainFilePath ) {
31 [NSException raise: NSInternalInconsistencyException format: @"%s:%d main() Failed to find the Main.{py,pyc,pyo} file in the application wrapper's Resources directory.", __FILE__, __LINE__];
32 }
33
34 Py_SetProgramName("/usr/bin/python");
35 Py_Initialize();
36 PySys_SetArgv(argc, (char **)argv);
37
38 const char *mainFilePathPtr = [mainFilePath UTF8String];
39 FILE *mainFile = fopen(mainFilePathPtr, "r");
40 int result = PyRun_SimpleFile(mainFile, (char *)[[mainFilePath lastPathComponent] UTF8String]);
41
42 if ( result != 0 )
43 [NSException raise: NSInternalInconsistencyException
44 format: @"%s:%d main() PyRun_SimpleFile failed with file '%@'. See console for errors.", __FILE__, __LINE__, mainFilePath];
45
46 [pool drain];
47
48 return result;
49 }
@@ -0,0 +1,24 b''
1 #
2 # main.py
3 # IPython1Sandbox
4 #
5 # Created by Barry Wark on 3/4/08.
6 # Copyright __MyCompanyName__ 2008. All rights reserved.
7 #
8
9 #import modules required by application
10 import objc
11 import Foundation
12 import AppKit
13
14 from PyObjCTools import AppHelper
15
16 from twisted.internet import _threadedselect
17 reactor = _threadedselect.install()
18
19 # import modules containing classes required to start application and load MainMenu.nib
20 import IPython1SandboxAppDelegate
21 import IPython.frontend.cocoa.cocoa_frontend
22
23 # pass control to AppKit
24 AppHelper.runEventLoop()
1 NO CONTENT: new file 100644
@@ -0,0 +1,27 b''
1 2008-03-14 00:06:49-0700 [-] Log opened.
2 2008-03-14 00:06:49-0700 [-] --> ipython1.frontend.cocoa.tests.test_cocoa_frontend.TestIPythonCocoaControler.testControllerCompletesToken <--
3 2008-03-14 00:06:49-0700 [-] Unhandled error in Deferred:
4 2008-03-14 00:06:49-0700 [-] Unhandled Error
5 Traceback (most recent call last):
6 File "/Library/Python/2.5/site-packages/Twisted-2.5.0_rUnknown-py2.5-macosx-10.3-i386.egg/twisted/internet/utils.py", line 144, in runWithWarningsSuppressed
7 result = f(*a, **kw)
8 File "/Users/barry/Desktop/ipython1-cocoa/ipython1/frontend/cocoa/tests/test_cocoa_frontend.py", line 94, in testControllerCompletesToken
9 self.controller.executeRequest([code]).addCallback(testCompletes)
10 File "/Library/Python/2.5/site-packages/Twisted-2.5.0_rUnknown-py2.5-macosx-10.3-i386.egg/twisted/internet/defer.py", line 196, in addCallback
11 callbackKeywords=kw)
12 File "/Library/Python/2.5/site-packages/Twisted-2.5.0_rUnknown-py2.5-macosx-10.3-i386.egg/twisted/internet/defer.py", line 187, in addCallbacks
13 self._runCallbacks()
14 --- <exception caught here> ---
15 File "/Library/Python/2.5/site-packages/Twisted-2.5.0_rUnknown-py2.5-macosx-10.3-i386.egg/twisted/internet/defer.py", line 325, in _runCallbacks
16 self.result = callback(self.result, *args, **kw)
17 File "/Users/barry/Desktop/ipython1-cocoa/ipython1/frontend/cocoa/tests/test_cocoa_frontend.py", line 89, in testCompletes
18 self.assert_("longNameVariable" in result)
19 File "/Library/Python/2.5/site-packages/Twisted-2.5.0_rUnknown-py2.5-macosx-10.3-i386.egg/twisted/trial/unittest.py", line 136, in failUnless
20 raise self.failureException(msg)
21 twisted.trial.unittest.FailTest: None
22
23 2008-03-14 00:06:49-0700 [-] --> ipython1.frontend.cocoa.tests.test_cocoa_frontend.TestIPythonCocoaControler.testControllerExecutesCode <--
24 2008-03-14 00:06:49-0700 [-] --> ipython1.frontend.cocoa.tests.test_cocoa_frontend.TestIPythonCocoaControler.testControllerInstantiatesIEngineInteractive <--
25 2008-03-14 00:06:49-0700 [-] --> ipython1.frontend.cocoa.tests.test_cocoa_frontend.TestIPythonCocoaControler.testControllerMirrorsUserNSWithValuesAsStrings <--
26 2008-03-14 00:06:49-0700 [-] --> ipython1.frontend.cocoa.tests.test_cocoa_frontend.TestIPythonCocoaControler.testControllerRaisesCompilerErrorForIllegalCode <--
27 2008-03-14 00:06:49-0700 [-] --> ipython1.frontend.cocoa.tests.test_cocoa_frontend.TestIPythonCocoaControler.testControllerReturnsNoneForIncompleteCode <--
@@ -0,0 +1,72 b''
1 # encoding: utf-8
2 """This file contains unittests for the
3 IPython.frontend.cocoa.cocoa_frontend module.
4 """
5 __docformat__ = "restructuredtext en"
6
7 #---------------------------------------------------------------------------
8 # Copyright (C) 2005 The IPython Development Team
9 #
10 # Distributed under the terms of the BSD License. The full license is in
11 # the file COPYING, distributed as part of this software.
12 #---------------------------------------------------------------------------
13
14 #---------------------------------------------------------------------------
15 # Imports
16 #---------------------------------------------------------------------------
17 from IPython.kernel.core.interpreter import Interpreter
18 import IPython.kernel.engineservice as es
19 from IPython.testing.util import DeferredTestCase
20 from twisted.internet.defer import succeed
21 from IPython.frontend.cocoa.cocoa_frontend import IPythonCocoaController
22
23 from Foundation import NSMakeRect
24 from AppKit import NSTextView, NSScrollView
25
26 class TestIPythonCocoaControler(DeferredTestCase):
27 """Tests for IPythonCocoaController"""
28
29 def setUp(self):
30 self.controller = IPythonCocoaController.alloc().init()
31 self.engine = es.EngineService()
32 self.engine.startService()
33
34
35 def tearDown(self):
36 self.controller = None
37 self.engine.stopService()
38
39 def testControllerExecutesCode(self):
40 code ="""5+5"""
41 expected = Interpreter().execute(code)
42 del expected['number']
43 def removeNumberAndID(result):
44 del result['number']
45 del result['id']
46 return result
47 self.assertDeferredEquals(
48 self.controller.execute(code).addCallback(removeNumberAndID),
49 expected)
50
51 def testControllerMirrorsUserNSWithValuesAsStrings(self):
52 code = """userns1=1;userns2=2"""
53 def testControllerUserNS(result):
54 self.assertEquals(self.controller.userNS['userns1'], 1)
55 self.assertEquals(self.controller.userNS['userns2'], 2)
56
57 self.controller.execute(code).addCallback(testControllerUserNS)
58
59
60 def testControllerInstantiatesIEngine(self):
61 self.assert_(es.IEngineBase.providedBy(self.controller.engine))
62
63 def testControllerCompletesToken(self):
64 code = """longNameVariable=10"""
65 def testCompletes(result):
66 self.assert_("longNameVariable" in result)
67
68 def testCompleteToken(result):
69 self.controller.complete("longNa").addCallback(testCompletes)
70
71 self.controller.execute(code).addCallback(testCompletes)
72
@@ -0,0 +1,352 b''
1 # encoding: utf-8
2 # -*- test-case-name: IPython.frontend.tests.test_frontendbase -*-
3 """
4 frontendbase provides an interface and base class for GUI frontends for
5 IPython.kernel/IPython.kernel.core.
6
7 Frontend implementations will likely want to subclass FrontEndBase.
8
9 Author: Barry Wark
10 """
11 __docformat__ = "restructuredtext en"
12
13 #-------------------------------------------------------------------------------
14 # Copyright (C) 2008 The IPython Development Team
15 #
16 # Distributed under the terms of the BSD License. The full license is in
17 # the file COPYING, distributed as part of this software.
18 #-------------------------------------------------------------------------------
19
20 #-------------------------------------------------------------------------------
21 # Imports
22 #-------------------------------------------------------------------------------
23 import string
24 import uuid
25 import _ast
26
27 import zope.interface as zi
28
29 from IPython.kernel.core.history import FrontEndHistory
30 from IPython.kernel.core.util import Bunch
31 from IPython.kernel.engineservice import IEngineCore
32
33 from twisted.python.failure import Failure
34
35 ##############################################################################
36 # TEMPORARY!!! fake configuration, while we decide whether to use tconfig or
37 # not
38
39 rc = Bunch()
40 rc.prompt_in1 = r'In [$number]: '
41 rc.prompt_in2 = r'...'
42 rc.prompt_out = r'Out [$number]: '
43
44 ##############################################################################
45
46 class IFrontEndFactory(zi.Interface):
47 """Factory interface for frontends."""
48
49 def __call__(engine=None, history=None):
50 """
51 Parameters:
52 interpreter : IPython.kernel.engineservice.IEngineCore
53 """
54
55 pass
56
57
58
59 class IFrontEnd(zi.Interface):
60 """Interface for frontends. All methods return t.i.d.Deferred"""
61
62 zi.Attribute("input_prompt_template", "string.Template instance\
63 substituteable with execute result.")
64 zi.Attribute("output_prompt_template", "string.Template instance\
65 substituteable with execute result.")
66 zi.Attribute("continuation_prompt_template", "string.Template instance\
67 substituteable with execute result.")
68
69 def update_cell_prompt(self, result):
70 """Subclass may override to update the input prompt for a block.
71 Since this method will be called as a
72 twisted.internet.defer.Deferred's callback,
73 implementations should return result when finished.
74
75 NB: result is a failure if the execute returned a failre.
76 To get the blockID, you should do something like::
77 if(isinstance(result, twisted.python.failure.Failure)):
78 blockID = result.blockID
79 else:
80 blockID = result['blockID']
81 """
82
83 pass
84
85 def render_result(self, result):
86 """Render the result of an execute call. Implementors may choose the
87 method of rendering.
88 For example, a notebook-style frontend might render a Chaco plot
89 inline.
90
91 Parameters:
92 result : dict (result of IEngineBase.execute )
93
94 Result:
95 Output of frontend rendering
96 """
97
98 pass
99
100 def render_error(self, failure):
101 """Subclasses must override to render the failure. Since this method
102 ill be called as a twisted.internet.defer.Deferred's callback,
103 implementations should return result when finished.
104 """
105
106 pass
107
108
109 def input_prompt(result={}):
110 """Returns the input prompt by subsituting into
111 self.input_prompt_template
112 """
113 pass
114
115 def output_prompt(result):
116 """Returns the output prompt by subsituting into
117 self.output_prompt_template
118 """
119
120 pass
121
122 def continuation_prompt():
123 """Returns the continuation prompt by subsituting into
124 self.continuation_prompt_template
125 """
126
127 pass
128
129 def is_complete(block):
130 """Returns True if block is complete, False otherwise."""
131
132 pass
133
134 def compile_ast(block):
135 """Compiles block to an _ast.AST"""
136
137 pass
138
139
140 def get_history_previous(currentBlock):
141 """Returns the block previous in the history. Saves currentBlock if
142 the history_cursor is currently at the end of the input history"""
143 pass
144
145 def get_history_next():
146 """Returns the next block in the history."""
147
148 pass
149
150
151 class FrontEndBase(object):
152 """
153 FrontEndBase manages the state tasks for a CLI frontend:
154 - Input and output history management
155 - Input/continuation and output prompt generation
156
157 Some issues (due to possibly unavailable engine):
158 - How do we get the current cell number for the engine?
159 - How do we handle completions?
160 """
161
162 zi.implements(IFrontEnd)
163 zi.classProvides(IFrontEndFactory)
164
165 history_cursor = 0
166
167 current_indent_level = 0
168
169
170 input_prompt_template = string.Template(rc.prompt_in1)
171 output_prompt_template = string.Template(rc.prompt_out)
172 continuation_prompt_template = string.Template(rc.prompt_in2)
173
174 def __init__(self, engine=None, history=None):
175 assert(engine==None or IEngineCore.providedBy(engine))
176 self.engine = IEngineCore(engine)
177 if history is None:
178 self.history = FrontEndHistory(input_cache=[''])
179 else:
180 self.history = history
181
182
183 def input_prompt(self, result={}):
184 """Returns the current input prompt
185
186 It would be great to use ipython1.core.prompts.Prompt1 here
187 """
188
189 result.setdefault('number','')
190
191 return self.input_prompt_template.safe_substitute(result)
192
193
194 def continuation_prompt(self):
195 """Returns the current continuation prompt"""
196
197 return self.continuation_prompt_template.safe_substitute()
198
199 def output_prompt(self, result):
200 """Returns the output prompt for result"""
201
202 return self.output_prompt_template.safe_substitute(result)
203
204
205 def is_complete(self, block):
206 """Determine if block is complete.
207
208 Parameters
209 block : string
210
211 Result
212 True if block can be sent to the engine without compile errors.
213 False otherwise.
214 """
215
216 try:
217 ast = self.compile_ast(block)
218 except:
219 return False
220
221 lines = block.split('\n')
222 return (len(lines)==1 or str(lines[-1])=='')
223
224
225 def compile_ast(self, block):
226 """Compile block to an AST
227
228 Parameters:
229 block : str
230
231 Result:
232 AST
233
234 Throws:
235 Exception if block cannot be compiled
236 """
237
238 return compile(block, "<string>", "exec", _ast.PyCF_ONLY_AST)
239
240
241 def execute(self, block, blockID=None):
242 """Execute the block and return result.
243
244 Parameters:
245 block : {str, AST}
246 blockID : any
247 Caller may provide an ID to identify this block.
248 result['blockID'] := blockID
249
250 Result:
251 Deferred result of self.interpreter.execute
252 """
253
254 if(not self.is_complete(block)):
255 return Failure(Exception("Block is not compilable"))
256
257 if(blockID == None):
258 blockID = uuid.uuid4() #random UUID
259
260 d = self.engine.execute(block)
261 d.addCallback(self._add_history, block=block)
262 d.addBoth(self._add_block_id, blockID)
263 d.addBoth(self.update_cell_prompt)
264 d.addCallbacks(self.render_result, errback=self.render_error)
265
266 return d
267
268
269 def _add_block_id(self, result, blockID):
270 """Add the blockID to result or failure. Unfortunatley, we have to
271 treat failures differently than result dicts.
272 """
273
274 if(isinstance(result, Failure)):
275 result.blockID = blockID
276 else:
277 result['blockID'] = blockID
278
279 return result
280
281 def _add_history(self, result, block=None):
282 """Add block to the history"""
283
284 assert(block != None)
285 self.history.add_items([block])
286 self.history_cursor += 1
287
288 return result
289
290
291 def get_history_previous(self, currentBlock):
292 """ Returns previous history string and decrement history cursor.
293 """
294 command = self.history.get_history_item(self.history_cursor - 1)
295
296 if command is not None:
297 if(self.history_cursor == len(self.history.input_cache)):
298 self.history.input_cache[self.history_cursor] = currentBlock
299 self.history_cursor -= 1
300 return command
301
302
303 def get_history_next(self):
304 """ Returns next history string and increment history cursor.
305 """
306 command = self.history.get_history_item(self.history_cursor+1)
307
308 if command is not None:
309 self.history_cursor += 1
310 return command
311
312 ###
313 # Subclasses probably want to override these methods...
314 ###
315
316 def update_cell_prompt(self, result):
317 """Subclass may override to update the input prompt for a block.
318 Since this method will be called as a
319 twisted.internet.defer.Deferred's callback, implementations should
320 return result when finished.
321
322 NB: result is a failure if the execute returned a failre.
323 To get the blockID, you should do something like::
324 if(isinstance(result, twisted.python.failure.Failure)):
325 blockID = result.blockID
326 else:
327 blockID = result['blockID']
328
329
330 """
331
332 return result
333
334
335 def render_result(self, result):
336 """Subclasses must override to render result. Since this method will
337 be called as a twisted.internet.defer.Deferred's callback,
338 implementations should return result when finished.
339 """
340
341 return result
342
343
344 def render_error(self, failure):
345 """Subclasses must override to render the failure. Since this method
346 will be called as a twisted.internet.defer.Deferred's callback,
347 implementations should return result when finished."""
348
349 return failure
350
351
352
1 NO CONTENT: new file 100644
@@ -0,0 +1,151 b''
1 # encoding: utf-8
2
3 """This file contains unittests for the frontendbase module."""
4
5 __docformat__ = "restructuredtext en"
6
7 #---------------------------------------------------------------------------
8 # Copyright (C) 2008 The IPython Development Team
9 #
10 # Distributed under the terms of the BSD License. The full license is in
11 # the file COPYING, distributed as part of this software.
12 #---------------------------------------------------------------------------
13
14 #---------------------------------------------------------------------------
15 # Imports
16 #---------------------------------------------------------------------------
17
18 import unittest
19 from IPython.frontend import frontendbase
20 from IPython.kernel.engineservice import EngineService
21
22 class FrontEndCallbackChecker(frontendbase.FrontEndBase):
23 """FrontEndBase subclass for checking callbacks"""
24 def __init__(self, engine=None, history=None):
25 super(FrontEndCallbackChecker, self).__init__(engine=engine,
26 history=history)
27 self.updateCalled = False
28 self.renderResultCalled = False
29 self.renderErrorCalled = False
30
31 def update_cell_prompt(self, result):
32 self.updateCalled = True
33 return result
34
35 def render_result(self, result):
36 self.renderResultCalled = True
37 return result
38
39
40 def render_error(self, failure):
41 self.renderErrorCalled = True
42 return failure
43
44
45
46
47 class TestFrontendBase(unittest.TestCase):
48 def setUp(self):
49 """Setup the EngineService and FrontEndBase"""
50
51 self.fb = FrontEndCallbackChecker(engine=EngineService())
52
53
54 def test_implements_IFrontEnd(self):
55 assert(frontendbase.IFrontEnd.implementedBy(
56 frontendbase.FrontEndBase))
57
58
59 def test_is_complete_returns_False_for_incomplete_block(self):
60 """"""
61
62 block = """def test(a):"""
63
64 assert(self.fb.is_complete(block) == False)
65
66 def test_is_complete_returns_True_for_complete_block(self):
67 """"""
68
69 block = """def test(a): pass"""
70
71 assert(self.fb.is_complete(block))
72
73 block = """a=3"""
74
75 assert(self.fb.is_complete(block))
76
77
78 def test_blockID_added_to_result(self):
79 block = """3+3"""
80
81 d = self.fb.execute(block, blockID='TEST_ID')
82
83 d.addCallback(self.checkBlockID, expected='TEST_ID')
84
85 def test_blockID_added_to_failure(self):
86 block = "raise Exception()"
87
88 d = self.fb.execute(block,blockID='TEST_ID')
89 d.addErrback(self.checkFailureID, expected='TEST_ID')
90
91 def checkBlockID(self, result, expected=""):
92 assert(result['blockID'] == expected)
93
94
95 def checkFailureID(self, failure, expected=""):
96 assert(failure.blockID == expected)
97
98
99 def test_callbacks_added_to_execute(self):
100 """test that
101 update_cell_prompt
102 render_result
103
104 are added to execute request
105 """
106
107 d = self.fb.execute("10+10")
108 d.addCallback(self.checkCallbacks)
109
110
111 def checkCallbacks(self, result):
112 assert(self.fb.updateCalled)
113 assert(self.fb.renderResultCalled)
114
115
116 def test_error_callback_added_to_execute(self):
117 """test that render_error called on execution error"""
118
119 d = self.fb.execute("raise Exception()")
120 d.addCallback(self.checkRenderError)
121
122 def checkRenderError(self, result):
123 assert(self.fb.renderErrorCalled)
124
125 def test_history_returns_expected_block(self):
126 """Make sure history browsing doesn't fail"""
127
128 blocks = ["a=1","a=2","a=3"]
129 for b in blocks:
130 d = self.fb.execute(b)
131
132 # d is now the deferred for the last executed block
133 d.addCallback(self.historyTests, blocks)
134
135
136 def historyTests(self, result, blocks):
137 """historyTests"""
138
139 assert(len(blocks) >= 3)
140 assert(self.fb.get_history_previous("") == blocks[-2])
141 assert(self.fb.get_history_previous("") == blocks[-3])
142 assert(self.fb.get_history_next() == blocks[-2])
143
144
145 def test_history_returns_none_at_startup(self):
146 """test_history_returns_none_at_startup"""
147
148 assert(self.fb.get_history_previous("")==None)
149 assert(self.fb.get_history_next()==None)
150
151
@@ -1,864 +1,876 b''
1 1 # encoding: utf-8
2 2 # -*- test-case-name: IPython.kernel.tests.test_engineservice -*-
3 3
4 4 """A Twisted Service Representation of the IPython core.
5 5
6 6 The IPython Core exposed to the network is called the Engine. Its
7 7 representation in Twisted in the EngineService. Interfaces and adapters
8 8 are used to abstract out the details of the actual network protocol used.
9 9 The EngineService is an Engine that knows nothing about the actual protocol
10 10 used.
11 11
12 12 The EngineService is exposed with various network protocols in modules like:
13 13
14 14 enginepb.py
15 15 enginevanilla.py
16 16
17 17 As of 12/12/06 the classes in this module have been simplified greatly. It was
18 18 felt that we had over-engineered things. To improve the maintainability of the
19 19 code we have taken out the ICompleteEngine interface and the completeEngine
20 20 method that automatically added methods to engines.
21 21
22 22 """
23 23
24 24 __docformat__ = "restructuredtext en"
25 25
26 26 #-------------------------------------------------------------------------------
27 27 # Copyright (C) 2008 The IPython Development Team
28 28 #
29 29 # Distributed under the terms of the BSD License. The full license is in
30 30 # the file COPYING, distributed as part of this software.
31 31 #-------------------------------------------------------------------------------
32 32
33 33 #-------------------------------------------------------------------------------
34 34 # Imports
35 35 #-------------------------------------------------------------------------------
36 36
37 37 import os, sys, copy
38 38 import cPickle as pickle
39 39 from new import instancemethod
40 40
41 41 from twisted.application import service
42 42 from twisted.internet import defer, reactor
43 43 from twisted.python import log, failure, components
44 44 import zope.interface as zi
45 45
46 46 from IPython.kernel.core.interpreter import Interpreter
47 47 from IPython.kernel import newserialized, error, util
48 48 from IPython.kernel.util import printer
49 49 from IPython.kernel.twistedutil import gatherBoth, DeferredList
50 50 from IPython.kernel import codeutil
51 51
52 52
53 53 #-------------------------------------------------------------------------------
54 54 # Interface specification for the Engine
55 55 #-------------------------------------------------------------------------------
56 56
57 57 class IEngineCore(zi.Interface):
58 58 """The minimal required interface for the IPython Engine.
59 59
60 60 This interface provides a formal specification of the IPython core.
61 61 All these methods should return deferreds regardless of what side of a
62 62 network connection they are on.
63 63
64 64 In general, this class simply wraps a shell class and wraps its return
65 65 values as Deferred objects. If the underlying shell class method raises
66 66 an exception, this class should convert it to a twisted.failure.Failure
67 67 that will be propagated along the Deferred's errback chain.
68 68
69 69 In addition, Failures are aggressive. By this, we mean that if a method
70 70 is performing multiple actions (like pulling multiple object) if any
71 71 single one fails, the entire method will fail with that Failure. It is
72 72 all or nothing.
73 73 """
74 74
75 75 id = zi.interface.Attribute("the id of the Engine object")
76 76 properties = zi.interface.Attribute("A dict of properties of the Engine")
77 77
78 78 def execute(lines):
79 79 """Execute lines of Python code.
80 80
81 81 Returns a dictionary with keys (id, number, stdin, stdout, stderr)
82 82 upon success.
83 83
84 84 Returns a failure object if the execution of lines raises an exception.
85 85 """
86 86
87 87 def push(namespace):
88 88 """Push dict namespace into the user's namespace.
89 89
90 90 Returns a deferred to None or a failure.
91 91 """
92 92
93 93 def pull(keys):
94 94 """Pulls values out of the user's namespace by keys.
95 95
96 96 Returns a deferred to a tuple objects or a single object.
97 97
98 98 Raises NameError if any one of objects doess not exist.
99 99 """
100 100
101 101 def push_function(namespace):
102 102 """Push a dict of key, function pairs into the user's namespace.
103 103
104 104 Returns a deferred to None or a failure."""
105 105
106 106 def pull_function(keys):
107 107 """Pulls functions out of the user's namespace by keys.
108 108
109 109 Returns a deferred to a tuple of functions or a single function.
110 110
111 111 Raises NameError if any one of the functions does not exist.
112 112 """
113 113
114 114 def get_result(i=None):
115 115 """Get the stdin/stdout/stderr of command i.
116 116
117 117 Returns a deferred to a dict with keys
118 118 (id, number, stdin, stdout, stderr).
119 119
120 120 Raises IndexError if command i does not exist.
121 121 Raises TypeError if i in not an int.
122 122 """
123 123
124 124 def reset():
125 125 """Reset the shell.
126 126
127 127 This clears the users namespace. Won't cause modules to be
128 128 reloaded. Should also re-initialize certain variables like id.
129 129 """
130 130
131 131 def kill():
132 132 """Kill the engine by stopping the reactor."""
133 133
134 134 def keys():
135 135 """Return the top level variables in the users namspace.
136 136
137 137 Returns a deferred to a dict."""
138 138
139 139
140 140 class IEngineSerialized(zi.Interface):
141 141 """Push/Pull methods that take Serialized objects.
142 142
143 143 All methods should return deferreds.
144 144 """
145 145
146 146 def push_serialized(namespace):
147 147 """Push a dict of keys and Serialized objects into the user's namespace."""
148 148
149 149 def pull_serialized(keys):
150 150 """Pull objects by key from the user's namespace as Serialized.
151 151
152 152 Returns a list of or one Serialized.
153 153
154 154 Raises NameError is any one of the objects does not exist.
155 155 """
156 156
157 157
158 158 class IEngineProperties(zi.Interface):
159 159 """Methods for access to the properties object of an Engine"""
160 160
161 161 properties = zi.Attribute("A StrictDict object, containing the properties")
162 162
163 163 def set_properties(properties):
164 164 """set properties by key and value"""
165 165
166 166 def get_properties(keys=None):
167 167 """get a list of properties by `keys`, if no keys specified, get all"""
168 168
169 169 def del_properties(keys):
170 170 """delete properties by `keys`"""
171 171
172 172 def has_properties(keys):
173 173 """get a list of bool values for whether `properties` has `keys`"""
174 174
175 175 def clear_properties():
176 176 """clear the properties dict"""
177 177
178 178 class IEngineBase(IEngineCore, IEngineSerialized, IEngineProperties):
179 179 """The basic engine interface that EngineService will implement.
180 180
181 181 This exists so it is easy to specify adapters that adapt to and from the
182 182 API that the basic EngineService implements.
183 183 """
184 184 pass
185 185
186 186 class IEngineQueued(IEngineBase):
187 187 """Interface for adding a queue to an IEngineBase.
188 188
189 189 This interface extends the IEngineBase interface to add methods for managing
190 190 the engine's queue. The implicit details of this interface are that the
191 191 execution of all methods declared in IEngineBase should appropriately be
192 192 put through a queue before execution.
193 193
194 194 All methods should return deferreds.
195 195 """
196 196
197 197 def clear_queue():
198 198 """Clear the queue."""
199 199
200 200 def queue_status():
201 201 """Get the queued and pending commands in the queue."""
202 202
203 203 def register_failure_observer(obs):
204 204 """Register an observer of pending Failures.
205 205
206 206 The observer must implement IFailureObserver.
207 207 """
208 208
209 209 def unregister_failure_observer(obs):
210 210 """Unregister an observer of pending Failures."""
211 211
212 212
213 213 class IEngineThreaded(zi.Interface):
214 214 """A place holder for threaded commands.
215 215
216 216 All methods should return deferreds.
217 217 """
218 218 pass
219 219
220 220
221 221 #-------------------------------------------------------------------------------
222 222 # Functions and classes to implement the EngineService
223 223 #-------------------------------------------------------------------------------
224 224
225 225
226 226 class StrictDict(dict):
227 227 """This is a strict copying dictionary for use as the interface to the
228 228 properties of an Engine.
229 229 :IMPORTANT:
230 230 This object copies the values you set to it, and returns copies to you
231 231 when you request them. The only way to change properties os explicitly
232 232 through the setitem and getitem of the dictionary interface.
233 233 Example:
234 234 >>> e = kernel.get_engine(id)
235 235 >>> L = someList
236 236 >>> e.properties['L'] = L
237 237 >>> L == e.properties['L']
238 238 ... True
239 239 >>> L.append(something Else)
240 240 >>> L == e.properties['L']
241 241 ... False
242 242
243 243 getitem copies, so calls to methods of objects do not affect the
244 244 properties, as in the following example:
245 245 >>> e.properties[1] = range(2)
246 246 >>> print e.properties[1]
247 247 ... [0, 1]
248 248 >>> e.properties[1].append(2)
249 249 >>> print e.properties[1]
250 250 ... [0, 1]
251 251
252 252 """
253 253 def __init__(self, *args, **kwargs):
254 254 dict.__init__(self, *args, **kwargs)
255 255 self.modified = True
256 256
257 257 def __getitem__(self, key):
258 258 return copy.deepcopy(dict.__getitem__(self, key))
259 259
260 260 def __setitem__(self, key, value):
261 261 # check if this entry is valid for transport around the network
262 262 # and copying
263 263 try:
264 264 pickle.dumps(key, 2)
265 265 pickle.dumps(value, 2)
266 266 newvalue = copy.deepcopy(value)
267 267 except:
268 268 raise error.InvalidProperty(value)
269 269 dict.__setitem__(self, key, newvalue)
270 270 self.modified = True
271 271
272 272 def __delitem__(self, key):
273 273 dict.__delitem__(self, key)
274 274 self.modified = True
275 275
276 276 def update(self, dikt):
277 277 for k,v in dikt.iteritems():
278 278 self[k] = v
279 279
280 280 def pop(self, key):
281 281 self.modified = True
282 282 return dict.pop(self, key)
283 283
284 284 def popitem(self):
285 285 self.modified = True
286 286 return dict.popitem(self)
287 287
288 288 def clear(self):
289 289 self.modified = True
290 290 dict.clear(self)
291 291
292 292 def subDict(self, *keys):
293 293 d = {}
294 294 for key in keys:
295 295 d[key] = self[key]
296 296 return d
297 297
298 298
299 299
300 300 class EngineAPI(object):
301 301 """This is the object through which the user can edit the `properties`
302 302 attribute of an Engine.
303 303 The Engine Properties object copies all object in and out of itself.
304 304 See the EngineProperties object for details.
305 305 """
306 306 _fix=False
307 307 def __init__(self, id):
308 308 self.id = id
309 309 self.properties = StrictDict()
310 310 self._fix=True
311 311
312 312 def __setattr__(self, k,v):
313 313 if self._fix:
314 314 raise error.KernelError("I am protected!")
315 315 else:
316 316 object.__setattr__(self, k, v)
317 317
318 318 def __delattr__(self, key):
319 319 raise error.KernelError("I am protected!")
320 320
321 321
322 322 _apiDict = {}
323 323
324 324 def get_engine(id):
325 325 """Get the Engine API object, whcih currently just provides the properties
326 326 object, by ID"""
327 327 global _apiDict
328 328 if not _apiDict.get(id):
329 329 _apiDict[id] = EngineAPI(id)
330 330 return _apiDict[id]
331 331
332 332 def drop_engine(id):
333 333 """remove an engine"""
334 334 global _apiDict
335 335 if _apiDict.has_key(id):
336 336 del _apiDict[id]
337 337
338 338 class EngineService(object, service.Service):
339 339 """Adapt a IPython shell into a IEngine implementing Twisted Service."""
340 340
341 341 zi.implements(IEngineBase)
342 342 name = 'EngineService'
343 343
344 344 def __init__(self, shellClass=Interpreter, mpi=None):
345 345 """Create an EngineService.
346 346
347 347 shellClass: something that implements IInterpreter or core1
348 348 mpi: an mpi module that has rank and size attributes
349 349 """
350 350 self.shellClass = shellClass
351 351 self.shell = self.shellClass()
352 352 self.mpi = mpi
353 353 self.id = None
354 354 self.properties = get_engine(self.id).properties
355 355 if self.mpi is not None:
356 356 log.msg("MPI started with rank = %i and size = %i" %
357 357 (self.mpi.rank, self.mpi.size))
358 358 self.id = self.mpi.rank
359 359 self._seedNamespace()
360 360
361 361 # Make id a property so that the shell can get the updated id
362 362
363 363 def _setID(self, id):
364 364 self._id = id
365 365 self.properties = get_engine(id).properties
366 366 self.shell.push({'id': id})
367 367
368 368 def _getID(self):
369 369 return self._id
370 370
371 371 id = property(_getID, _setID)
372 372
373 373 def _seedNamespace(self):
374 374 self.shell.push({'mpi': self.mpi, 'id' : self.id})
375 375
376 376 def executeAndRaise(self, msg, callable, *args, **kwargs):
377 377 """Call a method of self.shell and wrap any exception."""
378 378 d = defer.Deferred()
379 379 try:
380 380 result = callable(*args, **kwargs)
381 381 except:
382 382 # This gives the following:
383 383 # et=exception class
384 384 # ev=exception class instance
385 385 # tb=traceback object
386 386 et,ev,tb = sys.exc_info()
387 387 # This call adds attributes to the exception value
388 388 et,ev,tb = self.shell.formatTraceback(et,ev,tb,msg)
389 389 # Add another attribute
390 390 ev._ipython_engine_info = msg
391 391 f = failure.Failure(ev,et,None)
392 392 d.errback(f)
393 393 else:
394 394 d.callback(result)
395 395
396 396 return d
397 397
398 398 # The IEngine methods. See the interface for documentation.
399 399
400 400 def execute(self, lines):
401 401 msg = {'engineid':self.id,
402 402 'method':'execute',
403 403 'args':[lines]}
404 404 d = self.executeAndRaise(msg, self.shell.execute, lines)
405 405 d.addCallback(self.addIDToResult)
406 406 return d
407 407
408 408 def addIDToResult(self, result):
409 409 result['id'] = self.id
410 410 return result
411 411
412 412 def push(self, namespace):
413 413 msg = {'engineid':self.id,
414 414 'method':'push',
415 415 'args':[repr(namespace.keys())]}
416 416 d = self.executeAndRaise(msg, self.shell.push, namespace)
417 417 return d
418 418
419 419 def pull(self, keys):
420 420 msg = {'engineid':self.id,
421 421 'method':'pull',
422 422 'args':[repr(keys)]}
423 423 d = self.executeAndRaise(msg, self.shell.pull, keys)
424 424 return d
425 425
426 426 def push_function(self, namespace):
427 427 msg = {'engineid':self.id,
428 428 'method':'push_function',
429 429 'args':[repr(namespace.keys())]}
430 430 d = self.executeAndRaise(msg, self.shell.push_function, namespace)
431 431 return d
432 432
433 433 def pull_function(self, keys):
434 434 msg = {'engineid':self.id,
435 435 'method':'pull_function',
436 436 'args':[repr(keys)]}
437 437 d = self.executeAndRaise(msg, self.shell.pull_function, keys)
438 438 return d
439 439
440 440 def get_result(self, i=None):
441 441 msg = {'engineid':self.id,
442 442 'method':'get_result',
443 443 'args':[repr(i)]}
444 444 d = self.executeAndRaise(msg, self.shell.getCommand, i)
445 445 d.addCallback(self.addIDToResult)
446 446 return d
447 447
448 448 def reset(self):
449 449 msg = {'engineid':self.id,
450 450 'method':'reset',
451 451 'args':[]}
452 452 del self.shell
453 453 self.shell = self.shellClass()
454 454 self.properties.clear()
455 455 d = self.executeAndRaise(msg, self._seedNamespace)
456 456 return d
457 457
458 458 def kill(self):
459 459 drop_engine(self.id)
460 460 try:
461 461 reactor.stop()
462 462 except RuntimeError:
463 463 log.msg('The reactor was not running apparently.')
464 464 return defer.fail()
465 465 else:
466 466 return defer.succeed(None)
467 467
468 468 def keys(self):
469 469 """Return a list of variables names in the users top level namespace.
470 470
471 471 This used to return a dict of all the keys/repr(values) in the
472 472 user's namespace. This was too much info for the ControllerService
473 473 to handle so it is now just a list of keys.
474 474 """
475 475
476 476 remotes = []
477 477 for k in self.shell.user_ns.iterkeys():
478 478 if k not in ['__name__', '_ih', '_oh', '__builtins__',
479 479 'In', 'Out', '_', '__', '___', '__IP', 'input', 'raw_input']:
480 480 remotes.append(k)
481 481 return defer.succeed(remotes)
482 482
483 483 def set_properties(self, properties):
484 484 msg = {'engineid':self.id,
485 485 'method':'set_properties',
486 486 'args':[repr(properties.keys())]}
487 487 return self.executeAndRaise(msg, self.properties.update, properties)
488 488
489 489 def get_properties(self, keys=None):
490 490 msg = {'engineid':self.id,
491 491 'method':'get_properties',
492 492 'args':[repr(keys)]}
493 493 if keys is None:
494 494 keys = self.properties.keys()
495 495 return self.executeAndRaise(msg, self.properties.subDict, *keys)
496 496
497 497 def _doDel(self, keys):
498 498 for key in keys:
499 499 del self.properties[key]
500 500
501 501 def del_properties(self, keys):
502 502 msg = {'engineid':self.id,
503 503 'method':'del_properties',
504 504 'args':[repr(keys)]}
505 505 return self.executeAndRaise(msg, self._doDel, keys)
506 506
507 507 def _doHas(self, keys):
508 508 return [self.properties.has_key(key) for key in keys]
509 509
510 510 def has_properties(self, keys):
511 511 msg = {'engineid':self.id,
512 512 'method':'has_properties',
513 513 'args':[repr(keys)]}
514 514 return self.executeAndRaise(msg, self._doHas, keys)
515 515
516 516 def clear_properties(self):
517 517 msg = {'engineid':self.id,
518 518 'method':'clear_properties',
519 519 'args':[]}
520 520 return self.executeAndRaise(msg, self.properties.clear)
521 521
522 522 def push_serialized(self, sNamespace):
523 523 msg = {'engineid':self.id,
524 524 'method':'push_serialized',
525 525 'args':[repr(sNamespace.keys())]}
526 526 ns = {}
527 527 for k,v in sNamespace.iteritems():
528 528 try:
529 529 unserialized = newserialized.IUnSerialized(v)
530 530 ns[k] = unserialized.getObject()
531 531 except:
532 532 return defer.fail()
533 533 return self.executeAndRaise(msg, self.shell.push, ns)
534 534
535 535 def pull_serialized(self, keys):
536 536 msg = {'engineid':self.id,
537 537 'method':'pull_serialized',
538 538 'args':[repr(keys)]}
539 539 if isinstance(keys, str):
540 540 keys = [keys]
541 541 if len(keys)==1:
542 542 d = self.executeAndRaise(msg, self.shell.pull, keys)
543 543 d.addCallback(newserialized.serialize)
544 544 return d
545 545 elif len(keys)>1:
546 546 d = self.executeAndRaise(msg, self.shell.pull, keys)
547 547 @d.addCallback
548 548 def packThemUp(values):
549 549 serials = []
550 550 for v in values:
551 551 try:
552 552 serials.append(newserialized.serialize(v))
553 553 except:
554 554 return defer.fail(failure.Failure())
555 555 return serials
556 556 return packThemUp
557 557
558 558
559 559 def queue(methodToQueue):
560 560 def queuedMethod(this, *args, **kwargs):
561 561 name = methodToQueue.__name__
562 562 return this.submitCommand(Command(name, *args, **kwargs))
563 563 return queuedMethod
564 564
565 565 class QueuedEngine(object):
566 566 """Adapt an IEngineBase to an IEngineQueued by wrapping it.
567 567
568 568 The resulting object will implement IEngineQueued which extends
569 569 IEngineCore which extends (IEngineBase, IEngineSerialized).
570 570
571 571 This seems like the best way of handling it, but I am not sure. The
572 572 other option is to have the various base interfaces be used like
573 573 mix-in intefaces. The problem I have with this is adpatation is
574 574 more difficult and complicated because there can be can multiple
575 575 original and final Interfaces.
576 576 """
577 577
578 578 zi.implements(IEngineQueued)
579 579
580 580 def __init__(self, engine):
581 581 """Create a QueuedEngine object from an engine
582 582
583 583 engine: An implementor of IEngineCore and IEngineSerialized
584 584 keepUpToDate: whether to update the remote status when the
585 585 queue is empty. Defaults to False.
586 586 """
587 587
588 588 # This is the right way to do these tests rather than
589 589 # IEngineCore in list(zi.providedBy(engine)) which will only
590 590 # picks of the interfaces that are directly declared by engine.
591 591 assert IEngineBase.providedBy(engine), \
592 592 "engine passed to QueuedEngine doesn't provide IEngineBase"
593 593
594 594 self.engine = engine
595 595 self.id = engine.id
596 596 self.queued = []
597 597 self.history = {}
598 598 self.engineStatus = {}
599 599 self.currentCommand = None
600 600 self.failureObservers = []
601 601
602 602 def _get_properties(self):
603 603 return self.engine.properties
604 604
605 605 properties = property(_get_properties, lambda self, _: None)
606 606 # Queue management methods. You should not call these directly
607 607
608 608 def submitCommand(self, cmd):
609 609 """Submit command to queue."""
610 610
611 611 d = defer.Deferred()
612 612 cmd.setDeferred(d)
613 613 if self.currentCommand is not None:
614 614 if self.currentCommand.finished:
615 615 # log.msg("Running command immediately: %r" % cmd)
616 616 self.currentCommand = cmd
617 617 self.runCurrentCommand()
618 618 else: # command is still running
619 619 # log.msg("Command is running: %r" % self.currentCommand)
620 620 # log.msg("Queueing: %r" % cmd)
621 621 self.queued.append(cmd)
622 622 else:
623 623 # log.msg("No current commands, running: %r" % cmd)
624 624 self.currentCommand = cmd
625 625 self.runCurrentCommand()
626 626 return d
627 627
628 628 def runCurrentCommand(self):
629 629 """Run current command."""
630 630
631 631 cmd = self.currentCommand
632 632 f = getattr(self.engine, cmd.remoteMethod, None)
633 633 if f:
634 634 d = f(*cmd.args, **cmd.kwargs)
635 635 if cmd.remoteMethod is 'execute':
636 636 d.addCallback(self.saveResult)
637 637 d.addCallback(self.finishCommand)
638 638 d.addErrback(self.abortCommand)
639 639 else:
640 640 return defer.fail(AttributeError(cmd.remoteMethod))
641 641
642 642 def _flushQueue(self):
643 643 """Pop next command in queue and run it."""
644 644
645 645 if len(self.queued) > 0:
646 646 self.currentCommand = self.queued.pop(0)
647 647 self.runCurrentCommand()
648 648
649 649 def saveResult(self, result):
650 650 """Put the result in the history."""
651 651 self.history[result['number']] = result
652 652 return result
653 653
654 654 def finishCommand(self, result):
655 655 """Finish currrent command."""
656 656
657 657 # The order of these commands is absolutely critical.
658 658 self.currentCommand.handleResult(result)
659 659 self.currentCommand.finished = True
660 660 self._flushQueue()
661 661 return result
662 662
663 663 def abortCommand(self, reason):
664 664 """Abort current command.
665 665
666 666 This eats the Failure but first passes it onto the Deferred that the
667 667 user has.
668 668
669 669 It also clear out the queue so subsequence commands don't run.
670 670 """
671 671
672 672 # The order of these 3 commands is absolutely critical. The currentCommand
673 673 # must first be marked as finished BEFORE the queue is cleared and before
674 674 # the current command is sent the failure.
675 675 # Also, the queue must be cleared BEFORE the current command is sent the Failure
676 676 # otherwise the errback chain could trigger new commands to be added to the
677 677 # queue before we clear it. We should clear ONLY the commands that were in
678 678 # the queue when the error occured.
679 679 self.currentCommand.finished = True
680 680 s = "%r %r %r" % (self.currentCommand.remoteMethod, self.currentCommand.args, self.currentCommand.kwargs)
681 681 self.clear_queue(msg=s)
682 682 self.currentCommand.handleError(reason)
683 683
684 684 return None
685 685
686 686 #---------------------------------------------------------------------------
687 687 # IEngineCore methods
688 688 #---------------------------------------------------------------------------
689 689
690 690 @queue
691 691 def execute(self, lines):
692 692 pass
693 693
694 694 @queue
695 695 def push(self, namespace):
696 696 pass
697 697
698 698 @queue
699 699 def pull(self, keys):
700 700 pass
701 701
702 702 @queue
703 703 def push_function(self, namespace):
704 704 pass
705 705
706 706 @queue
707 707 def pull_function(self, keys):
708 708 pass
709 709
710 710 def get_result(self, i=None):
711 711 if i is None:
712 712 i = max(self.history.keys()+[None])
713 713
714 714 cmd = self.history.get(i, None)
715 715 # Uncomment this line to disable chaching of results
716 716 #cmd = None
717 717 if cmd is None:
718 718 return self.submitCommand(Command('get_result', i))
719 719 else:
720 720 return defer.succeed(cmd)
721 721
722 722 def reset(self):
723 723 self.clear_queue()
724 724 self.history = {} # reset the cache - I am not sure we should do this
725 725 return self.submitCommand(Command('reset'))
726 726
727 727 def kill(self):
728 728 self.clear_queue()
729 729 return self.submitCommand(Command('kill'))
730 730
731 731 @queue
732 732 def keys(self):
733 733 pass
734 734
735 735 #---------------------------------------------------------------------------
736 736 # IEngineSerialized methods
737 737 #---------------------------------------------------------------------------
738 738
739 739 @queue
740 740 def push_serialized(self, namespace):
741 741 pass
742 742
743 743 @queue
744 744 def pull_serialized(self, keys):
745 745 pass
746 746
747 747 #---------------------------------------------------------------------------
748 748 # IEngineProperties methods
749 749 #---------------------------------------------------------------------------
750 750
751 751 @queue
752 752 def set_properties(self, namespace):
753 753 pass
754 754
755 755 @queue
756 756 def get_properties(self, keys=None):
757 757 pass
758 758
759 759 @queue
760 760 def del_properties(self, keys):
761 761 pass
762 762
763 763 @queue
764 764 def has_properties(self, keys):
765 765 pass
766 766
767 767 @queue
768 768 def clear_properties(self):
769 769 pass
770 770
771 771 #---------------------------------------------------------------------------
772 772 # IQueuedEngine methods
773 773 #---------------------------------------------------------------------------
774 774
775 775 def clear_queue(self, msg=''):
776 776 """Clear the queue, but doesn't cancel the currently running commmand."""
777 777
778 778 for cmd in self.queued:
779 779 cmd.deferred.errback(failure.Failure(error.QueueCleared(msg)))
780 780 self.queued = []
781 781 return defer.succeed(None)
782 782
783 783 def queue_status(self):
784 784 if self.currentCommand is not None:
785 785 if self.currentCommand.finished:
786 786 pending = repr(None)
787 787 else:
788 788 pending = repr(self.currentCommand)
789 789 else:
790 790 pending = repr(None)
791 791 dikt = {'queue':map(repr,self.queued), 'pending':pending}
792 792 return defer.succeed(dikt)
793 793
794 794 def register_failure_observer(self, obs):
795 795 self.failureObservers.append(obs)
796 796
797 797 def unregister_failure_observer(self, obs):
798 798 self.failureObservers.remove(obs)
799 799
800 800
801 801 # Now register QueuedEngine as an adpater class that makes an IEngineBase into a
802 802 # IEngineQueued.
803 803 components.registerAdapter(QueuedEngine, IEngineBase, IEngineQueued)
804 804
805 805
806 806 class Command(object):
807 807 """A command object that encapslates queued commands.
808 808
809 809 This class basically keeps track of a command that has been queued
810 810 in a QueuedEngine. It manages the deferreds and hold the method to be called
811 811 and the arguments to that method.
812 812 """
813 813
814 814
815 815 def __init__(self, remoteMethod, *args, **kwargs):
816 816 """Build a new Command object."""
817 817
818 818 self.remoteMethod = remoteMethod
819 819 self.args = args
820 820 self.kwargs = kwargs
821 821 self.finished = False
822 822
823 823 def setDeferred(self, d):
824 824 """Sets the deferred attribute of the Command."""
825 825
826 826 self.deferred = d
827 827
828 828 def __repr__(self):
829 829 if not self.args:
830 830 args = ''
831 831 else:
832 832 args = str(self.args)[1:-2] #cut off (...,)
833 833 for k,v in self.kwargs.iteritems():
834 834 if args:
835 835 args += ', '
836 836 args += '%s=%r' %(k,v)
837 837 return "%s(%s)" %(self.remoteMethod, args)
838 838
839 839 def handleResult(self, result):
840 840 """When the result is ready, relay it to self.deferred."""
841 841
842 842 self.deferred.callback(result)
843 843
844 844 def handleError(self, reason):
845 845 """When an error has occured, relay it to self.deferred."""
846 846
847 847 self.deferred.errback(reason)
848 848
849 849 class ThreadedEngineService(EngineService):
850 """An EngineService subclass that defers execute commands to a separate
851 thread.
852
853 ThreadedEngineService uses twisted.internet.threads.deferToThread to
854 defer execute requests to a separate thread. GUI frontends may want to
855 use ThreadedEngineService as the engine in an
856 IPython.frontend.frontendbase.FrontEndBase subclass to prevent
857 block execution from blocking the GUI thread.
858 """
850 859
851 860 zi.implements(IEngineBase)
852 861
853 862 def __init__(self, shellClass=Interpreter, mpi=None):
854 863 EngineService.__init__(self, shellClass, mpi)
864
865
866 def execute(self, lines):
855 867 # Only import this if we are going to use this class
856 868 from twisted.internet import threads
857 869
858 def execute(self, lines):
859 msg = """engine: %r
860 method: execute(lines)
861 lines = %s""" % (self.id, lines)
862 d = threads.deferToThread(self.executeAndRaise, msg, self.shell.execute, lines)
870 msg = {'engineid':self.id,
871 'method':'execute',
872 'args':[lines]}
873
874 d = threads.deferToThread(self.shell.execute, lines)
863 875 d.addCallback(self.addIDToResult)
864 876 return d
@@ -1,66 +1,78 b''
1 1 # encoding: utf-8
2 2
3 3 """This file contains unittests for the kernel.engineservice.py module.
4 4
5 5 Things that should be tested:
6 6
7 7 - Should the EngineService return Deferred objects?
8 8 - Run the same tests that are run in shell.py.
9 9 - Make sure that the Interface is really implemented.
10 10 - The startService and stopService methods.
11 11 """
12 12
13 13 __docformat__ = "restructuredtext en"
14 14
15 15 #-------------------------------------------------------------------------------
16 16 # Copyright (C) 2008 The IPython Development Team
17 17 #
18 18 # Distributed under the terms of the BSD License. The full license is in
19 19 # the file COPYING, distributed as part of this software.
20 20 #-------------------------------------------------------------------------------
21 21
22 22 #-------------------------------------------------------------------------------
23 23 # Imports
24 24 #-------------------------------------------------------------------------------
25 25
26 26 try:
27 27 from twisted.internet import defer
28 28 from twisted.application.service import IService
29 29
30 30 from IPython.kernel import engineservice as es
31 31 from IPython.testing.util import DeferredTestCase
32 32 from IPython.kernel.tests.engineservicetest import \
33 33 IEngineCoreTestCase, \
34 34 IEngineSerializedTestCase, \
35 35 IEngineQueuedTestCase, \
36 36 IEnginePropertiesTestCase
37 37 except ImportError:
38 38 pass
39 39 else:
40 40 class BasicEngineServiceTest(DeferredTestCase,
41 41 IEngineCoreTestCase,
42 42 IEngineSerializedTestCase,
43 43 IEnginePropertiesTestCase):
44 44
45 45 def setUp(self):
46 46 self.engine = es.EngineService()
47 47 self.engine.startService()
48 48
49 49 def tearDown(self):
50 50 return self.engine.stopService()
51 51
52 class ThreadedEngineServiceTest(DeferredTestCase,
53 IEngineCoreTestCase,
54 IEngineSerializedTestCase,
55 IEnginePropertiesTestCase):
56
57 def setUp(self):
58 self.engine = es.ThreadedEngineService()
59 self.engine.startService()
60
61 def tearDown(self):
62 return self.engine.stopService()
63
52 64 class QueuedEngineServiceTest(DeferredTestCase,
53 65 IEngineCoreTestCase,
54 66 IEngineSerializedTestCase,
55 67 IEnginePropertiesTestCase,
56 68 IEngineQueuedTestCase):
57 69
58 70 def setUp(self):
59 71 self.rawEngine = es.EngineService()
60 72 self.rawEngine.startService()
61 73 self.engine = es.IEngineQueued(self.rawEngine)
62 74
63 75 def tearDown(self):
64 76 return self.rawEngine.stopService()
65 77
66 78
General Comments 0
You need to be logged in to leave comments. Login now