diff --git a/.gitattributes b/.gitattributes index 0a64debb8..260342750 100644 --- a/.gitattributes +++ b/.gitattributes @@ -143,56 +143,6 @@ doc/manual/using.ccldoc -text doc/release-notes-1.2.txt -text doc/release-notes.txt -text examples/android/native-activity.lisp -text -examples/cocoa/currency-converter/CurrencyConverter.nib/designable.nib -text -examples/cocoa/currency-converter/CurrencyConverter.nib/keyedobjects.nib -text -examples/cocoa/currency-converter/HOWTO.html -text -examples/cocoa/currency-converter/HOWTO_files/images/bosco.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/cc1.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/cc2.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/finder-win1.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/finder-win2.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard1.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard2.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard3.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard4.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard5.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard6.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard7.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard8.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger1.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger10.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger11.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger12.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger13.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger14.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger15.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger16.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger17.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger18.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger19.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger2.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger20.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger21.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger22.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger3.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger4.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger5.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger6.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger7.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger8.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger9.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/ibwin1.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/listener1.jpg -text -examples/cocoa/currency-converter/HOWTO_files/images/term1.jpg -text -examples/cocoa/currency-converter/HOWTO_files/pages/build_app.html -text -examples/cocoa/currency-converter/HOWTO_files/pages/building_ui.html -text -examples/cocoa/currency-converter/HOWTO_files/pages/building_ui_tiger.html -text -examples/cocoa/currency-converter/HOWTO_files/pages/conclusion.html -text -examples/cocoa/currency-converter/HOWTO_files/pages/create_lisp.html -text -examples/cocoa/currency-converter/HOWTO_files/pages/making_project.html -text -examples/cocoa/currency-converter/HOWTO_files/pages/writing_lisp.html -text -examples/cocoa/currency-converter/HOWTO_files/stylesheets/styles.css -text -examples/cocoa/currency-converter/currency-converter.lisp -text examples/cocoa/easygui.lisp -text examples/cocoa/easygui/action-targets.lisp -text examples/cocoa/easygui/dialogs.lisp -text @@ -208,12 +158,6 @@ examples/cocoa/easygui/views.lisp -text examples/cocoa/interface-databases/HOWTO.html -text examples/cocoa/interface-databases/HOWTO_files/images/bosco.jpg -text examples/cocoa/interface-databases/HOWTO_files/stylesheets/styles.css -text -examples/cocoa/nib-loading/HOWTO.html -text -examples/cocoa/nib-loading/HOWTO_files/images/bosco.jpg -text -examples/cocoa/nib-loading/HOWTO_files/stylesheets/styles.css -text -examples/cocoa/nib-loading/hello.nib/designable.nib -text -examples/cocoa/nib-loading/hello.nib/keyedobjects.nib -text -examples/cocoa/nib-loading/nib-loading.lisp -text examples/cocoa/progress-view-controller/progress-view-controller.lisp -text examples/cocoa/qtvidcapture/QTVidCapture.nib/classes.nib -text examples/cocoa/qtvidcapture/QTVidCapture.nib/info.nib -text diff --git a/examples/cocoa/currency-converter/CurrencyConverter.nib/designable.nib b/examples/cocoa/currency-converter/CurrencyConverter.nib/designable.nib deleted file mode 100644 index e0de7e40d..000000000 --- a/examples/cocoa/currency-converter/CurrencyConverter.nib/designable.nib +++ /dev/null @@ -1,2923 +0,0 @@ - - - - 1050 - 9A581 - 629 - 949 - 343.00 - - YES - - - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - NSApplication - - - FirstResponder - - - - - - AMainMenu - - YES - - - Currency Converter - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - - NSMenuMixedState - - submenuAction: - - - - YES - - - About Currency Converter - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - UHJlZmVyZW5jZXPigKY - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Services - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - _NSServicesMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Hide Currency Converter - h - 1048576 - 2147483647 - - - - - - Hide Others - - 1572864 - 2147483647 - - - - - - Show All - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit Currency Converter - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - New - n - 1048576 - 2147483647 - - - - - - T3BlbuKApg - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - U2F2ZSBBc+KApg - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Page Setup... - P - 1179648 - 2147483647 - - - - - - - UHJpbnTigKY - p - 1048576 - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - RmluZOKApg - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - U2hvdyBTcGVsbGluZ+KApg - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Smart Copy/Paste - - 2147483647 - - - 1 - - - - Smart Quotes - - 2147483647 - - - 2 - - - - Smart Links - - 2147483647 - - - 3 - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - Format - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Show Fonts - t - 1048576 - 2147483647 - - - - - - Show Colors - C - 1179648 - 2147483647 - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Show Toolbar - - 1572864 - 2147483647 - - - - - - Q3VzdG9taXplIFRvb2xiYXLigKY - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 1048576 - 2147483647 - - - submenuAction: - - - - YES - - - Currency Converter Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - 7 - 2 - {{306, 767}, {350, 189}} - 611844096 - - NSWindow - - - - 256 - - YES - - - 268 - {{195, 147}, {135, 22}} - - - YES - - -1804468671 - 272630784 - - - LucidaGrande - 1.300000e+01 - 1044 - - - YES - - 6 - System - textBackgroundColor - - 3 - MQA - - - - 6 - - textColor - - 3 - MAA - - - - - - - 268 - {{195, 115}, {135, 22}} - - - YES - - -1804468671 - 272630784 - - - - YES - - - - - - - 268 - {{195, 83}, {135, 22}} - - - YES - - -2072904127 - 272630784 - - - - YES - - - - - - - 268 - {{47, 149}, {143, 17}} - - - YES - - 67239488 - 71304192 - Exchange rate per $1: - - - - 6 - - controlColor - - 3 - MC42NjY2NjY2OQA - - - - 6 - - controlTextColor - - - - - - - 268 - {{67, 115}, {123, 17}} - - - YES - - 67239488 - 71304192 - Dollars to Convert: - - - - - - - - - 268 - {{17, 83}, {173, 17}} - - - YES - - 67239488 - 71304192 - Amount in other Currency: - - - - - - - - - 268 - {{214, 12}, {96, 32}} - - - YES - - 67239424 - 134217728 - Convert - - - -2038284033 - 129 - - DQ - 200 - 25 - - - - - 12 - {{20, 58}, {310, 5}} - - - {0, 0} - - 67239424 - 0 - Box - - - - 3 - MCAwLjgwMDAwMDAxAA - - - 3 - 2 - 0 - NO - - - {350, 189} - - - - {{0, 0}, {1920, 1178}} - - - Converter - - - ConverterController - - - - - YES - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - print: - - - - 86 - - - - runPageLayout: - - - - 87 - - - - clearRecentDocuments: - - - - 127 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - orderFrontColorPanel: - - - - 361 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - hide: - - - - 369 - - - - hideOtherApplications: - - - - 370 - - - - terminate: - - - - 371 - - - - unhideAllApplications: - - - - 372 - - - - nextKeyView - - - - 390 - - - - - - - - 391 - - - - initialFirstResponder - - - - 392 - - - - rateField - - - - 396 - - - - dollarField - - - - 397 - - - - amountField - - - - 398 - - - - converter - - - - 399 - - - - convert: - - - - 400 - - - - - YES - - 0 - - YES - - - - - - -2 - - - RmlsZSdzIE93bmVyA - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - YES - - - - - - - - - - MainMenu - - - 19 - - - YES - - - - - - 56 - - - YES - - - - - - 103 - - - YES - - - - 1 - - - 217 - - - YES - - - - - - 83 - - - YES - - - - - - 81 - - - YES - - - - - - - - - - - - - - - - 75 - - - 3 - - - 80 - - - 8 - - - 78 - - - 6 - - - 72 - - - - - 82 - - - 9 - - - 124 - - - YES - - - - - - 77 - - - 5 - - - 73 - - - - - - 79 - - - 7 - - - 112 - - - 10 - - - 74 - - - 2 - - - 125 - - - YES - - - - - - 126 - - - - - 205 - - - YES - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - YES - - - - - - 216 - - - YES - - - - - - 200 - - - YES - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - YES - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - YES - - - - - - - 111 - - - - - 57 - - - YES - - - - - - - - - - - - - - - - 58 - - - - - 134 - - - - - 150 - - - - - 136 - - - 1111 - - - 144 - - - - - 129 - - - 121 - - - 143 - - - - - 236 - - - - - 131 - - - YES - - - - - - 149 - - - - - 145 - - - - - 130 - - - - - 24 - - - YES - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - YES - - - - - - 296 - - - YES - - - - - - - 297 - - - - - 298 - - - - - 299 - - - YES - - - - - - 300 - - - YES - - - - - - - 344 - - - - - 345 - - - - - 211 - - - YES - - - - - - 212 - - - YES - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - YES - - - - - - 349 - - - YES - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 367 - - - YES - - - - - - 368 - - - YES - - - - - - - - - - - - - 373 - - - YES - - - - - - 374 - - - - - 375 - - - YES - - - - - - 376 - - - - - 377 - - - YES - - - - - - 378 - - - - - 379 - - - YES - - - - - - 380 - - - - - 381 - - - YES - - - - - - 382 - - - - - 383 - - - YES - - - - - - 384 - - - - - 385 - - - YES - - - - - - 386 - - - - - 389 - - - - - 394 - - - - - 395 - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 103.IBPluginDependency - 103.ImportedFromIB2 - 106.IBPluginDependency - 106.ImportedFromIB2 - 106.editorWindowContentRectSynchronizationRect - 111.IBPluginDependency - 111.ImportedFromIB2 - 112.IBPluginDependency - 112.ImportedFromIB2 - 124.IBPluginDependency - 124.ImportedFromIB2 - 125.IBPluginDependency - 125.ImportedFromIB2 - 125.editorWindowContentRectSynchronizationRect - 126.IBPluginDependency - 126.ImportedFromIB2 - 129.IBPluginDependency - 129.ImportedFromIB2 - 130.IBPluginDependency - 130.ImportedFromIB2 - 130.editorWindowContentRectSynchronizationRect - 131.IBPluginDependency - 131.ImportedFromIB2 - 134.IBPluginDependency - 134.ImportedFromIB2 - 136.IBPluginDependency - 136.ImportedFromIB2 - 143.IBPluginDependency - 143.ImportedFromIB2 - 144.IBPluginDependency - 144.ImportedFromIB2 - 145.IBPluginDependency - 145.ImportedFromIB2 - 149.IBPluginDependency - 149.ImportedFromIB2 - 150.IBPluginDependency - 150.ImportedFromIB2 - 19.IBPluginDependency - 19.ImportedFromIB2 - 195.IBPluginDependency - 195.ImportedFromIB2 - 196.IBPluginDependency - 196.ImportedFromIB2 - 197.IBPluginDependency - 197.ImportedFromIB2 - 198.IBPluginDependency - 198.ImportedFromIB2 - 199.IBPluginDependency - 199.ImportedFromIB2 - 200.IBPluginDependency - 200.ImportedFromIB2 - 200.editorWindowContentRectSynchronizationRect - 201.IBPluginDependency - 201.ImportedFromIB2 - 202.IBPluginDependency - 202.ImportedFromIB2 - 203.IBPluginDependency - 203.ImportedFromIB2 - 204.IBPluginDependency - 204.ImportedFromIB2 - 205.IBPluginDependency - 205.ImportedFromIB2 - 205.editorWindowContentRectSynchronizationRect - 206.IBPluginDependency - 206.ImportedFromIB2 - 207.IBPluginDependency - 207.ImportedFromIB2 - 208.IBPluginDependency - 208.ImportedFromIB2 - 209.IBPluginDependency - 209.ImportedFromIB2 - 210.IBPluginDependency - 210.ImportedFromIB2 - 211.IBPluginDependency - 211.ImportedFromIB2 - 212.IBPluginDependency - 212.ImportedFromIB2 - 212.editorWindowContentRectSynchronizationRect - 213.IBPluginDependency - 213.ImportedFromIB2 - 214.IBPluginDependency - 214.ImportedFromIB2 - 215.IBPluginDependency - 215.ImportedFromIB2 - 216.IBPluginDependency - 216.ImportedFromIB2 - 217.IBPluginDependency - 217.ImportedFromIB2 - 218.IBPluginDependency - 218.ImportedFromIB2 - 219.IBPluginDependency - 219.ImportedFromIB2 - 220.IBPluginDependency - 220.ImportedFromIB2 - 220.editorWindowContentRectSynchronizationRect - 221.IBPluginDependency - 221.ImportedFromIB2 - 23.IBPluginDependency - 23.ImportedFromIB2 - 236.IBPluginDependency - 236.ImportedFromIB2 - 239.IBPluginDependency - 239.ImportedFromIB2 - 24.IBPluginDependency - 24.ImportedFromIB2 - 24.editorWindowContentRectSynchronizationRect - 29.IBPluginDependency - 29.ImportedFromIB2 - 29.WindowOrigin - 29.editorWindowContentRectSynchronizationRect - 295.IBPluginDependency - 296.IBPluginDependency - 296.editorWindowContentRectSynchronizationRect - 297.IBPluginDependency - 298.IBPluginDependency - 299.IBPluginDependency - 300.IBPluginDependency - 300.editorWindowContentRectSynchronizationRect - 344.IBPluginDependency - 345.IBPluginDependency - 346.IBPluginDependency - 346.ImportedFromIB2 - 348.IBPluginDependency - 348.ImportedFromIB2 - 349.IBPluginDependency - 349.ImportedFromIB2 - 349.editorWindowContentRectSynchronizationRect - 350.IBPluginDependency - 350.ImportedFromIB2 - 351.IBPluginDependency - 351.ImportedFromIB2 - 354.IBPluginDependency - 354.ImportedFromIB2 - 367.IBPluginDependency - 367.IBWindowTemplateEditedContentRect - 367.NSWindowTemplate.visibleAtLaunch - 367.editorWindowContentRectSynchronizationRect - 368.IBPluginDependency - 373.IBPluginDependency - 374.IBPluginDependency - 375.IBPluginDependency - 376.IBPluginDependency - 377.IBPluginDependency - 378.IBPluginDependency - 379.IBPluginDependency - 380.IBPluginDependency - 381.IBPluginDependency - 382.IBPluginDependency - 383.IBPluginDependency - 384.IBPluginDependency - 385.IBPluginDependency - 386.IBPluginDependency - 389.IBPluginDependency - 394.IBPluginDependency - 395.IBPluginDependency - 5.IBPluginDependency - 5.ImportedFromIB2 - 56.IBPluginDependency - 56.ImportedFromIB2 - 57.IBPluginDependency - 57.ImportedFromIB2 - 57.editorWindowContentRectSynchronizationRect - 58.IBPluginDependency - 58.ImportedFromIB2 - 72.IBPluginDependency - 72.ImportedFromIB2 - 73.IBPluginDependency - 73.ImportedFromIB2 - 74.IBPluginDependency - 74.ImportedFromIB2 - 75.IBPluginDependency - 75.ImportedFromIB2 - 77.IBPluginDependency - 77.ImportedFromIB2 - 78.IBPluginDependency - 78.ImportedFromIB2 - 79.IBPluginDependency - 79.ImportedFromIB2 - 80.IBPluginDependency - 80.ImportedFromIB2 - 81.IBPluginDependency - 81.ImportedFromIB2 - 81.editorWindowContentRectSynchronizationRect - 82.IBPluginDependency - 82.ImportedFromIB2 - 83.IBPluginDependency - 83.ImportedFromIB2 - 92.IBPluginDependency - 92.ImportedFromIB2 - - - YES - - - - - - - - {{532, 981}, {242, 23}} - - - - - - - - - {{522, 812}, {146, 23}} - - - - - - - {{436, 809}, {64, 6}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {{608, 612}, {275, 83}} - - - - - - - - - - - {{301, 761}, {243, 243}} - - - - - - - - - - - - - - - {{608, 612}, {167, 43}} - - - - - - - - - - - - - - - - - {{608, 612}, {241, 103}} - - - - - - - - - - - {{461, 931}, {197, 73}} - - - {74, 862} - {{88, 1004}, {505, 20}} - - - {{411, 961}, {234, 43}} - - - - - {{345, 961}, {176, 43}} - - - - - - - - - {{440, 714}, {177, 63}} - - - - - - - - {{87, 713}, {350, 189}} - - - - - - - - - - - - - - - - - - - - - - - - - - - {{100, 821}, {271, 183}} - - - - - - - - - - - - - - - - - - - - - {{259, 801}, {199, 203}} - - - - - - - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 400 - - - - YES - - - - - - id - - - YES - - YES - - - - - - - YES - - - - - - - - IBUserSource - - - - - - - - myAction1: - - - - YES - - YES - - - YES - - - - - - - - - - 0 - - 3 - - YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxECfAALAAwAMQA1ADYAPAA9 -AEIAVgBXAFgAWQALAGYAcQB9AH4AkACRAJkAmgCdAKcAqACpAK4AsAC1ALYAuQC9AMMAywDMANQA3ADd -AOYA7gDvAPgA+QD+AP8BAgEHAQgBEAERARgBGQEhASIBKQEqATIBMwFGAUcBSAFLAU4BXwFgAWEBZwFo -AWsBbgFyAAsBcwF1AXYBeQF9Aa0BswHDAcgByQHKAc8B0AHRAdQB2AHZAdwB3QHhAecB6gHrAewB7wHz -AfsB/wIAAgECAgIGAg0CEQISAhMCFwIeAh8CIAIkAi0CLgIvAjACNAI7AjwCPQJCAkMCRwJOAlMCVAJV -AlYCWgJhAmUCZgJnAmgCbAJzAngCeQJ6AnsCfwKGAooCiwKMAo0CkQKaAp4CnwKgAqQCqwKsAq0CrgKy -ArkCugK7ArwCwALHAsgCyQLKAs4C1QLWAtcC2wLjAuQC5QLmAuoC8QL1AvYC9wL4AvwDAwMEAwUDCQMQ -AxUDFgMXAxsDIgMjAyQDJQMpAzADMQMyAzYDPQM+Az8DQANEA0sDTANNA1IDUwNXA14DYgNjA2QDZQNp -A3ADcQNyA3MDdwN+A38DgAOFA4gDiQOKA44DlQOWA5cDmwOiA6MDpAOlA6kDsAOxA7IDtwO4A7wDwwPE -A8UDyQPQA9ED0gPTA9cD3gPfA+AD4QPlA+wD7QPuA/MD+gP7A/wEAQQCBAYEDQQOBA8EFAQVBBkEIAQh -BCIEIwQoBCwEMwQ3BDgEOQQ6BKEErAS1BLYEvQTGBMcEyQTUBNUE1gTbBOQE6QTVBOoE+gUDBQwFFQTV -BRYFHgUlBSYFJwUuBS8FMAU3BTgFOQVCBNUFQwVKBVME1QVUBVoFXwVgBWMFZAVtBXQFdQV+BNUFfwWD -BYoFiwWMBZMFlAWVBNUFngWsBbUE1QW+BccFyAXPBdAF0QXSBeAF6QTVBeoF7gXvBfgE1QYBBgIGBwYQ -BNUGEQYWBNUGHwTVBigGKQYzBjQGNwY5BqAHCAdwB3EHcgdzB3QHdQd2B3cHeAd5B3oHewd8B30Hfgd/ -B4AHgQeCB4MHhAeFB4YHhweIB4kHigeLB4wHjQeOB48HkAeRB5IHkweUB5UHlgeXB5gHmQeaB5sHnAed -B54HnwegB6EHogejB6QHpQemB6cHqAepB6oHqwesB60HrgevB7AHsQeyB7MHtAe1B7YHtwe4B7kHuge7 -B7wHvQe+B78HwAfBB8IHwwfEB8UHxgfHB8gHyQfKB8sHzAfNB84DiAfPB9AH0QfSB9MH1AfXB9oIbwkE -CQUJBgkHCQgJCQkKCQsJDAkNCQ4JDwkQCREJEgkTCRQJFQkWCRcJGAkZCRoJGwkcCR0JHgkfCSAJIQki -CSMJJAklCSYJJwkoCSkJKgkrCSwJLQkuCS8JMAkxCTIJMwk0CTUJNgE+CTcJOAk5CToJOwk8CT0JPgk/ -CUAJQQlCCUMJRAlFCUYJRwlICUkJSglLCUwJTQlOCU8JUAlRAUMJUglTCVQJVQlWCVcJWAlZCVoJWwlc -CV0JXglfCWAJYQliCWMJZAllCWYJZwloCWkJaglrCWwJbQluCW8JcAlxCXIJcwl0CXUJdgl3CXgJeQl6 -CXsJfAl9CX4JfwmACYEJggmDCYQJhQmGCYcJiAmJCYoJiwmMCY0JjgmPCZAJkQmSCZMJlAmXCZoJnVUk -bnVsbN8QEgANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYA -JwAoACkAKgArACwALQAuAC8AMFZOU1Jvb3RWJGNsYXNzXU5TT2JqZWN0c0tleXNfEA9OU0NsYXNzZXNW -YWx1ZXNfEBlOU0FjY2Vzc2liaWxpdHlPaWRzVmFsdWVzXU5TQ29ubmVjdGlvbnNbTlNOYW1lc0tleXNb -TlNGcmFtZXdvcmtdTlNDbGFzc2VzS2V5c1pOU09pZHNLZXlzXU5TTmFtZXNWYWx1ZXNfEBlOU0FjY2Vz -c2liaWxpdHlDb25uZWN0b3JzXU5TRm9udE1hbmFnZXJfEBBOU1Zpc2libGVXaW5kb3dzXxAPTlNPYmpl -Y3RzVmFsdWVzXxAXTlNBY2Nlc3NpYmlsaXR5T2lkc0tleXNZTlNOZXh0T2lkXE5TT2lkc1ZhbHVlc4AC -gQJ7gQEdgQHjgQJ6gEuBAXuABYEB4oEB5IEBfIECeIAAgAaBAXqBAnkRAZKBAeXSAA4AMgAzADRbTlND -bGFzc05hbWWABIADXU5TQXBwbGljYXRpb27SADcAOAA5ADpYJGNsYXNzZXNaJGNsYXNzbmFtZaIAOgA7 -Xk5TQ3VzdG9tT2JqZWN0WE5TT2JqZWN0XxAQSUJDb2NvYUZyYW1ld29ya9IADgA+AD8AQFpOUy5vYmpl -Y3RzgEqhAEGAB9oAQwAOAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVAArXE5TV2luZG93 -Vmlld1xOU1NjcmVlblJlY3RdTlNXaW5kb3dUaXRsZVlOU1dURmxhZ3NdTlNXaW5kb3dDbGFzc1xOU1dp -bmRvd1JlY3RfEA9OU1dpbmRvd0JhY2tpbmdfEBFOU1dpbmRvd1N0eWxlTWFza1tOU1ZpZXdDbGFzc4AL -gEmASIAJEiR4AACACoAIEAIQB4AAXxAYe3szMDYsIDc2N30sIHszNTAsIDE4OX19XxASQ3VycmVuY3kg -Q29udmVydGVyWE5TV2luZG931wBaAA4AWwBcAF0AWABeAF8AYABhAGIAYwBfAGVfEA9OU05leHRSZXNw -b25kZXJaTlNTdWJ2aWV3c1hOU3ZGbGFnc1tOU0ZyYW1lU2l6ZVtOU1N1cGVydmlld4AMgEeADREBAIBF -gAyARtIADgA+AGcAaIBEqABpAGoAawBsAG0AbgBvAHCADoAfgCKAJYAugDKANoA92ABaAA4AcgBzAFwA -dABYAF4ATAB2AHcAeAB5AHoAXwBMV05TRnJhbWVWTlNDZWxsWU5TRW5hYmxlZIALgB6AD4AQEQEMCYAM -gAtfEBd7ezE5NSwgMTQ3fSwgezEzNSwgMjJ9fdkAfwAOAIAAgQCCAIMAhACFAIYAhwCIAIkAigCLAGkA -jQB6AI9bTlNDZWxsRmxhZ3NfEBFOU0JhY2tncm91bmRDb2xvclpOU0NvbnRlbnRzWU5TU3VwcG9ydF1O -U0NvbnRyb2xWaWV3XE5TQ2VsbEZsYWdzMl8QEU5TRHJhd3NCYWNrZ3JvdW5kW05TVGV4dENvbG9yE/// -//+Ucf5BgB2AFYARgBKADhIQQAQACYAaUNQADgCSAJMAlACVAJYAlwCYVk5TU2l6ZVZOU05hbWVYTlNm -RmxhZ3OAFCNAKgAAAAAAAIATEQQUXEx1Y2lkYUdyYW5kZdIANwA4AJsAnKIAnAA7Vk5TRm9udNUADgCe -AJ8AoAChAKIAowCkAKUApldOU0NvbG9yXE5TQ29sb3JTcGFjZVtOU0NvbG9yTmFtZV1OU0NhdGFsb2dO -YW1lgBmAGBAGgBeAFlZTeXN0ZW1fEBN0ZXh0QmFja2dyb3VuZENvbG9y0wAOAJ8AqgCiAKwArVdOU1do -aXRlgBkQA0IxANIANwA4AK8AnqIAngA71QAOAJ4AnwCgAKEAogCyAKQAswCmgBmAHIAbgBZZdGV4dENv -bG9y0wAOAJ8AqgCiAKwAuIAZQjAA0gA3ADgAugC7pAC7ALwAcwA7XxAPTlNUZXh0RmllbGRDZWxsXE5T -QWN0aW9uQ2VsbNIANwA4AL4Av6UAvwDAAMEAwgA7W05TVGV4dEZpZWxkWU5TQ29udHJvbFZOU1ZpZXdb -TlNSZXNwb25kZXLYAFoADgByAHMAXAB0AFgAXgBMAHYAxgDHAHkAegBfAEyAC4AegCCAIQmADIALXxAX -e3sxOTUsIDExNX0sIHsxMzUsIDIyfX3ZAH8ADgCAAIEAggCDAIQAhQCGAIcAiACJAIoAiwBqAI0AegCP -gB2AFYARgBKAHwmAGtgAWgAOAHIAcwBcAHQAWABeAEwAdgDXANgAeQB6AF8ATIALgB6AI4AkCYAMgAtf -EBZ7ezE5NSwgODN9LCB7MTM1LCAyMn192QB/AA4AgACBAIIAgwCEAIUAhgDeAIgAiQCKAIsAawCNAHoA -jxP/////hHH+QYAdgBWAEYASgCIJgBrYAFoADgByAHMAXAB0AFgAXgBMAHYA6QDqAHkAegBfAEyAC4Ae -gCaAJwmADIALXxAWe3s0NywgMTQ5fSwgezE0MywgMTd9fdgAfwAOAIAAgQCCAIMAhACGAPAAiADyAPMA -iwBsAPYA9xIEAf5AgB2AKYAogBKAJRIEQAQAgCxfEBVFeGNoYW5nZSByYXRlIHBlciAkMTrVAA4AngCf -AKAAoQCiAPsApAD8AKaAGYArgCqAFlxjb250cm9sQ29sb3LTAA4AnwCqAKIArAEBgBlLMC42NjY2NjY2 -OQDVAA4AngCfAKAAoQCiALIApAEFAKaAGYAcgC2AFl8QEGNvbnRyb2xUZXh0Q29sb3LYAFoADgByAHMA -XAB0AFgAXgBMAHYBCwEMAHkAegBfAEyAC4AegC+AMAmADIALXxAWe3s2NywgMTE1fSwgezEyMywgMTd9 -fdgAfwAOAIAAgQCCAIMAhACGAPAAiADyARQAiwBtAPYA94AdgCmAMYASgC6ALF8QE0RvbGxhcnMgdG8g -Q29udmVydDrYAFoADgByAHMAXAB0AFgAXgBMAHYBHAEdAHkAegBfAEyAC4AegDOANAmADIALXxAVe3sx -NywgODN9LCB7MTczLCAxN3192AB/AA4AgACBAIIAgwCEAIYA8ACIAPIBJQCLAG4A9gD3gB2AKYA1gBKA -MoAsXxAZQW1vdW50IGluIG90aGVyIEN1cnJlbmN5OtgAWgAOAHIAcwBcAHQAWABeAEwBLAEtAS4AeQB6 -AF8ATIALgDyAN4A4CYAMgAtfEBV7ezIxNCwgMTJ9LCB7OTYsIDMyfX3cAH8ADgE0ATUBNgE3AIEAggCD -ATgAhAE5AToBOwCKAT0BPgE/AUAAiwBvAUMBRAFFXxATTlNBbHRlcm5hdGVDb250ZW50c18QEk5TUGVy -aW9kaWNJbnRlcnZhbF5OU0J1dHRvbkZsYWdzMl8QD05TS2V5RXF1aXZhbGVudF8QD05TUGVyaW9kaWNE -ZWxheV1OU0J1dHRvbkZsYWdzEgQB/gCAO4AREBkQgYA6gDmAEoA2EMgSCAAAABP/////hoJA/1dDb252 -ZXJ0UQ3SADcAOAFJAUqkAUoAvABzADtcTlNCdXR0b25DZWxs0gA3ADgBTAFNpQFNAMAAwQDCADtYTlNC -dXR0b27cAFoBTwAOAVAAcgFRAFwBUgBYAVMBVABeAEwAUwFWAVcBWAFZAVoArABfAVwBXQBMWU5TQm94 -VHlwZVtOU1RpdGxlQ2VsbF1OU1RyYW5zcGFyZW50XE5TQm9yZGVyVHlwZVlOU09mZnNldHNfEA9OU1Rp -dGxlUG9zaXRpb26AC4BDgECAPggQDIAMgD8QAIALXxAUe3syMCwgNTh9LCB7MzEwLCA1fX1WezAsIDB9 -1wB/AA4AgACBAIIAhACGAToAiACJAWQAiwFdAWaAHYAVgEGAEoBCU0JveNMADgCfAKoAogCsAWqAGU0w -IDAuODAwMDAwMDEA0gA3ADgBbAFtpAFtAMEAwgA7VU5TQm940gA3ADgBbwFwowFwAXEAO15OU011dGFi -bGVBcnJheVdOU0FycmF5WnszNTAsIDE4OX3SADcAOAF0AMGjAMEAwgA7XxAWe3swLCAwfSwgezE5MjAs -IDExNzh9fdIANwA4AXcBeKIBeAA7XxAQTlNXaW5kb3dUZW1wbGF0ZdIANwA4AXoBe6MBewF8ADtcTlNN -dXRhYmxlU2V0VU5TU2V00gAOAD4AZwF/gESvEC0BgAGBAYIBgwGEAYUBhgGHAYgBiQGKAYsBjAGNAY4B -jwGQAZEBkgGTAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAaABoQGiAaMBpAGlAaYBpwGoAakBqgGrAayA -TIBagF+AZYBqgG6Ac4B3gHmAf4CFgIuAkYCWgJuAoIClgKmAroC0gLiAvYDCgMaAy4DPgNGA14DcgOCA -5IDogO2A8YDzgPeA/IEBAYEBBYEBCYEBC4EBD4EBEYEBFoEBF9MADgGuAa8BsAGxAbJYTlNTb3VyY2VX -TlNMYWJlbIBZgE2AWNgADgG0AbUBtgG3AbgBuQG6AbsBvAG9Ab4BvwHAAcEBwldOU1RpdGxlXxARTlNL -ZXlFcXVpdk1vZE1hc2taTlNLZXlFcXVpdl1OU01uZW1vbmljTG9jWU5TT25JbWFnZVxOU01peGVkSW1h -Z2VWTlNNZW51gFeATxIAEgAAgFASf////4BRgFWATtMADgG0AcQBxQHGAcdbTlNNZW51SXRlbXOBASSB -AWGBAWJoAFMAYQB2AGUAIABBAHMgJlFT0wAOADIBywHMAc0Bzl5OU1Jlc291cmNlTmFtZYBUgFKAU1dO -U0ltYWdlXxAPTlNNZW51Q2hlY2ttYXJr0gA3ADgB0gHTogHTADtfEBBOU0N1c3RvbVJlc291cmNl0wAO -ADIBywHMAc0B14BUgFKAVl8QEE5TTWVudU1peGVkU3RhdGXSADcAOAHaAduiAdsAO1pOU01lbnVJdGVt -XxAPc2F2ZURvY3VtZW50QXM60gA3ADgB3gHfowHfAeAAO18QFU5TTmliQ29udHJvbENvbm5lY3Rvcl5O -U05pYkNvbm5lY3RvctQADgHiAa4BrwHjAGkB5QHmXU5TRGVzdGluYXRpb26AXoAOgFuAXdIADgAyADMB -6YAEgFxfEBNDb252ZXJ0ZXJDb250cm9sbGVyWXJhdGVGaWVsZNIANwA4Ae0B7qMB7gHgADtfEBROU05p -Yk91dGxldENvbm5lY3RvctMADgGuAa8BsAHxAfKAWYBggGTYAA4BtAG1AbYBtwG4AbkBugG7AfUB9gH3 -Ab8BwAHBAfqAV4BiEgAQAACAY4BRgFWAYdMADgG0AcQBxQH9Af6BASSBAT6BAUBeQ2hlY2sgU3BlbGxp -bmdRO15jaGVja1NwZWxsaW5nOtMADgGuAa8BsAIEAgWAWYBmgGnYAA4BtAG1AbYBtwG4AbkBugG7AggB -9gCKAb8BwAHBAgyAV4BogBGAUYBVgGfTAA4BtAHEAcUCDwIQgQEkgQEmgQEoXVN0b3AgU3BlYWtpbmdd -c3RvcFNwZWFraW5nOtMADgGuAa8BsAIVAhaAWYBrgG3YAA4BtAG1AbYBtwG4AbkBugG7AhkB9gCKAb8B -wAHBAgyAV4BsgBGAUYBVgGdeU3RhcnQgU3BlYWtpbmdec3RhcnRTcGVha2luZzrTAA4BrgGvAbACIgIj -gFmAb4By2QAOAiUBtAG1AbYBtwG4AbkBugG7AIoCKAG9AikBvwHAAcEBwllOU1Rvb2xUaXCAV4ARgHCA -cYBRgFWATl1QYWdlIFNldHVwLi4uUVBecnVuUGFnZUxheW91dDrTAA4BrgGvAbACMgIzgFmAdIB22AAO -AbQBtQG2AbcBuAG5AboBuwI2AfYAigG/AcABwQH6gFeAdYARgFGAVYBhXxAbQ2hlY2sgR3JhbW1hciBX -aXRoIFNwZWxsaW5nXxAWdG9nZ2xlR3JhbW1hckNoZWNraW5nOtQADgHiAa4BrwHjAGoAaQJBgF6AH4AO -gHhbbmV4dEtleVZpZXfTAA4BrgGvAbACRQJGgFmAeoB+2AAOAbQBtQG2AbcBuAG5AboBuwJJAfYCSgG/ -AcABwQJNgFeAfIB9gFGAVYB71AAOAbQAkwHEAcUCUAJRAlKBASSBASCBASOBASFYTWluaW1pemVRbV8Q -E3BlcmZvcm1NaW5pYXR1cml6ZTrTAA4BrgGvAbACWAJZgFmAgICE2AAOAbQBtQG2AbcBuAG5AboBuwJc -AfYCXQG/AcABwQJggFeAgoCDgFGAVYCB0wAOAbQBxAHFAmMCZIEBJIEBK4EBLVVQYXN0ZVF2VnBhc3Rl -OtMADgGuAa8BsAJqAmuAWYCGgIrYAA4BtAG1AbYBtwG4AbkBugG7Am4B9gJvAb8BwAHBAnKAV4CIgImA -UYBVgIfUAA4BtACTAcQBxQBPAnYCd4EBJIAJgQFdgQFYXxAXUXVpdCBDdXJyZW5jeSBDb252ZXJ0ZXJR -cVp0ZXJtaW5hdGU60wAOAa4BrwGwAn0CfoBZgIyAkNgADgG0AbUBtgG3AbgBuQG6AbsCgQG9AoIBvwHA -AcEChYBXgI6Aj4BRgFWAjdMADgG0AcQBxQKIAomBASSBAWuBAWxbU2hvdyBDb2xvcnNRQ18QFW9yZGVy -RnJvbnRDb2xvclBhbmVsOtMADgGuAa8BsAKPApCAWYCSgJXYAA4BtAG2AbcBuAG5AboCkgG7ApQAigG/ -AcABwQKYAplVTlNUYWeAV4CUgBGAUYBVgJMQAdMADgG0AcQBxQKcAp2BASSBAUKBAURfEBBTbWFydCBD -b3B5L1Bhc3RlXxAYdG9nZ2xlU21hcnRJbnNlcnREZWxldGU60wAOAa4BrwGwAqICo4BZgJeAmtgADgG0 -AbUBtgG3AbgBuQG6AbsCpgH2AqcBvwHAAcECYIBXgJiAmYBRgFWAgVNDdXRReFRjdXQ60wAOAa4BrwGw -ArACsYBZgJyAn9gADgG0AbUBtgG3AbgBuQG6AbsCtAH2ArUBvwHAAcEBwoBXgJ2AnoBRgFWATmYAUABy -AGkAbgB0ICZRcFZwcmludDrTAA4BrgGvAbACvgK/gFmAoYCk2AAOAbQBtQG2AbcBuAG5AboBuwLCAfYC -wwG/AcABwQHCgFeAooCjgFGAVYBOVFNhdmVRc11zYXZlRG9jdW1lbnQ60wAOAa4BrwGwAswCzYBZgKaA -qNgADgG0AbUBtgG3AbgBuQG6AbsC0AH2AIoBvwHAAcEB+oBXgKeAEYBRgFWAYV8QG0NoZWNrIFNwZWxs -aW5nIFdoaWxlIFR5cGluZ18QHnRvZ2dsZUNvbnRpbnVvdXNTcGVsbENoZWNraW5nOtMADgGuAa8BsALZ -AtqAWYCqgK3YAA4BtAG1AbYBtwG4AbkBugG7At0C3gLfAb8BwAHBAnKAV4CrEgAYAACArIBRgFWAh1tI -aWRlIE90aGVyc1FoXxAWaGlkZU90aGVyQXBwbGljYXRpb25zOtMADgGuAa8BsALoAumAWYCvgLPZAA4B -tAG1AbYBtwG4AbkBugKSAbsC7AH2Au0BvwHAAcEC8AKZgFeAsYCygFGAVYCw0wAOAbQBxAHFAvMC9IEB -JIEBMYEBM2UARgBpAG4AZCAmUWZfEBdwZXJmb3JtRmluZFBhbmVsQWN0aW9uOtMADgGuAa8BsAL6AvuA -WYC1gLfXAA4BtAG2AbcBuAG5AboBuwL+AIoBvwHAAcEBwoBXgLaAEYBRgFWATl8QD1JldmVydCB0byBT -YXZlZF8QFnJldmVydERvY3VtZW50VG9TYXZlZDrTAA4BrgGvAbADBwMIgFmAuYC82AAOAbQBtQG2AbcB -uAG5AboBuwMLAfYAigG/AcABwQMPgFeAu4ARgFGAVYC61AAOAbQAkwHEAcUDEgMTAxSBASSBAWSBAWeB -AWZaQ2xlYXIgTWVudV8QFWNsZWFyUmVjZW50RG9jdW1lbnRzOtMADgGuAa8BsAMZAxqAWYC+gMHYAA4B -tAG1AbYBtwG4AbkBugG7Ax0B9gMeAb8BwAHBAfqAV4C/gMCAUYBVgGFuAFMAaABvAHcAIABTAHAAZQBs -AGwAaQBuAGcgJlE6XxAPc2hvd0d1ZXNzUGFuZWw60wAOAa4BrwGwAycDKIBZgMOAxdgADgG0AbYBtwG4 -AbkBugKSAbsDKwCKAb8BwAHBApgArIBXgMSAEYBRgFWAk1tTbWFydCBMaW5rc18QHXRvZ2dsZUF1dG9t -YXRpY0xpbmtEZXRlY3Rpb2460wAOAa4BrwGwAzQDNYBZgMeAytgADgG0AbUBtgG3AbgBuQG6AbsDOAH2 -AzkBvwHAAcECYIBXgMiAyYBRgFWAgVpTZWxlY3QgQWxsUWFac2VsZWN0QWxsOtMADgGuAa8BsANCA0OA -WYDMgM7YAA4BtAG1AbYBtwG4AbkBugG7A0YB9gLfAb8BwAHBAnKAV4DNgKyAUYBVgIdfEBdIaWRlIEN1 -cnJlbmN5IENvbnZlcnRlclVoaWRlOtQADgHiAa4BrwHjAGsB5QNRgF6AIoBbgNBbYW1vdW50RmllbGTT -AA4BrgGvAbADVQNWgFmA0oDW2AAOAbQBtQG2AbcBuAG5AboBuwNZAt4DWgG/AcABwQNdgFeA1IDVgFGA -VYDT0wAOAbQBxAHFA2ADYYEBJIEBboEBcFxTaG93IFRvb2xiYXJRdF8QE3RvZ2dsZVRvb2xiYXJTaG93 -bjrTAA4BrgGvAbADZwNogFmA2IDb2AAOAbQBtQG2AbcBuAG5AboBuwNrAfYDbAG/AcABwQJggFeA2YDa -gFGAVYCBVFVuZG9RelV1bmRvOtMADgGuAa8BsAN1A3aAWYDdgN/YAA4BtAG1AbYBtwG4AbkBugG7A3kB -9gCKAb8BwAHBAmCAV4DegBGAUYBVgIFWRGVsZXRlV2RlbGV0ZTrUAA4B4gGuAa8B4wOCAeUDhIBegOGA -W4Dj0gAOADIAMwOHgASA4llDb252ZXJ0ZXJZY29udmVydGVy0wAOAa4BrwGwA4wDjYBZgOWA59gADgG0 -AbUBtgG3AbgBuQG6AbsDkAH2AIoBvwHAAcECcoBXgOaAEYBRgFWAh1hTaG93IEFsbF8QFnVuaGlkZUFs -bEFwcGxpY2F0aW9uczrTAA4BrgGvAbADmQOagFmA6YDs2AAOAbQBtQG2AbcBuAG5AboBuwOdAfYDngG/ -AcABwQHCgFeA6oDrgFGAVYBOVUNsb3NlUXddcGVyZm9ybUNsb3NlOtMADgGuAa8BsAOnA6iAWYDugPDY -AA4BtAG1AbYBtwG4AbkBugG7A6sB9gCKAb8BwAHBAk2AV4DvgBGAUYBVgHtUWm9vbVxwZXJmb3JtWm9v -bTrUAA4B4gGuAa8BsAHlAG8DtoBZgFuANoDyWGNvbnZlcnQ60wAOAa4BrwGwA7oDu4BZgPSA9tgADgG0 -AbYBtwG4AbkBugKSAbsDvgCKAb8BwAHBApgAU4BXgPWAEYBRgFWAk1xTbWFydCBRdW90ZXNfECF0b2dn -bGVBdXRvbWF0aWNRdW90ZVN1YnN0aXR1dGlvbjrTAA4BrgGvAbADxwPIgFmA+ID72AAOAbQBtQG2AbcB -uAG5AboBuwPLAfYDzAG/AcABwQJggFeA+YD6gFGAVYCBVENvcHlRY1Vjb3B5OtMADgGuAa8BsAPVA9aA -WYD9gQEA2AAOAbQBtQG2AbcBuAG5AboBuwPZAfYD2gG/AcABwQLwgFeA/oD/gFGAVYCwXxARSnVtcCB0 -byBTZWxlY3Rpb25Ral8QHWNlbnRlclNlbGVjdGlvbkluVmlzaWJsZUFyZWE60wAOAa4BrwGwA+MD5IBZ -gQECgQEE2AAOAbQBtQG2AbcBuAG5AboBuwPnAfYAigG/AcABwQJNgFeBAQOAEYBRgFWAe18QEkJyaW5n -IEFsbCB0byBGcm9udF8QD2FycmFuZ2VJbkZyb250OtQADgHiAa4BrwGwAB8D8QPygFmAAoEBBoEBCNcA -DgG0AbYBtwG4AbkBugG7A/UAigG/AcABwQJygFeBAQeAEYBRgFWAh18QGEFib3V0IEN1cnJlbmN5IENv -bnZlcnRlcl8QHW9yZGVyRnJvbnRTdGFuZGFyZEFib3V0UGFuZWw61AAOAeIBrgGvAeMAagHlBACAXoAf -gFuBAQpbZG9sbGFyRmllbGTTAA4BrgGvAbAEBAQFgFmBAQyBAQ7YAA4BtAG1AbYBtwG4AbkBugG7BAgB -9gCKAb8BwAHBA12AV4EBDYARgFGAVYDTbxASAEMAdQBzAHQAbwBtAGkAegBlACAAVABvAG8AbABiAGEA -ciAmXxAfcnVuVG9vbGJhckN1c3RvbWl6YXRpb25QYWxldHRlOtQADgHiAa4BrwHjAGkAQQQTgF6ADoAH -gQEQXxAVaW5pdGlhbEZpcnN0UmVzcG9uZGVy0wAOAa4BrwGwBBcEGIBZgQESgQEV2AAOAbQBtQG2AbcB -uAG5AboBuwQbAb0EHAG/AcABwQJggFeBAROBARSAUYBVgIFUUmVkb1FaVXJlZG861AAOAeIBrgGvAeMA -aQBqAkGAXoAOgB+AeNMADgGuAa8BsAQqBCuAWYEBGIEBHNgADgG0AbUBtgG3AbgBuQG6AbsELgH2BC8B -vwHAAcEEMoBXgQEagQEbgFGAVYEBGdMADgG0AcQBxQQ1BDaBASSBAU2BAU9fEBdDdXJyZW5jeSBDb252 -ZXJ0ZXIgSGVscFE/WXNob3dIZWxwOtIADgA+BDsEPIEBea8QZAIyBD4C2QQEBEEEFwBuAk0A2ARGAmoC -IgRJA2cCzARMA/EATARPBFAAcAHlA5kBHQBsAGkC8AKwA8cEWgRbAOoEXQOMAHgEMgRhBGIDNAJYBGUD -JwMHAmAEaQN1AGsDGQRtBG4CDAHCA7oEcgBtAoUEdQH6A10D1QGxBHoEewR8BH0EfgLoA1UAQQJyBIMA -bwJFAvoEhwMPAGoEigNCA+MEjQQqAMcEkAEMA6cEkwKYAr4CjwEuAfECFQKiA4ICBASdBJ4CfQSggHSB -AR6AqoEBDIEBH4EBEoAygHuAJIEBJYCGgG+BASmA2ICmgQFFgQEGgAuBAUmBAUqAPYBbgOmANIAlgA6A -sICcgPiBAS+BAS6AJ4EBTIDlgBCBARmBAVCBATSAx4CAgQFBgMOAuYCBgQFTgN2AIoC+gQFWgQFegGeA -ToD0gQFpgC6AjYEBbYBhgNOA/YBNgQE3gQE9gQFxgQFzgQFagK+A0oAHgIeBATqANoB6gLWBAWOAuoAf -gQEigMyBAQKBAVmBARiAIYEBXIAwgO6BASqAk4ChgJKAOIBggGuAl4DhgGaBAWiBAXiAjIEBMNoADgG0 -AbUEogG2BKMBtwG4AbkBugG7AIoB9gB6AIoAegG/AcABwQJyXU5TSXNTZXBhcmF0b3JcTlNJc0Rpc2Fi -bGVkgFeAEQmAEQmAUYBVgIfaAA4BtAG1BKIBtgSjAbcBuAG5AboBuwCKAfYAegCKAHoBvwHAAcECcoBX -gBEJgBEJgFGAVYCHVldpbmRvd9IADgA+AGcEuIBEpAJFA6cEigPjgHqA7oEBIoEBAtoADgG0AbUEogG2 -BKMBtwG4AbkBugG7AIoB9gB6AIoAegG/AcABwQJNgFeAEQmAEQmAUYBVgHteX05TV2luZG93c01lbnXS -ADcAOATIAbqiAboAO9oADgTKAbQBtQG2AbcBuAG5AboEywG7AgwCDwH2AIoBvwHAAcECYATTWU5TU3Vi -bWVudVhOU0FjdGlvboBXgGeBASaAEYBRgFWAgYEBJ1ZTcGVlY2hec3VibWVudUFjdGlvbjrSAA4APgBn -BNiARKICFQIEgGuAZtoADgTKAbQBtQG2AbcBuAG5AboEywG7AmACYwH2AIoBvwHAAcEEkwTjgFeAgYEB -K4ARgFGAVYEBKoEBLNQADgG0AJMBxAHFBOYE5wTogQEkgQF1gQF3gQF2VEVkaXTSAA4APgBnBOyARK0D -ZwQXBFsCogPHAlgDdQM0BFoEoAR7BGUERoDYgQESgQEugJeA+ICAgN2Ax4EBL4EBMIEBPYEBQYEBJdoA -DgG0AbUEogG2BKMBtwG4AbkBugG7AIoB9gB6AIoAegG/AcABwQJggFeAEQmAEQmAUYBVgIHaAA4BtAG1 -BKIBtgSjAbcBuAG5AboBuwCKAfYAegCKAHoBvwHAAcECYIBXgBEJgBEJgFGAVYCB2gAOBMoBtAG1AbYB -twG4AbkBugTLAbsC8ALzAfYAigG/AcABwQJgBRSAV4CwgQExgBGAUYBVgIGBATJURmluZNIADgA+AGcF -GIBEpQLoBGIEegSDA9WAr4EBNIEBN4EBOoD92QAOAbQBtQG2AbcBuAG5AboCkgG7BSAB9gUhAb8BwAHB -AvAAU4BXgQE1gQE2gFGAVYCwWUZpbmQgTmV4dFFn2QAOAbQBtQG2AbcBuAG5AboCkgG7BSkBvQUqAb8B -wAHBAvAArIBXgQE4gQE5gFGAVYCwXUZpbmQgUHJldmlvdXNRR9kADgG0AbUBtgG3AbgBuQG6ApIBuwUy -AfYFMwG/AcABwQLwAFSAV4EBO4EBPIBRgFWAsF8QFlVzZSBTZWxlY3Rpb24gZm9yIEZpbmRRZdoADgTK -AbQBtQG2AbcBuAG5AboEywG7AfoB/QH2AIoBvwHAAcECYAVBgFeAYYEBPoARgFGAVYCBgQE/XxAUU3Bl -bGxpbmcgYW5kIEdyYW1tYXLSAA4APgBnBUWARKQDGQHxAswCMoC+gGCApoB02gAOBMoBtAG1AbYBtwG4 -AbkBugTLAbsCmAKcAfYAigG/AcABwQJgBVKAV4CTgQFCgBGAUYBVgIGBAUNdU3Vic3RpdHV0aW9uc9IA -DgA+AGcFVoBEowKPA7oDJ4CSgPSAw9QADgG0AJMBxAHFBVwFXQVegQEkgQFGgQFIgQFHWFNlcnZpY2Vz -0gAOAD4AZwVigESgXxAPX05TU2VydmljZXNNZW512gAOAbQBtQSiAbYEowG3AbgBuQG6AbsAigH2AHoA -igB6Ab8BwAHBAcKAV4ARCYARCYBRgFWATtgADgG0AbUBtgG3AbgBuQG6AbsFbwH2A1oBvwHAAcEChYBX -gQFLgNWAUYBVgI1aU2hvdyBGb250c9oADgTKAbQBtQG2AbcBuAG5AboEywG7BDIENQH2AIoBvwHAAcEE -kwV9gFeBARmBAU2AEYBRgFWBASqBAU5USGVscNIADgA+AGcFgYBEoQQqgQEY2AAOAbQBtQG2AbcBuAG5 -AboBuwWFAfYFhgG/AcABwQJygFeBAVGBAVKAUYBVgIdsAFAAcgBlAGYAZQByAGUAbgBjAGUAcyAmUSzY -AA4BtAG1AbYBtwG4AbkBugG7BY4B9gWPAb8BwAHBAcKAV4EBVIEBVYBRgFWATlNOZXdRbtoADgTKAbQB -tQG2AbcBuAG5AboEywG7AnIATwH2AIoBvwHAAcEEkwWdgFeAh4AJgBGAUYBVgQEqgQFX0gAOAD4AZwWg -gESrA/EEjQRhBD4EfgSQA0IC2QOMBEECaoEBBoEBWYEBUIEBHoEBWoEBXIDMgKqA5YEBH4CG2gAOAbQB -tQSiAbYEowG3AbgBuQG6AbsAigH2AHoAigB6Ab8BwAHBAnKAV4ARCYARCYBRgFWAh9oADgTKAbQBtQG2 -AbcBuAG5AboEywG7BEwFXAH2AIoBvwHAAcECcgW9gFeBAUWBAUaAEYBRgFWAh4EBW9oADgG0AbUEogG2 -BKMBtwG4AbkBugG7AIoB9gB6AIoAegG/AcABwQJygFeAEQmAEQmAUYBVgIdcX05TQXBwbGVNZW512AAO -AbQBtQG2AbcBuAG5AboBuwXKAfYFywG/AcABwQHCgFeBAV+BAWCAUYBVgE5lAE8AcABlAG4gJlFvVEZp -bGXSAA4APgBnBdSARKsEaQRuBIcEnQOZAr4BsQL6BE8CIgKwgQFTgQFegQFjgQFogOmAoYBNgLWBAUmA -b4Cc2gAOBMoBtAG1AbYBtwG4AbkBugTLAbsDDwMSAfYAigG/AcABwQHCBeiAV4C6gQFkgBGAUYBVgE6B -AWVbT3BlbiBSZWNlbnTSAA4APgBnBeyARKEDB4C5XxAWX05TUmVjZW50RG9jdW1lbnRzTWVuddoADgG0 -AbUEogG2BKMBtwG4AbkBugG7AIoB9gB6AIoAegG/AcABwQHCgFeAEQmAEQmAUYBVgE7aAA4EygG0AbUB -tgG3AbgBuQG6BMsBuwJNAlAB9gCKAb8BwAHBBJMGAIBXgHuBASCAEYBRgFWBASqBAWpWRm9ybWF00gAO -AD4AZwYEgESiBFACfYEBSoCM2gAOBMoBtAG1AbYBtwG4AbkBugTLAbsDXQNgAfYAigG/AcABwQSTBg+A -V4DTgQFugBGAUYBVgQEqgQFvVFZpZXfSAA4APgBnBhOARKIDVQQEgNKBAQzaAA4EygG0AbUBtgG3AbgB -uQG6BMsBuwHCAcYB9gCKAb8BwAHBBJMGHoBXgE6BAWGAEYBRgFWBASqBAXLaAA4EygG0AbUBtgG3AbgB -uQG6BMsBuwKFAogB9gCKAb8BwAHBBJMGJ4BXgI2BAWuAEYBRgFWBASqBAXRZQU1haW5NZW510gAOAD4A -ZwYrgESnBG0EfARJBH0EdQRyBF2BAVaBAXGBASmBAXOBAW2BAWmBAUxbX05TTWFpbk1lbnXSAA4AMgAz -ADSABIAD0gA3ADgGOAFxogFxADvSAA4APgQ7BjuBAXmvEGQB+gJyAnIDXQJyAmAATARyAGsCYAJyAcIE -kwJgAfoEfgJyAEEBwgKFAEwAHwHCAG4ATABMBKABwgJgAmACYABsBJMCcgBpBF0CcgLwAmACYAJgApgD -DwRJAcICYABMAfoEkwHCBEYEfAKYBJMATAR9BJMEewR1AvABwgLwAmAEkwSTAnIC8ANdAB8EbQLwAEwC -TQHCAcIEhwBMAk0CcgJNAnIEMgBqAnIAbQJNAB8EZQHCApgAbwH6AgwCYAAfAgwBwgAfAoUCYIBhgIeA -h4DTgIeAgYALgQFpgCKAgYCHgE6BASqAgYBhgQFagIeAB4BOgI2AC4ACgE6AMoALgAuBATCAToCBgIGA -gYAlgQEqgIeADoEBTICHgLCAgYCBgIGAk4C6gQEpgE6AgYALgGGBASqAToEBJYEBcYCTgQEqgAuBAXOB -ASqBAT2BAW2AsIBOgLCAgYEBKoEBKoCHgLCA04ACgQFWgLCAC4B7gE6AToEBY4ALgHuAh4B7gIeBARmA -H4CHgC6Ae4ACgQFBgE6Ak4A2gGGAZ4CBgAKAZ4BOgAKAjYCB0gAOAD4EOwaigQF5rxBlAjIEPgLZBAQE -FwBuBEECTQDYBEYCagIiBEkATAPxA2cAcARMBE8EUALMAeUDmQEdAGwAaQKwAvADxwRaBFsA6gRdA4wA -eAQyBGEEYgM0AlgEZQMnAwcCYARpA3UAawMZBG0EbgIMAcIDugRyAG0ChQR1AfoDXQGxA9UEewR9BHwE -egR+A1UAQQLoAnIEgwBvAkUAagL6BIcDDwSKA0ID4wQqBI0AxwSQAQwDpwSTApgCvgKPAS4B8QIVAqIA -HwOCAgQEnQSeAn0EoIB0gQEegKqBAQyBARKAMoEBH4B7gCSBASWAhoBvgQEpgAuBAQaA2IA9gQFFgQFJ -gQFKgKaAW4DpgDSAJYAOgJyAsID4gQEvgQEugCeBAUyA5YAQgQEZgQFQgQE0gMeAgIEBQYDDgLmAgYEB -U4DdgCKAvoEBVoEBXoBngE6A9IEBaYAugI2BAW2AYYDTgE2A/YEBPYEBc4EBcYEBN4EBWoDSgAeAr4CH -gQE6gDaAeoAfgLWBAWOAuoEBIoDMgQECgQEYgQFZgCGBAVyAMIDugQEqgJOAoYCSgDiAYIBrgJeAAoDh -gGaBAWiBAXiAjIEBMNIADgA+BDsHCoEBea8QZQcLBwwHDQcOBw8HEAcRBxIHEwcUBxUHFgcXBxgHGQca -BxsHHAcdBx4HHwcgByEHIgcjByQHJQcmBycHKAcpByoHKwcsBy0HLgcvBzAHMQcyBzMHNAc1BzYHNwc4 -BzkHOgc7BzwHPQc+Bz8HQAdBB0IHQwdEB0UHRgdHB0gHSQdKB0sHTAdNB04HTwdQB1EHUgdTB1QHVQdW -B1cHWAdZB1oHWwdcB10HXgdfB2AHYQdiB2MHZAdlB2YHZwdoB2kHagdrB2wHbQduB2+BAX2BAX6BAX+B -AYCBAYGBAYKBAYOBAYSBAYWBAYaBAYeBAYiBAYmBAYqBAYuBAYyBAY2BAY6BAY+BAZCBAZGBAZKBAZOB -AZSBAZWBAZaBAZeBAZiBAZmBAZqBAZuBAZyBAZ2BAZ6BAZ+BAaCBAaGBAaKBAaOBAaSBAaWBAaaBAaeB -AaiBAamBAaqBAauBAayBAa2BAa6BAa+BAbCBAbGBAbKBAbOBAbSBAbWBAbaBAbeBAbiBAbmBAbqBAbuB -AbyBAb2BAb6BAb+BAcCBAcGBAcKBAcOBAcSBAcWBAcaBAceBAciBAcmBAcqBAcuBAcyBAc2BAc6BAc+B -AdCBAdGBAdKBAdOBAdSBAdWBAdaBAdeBAdiBAdmBAdqBAduBAdyBAd2BAd6BAd+BAeCBAeFfECdNZW51 -IEl0ZW0gKENoZWNrIEdyYW1tYXIgV2l0aCBTcGVsbGluZylbU2VwYXJhdG9yLTJfEBdNZW51IEl0ZW0g -KEhpZGUgT3RoZXJzKW8QHgBNAGUAbgB1ACAASQB0AGUAbQAgACgAQwB1AHMAdABvAG0AaQB6AGUAIABU -AG8AbwBsAGIAYQByICYAKV8QEE1lbnUgSXRlbSAoUmVkbylfECdTdGF0aWMgVGV4dCAoQW1vdW50IGlu -IG90aGVyIEN1cnJlbmN5OilbU2VwYXJhdG9yLTNdTWVudSAoV2luZG93KV8QEVRleHQgRmllbGQgQ2Vs -bC0xXxASTWVudSBJdGVtIChTcGVlY2gpVDExMTFRNV8QEE1lbnUgSXRlbSAoRWRpdClcQ29udGVudCBW -aWV3XxAkTWVudSBJdGVtIChBYm91dCBDdXJyZW5jeSBDb252ZXJ0ZXIpXxAQTWVudSBJdGVtIChVbmRv -KV8QD0hvcml6b250YWwgTGluZV8QD01lbnUgKFNlcnZpY2VzKVMyLTFfEBZNZW51IEl0ZW0gKFNob3cg -Rm9udHMpXxAnTWVudSBJdGVtIChDaGVjayBTcGVsbGluZyBXaGlsZSBUeXBpbmcpXxAUQ29udmVydGVy -IENvbnRyb2xsZXJTMS0xXxArVGV4dCBGaWVsZCBDZWxsIChBbW91bnQgaW4gb3RoZXIgQ3VycmVuY3k6 -KV8QI1N0YXRpYyBUZXh0IChFeGNoYW5nZSByYXRlIHBlciAkMTopWlRleHQgRmllbGRRNltNZW51IChG -aW5kKV8QEE1lbnUgSXRlbSAoQ29weSlZU2VwYXJhdG9yW1NlcGFyYXRvci0xXxAnVGV4dCBGaWVsZCBD -ZWxsIChFeGNoYW5nZSByYXRlIHBlciAkMTopUTFfEBRNZW51IEl0ZW0gKFNob3cgQWxsKV8QD1RleHQg -RmllbGQgQ2VsbFEyUzEyMV8QFU1lbnUgSXRlbSAoRmluZCBOZXh0KV8QFk1lbnUgSXRlbSAoU2VsZWN0 -IEFsbClfEBFNZW51IEl0ZW0gKFBhc3RlKV8QGU1lbnUgSXRlbSAoU3Vic3RpdHV0aW9ucylfEBdNZW51 -IEl0ZW0gKFNtYXJ0IExpbmtzKV8QFk1lbnUgSXRlbSAoQ2xlYXIgTWVudSlbTWVudSAoRWRpdClROV8Q -Ek1lbnUgSXRlbSAoRGVsZXRlKVxUZXh0IEZpZWxkLTFvEBoATQBlAG4AdQAgAEkAdABlAG0AIAAoAFMA -aABvAHcAIABTAHAAZQBsAGwAaQBuAGcgJgApXxAeTWVudSBJdGVtIChDdXJyZW5jeSBDb252ZXJ0ZXIp -bxARAE0AZQBuAHUAIABJAHQAZQBtACAAKABPAHAAZQBuICYAKV1NZW51IChTcGVlY2gpW01lbnUgKEZp -bGUpXxAYTWVudSBJdGVtIChTbWFydCBRdW90ZXMpXxASTWVudSBJdGVtIChXaW5kb3cpXxAhU3RhdGlj -IFRleHQgKERvbGxhcnMgdG8gQ29udmVydDopXU1lbnUgKEZvcm1hdClfEBBNZW51IEl0ZW0gKFZpZXcp -XxAbTWVudSAoU3BlbGxpbmcgYW5kIEdyYW1tYXIpW01lbnUgKFZpZXcpUThfEB1NZW51IEl0ZW0gKEp1 -bXAgdG8gU2VsZWN0aW9uKV8QIE1lbnUgSXRlbSAoU3BlbGxpbmcgYW5kIEdyYW1tYXIpXxASTWVudSBJ -dGVtIChGb3JtYXQpXxAQTWVudSBJdGVtIChGaWxlKV8QGU1lbnUgSXRlbSAoRmluZCBQcmV2aW91cylf -EBRNZW51IEl0ZW0gKFNlcnZpY2VzKV8QGE1lbnUgSXRlbSAoU2hvdyBUb29sYmFyKV8QG1dpbmRvdyAo -Q3VycmVuY3kgQ29udmVydGVyKW8QEQBNAGUAbgB1ACAASQB0AGUAbQAgACgARgBpAG4AZCAmAClfEBlN -ZW51IChDdXJyZW5jeSBDb252ZXJ0ZXIpXxAiTWVudSBJdGVtIChVc2UgU2VsZWN0aW9uIGZvciBGaW5k -KV8QFVB1c2ggQnV0dG9uIChDb252ZXJ0KV8QFE1lbnUgSXRlbSAoTWluaW1pemUpXFRleHQgRmllbGQt -MlIxMF8QF01lbnUgSXRlbSAoT3BlbiBSZWNlbnQpXxASTWVudSAoT3BlbiBSZWNlbnQpW1NlcGFyYXRv -ci02XxAjTWVudSBJdGVtIChIaWRlIEN1cnJlbmN5IENvbnZlcnRlcilfEB5NZW51IEl0ZW0gKEJyaW5n -IEFsbCB0byBGcm9udClfECNNZW51IEl0ZW0gKEN1cnJlbmN5IENvbnZlcnRlciBIZWxwKVtTZXBhcmF0 -b3ItNF8QEVRleHQgRmllbGQgQ2VsbC0yW1NlcGFyYXRvci01XxAlVGV4dCBGaWVsZCBDZWxsIChEb2xs -YXJzIHRvIENvbnZlcnQ6KV8QEE1lbnUgSXRlbSAoWm9vbSlYTWFpbk1lbnVfEBRNZW51IChTdWJzdGl0 -dXRpb25zKVEzXxAcTWVudSBJdGVtIChTbWFydCBDb3B5L1Bhc3RlKV8QFUJ1dHRvbiBDZWxsIChDb252 -ZXJ0KV8QGk1lbnUgSXRlbSAoQ2hlY2sgU3BlbGxpbmcpXxAaTWVudSBJdGVtIChTdGFydCBTcGVha2lu -ZylfEA9NZW51IEl0ZW0gKEN1dClcRmlsZSdzIE93bmVyXxAZTWVudSBJdGVtIChTdG9wIFNwZWFraW5n -KVE3W0FwcGxpY2F0aW9uXxAXTWVudSBJdGVtIChTaG93IENvbG9ycylfEBBNZW51IEl0ZW0gKEZpbmQp -0gAOAD4EOwfWgQF5oNIADgA+BDsH2YEBeaDSAA4APgQ7B9yBAXmvEJICMgGUAakEPgLZBAQEQQQXAG4B -nQGRAacBgQJNANgERgJqAiIBmQGGAZwBiQGlBEkDZwLMBEwD8QBMBE8EUABwAeUBlQGEA5kBHQBsAGkC -8AKwA8cEWgRbAaIBmwDqBF0DjAB4BDIEYQGDAZYEYgM0AlgEZQMnAwcCYARpAZgDdQBrAxkEbQRuAgwB -kgGaAcIDugRyAG0BpAKFAY8EdQH6A10D1QGxBHoEewR8BH0EfgLoA1UAQQGMAZ4BqgJyAawEgwBvAkUC -+gSHAw8AagGCBIoDQgGLA+MBlwSNBCoAxwSQAQwDpwGNAZMBnwSTAYABoAGoAaMBpgKYAZACvgKPAS4B -8QIVAqIBigGIAasBhwGFAB8BoQOCAgQEnQSeAn0EoAGOgHSAuIEBD4EBHoCqgQEMgQEfgQESgDKA4ICp -gQEJgFqAe4AkgQElgIaAb4DPgHOA3IB/gQEBgQEpgNiApoEBRYEBBoALgQFJgQFKgD2AW4C9gGqA6YA0 -gCWADoCwgJyA+IEBL4EBLoDzgNeAJ4EBTIDlgBCBARmBAVCAZYDCgQE0gMeAgIEBQYDDgLmAgYEBU4DL -gN2AIoC+gQFWgQFegGeAroDRgE6A9IEBaYAugPyAjYCggQFtgGGA04D9gE2BATeBAT2BAXGBAXOBAVqA -r4DSgAeAkYDkgQERgIeBAReBATqANoB6gLWBAWOAuoAfgF+BASKAzICLgQECgMaBAVmBARiAIYEBXIAw -gO6AloC0gOiBASqATIDtgQELgPeBAQWAk4ClgKGAkoA4gGCAa4CXgIWAeYEBFoB3gG6AAoDxgOGAZoEB -aIEBeICMgQEwgJvSAA4APgQ7CHGBAXmvEJIIcghzCHQIdQh2CHcIeAh5CHoIewh8CH0Ifgh/CIAIgQiC -CIMIhAiFCIYIhwiICIkIigiLCIwIjQiOCI8IkAiRCJIIkwiUCJUIlgiXCJgImQiaCJsInAidCJ4Inwig -CKEIogijCKQIpQimCKcIqAipCKoIqwisCK0IrgivCLAIsQiyCLMItAi1CLYItwi4CLkIugi7CLwIvQi+ -CL8IwAjBCMIIwwjECMUIxgjHCMgIyQjKCMsIzAjNCM4IzwjQCNEI0gjTCNQI1QjWCNcI2AjZCNoI2wjc -CN0I3gjfCOAI4QjiCOMI5AjlCOYI5wjoCOkI6gjrCOwI7QjuCO8I8AjxCPII8wj0CPUI9gj3CPgI+Qj6 -CPsI/Aj9CP4I/wkACQEJAgkDgQHmgQHngQHogQHpgQHqgQHrgQHsgQHtgQHugQHvgQHwgQHxgQHygQHz -gQH0gQH1gQH2gQH3gQH4gQH5gQH6gQH7gQH8gQH9gQH+gQH/gQIAgQIBgQICgQIDgQIEgQIFgQIGgQIH -gQIIgQIJgQIKgQILgQIMgQINgQIOgQIPgQIQgQIRgQISgQITgQIUgQIVgQIWgQIXgQIYgQIZgQIagQIb -gQIcgQIdgQIegQIfgQIggQIhgQIigQIjgQIkgQIlgQImgQIngQIogQIpgQIqgQIrgQIsgQItgQIugQIv -gQIwgQIxgQIygQIzgQI0gQI1gQI2gQI3gQI4gQI5gQI6gQI7gQI8gQI9gQI+gQI/gQJAgQJBgQJCgQJD -gQJEgQJFgQJGgQJHgQJIgQJJgQJKgQJLgQJMgQJNgQJOgQJPgQJQgQJRgQJSgQJTgQJUgQJVgQJWgQJX -gQJYgQJZgQJagQJbgQJcgQJdgQJegQJfgQJggQJhgQJigQJjgQJkgQJlgQJmgQJngQJogQJpgQJqgQJr -gQJsgQJtgQJugQJvgQJwgQJxgQJygQJzgQJ0gQJ1gQJ2gQJ3EQFaEH8RAYgQjxCREQEqEJUQ1xEBfxEB -jxEBchEBjREBjBAYEQF6ENMQiBBNEQGOEQFbEOsQ4hAnENkQzxDbEIIQOhEBcBBKEQFYEQGFEQGLEOYQ -6RBJEQGAEQF7EQF1ENwQThDFENYQzhEBZBDfEQF8EGcQlhEBdhBqEOMRAWUQ0BDGEMsRAVwRAWIQfhDN -EFIRAXEQyhEBeRDMEDgQSBDUEPERAW4QUREBXxATEQF9EPURASwRAWoRAScRASgQ0hBQENUQ2BBTEQEr -EIMQ0REBKREBbxEBYxEBdBDnEDkRAWgQ3REBgRAXEHAQfBB9EQF3EOEQXBCGEQFpEAUQ6BDsEG8RAXgQ -kBEBfhDvEOQRAWwQwRAdEQFrEPARAW0Q4BCOEQFdEN4QSxEBXhEBghDJEMQQxxEBcxAlEQGHEQGGEFcR -AZERAZARAYoQwxBPE//////////9EQFZENoQVtIADgA+AGcJloBEoNIADgA+BDsJmYEBeaDSAA4APgQ7 -CZyBAXmg0gA3ADgJngmfogmfADteTlNJQk9iamVjdERhdGEACAAZACIAJwAxADoAPwBEAFIAVABmBWIF -aAWzBboFwQXPBeEF/QYLBhcGIwYxBjwGSgZmBnQGhwaZBrMGvQbKBswGzwbSBtUG2AbaBt0G3wbiBuUG -6AbrBu0G7wbyBvUG+Ab7BwQHEAcSBxQHIgcrBzQHPwdEB1MHXAdvB3gHgweFB4gHigezB8AHzQfbB+UH -8wgACBIIJggyCDQINgg4CDoIPwhBCEMIRQhHCEkIZAh5CIIInwixCLwIxQjRCN0I3wjhCOMI5gjoCOoI -7Aj1CPcJCAkKCQwJDgkQCRIJFAkWCRgJOQlBCUgJUglUCVYJWAlaCV0JXglgCWIJfAmhCa0JwQnMCdYJ -5AnxCgUKEQoaChwKHgogCiIKJAopCioKLAotCj4KRQpMClUKVwpgCmIKZQpyCnsKgAqHCpwKpAqxCr0K -ywrNCs8K0QrTCtUK3AryCv8LBwsJCwsLDgsXCxwLMQszCzULNws5C0MLUAtSC1ULXgtnC3kLhguPC5oL -pguwC7cLwwvkC+YL6AvqC+wL7QvvC/EMCwwwDDIMNAw2DDgMOgw7DD0MXgxgDGIMZAxmDGcMaQxrDIQM -qQyyDLQMtgy4DLoMvAy9DL8M4AziDOQM5gzoDOkM6wztDQYNJw0sDS4NMA0yDTQNNg07DT0NVQ1qDWwN -bg1wDXINfw2MDY4Nmg2vDbENsw21DbcNyg3rDe0N7w3xDfMN9A32DfgOEQ4yDjQONg44DjoOPA4+DlQO -dQ53DnkOew59Dn4OgA6CDpoOuw69Dr8OwQ7DDsUOxw7jDwQPBg8IDwoPDA8NDw8PEQ8pD1oPcA+FD5QP -pg+4D8YPyw/ND88P0Q/TD9UP1w/ZD9sP3Q/iD+sP8w/1D/4QBxAUEB0QKBAxEGIQbBB4EIYQkxCdEK8Q -sRCzELUQtxC4ELoQvBC+EMAQwhDZEOAQ/RD/EQERAxEFEQcRCxEYERoRKBExEToRQBFJEVARXxFnEXIR -exGCEZsRpBGpEbwRxRHMEdkR3xHoEeoSRxJJEksSTRJPElESUxJVElcSWRJbEl0SXxJhEmMSZRJnEmkS -axJtEm8ScRJzEnUSdxJ5EnsSfRJ/EoESgxKFEocSiRKLEo0SjxKREpQSlxKaEp0SoBKjEqYSqRK2Er8S -xxLJEssSzRLuEvYTChMVEyMTLRM6E0ETQxNFE0oTTBNRE1MTVRNXE2QTcBNzE3YTeROKE4wTmROoE6oT -rBOuE7YTyBPRE9YT6RP2E/gT+hP8FA8UGBQdFCgUOhRDFEoUYhRxFIIUkBSSFJQUlhSYFKEUoxSlFLsU -xRTOFNUU7BT5FPsU/RT/FSAVIhUkFSkVKxUtFS8VMRU+FUEVRBVHFVYVWBVnFXQVdhV4FXoVmxWdFZ8V -oRWjFaUVpxW0FbcVuhW9FcsV2RXmFegV6hXsFg0WDxYRFhMWFRYXFhkWKBY3FkQWRhZIFkoWbxZ5FnsW -fRZ/FoEWgxaFFocWlRaXFqYWsxa1FrcWuRbaFtwW3hbgFuIW5BbmFwQXHRcuFzAXMhc0FzYXQhdPF1EX -UxdVF3YXeBd6F3wXfheAF4IXkxeWF5kXnBefF6gXqhfAF80XzxfRF9MX9Bf2F/gX+hf8F/4YABgNGBAY -ExgWGBwYHhglGDIYNBg2GDgYWRhbGF0YXxhhGGMYZRh2GHkYexh+GIEYmxidGKgYtRi3GLkYuxjcGN4Y -4BjiGOQY5hjoGPUY+Bj7GP4ZChkMGSQZMRkzGTUZNxlYGV4ZYBliGWQZZhloGWoZbBl5GXwZfxmCGZUZ -sBm9Gb8ZwRnDGeQZ5hnoGeoZ7BnuGfAZ9Bn2GfsaCBoKGgwaDhovGjEaMxo1GjcaORo7GkgaShpRGl4a -YBpiGmQahRqHGokaixqNGo8akRqWGpgaphqzGrUatxq5Gtoa3BreGuAa4hrkGuYbBBslGzIbNBs2Gzgb -WRtbG10bYhtkG2YbaBtqG3YbeBuRG54boBuiG6QbyRvLG80bzxvRG9Mb1RviG+Ub6BvrG/Yb+BwSHB8c -IRwjHCUcQhxEHEYcSBxKHEwcThxgHHkchhyIHIocjBytHK8csRyzHLUctxy5HMoczRzQHNMc1hzhHPkd -Bh0IHQodDB0tHS8dMR0zHTUdNx05HVYdWB1qHXcdeR17HX0dnh2gHaIdpB2mHagdqh22HdYd4x3lHecd -6R4KHgweDh4QHhIeFB4WHiEeIx4uHjsePR4/HkEeYh5kHmYeaB5qHmwebh6IHo4enx6hHqMepR6nHrMe -wB7CHsQexh7nHuke6x7tHu8e8R7zHwAfAx8GHwkfFh8YHy4fOx89Hz8fQR9iH2QfZh9oH2ofbB9uH3Mf -dR97H4gfih+MH44frx+xH7MftR+3H7kfux/CH8of2x/dH98f4R/jH+wf7h/wH/ogBCARIBMgFSAXIDgg -OiA8ID4gQCBCIEQgTSBmIHMgdSB3IHkgmiCcIJ4goCCiIKQgpiCsIK4gvCDJIMsgzSDPIPAg8iD0IPYg -+CD6IPwhASEOIR8hISEjISUhJyEwIT0hPyFBIUMhZCFmIWghaiFsIW4hcCF9IaEhriGwIbIhtCHVIdch -2SHbId0h3yHhIeYh6CHuIfsh/SH/IgIiIyIlIiciKSIrIi0iLyJDIkUiZSJyInQidyJ6IpsinSKgIqIi -pCKmIqgivSLPIuAi4iLkIuci6iMHIwkjDCMOIxAjEiMUIy8jTyNgI2IjZCNmI2kjdSOCI4QjhyOKI6sj -rSOwI7IjtCO2I7gj3yQBJBIkFCQWJBgkGyQzJEAkQiRFJEgkaSRrJG4kcSRzJHUkdyR8JH4khCSVJJck -mSSbJJ0kqiSsJK8ksiTTJNUk2CTbJN0k3yTiJO8k8iT1JPglEiUUJR4lJyUqJfUl9yX6Jfwl/yYCJgUm -ByYJJgsmDiYQJhImFSYXJhkmHCYfJiEmJCYnJikmKyYtJi8mMSYzJjUmNyY5JjwmPyZBJkQmRiZIJksm -TiZRJlMmVSZYJlomXCZeJmEmYyZlJmcmaiZtJm8mcSZzJnYmeCZ6Jn0mfyaBJoMmhSaIJosmjiaRJpQm -liaYJpomnCafJqEmoyalJqgmqiasJq8msSa0Jrcmuia8Jr8mwSbDJsYmyCbKJswmzibQJtIm1CbWJtgm -2ybeJuAm4ycMJxonJycpJysnLCcuJy8nMSczJzUnXidgJ2InYydlJ2YnaCdqJ2wncyd8J34nhyeJJ4sn -jieRJ7onvCe+J78nwSfCJ8QnxifIJ9cn4CflKA4oGCghKCMoJSgoKCooLCguKDAoMyg6KEkoUihUKFko -WyhdKIYoiCiKKI0ojyiRKJMoliiZKKoorSiwKLMotii7KMQoxijhKOMo5ijpKOso7SjvKPEo8yj2KPko -/Cj/KQIpKyktKS8pMCkyKTMpNSk3KTkpYilkKWYpZylpKWopbCluKXApmSmbKZ0poCmiKaQppimoKasp -sCm5KbspxinIKcspzinRKdMp+Cn6Kf0qACoCKgQqBioQKhIqNyo5KjwqPypBKkMqRSpTKlUqeip8Kn8q -giqEKoYqiCqhKqMqzCrOKtAq0yrVKtcq2SrbKt4q9Sr+KwArCSsLKw0rDysRKzorPCs+K0ErQytFK0cr -SStMK1orYytlK2wrbitwK3IrgyuGK4krjCuPK5groSujK6QrtivfK+Er4yvkK+Yr5yvpK+sr7SwOLBAs -EywVLBcsGSwbLCYsTyxRLFQsVyxZLFssXSxgLGMsaCxxLHMsdix5LJosnCyfLKIspCymLKgswSzDLOQs -5izpLOws7izwLPIs9iz4LSEtIy0lLSctKS0rLS0tMC0zLTwtPi1VLVgtWy1eLWEtZC1nLWktay1tLXAt -ci2bLZ0tny2gLaItoy2lLactqS3SLdQt1y3aLdwt3i3gLeIt5S4OLhAuEi4TLhUuFi4YLhouHC4pLkou -TC5PLlIuVC5WLlguYy5lLmoucy51Lowujy6SLpUumC6aLpwuni6gLqMupS6nLtAu0i7ULtcu2S7bLt0u -3y7iLu4u9y75Lvwu/i8XL0AvQi9EL0UvRy9IL0ovTC9OL3cveS97L34vgC+CL4Qvhy+KL5Evmi+cL6Ev -pC+mL88v0S/TL9Yv2C/aL9wv3y/iL+cv8C/yL/cv+S/8MCUwJzApMCwwLjAwMDIwNTA4MGEwYzBlMGgw -ajBsMG4wcTB0MH4whzCJMJgwmzCeMKEwpDCnMKowrTC5MMIwxDDGMM8w1DDdMOAxqzGtMa8xsTGzMbUx -tzG5MbwxvjHAMcIxxDHHMckxyzHOMdAx0jHUMdYx2DHaMdwx3jHgMeIx5THnMekx6zHtMe8x8jH0MfYx -+TH7Mf0x/zIBMgMyBTIHMgoyDDIOMhAyEjIVMhcyGjIdMh8yIjIkMicyKjItMjAyMjI0MjYyODI7Mj4y -QDJCMkQyRjJJMksyTTJPMlEyUzJWMlgyWjJcMl4yYDJjMmUyZzJpMmsybTJwMnIydDJ2MngyejJ8Mn4y -gDKCMoQyhjKIMpEylDNhM2MzZjNoM2szbjNwM3MzdTN3M3ozfDN+M4EzgzOGM4gzijONM5AzkzOVM5cz -mTObM50znzOhM6MzpTOoM6szrTOwM7IztDO3M7ozvTO/M8EzxDPGM8gzyjPNM88z0TPTM9Yz2TPbM90z -3zPiM+Qz5jPpM+sz7TPvM/Ez9DP3M/oz/TQANAI0BDQGNAg0CzQNNA80ETQTNBY0GDQbNB00IDQjNCY0 -KDQrNC00LzQyNDQ0NjQ4NDo0PDQ+NEA0QjRENEY0STRMNE40UTRaNF01KjUtNTA1MzU2NTk1PDU/NUI1 -RTVINUs1TjVRNVQ1VzVaNV01YDVjNWY1aTVsNW81cjV1NXg1ezV+NYE1hDWHNYo1jTWQNZM1ljWZNZw1 -nzWiNaU1qDWrNa41sTW0Nbc1ujW9NcA1wzXGNck1zDXPNdI11TXYNds13jXhNeQ15zXqNe018DXzNfY1 -+TX8Nf82AjYFNgg2CzYONhE2FDYXNho2HTYgNiM2JjYpNiw2LzYyNjU2ODY7Nj42QTZENkc2SjZNNlA2 -UzZWNlk2gzaPNqk26Db7NyU3MTc/N1M3aDdtN283gjePN7Y3yTfbN+038TgKODQ4SzhPOH04oziuOLA4 -vDjPONk45TkPORE5KDk6OTw5QDlYOXE5hTmhObs51DngOeI59zoEOjs6XDqBOo86mzq2Oss67zr9OxA7 -Ljs6Ozw7XDt/O5Q7pzvDO9o79TwTPDg8VDx5PJE8qDy1PLg80jznPPM9GT06PWA9bD2APYw9tD3HPdA9 -5z3pPgg+ID49Plo+bD55PpU+lz6jPr0+0D7ZPtw+3T7mPuk+6j7zPvZAHUAfQCFAJEAnQClALEAvQDJA -NEA2QDhAO0A9QD9AQUBEQEZASEBKQExATkBQQFNAVkBYQFpAXUBgQGJAZUBoQGpAbEBuQHBAckB0QHZA -eEB6QHxAfkCBQIRAhkCIQIpAjUCPQJFAlECXQJlAm0CeQKBAokClQKdAqUCrQK5AsECyQLRAtkC5QLxA -vkDAQMJAxEDGQMlAy0DNQM9A0UDUQNZA2EDaQNxA30DiQOVA6EDrQO1A70DxQPNA9UD4QPpA/UEAQQJB -BEEGQQlBC0ENQQ9BEkEUQRZBGUEbQR5BIUEjQSZBKEEqQSxBLkEwQTNBNUE3QTpBPEE/QUFBQ0FFQUdB -SUFLQU1BT0FRQVNBVkFYQVpBXEFeQWBBYkFlQWhBakFtQW9BeEF7QqJCpUKoQqtCrkKxQrRCt0K6Qr1C -wELDQsZCyULMQs9C0kLVQthC20LeQuFC5ELnQupC7ULwQvNC9kL5QvxC/0MCQwVDCEMLQw5DEUMUQxdD -GkMdQyBDI0MmQylDLEMvQzJDNUM4QztDPkNBQ0RDR0NKQ01DUENTQ1ZDWUNcQ19DYkNlQ2hDa0NuQ3FD -dEN3Q3pDfUOAQ4NDhkOJQ4xDj0OSQ5VDmEObQ55DoUOkQ6dDqkOtQ7BDs0O2Q7lDvEO/Q8JDxUPIQ8tD -zkPRQ9RD10PaQ91D4EPjQ+ZD6UPsQ+9D8kP1Q/hD+0P+RAFEBEQHRApEDUQQRBNEFkQZRBxEH0QiRCVE -KEQrRC5EMUQ0RDdEOkQ9REBEQ0RGRElETERPRFJEVURYRFtEXURgRGJEZERnRGlEa0RuRHFEdER3RHpE -fER/RIFEg0SFRIhEi0SNRI9EkUSTRJVEl0SZRJtEnkSgRKNEpkSpRKtErUSvRLJEtUS4RLpEvES+RMBE -wkTFRMdEykTMRM5E0UTTRNVE2ETaRNxE3kThRORE5kToROpE7UTvRPJE9ET2RPhE+kT8RP9FAUUERQZF -CUULRQ5FEUUURRdFGUUbRR1FH0UhRSRFJkUoRStFLkUxRTRFNkU4RTtFPUVARUJFREVGRUhFS0VNRU9F -UUVURVZFWEVaRVxFX0VhRWRFZkVoRWtFbUVvRXJFdEV3RXlFe0V+RYBFgkWFRYhFikWMRY5FkUWTRZZF -mUWbRZ5FoUWkRaZFqEWxRbRFtkW4RcFFw0XERc1F0EXRRdpF3UXeRedF7AAAAAAAAAICAAAAAAAACaAA -AAAAAAAAAAAAAAAAAEX7A - - - diff --git a/examples/cocoa/currency-converter/CurrencyConverter.nib/keyedobjects.nib b/examples/cocoa/currency-converter/CurrencyConverter.nib/keyedobjects.nib deleted file mode 100644 index 2fd0daf21..000000000 Binary files a/examples/cocoa/currency-converter/CurrencyConverter.nib/keyedobjects.nib and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO.html b/examples/cocoa/currency-converter/HOWTO.html deleted file mode 100644 index 58c58c0fc..000000000 --- a/examples/cocoa/currency-converter/HOWTO.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - CurrencyConverter HOWTO - - - - - -
-

CurrencyConverter HOWTO

-
- -
-

Creating Apple's - Currency Converter example
- with Clozure CL -

- - -
-

This HOWTO guide explains how to use Clozure CL (formerly - OpenMCL) to create a Cocoa application that is functionally - identical to Apple's - - Currency Converter example. The most important - difference between Apple's example and this one is that this - one is implemented in Common Lisp instead of Objective-C. It - uses Clozure CL's Objective-C bridge to provide communication - between the Lisp code that you write and Apple's Cocoa - frameworks. The resulting application looks and acts just - like any other Cocoa application.

- -

This HOWTO doesn't discuss all the background information - that Apple's tutorial covers. Instead, we assume that you have - Apple's document handy for reference, and we just describe the - specific steps needed to build the example using - Apple's InterfaceBuilder application and Clozure CL.

- -

An observant programmer will look at the code in this example - and say, "well, that's trivial! Why create all those classes and - connections and so forth just to perform a multiplcation?" That - observation is correct: the actual work done by the Currency - Converter application is trivial—both in the Lisp and the - Objective-C versions. The point of this example (and Apple's) is - not to show you how to perform a multiplication. The point is to - show you how Apple's frameworks implement and support the - Model-View-Controller paradigm, and how you can use that support - to build Cocoa applications. In fact, the work done by the - application is intentionally trivial, to emphasize the - frameworks rather than the particulars of the application.

- -

This HOWTO has the additional purpose of showing you how - Clozure CL makes it possible to do exactly the same thing in - Lisp that you can do with Objective-C, so that you will - understand how to use Lisp with Apple's frameworks.

- -

The current version of the Clozure CL Objective-C bridge - includes code that was formerly distributed separately as the - "Bosco" application framework. Because that framework has been - integrated with Clozure CL proper, it no longer exists as a - separate project.

-
- -
-

Apple's Currency Converter Example

-
- -
-

It will be helpful in understanding this example if you can - easily refer to - Apple's - Currency Converter tutorial while working through this - HOWTO. You might consider opening a separate window or tab, and - keeping the Apple example handy while you work.

- -

In some ways, the Lisp version of the example is simpler - than the Objective-C example, but the basic concepts are the - same. In particular, the Lisp example follows the same - - Model-View-Controller paradigm that the Apple tutorial - uses. If you are new to Cocoa programming, or if you are not - familiar with how it uses the Model-View-Controller paradigm, - it's probably a good idea to read through the Apple example in - full, paying special attention to the Model-View-Controller - section. Once you've done that, keep the Apple pages handy in - a window for easy reference.

- -

This Common Lisp version of the Currency Converter example - uses Apple's InterfaceBuilder application to build a window and - main menu, and then uses Common Lisp code to load and operate - that user interface. The Common Lisp code relies on Clozure CL's - Objective-C bridge to provide communication between the running - Lisp code and Apple's Cocoa frameworks. Once the code is - complete, we use the BUILD-APPLICATION function to save a - working Cocoa application bundle. That bundle looks and acts - just like any other Cocoa application.

- -
- -
-

Requirements Before You Start

-
- -
-

In order to build this example you will need:

- - -
- - - - - - diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/bosco.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/bosco.jpg deleted file mode 100644 index c7b33f661..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/bosco.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/cc1.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/cc1.jpg deleted file mode 100644 index a4875c5b1..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/cc1.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/cc2.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/cc2.jpg deleted file mode 100644 index a5a08cce5..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/cc2.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/finder-win1.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/finder-win1.jpg deleted file mode 100644 index 4335b9312..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/finder-win1.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/finder-win2.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/finder-win2.jpg deleted file mode 100644 index d8f79010a..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/finder-win2.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard1.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard1.jpg deleted file mode 100644 index 0bfb12724..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard1.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard2.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard2.jpg deleted file mode 100644 index 6622b5ce9..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard2.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard3.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard3.jpg deleted file mode 100644 index 9e3f726a9..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard3.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard4.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard4.jpg deleted file mode 100644 index 3843b64a9..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard4.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard5.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard5.jpg deleted file mode 100644 index 284ec5f36..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard5.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard6.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard6.jpg deleted file mode 100644 index b6792ea00..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard6.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard7.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard7.jpg deleted file mode 100644 index 678eb2c3c..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard7.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard8.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard8.jpg deleted file mode 100644 index 5e153c221..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-leopard8.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger1.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger1.jpg deleted file mode 100644 index 39d598471..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger1.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger10.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger10.jpg deleted file mode 100644 index 6c998cf4c..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger10.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger11.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger11.jpg deleted file mode 100644 index 441c6e41a..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger11.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger12.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger12.jpg deleted file mode 100644 index d74310fca..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger12.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger13.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger13.jpg deleted file mode 100644 index 2a3ff481e..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger13.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger14.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger14.jpg deleted file mode 100644 index d9b184e6d..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger14.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger15.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger15.jpg deleted file mode 100644 index dd5002e57..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger15.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger16.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger16.jpg deleted file mode 100644 index aff537e45..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger16.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger17.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger17.jpg deleted file mode 100644 index 25aaa52f4..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger17.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger18.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger18.jpg deleted file mode 100644 index a74dcf85a..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger18.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger19.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger19.jpg deleted file mode 100644 index dd1b4bb68..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger19.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger2.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger2.jpg deleted file mode 100644 index 94636dc35..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger2.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger20.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger20.jpg deleted file mode 100644 index 09bbe5174..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger20.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger21.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger21.jpg deleted file mode 100644 index df6b25659..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger21.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger22.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger22.jpg deleted file mode 100644 index 613a73dda..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger22.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger3.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger3.jpg deleted file mode 100644 index 7eec55e43..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger3.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger4.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger4.jpg deleted file mode 100644 index aed4e712f..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger4.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger5.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger5.jpg deleted file mode 100644 index 4523ca897..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger5.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger6.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger6.jpg deleted file mode 100644 index 03d9716db..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger6.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger7.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger7.jpg deleted file mode 100644 index 2a1e4a56c..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger7.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger8.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger8.jpg deleted file mode 100644 index e4dcd7449..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger8.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger9.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger9.jpg deleted file mode 100644 index 54abadee6..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin-tiger9.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin1.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/ibwin1.jpg deleted file mode 100644 index f819554a7..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/ibwin1.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/listener1.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/listener1.jpg deleted file mode 100644 index 92592e740..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/listener1.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/images/term1.jpg b/examples/cocoa/currency-converter/HOWTO_files/images/term1.jpg deleted file mode 100644 index 3508829f1..000000000 Binary files a/examples/cocoa/currency-converter/HOWTO_files/images/term1.jpg and /dev/null differ diff --git a/examples/cocoa/currency-converter/HOWTO_files/pages/build_app.html b/examples/cocoa/currency-converter/HOWTO_files/pages/build_app.html deleted file mode 100644 index 3bcbc78af..000000000 --- a/examples/cocoa/currency-converter/HOWTO_files/pages/build_app.html +++ /dev/null @@ -1,144 +0,0 @@ - - - - CurrencyConverter HOWTO - - - - - -
-

Building the Application

-
- -
-

Both the user interface and the behavior of the - CurrencyConverter are complete now. All that remains for us to - do is to build the application executable into a Cocoa - application bundle. Apple's tutorial relies on XCode to build - the application from Objective-C source files; we will use the - Clozure CL IDE to build it from our Lisp source file.

- -

We build the application using the optional - BUILD-APPLICATION feature, distributed as part of Clozure CL. The - steps to build the Cocoa application are:

- -
    -
  1. Load the application code into the IDE

  2. -
  3. Load the BUILD_APPLICATION feature

  4. -
  5. Run BUILD_APPLICATION with the proper arguments

  6. -
- -

This sequence of steps causes Clozure CL to construct a Cocoa - application bundle and write out the application executable to - it, then quit. If all goes well, you should be able to run the - application by double-clicking it, and use the UI you built in - InterfaceBuilder to convert currencies.

-
- -
-

Building the Application, Step-by-Step

-
- -
-
    -
  1. Launch the Clozure CL IDE. It's safest to build the - application with a fresh IDE session, so if you have it - running, you may wish to quit and relaunch before following - the rest of the steps.

  2. - -
  3. For convenience, set the working directory to your - "currency-converter" folder. For example, you can do - something like this (using your pathnames in place of mine, of - course:):

    -

    (setf (current-directory) "/Users/mikel/Valise/clozure/openmcl/example-code/currency-converter/")

    -
  4. - -
  5. Load the application code:

    -

    (load "currency-converter")

    -
  6. - -
  7. Load the BUILD-APPLICATION feature:

    -

    (require "build-application")

    -
  8. - -
  9. Run BUILD-APPLICATION (be sure to correct the pathname - to your CurrencyConverter nibfile. It is safest to use a full, - absolute pathname—not the relative pathname you see - below):

    -

    -(ccl::build-application :name "CurrencyConverter"
    -                        :main-nib-name "CurrencyConverter"
    -                        :nibfiles 
    -  '(#P"currency-converter/CurrencyConverter.nib"))

    -
  10. -
- -

By default, BUILD-APPLICATION constructs the application - bundle in the current working directory. If you followed the - instructions here, that means it will build - CurrencyConverter.app in your currency-converter folder. You - can control where BUILD-APPLICATION puts the application bundle - by passing a pathname as the value of the keyword argument - :DIRECTORY, like so:

- -

-(ccl::build-application :name "CurrencyConverter"
-                        :directory #P"/Users/mikel/Desktop/"
-                        :main-nib-name "CurrencyConverter"
-                        :nibfiles 
-  '(#P"currency-converter/CurrencyConverter.nib"))

- -

If all goes well, BUILD-APPLICATION constructs an - application bundle, copies "CurrencyConverter.nib" into it, - writes the application executable, and quits. You should now - be able to launch CurrencyConverter.app by double-clicking - the application icon:

- -
- -
- -

CurrencyConverter.app launches and displays your user - interface, which you can then use to convert currencies:

- -
- -
- - -
- -
-

Correcting the Application Name

-
- -
-

You'll notice when you run the application that, even though - you named it CurrencyConverter, the name in the main menu - appears as "Clozure CL". That's because OS X takes the - application's name, not from the application bundle's name, nor - from the running code, but from an InfoPlist.strings file hidden - inside the application bundle. To make the name appear - correctly in the running application, you need to edit the file

- -

CurrencyConverter.app/Contents/Resources/English.lproj/InfoPlist.strings

- -

Find the entry named "CFBundleName" and change its value - from "Clozure CL" to "CurrencyConverter". The application's name - in the main menu bar should now appear correctly, as - "CurrencyConverter". You may also want to change the other - strings in the "InfoPlist.strings" file.

-
- - - - - - - diff --git a/examples/cocoa/currency-converter/HOWTO_files/pages/building_ui.html b/examples/cocoa/currency-converter/HOWTO_files/pages/building_ui.html deleted file mode 100644 index 368cb9f03..000000000 --- a/examples/cocoa/currency-converter/HOWTO_files/pages/building_ui.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - CurrencyConverter HOWTO - - - - - -
-

Building the User Interface

-
- -
-

The next step in creating a Lisp version of the currency - converter application is to construct the user - interface. Apple's - tutorial - describes in detail how to do this.

- -
-

Apple's Tutorial

-
- -

Apple's tutorial explains how to use InterfaceBuilder to create the - user interface, and how to use XCode to create project files and - write Objective-C code. Our project uses Lisp instead of - Objective-C, and does not use XCode project files, so you can skip - the part of the tutorial that explains how to use XCode.

- -
-

Using InterfaceBuilder to Create the UI

-
- -

We'll begin by using Apple's InterfaceBuilder application to - create a nibfile. The nibfile contains - archived versions of the Objective-C objects that define the - application's user interface. When you launch an application, - Mac OS X uses the archived objects in the nibfile to create the - windows and menus you see on the screen.

- -

Start by locating Apple's InterfaceBuilder application. If - you installed Apple's Developer Tools, InterfaceBuilder should - be in the folder "/Developer/Applications/":

- -
- -
- - -

NOTE: If you have not installed Apple's Developer Tools, you should - do that now. You will not be able to build the CurrencyConverter - example without them. The Developer Tools are distributed as an - optional install with Mac OS X 10.5 ("Leopard"). Look for the - "XCode Tools" package in the "Optional Installs" folder on the - Mac OS 10.5 install disk.

- -

Once you have located InterfaceBuilder, double-click to launch - the application. InterfaceBuilder presents a window you can use - to choose a template for the nibfile you are going to create.

- -
- -
- -

Click the "Application" icon and then click the "Choose" button to - create an application nibfile. InterfaceBuilder creates a new - application nibfile, but doesn't immediately save it. The - Objective-C objects that represent the new application's - interface appear in a new untitled window:

- -
- -
- -

The intial window and menubar also appear on the screen. The - new application's name appears in the menus as - "NewApplication". Save the new nibfile into the - "currency-converter" folder that you created earlier - (on this - page). InterfaceBuilder 3.0 gives you a choice of file - formats when you save a new nibfile; use the "NIB 3.x" - format—the "XIB 3.x" format works fine for editing your - user interface, but will not work correctly if you try to use it - in a working application. Give the new file the name - "CurrencyConverter.nib".

- -
-

NOTE: Most Objective-C application projects use a main - nibfile called "MainMenu.nib", and if you use XCode to create - a new application project, it creates a nibfile with that - name. Apple's CurrencyConverter tutorial assumes that the - name of the main nibfile is "MainMenu.nib".

- -

So, why do we tell you to use a different name? Clozure CL - has a main nibfile built into it, whose name is - "MainMenu.nib". Normally you don't see it, and don't even - need to know that it exists. But the Clozure CL - application-building tools create a new application by - copying resources from the Clozure CL application, so that - your new application has available to it all the built-in - Clozure CL tools. We ask you to name your nibfile - "CurrencyConverter.nib" so that it can coexist with the - Clozure CL main nibfile without causing any problems.

- -

This difference between a Lisp project and an Objective-C - project might be a little confusing at first. Just try to keep - in mind that whenever Apple's tutorial refers to the - "MainMenu.nib" file, it means the file we have just created - and named "CurrencyConverter.nib". In a Clozure CL project, - "MainMenu.nib" is the name of the main Lisp nibfile, not your - application's main nibfile.

-
- - -

Skip straight to the part of Apple's tutorial -called Defining -the View: Building the User Interface. Read the introduction to -nibfiles, and follow the instructions to create the Currency Converter -interface. (Remember that when the tutorial tells you to open and edit -"MainMenu.nib", you will instead open and edit your -"CurrencyConverter.nib".) When you reach the end of the section -called Test -the Interface, and move on to the short section afterward -called What's -Next, you are done creating the interface for your -application. Save your nibfile and continue with the next section of -this HOWTO.

- -
-

What if You Need to Use InterfaceBuilder 2.x?

-
- -

If you are still using Mac OS X 10.4.x ("Tiger"), you can still - create a working nibfile and you can still follow the instructions - in this HOWTO to create a Cocoa application with Clozure CL. The - main obstacle to doing so is that the earlier versions of - InterfaceBuilder have a significantly different user interface, and - so you may find it hard to follow Apple's tutorial when working with - InterfaceBuilder.

- -

If you are working with Mac OS X 10.4.x ("Tiger"), you can - look here to find a description - of how to build the user interface files with the earlier version of - InterfaceBuilder. When you have finished building your user - interface, you can continue with the next - section, "Creating a Lisp File".

- -

One other thing: if you are using Mac OS X 10.4.x ("Tiger"), you - will be able to build Cocoa applications only on PPC Macs. The - Clozure CL Objective-C support for Intel systems works only on Mac - OS X 10.5.x ("Leopard").

- - -
-

Adding Custom Classes to the nibfile

-
- -

Once the user interface for your application looks right, there is - still one important task to complete before you can use it. You must - record some information in the nibfile about the classes of the - objects, so that the application can create them with the right - connections in place.

- -

When you use XCode to write an Objective-C application, - InterfaceBuilder can read the Objective-C header files and use the - information in them to create descriptions of the classes in the - Objective-C code. When the application is written in Lisp, - InterfaceBuilder can't read the class descriptions from the code, - and so we'll have to manually tell the nibfile about any classes - that we use in the user interface.

- -

As you will see in the following sections, we'll use Lisp code to - define two Objective-C classes: Converter, and - ConverterController. The Converter class implements the method that - performs the actual currency conversion for our application; the - ConverterController class provides communication between the user - interface and the Converter object. We need a way to create - instances of these two classes in the nibfile, so that launching the - application sets up all the objects correctly.

- -
-

Create Instances of Custom Classes

-
- -

In InterfaceBuilder's Library window, select the Cocoa Objects and - Controllers view:

- -
- -
- -

Drag an Object from the Library window and drop it into the main - CurrencyConverter window:

- -
- -
- -

Now tell InterfaceBuilder the name of the new object's class. With - the Object icon selected in the main CurrencyConverter window, - choose the Identity tab of the Inspector. At the top of the - Identity view is a "Class" field; type the name of your custom - class (in this case, "Converter") into the "Class" field and save - the nibfile:

- -
- -
- -

Repeat the previous steps to create an instance of the - ConverterController class: drag an "Object" icon and drop it in the - main CurrencyConverter window. Then, change the name of the - Object's class to "ConverterController".

- -

That's all it takes to add an instance of a custom class to the - nibfile. We do still have to add the names of instance variables and - actions, and we need to create the connections between the - instances.

- -
-

Add Outlets and Actions

-
- -

Now, using the "+" button below the "Class Outlets" section of the - Inspector, add outlets to the ConverterController class. The - outlets you need to add are named "amountField", "converter", - "dollarField", and "rateField".

- -
- -
- -

We'll connect each of the "field" outlets to one of the text fields - in the CurrencyConverter UI, and we'll connect the "converter" - outlet to the Converter instance that we created before. When the - application launches, it creates the Converter and - ConverterController instances and establishes the connections that - we've specified in the nibfile.

- - -

First, though, we need to tell the nibfile about actions as well as - outlets. With the "ConverterController" instance selected, use the - "+" button below the "Class Actions" section to add a new - action. Name the action "convert:":

- -
- -
- -

In this application, the "convert:" action is the only action - defined for the user interface, so we are done with actions now. In - more complex applications you may need to define many actions and - outlets.

- -

Now we'll connect outlets and actions to objects.

- -
-

Add Connections

-
- -

InterfaceBuilder enables you to connect objects by - "Control-dragging" from one to another. To "Control-drag", you hold - down the Control key while dragging from one object to the next.

- -

Select the "ConverterController" instance in the nibfile's main - window, and Control-drag a connection to the "Exchange rate" text - field in the application's main window. (Be sure to connect to the - text field, not to its label!) When you release the mouse button, - InterfaceBuilder pops up a menu that lists the available - outlets. Choose "rateField" from the menu. The "rateField" outlet of - the "ConverterController" instance is now connected to the "Exchange - rate" text field.

- -

Repeat the same steps for the "Dollars" field and the "Amount" - field, connecting them to the "dollarField" and "amountField" - outlets, respectively.

- -

Finally, Control-drag a connection from the "ConverterController" - instance to the "Converter" instance. Choose "converter" from the - popup menu to connect the "converter" field of the - "ConverterController" instance to the "Converter" instance.

- -

To confirm that the connections are correct, you can use the - Connections view in the inspector. With the "ConverterController" - instance selected, click the blue arrow icon at the top of the - Inspector window to display connections. You should see a list of - outlets and the types of objects they are connected to:

- -
- -
- -

We need to add one more connection: from the "Convert" button in - the application window to the "ConverterController" - instance. Control drag a connection from the "Convert" button in the - application window to the "ConverterController" instance in the - nibfile's main window. InterfaceBuilder pops up a menu; choose the - "convert:" action from the menu to connect the button to the - action.

- -

The nibfile now contains descriptions of the needed cusstom - classes and their connections. You can continue with the next - section, which explains how to write the Lisp code that implements - the application's behavior.

- - - - - - diff --git a/examples/cocoa/currency-converter/HOWTO_files/pages/building_ui_tiger.html b/examples/cocoa/currency-converter/HOWTO_files/pages/building_ui_tiger.html deleted file mode 100644 index 6b5193f16..000000000 --- a/examples/cocoa/currency-converter/HOWTO_files/pages/building_ui_tiger.html +++ /dev/null @@ -1,586 +0,0 @@ - - - - CurrencyConverter HOWTO - - - - - -
-

Building the User Interface on "Tiger"

-
- -
-

If you are using Mac OS X 10.4.x ("Tiger") to build your - application, then the Apple tutorial's section on building the - UI may be somewhat confusing. Apple's tutorial uses - InterfaceBuilder 3.x to show how to build an interface, and - there were many interface changes between versions 2.x and 3.x - of InterfaceBuilder. In this section we see how to build the UI - using InterfaceBuilder 2.x.

- -
-

Launch InterfaceBuilder

-
- -

Start by locating Apple's InterfaceBuilder application. If - you installed Apple's Developer Tools, InterfaceBuilder should - be in the folder "/Developer/Applications/":

- -
- -
- -

NOTE: If you have not - installed Apple's Developer Tools, you should do that now. You - will not be able to build the CurrencyConverter example - without them. The Developer Tools are distributed as an - optional install with Mac OS X 10.4 ("Tiger"). Look for the - "XCode Tools" package in the "Optional Installs" folder on the - Mac OS 10.4 install disk.

- -

Once you have located InterfaceBuilder, double-click to launch - the application. InterfaceBuilder presents a window you can use - to choose a template for the nibfile you are going to create.

- -
- -
- -

Make sure the "Application" option is selected in the "Cocoa" - section and click the "New" button to create a new - nibfile. InterfaceBuilder creates a new application nibfile, but - doesn't immediately save it. The Objective-C objects that - represent the new application's interface appear in a new - untitled window:

- -
- -
- -

The intial window and menubar also appear on the screen. The - new application's name appears in the menus as - "NewApplication". Save the new nibfile into the - "currency-converter" folder that you created earlier - (on this page). Give the new - file the name "CurrencyConverter.nib"

- -
-

NOTE: Most Objective-C application projects use a main - nibfile called "MainMenu.nib", and if you use XCode to create - a new application project, it creates a nibfile with that - name. Apple's CurrencyConverter tutorial assumes that the - name of the main nibfile is "MainMenu.nib".

- -

So, why do we tell you to use a different name? Clozure CL - has a main nibfile built into it, whose name is - "MainMenu.nib". Normally you don't see it, and don't even - need to know that it exists. But the Clozure CL - application-building tools create a new application by - copying resources from the Clozure CL application, so that - your new application has available to it all the built-in - Clozure CL tools. We ask you to name your nibfile - "CurrencyConverter.nib" so that it can coexist with the - Clozure CL main nibfile without causing any problems.

- -

This difference between a Lisp project and an Objective-C - project might be a little confusing at first. Just try to keep - in mind that whenever Apple's tutorial refers to the - "MainMenu.nib" file, it means the file we have just created - and named "CurrencyConverter.nib". In a Clozure CL project, - "MainMenu.nib" is the name of the main Lisp nibfile, not your - application's main nibfile.

-
- -
-

Resize the Window

-
- -

Make the window smaller by dragging the bottom-right corner - of the window inward.

- -
- -
- -
-

Change the Title of the Window

-
- -

InterfaceBuilder creates the initial window with the title - "Window". Change the title to the more appropriate "Currency - Converter":

- -
    -
  1. Click the Window object in the "Currency Converter" - window.

    -

    - -
    -

  2. -
  3. Choose "Attributes" from the drop-down menu in the - Inspector window:

    -

    - -
    -

  4. -
  5. Change the "Window Title" field to read "Currency Converter":

    -

    - -
    -

  6. -
- -
-

Add Text Fields

-
- -

In InterfaceBuilder's Palettes window, select the "Cocoa - Text" view, and find the NSTextView object:

- -
- -
- -

Drag an NSTextView object and drop it into the "Currency - Converter" window:

- -
- -
- -

If you drag a view near the edges of a window, - InterfaceBuilder displays blue guide lines that show the - standard placement of a view near the edge of the window. Drag - the text view to the right and upward until the guide lines - appear, and then let go. The text view is then positioned in - the standard way.

- -

Now add two more text fields. You can drag them from the - palette as you did the first one, or you can duplicate the - first one. To duplicate, select the first text view and then - choose "Duplicate" from the "Edit" menu. Alternatively, you can - option-drag the text field to duplicate it.

- -
- -
- -
-

Label the Text Fields

-
- -

Now add labels to the text fields, to identify their - purposes for the user. For each text field, drag a Label object - from the palette and drop it next to the field. (Alternatively, - you can drop one Label and then duplicate it, just as you can - duplicate the text fields.)

- -
- -
- -

Just as InterfaceBuilder displayed guidelines to help you - position the text field near the edge of the window, it also - displays guide lines to help you position the labels near the - text fields. Just drag each label until the blue guide lines - appear, then release the label.

- -

Now change the text of the labels. Click a label to select - it. Then show the Inspector by choosing the "Show Inspector" - item from the "Tools" menu. Select the "Attributes" item from - the pull-down menu at the top of the Inspector window, and type - the correct text into the Title field. For example, here is how - to enter the text for the top label:

- -
- -
- -

Here's how the labels should look after you have entered the - text for all three:

- -
- -
- -

When you first enter the text for a label, the label may not - be wide enough to show it all. In that case, you'll see only - part of the text in the label. You can resize the label to make - the full text visible. Click the label to select it. Notice the - small blue dots that surround it. Grab a dot on the left side - and drag it to the left to make the label wider, until you can - see the entire text.

- -
-

Change Text Field Attributes

-
- -

The first two text fields accept user input; the last - displays the result of the conversion. We want the first two - text fields to be editable, so users can enter the values to use - in the conversion. We don't want the last field to be editable, - but we do want users to be able to copy text from it.

- -

We can control all this behavior using text-field - attributes, configurable in the Inspector.

- -
    -
  1. Select the first text field

  2. -
  3. Choose "Show Inspector" from the "Tools" menu

  4. -
  5. Make sure "Attributes" is selected in the pull-down - menu at the top of the Inspector window

  6. -
  7. Ensure that the "Editable" and "Enabled" boxes are - checked in the "Attributes" display of the Inspector window

  8. -
  9. Repeat this process for the second text field

  10. -
  11. Finally, repeat it again for the last text field, but - this time make sure the "Editable" box is unchecked

  12. -
- -
-

Add a Button

-
- -

Now we add a button that activates the currency conversion.

- -
    -
  1. Drag a Button object from the palette and drop it on - the window

    -

    - -
    -

  2. -
  3. Double-click the button and change its title to "Convert"

    -

    - -
    -

  4. -
  5. Select the button and then choose "Attributes" from - the pull-down menu at the top of the Inspector window. Almost - halfway down the "Attributes" view of the Inspector window, - find the "Key Equiv" field. Choose "Return" from the pulldown - menu in that field.

    -

    - -
    -

    -

    When you choose "Return", InterfaceBuilder enters "\R" in - the text field for the Key Equivalent. Now when a user hits - the "Return" key, your application will behave as if they had - clicked the "Convert" button.

  6. -
- -
-

Add a Separator

-
- -

Now add a separator line to visually group the text fields - together. Drag a separator line from the palette and drop it - above the button.

- -

- -
-

- -

Drag the ends of the separator line until it spans a - visually pleasing width. As always, you can use the blue - guidelines that InterfaceBuilder displays to adjust the size - and position of the line and other elements to conform to - Apple's Human Interface Guidelines.

- -
-

Set Up the Menus

-
- -

InterfaceBuilder creates the standard menus for a new - application, but it doesn't know the name of the - application. Consequently, the Application menu and several menu - items use the name "NewApplication" where they should use the - name of your application. Change the text of these items so that - they read "Currency Converter" instead of "NewApplication".

- -
    -
  1. Double-click the text "NewApplication" in the - application menu of your application's menubar. Change the - text to "Currency Converter".

    -

    - -
    -

    -

    NOTE: This change isn't really enough to get your - application to display the right name for the Application menu - when it's launched; the section - on building the application explains how to make sure the - correct name appears.

  2. -
  3. Repeat this process for each menu item where the name - "NewApplication" appears. Using the same method you used to - change the name of the application menu, edit the "About - NewApplication" item, the "Hide NewApplication" item, and the - "Quit NewApplication" item in the application menu. Then edit - the "NewApplication Help" item in the "Help" menu.

  4. -
- -
-

Tighten Up the Window Layout

-
- -

InterfaceBuilder provides layout tools with which you can - easily clean up the layout of a UI window and ensure it - conforms to Apple's user interface guidelines.

- -
    -
  1. Select the "Exchange Rate" text label. Then - Shift-click the other two labels to include them in the - selection (actually, it doesn't matter which label you select first).

  2. -
  3. Choose "Layout" > "Size to Fit" to shrink the labels - to the smallest sizes that still show all the text

  4. -
  5. Choose "Layout" > "Alignment" > "Align Right Edges" to - line up the right sides of the labels

  6. -
  7. With all three labels still selected, drag them up and - to the left. Release them when the blue guidelines show at - the top and left side of the window.

  8. -
  9. Now select all three text fields. You can click one of - them, then Shift-click to add the others to the - selection. Drag them up and left, toward the labels. Again, - release them when the blue guide line appears to show you the - proper distance from the labels. A guide line also appears to - show you when the fields are vertically aligned with the - center label.

  10. -
  11. Next, grab the separator line and move it up and to the - left. Release it when its left edge is aligned with the left - edge of the bottom label, and its top is the recommended - distance from the bottom label and its text field. Then drag - the right end of the separator line to resize it until its - right edge is aligned with the right edge of the bottom text - field. Again, guide lines show when you have found the proper - distances.

  12. -
  13. Grab the button and move it up and left, again using - the guide lines to help you find a good position.

  14. -
  15. Finally, resize the window. When the blue guide lines - appear on the right and bottom of the window, it's the right - size for its contents.

  16. -
- -

Now your application window should look something like the - one in the illustration:

- -

- -
-

- -
-

Enable Tabbing Between Text Fields

-
- -

Users generally expect to be able to use the Tab key to move - from one text field to the next in a dialog - box. InterfaceBuilder enables you to specify the tabbing order - in text fields.

- -
    -
  1. Choose "Layout" > "Keyboard Navigation" > "Show - Keyboard Check". InterfaceBuilder displays a set of small - icons that identify UI elements that can respond to key - events.

  2. -
  3. Select the "Exchange Rate" text field (the field, not - the label) and then choose "Layout" > "Keyboard Navigation" > - "Make Initial First Responder". A small "1" icon appears in - the text field to show that when the application launches, - that field receives keyboard events.

  4. -
  5. Control-drag from the "Exchange Rate" field to the - "Dollars" field. InterfaceBuilder shows the "Connections" - Inspector, and, because Keyboard Check is enabled, - automatically selects the "nextKeyView" outlet. Click the - "Connect" button in the Inspector window to confirm.

  6. -
  7. Repeat the previous steps to connect the "Dollars" - field back to the "Exchange Rate" field. That way, tabbing - moves the insertion point from the "Exchange Rate" field to - the "Dollars" field, and then back to the "Exchange Rate" - field. Control-drag from the "Dollars" field to the "Exchange - Rate" field, then click "Connect" to confirm.

  8. -
- -

We don't enable tabbing into the "Amount" field because it's - not an editable field; it's used only to show the result of a - conversion.

- -
-

Set Up the Classes Used In the User Interface

-
- -

The visual elements of your application's user interface are - all ready now. The last thing you must do is create descriptions - of any custom classes used by the application when users - interact with the interface.

- -

When a user clicks the "Convert" button, it should send a - message to a custom class that causes the conversion to take - place. In order for the application to connect the user - interface to classes that perform these actions, you must add - descriptions of your classes to the nibfile. Fortunately, - InterfaceBuilder can create class descriptions and save them in - the nibfile for you.

- -
-

ConverterController

-
- -

ConverterController is the controller class that the user - interface communicates with directly when the "Convert" button - is pressed. Create a description of the ConverterController - class, and then create an instance of it.

- -
    -
  1. In InterfaceBuilder's "CurrencyConverter.nib" window, - click the "Classes" tab. The window shows a browser view of - all available Objective-C classes:

    -

    - -

    -
  2. -
  3. Control-click the "NSObject" entry in the browser, and - choose "Subclass NSObject" from the popup - menu. InterfaceBuilder creates a new entry initially called - "MyObject". Change the name from "MyObject" to "ConverterController".

  4. -
  5. Select the "ConverterController" class in the browser, - then activate the Inspector window and choose "Attributes" - from the popup menu at the top of the Inspector. At the - bottom of the "Attributes" view is a list of actions or - outlets. Select "Outlets", and use the "Add" button to add - four fields:

    -

    - -

    -

    Rename these four fields to: "amountField", "dollarField", - "rateField", and "converter":

    -

    - -

  6. -
  7. Now add the action that is triggered when the - "Convert" button is pressed: switch to the Actions view and - use the "Add" button to add a new action:

    -

    - -

    -

    Change the name of the action from "myAction:" to "convert:"

  8. -
  9. Now create an instance of the ConverterController - class. In the browser, Right-click the ConverterController - class and choose "Instantiate ConverterController". The - browser view automatically switches to the Instances view to - show you the newly-created instance of ConverterController as - a blue box icon. There is a small yellow flag next to the - ConverterController instances to show that it has outlets - that are not connected to anything. In our final step, we'll - create the correct connections for the instance's outlets, - which will enable the application to send messages correctly - to the objects that implement its behavior.

  10. -
- -
-

Converter

-
- -

Converter is - the model - class that implements the actual conversion code. Create a - description of the Converter class, and then create an - instance of it. Repeat the steps you used to create the - ConverterController class and instance to create a Converter - class and instance:

- -
    -
  1. Switch to the browser view in the - "CurrencyConverter.nib" window.

  2. -
  3. Control-click NSObject and choose "Subclass NSObject" - from the resulting popup menu.

  4. -
  5. Change the name of the newly-created class from - "MyObject" to "Converter"

  6. -
  7. Control-click the "Converter" class and choose - "Instantiate Converter" to create an instance of the - Converter class.

  8. -
- -

The model class, "Converter", has no outlets or actions, so - you don't need to add anything to it before instantiating - it. Your code will implement a conversion method, but - InterfaceBuilder doesn't need to know about it; the "convert:" - method in your code will know everything it needs to about the - "Converter" class. You just need to create the class - description and the instance so that your application will - start up with the correct objects created and connected.

- -
-

Connecting the Outlets

-
- -

The final step in setting up the user interface is - establishing connections between the outlets and objects in the - interface, so that messages are sent from the user interface to - the correct objects.

- -
    -
  1. Connect the "Convert" button to the - "ConverterController" instance. Control-drag from the - "Convert" button to the "ConverterController" instance. Make - sure the "convert:" action is selected in the "Target/Action" - view of the Inspector window, then click the "connect" button - to confirm.

  2. -
  3. Connect the "ConverterController" instance to the text - fields. Control-drag from the "ConverterController" instance - to the "Exchange Rate" field. Select "rateField" in the - "Outlets" view of the Inspector window and click "connect" to - confirm. Then repeat this process, connecting "dollarField" to - the "Dollars" text field, and "amountField" to the "Amount" - field.

  4. -
  5. Finally, connect the "ConverterController" to the - "Converter" instance. Control-drag from the - "ConverterController" instance to the "Converter" - instance. Select the "converter" outlet in the Inspector - window and click "connect" to confirm.

  6. -
- -

The nibfile now contains descriptions of the custom classes - that your code will implement, including connections between - their outlets and the objects with which they must - communicate. You can save the nibfile and proceed to write the - code that implements their behavior.

- -

You can continue now with the section on "Creating a Lisp File".

- - - -
- - - - - diff --git a/examples/cocoa/currency-converter/HOWTO_files/pages/conclusion.html b/examples/cocoa/currency-converter/HOWTO_files/pages/conclusion.html deleted file mode 100644 index 4d2ee3942..000000000 --- a/examples/cocoa/currency-converter/HOWTO_files/pages/conclusion.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - CurrencyConverter HOWTO - - - - - -
-

Conclusion

-
- -
-

This concludes our HOWTO on building the Apple - CurrencyConverter example in Lisp with Clozure CL. Your own Lisp - applications are likely to be considerably more complex than the - Currency Converter, which, after all, just does a simple - multiplication. You can, however, use exactly the same steps to - build a much richer and more full-featured Cocoa - application.

- -

A more complex application will still consist of one or more - nibfiles and one or more Lisp source files. You will still use - the Objective-C bridge to define Objective-C classes and - methods, and to use Cocoa library features. And you will still - use BUILD-APPLICATION to turn your source and nibfiles into - standalone Cocoa applications.

- -

You should now be able to use Clozure CL to accomplish anything - that an Objective-C user can accomplish with Cocoa. Good luck!

- - - - - - diff --git a/examples/cocoa/currency-converter/HOWTO_files/pages/create_lisp.html b/examples/cocoa/currency-converter/HOWTO_files/pages/create_lisp.html deleted file mode 100644 index adb852490..000000000 --- a/examples/cocoa/currency-converter/HOWTO_files/pages/create_lisp.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - CurrencyConverter HOWTO - - - - - -
-

Creating a Lisp File

-
- -
-

Now that you have created the nibfile that defines your - application's user interface, it's time to create the Lisp - source file that defines its behavior. When you work with - Objective C, as in Apple's tutorial, you use Apple's XCode - application to create and manage projects, to edit Objective C - source files, and to build the final application. In this HOWTO, - the Clozure CL application takes the place of XCode. The Lisp - project structure is much simpler than the XCode project - structure: to build the Lisp application we need only the - nibfile created in the previous section, and a single Lisp - source file.

- -

Double-click Clozure CL to launch it. Clozure CL displays a Listener window:

- -
- -
- -

Choose "New" from the "File" menu to create a new Lisp source - window. Save it with the name "CurrencyConverter.lisp" into the - same "currency-converter" folder where you saved your nibfile in - the earlier section. You should now have a "currency-converter" - folder that contains a "CurrencyConverter.lisp" item and a - "CurrencyConverter.nib" item.

- -

Now you're ready to continue, and write the Lisp code that - implements the application's behavior.

- - - - - - diff --git a/examples/cocoa/currency-converter/HOWTO_files/pages/making_project.html b/examples/cocoa/currency-converter/HOWTO_files/pages/making_project.html deleted file mode 100644 index b2a9c129f..000000000 --- a/examples/cocoa/currency-converter/HOWTO_files/pages/making_project.html +++ /dev/null @@ -1,60 +0,0 @@ - - - - CurrencyConverter HOWTO - - - - - -
-

Creating a Project

-
- -
-

Example Files

-
- -
-

This HOWTO is distributed with example files that include a - working nibfile (a file of user-interface objects, - named "CurrencyConverter.nib") and a Lisp source file (named - "CurrencyConverter.lisp"). You can build a working copy of the - example application by using these files, but you probably - shouldn't. If you want to understand how to build your own Lisp - application projects, you should follow the instructions here to - create your own source file and nibfile, and use the example - files only for reference in case something goes wrong.

-
- -
-

Create the Project Folder

-
- -
-

First, create a project folder to hold the files you are - going to create. When your project is complete, the folder will - contain a nibfile that defines the user interface, and - a Lisp source file that defines the behavior of the - application. Those two files are really all there is to a Lisp - application, though not all applications are as simple as this - currency converter. For more complex applications it makes sense - to split your UI into several nibfiles, and to split your - implementation into several source files. The basic principle - remains the same, however: nibfiles define your user interface, - and Lisp files define your application's behavior.

- -

Create a folder somewhere convenient, and name it - "currency-converter". Next we will use Apple's InterfaceBuilder - application to create the user interface The next page tells you - how to do that; when you create your nibfile, save it into your - "currency-converter" folder.

- - - - - - diff --git a/examples/cocoa/currency-converter/HOWTO_files/pages/writing_lisp.html b/examples/cocoa/currency-converter/HOWTO_files/pages/writing_lisp.html deleted file mode 100644 index 154f7e163..000000000 --- a/examples/cocoa/currency-converter/HOWTO_files/pages/writing_lisp.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - CurrencyConverter HOWTO - - - - - -
-

Writing the Lisp Source

-
- -
-

In this section we'll write Lisp code that duplicates the - features provided by the Objective-C code in Apple's - tutorial. In Apple's tutorial, the explanation of the Objective - C code begins with the - section Bridging - the Model and View: The Controller.

- -

The Lisp code in this section of the HOWTO is considerably - simpler than the corresponding Objective-C code, in part - because we can ignore the conventions that XCode uses for - laying out source files. We can just write all our definitions - into a single Lisp source file, and load that file into Clozure CL - when we are ready to build the application.

- -
-

First Things First

-
- -
-

Place the following line at the top of your Lisp source file:

- -
(in-package "CCL")
- -

Clozure CL's Objective-C bridge code is defined in the "CCL" - package. Usually, when building an application, you'll create a - package for that application and import the definitions you need - to use. In order to keep the discussion short in this simple - example, we just place all our definitions in the "CCL" - package.

- -
- -
-

Defining the Converter Class

-
- -
-

We begin by defining the Converter class. Recall from Apple's - tutorial that this is the Model class that implements the - conversion between dollars and other currencies. Here is the - Lisp definition that implements the class you created in - InterfaceBuilder:

- -
-(defclass converter (ns:ns-object)
-  ()
-  (:metaclass ns:+ns-object))
-      
-
- -
-

This is an ordinary CLOS class definition, with a couple of - simple wrinkles. First, the superclass it inherits from is the - NS-OBJECT class in the "NS" package. NS-OBJECT is an Objective-C - class, the ancestor of all Objective-C objects. This CLOS - definition actually creates a new Objective-C class named - "Converter".

- -

We tell Clozure CL how to build the right kind of class object - by including the :METACLASS option in the definition:

- -
-  (:metaclass ns:+ns-object)
-      
- -

The Objective-C bridge knows that when the metaclass - is ns:+ns-object, it must lay out the class object - in memory as an Objective-C class, rather than a normal CLOS - STANDARD-CLASS.

- -

Next, we define the method "convertCurrency:atRate:":

- -
-(objc:defmethod (#/convertCurrency:atRate: :float) 
-    ((self converter) (currency :float) (rate :float))
-  (* currency rate))
-      
- -

This is the method that actually does the currency - conversion. It's a Lisp method that will be called when the - AppKit sends the Objective-C message "convertCurrency:atRate:" - It's very simple—really, it just multiples - currency times rate. Most of the text in the definition is - Objective-C bridge code that links the definition to the right - class with the right argument and return types.

- -

objc:defmethod is a version of DEFMETHOD that - creates methods that can execute in response to Objective-C - message-sends.

- -

The syntax #/convertCurrency:atRate: uses the - "#/" reader macro to read a symbol with case preserved, so that - you can see in your code the same name that Objective-C uses for - the method, without worrying about how the name might be - converted between Lisp and Objective-C conventions.

- -

The number of arguments to an Objective-C method is the - number of colons in the name, plus one. Each colon indicates an - argument, and there is always an extra "self" argument that - refers to the object that receives the message. These are normal - Objective-C conventions, but we perhaps need to emphasize the - details, since we are using Lisp code to call the Objective-C - methods.

- -

We indicate the return type and the types of arguments in - the method definition by surrounding parameters and the method - name with parentheses, and appending the type name.

- -

Thus, for example,

- -
-(#/convertCurrency:atRate: :float) 
-      
- -

means that the return type of the method is :FLOAT, and

- -
-(self converter) 
-      
- -

means that the type of the receiving object is Converter.

- -

You will see these same conventions repeated in the next - section.

-
- -
-

Defining the ConverterController Class

-
- -
-

The previous section defined the Model class, Converter. All - we need now is a definition for the ConverterController - class. Recall from your reading of Apple's Tutorial that the - CurrencyConverter example uses the Model-View-Controller - paradigm. You used InterfaceBuilder to construct the - application's views. The Converter class provides the model - that represents application data. Now we define the controller - class, ConverterController, which connects the View and the - Model.

- -

Here's the definition of the ConverterController class:

- -
-(defclass converter-controller (ns:ns-object)
-  ((amount-field :foreign-type :id :accessor amount-field)
-   (converter :foreign-type :id :accessor converter)
-   (dollar-field :foreign-type :id :accessor dollar-field)
-   (rate-field :foreign-type :id :accessor rate-field))
-  (:metaclass ns:+ns-object))
-      
- -

Once again we use the Objective-C bridge to define an - Objective-C class. This time, we provide several - instance-variable definitions in the class, and name accessors - for each of them explicitly. The :FOREIGN-TYPE - initargs enable us to specify the type of each field in the - foreign (Objective-C) class.

- -

Each field in the definition of the ConverterController class - is an outlet that will be used to store a reference to one of - the text fields that you created in InterfaceBuilder. For - example, amount-field will be connected to the - "Amount" text field.

- -

Why did we spell the name "amount-field" in Lisp code, and - "amountField" when creating the outlet in InterfaceBuilder? The - Objective-C bridge automatically converts Lisp-style field names - (like "amount-field") to Objective-C-style field names (like - "amountField"), when handling class definitions.

- -

The converter field at launch time contains a - reference to the Converter object, whose class definition is in - the previous section.

- -

The final piece of the implementation is a definition of the - "convert:" method. This is the method that is called when a - user clicks the "Convert" button in the user interface.

- -
-(objc:defmethod (#/convert: :void) ((self converter-controller) sender)
-  (declare (ignore sender))
-  (let* ((conv (converter self))
-         (dollar-field (dollar-field self))
-         (rate-field (rate-field self))
-         (amount-field (amount-field self))
-         (dollars (#/floatValue dollar-field))
-         (rate (#/floatValue rate-field))
-         (amount (#/convertCurrency:atRate: conv dollars rate)))
-    (#/setFloatValue: amount-field amount)
-    (#/selectText: rate-field self)))
-      
- -

Just as in the Apple example, this method reads the dollar - and rate values, and passes them to the - "convertCurrency:atRate:" method of the Converter class. It then - sets the text of the amount-field to reflect the result of the - conversion. The only significant difference between this - implementation and Apple's is that the code is written in Lisp - rather than Objective-C.

- -

This completes the definition of the CurrencyConverter's - behavior. All that remains is to actually build the Cocoa - application. The next section shows how to do that.

- -
- - - - - - diff --git a/examples/cocoa/currency-converter/HOWTO_files/stylesheets/styles.css b/examples/cocoa/currency-converter/HOWTO_files/stylesheets/styles.css deleted file mode 100644 index bb6542461..000000000 --- a/examples/cocoa/currency-converter/HOWTO_files/stylesheets/styles.css +++ /dev/null @@ -1,55 +0,0 @@ -body { - background-color: white; - font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif; -} - -.title { - text-align: center; - font-size: 16pt; -} - -.subtitle { - font-size: medium; - font-weight: bold; - text-align: center; -} - -.byline { - text-align: center; - font-weight: bold; - font-size: small; -} - -.section-head { - padding-top: 2em; - padding-left: 1em; -} - -.body-text { - font: 12pt Georgia, "Times New Roman", Times, serif; - margin-left: 4em; - margin-right: 4em; - text-indent: 3em; -} - -.note { - font: 12pt Georgia, "Times New Roman", Times, serif; - margin-left: 6em; - margin-right: 6em; - text-indent: 0em; -} - -.inline-image { - text-align: center; -} - -.nav { - text-align: center; - font-size: large; - font-weight: bold; - padding-top: 4em; -} - -li, pre { - text-indent: 0; -} \ No newline at end of file diff --git a/examples/cocoa/currency-converter/currency-converter.lisp b/examples/cocoa/currency-converter/currency-converter.lisp deleted file mode 100644 index 3489a5b88..000000000 --- a/examples/cocoa/currency-converter/currency-converter.lisp +++ /dev/null @@ -1,54 +0,0 @@ -(in-package "CCL") - -;;; define the classes referenced in the nibfile - -(defclass converter (ns:ns-object) - () - (:metaclass ns:+ns-object)) - -(objc:defmethod (#/convertCurrency:atRate: :float) - ((self converter) (currency :float) (rate :float)) - (* currency rate)) - -(defclass converter-controller (ns:ns-object) - ((amount-field :foreign-type :id :accessor amount-field) - (converter :foreign-type :id :accessor converter) - (dollar-field :foreign-type :id :accessor dollar-field) - (rate-field :foreign-type :id :accessor rate-field)) - (:metaclass ns:+ns-object)) - -(objc:defmethod (#/convert: :void) ((self converter-controller) sender) - (declare (ignore sender)) - (let* ((conv (converter self)) - (dollar-field (dollar-field self)) - (rate-field (rate-field self)) - (amount-field (amount-field self)) - (dollars (#/floatValue dollar-field)) - (rate (#/floatValue rate-field)) - (amount (#/convertCurrency:atRate: conv dollars rate))) - (#/setFloatValue: amount-field amount) - (#/selectText: rate-field self))) - - - - -#| -"/Users/mikel/Valise/clozure/openmcl/example-code/currency-converter/CurrencyConverter.nib" - -building the app: - -(progn - (setf (current-directory) "/Users/mikel/Valise/clozure/openmcl/example-code/currency-converter/") - (load "currency-converter") - (require "build-application") - (ccl::build-application :name "CurrencyConverter" - :main-nib-name "CurrencyConverter" - :directory "/Users/mikel/Desktop/" - :nibfiles '(#P"/usr/local/openmcl/trunk/ccl/examples/cocoa/currency-converter/CurrencyConverter.xib"))) - -TODO NOTES: - -The name of the app in the main menu title is determined by the CFBundleName field in the -InfoPlist.strings file in the English.lproj resources folder. - -|# \ No newline at end of file diff --git a/examples/cocoa/nib-loading/HOWTO.html b/examples/cocoa/nib-loading/HOWTO.html deleted file mode 100644 index 62a666255..000000000 --- a/examples/cocoa/nib-loading/HOWTO.html +++ /dev/null @@ -1,441 +0,0 @@ - - - - Nib-Loading HOWTO - - - - - -
-

Nib-Loading HOWTO

-
- -
-

This HOWTO shows how you can load nibfiles - into a running copy of Clozure CL by evaluating Lisp forms. You - might want to load nibfiles this way to test user-interface - elements that you are working on for an application project, or - to enable an application to dynamically load optional - user-interface elements.

- -
- -
-

Nibfiles

-
- -
-

A large part of developing Cocoa applications is creating - user-interface elements using the Cocoa frameworks. Although - it's perfectly possible to create any user-interface element - just by making method calls against the frameworks, the more - standard way to design a user interface is to use Apple's - InterfaceBuilder application to - create nibfiles—files of archived - Objective-C objects that implement the user-interface - elements.

- -

InterfaceBuilder is an application that ships with Apple's - Developer Tools. The Developer Tools are an optional install - that comes with Mac OS X. Before you can use this HOWTO, you'll - need to make sure that Apple's Developer Tools are installed on - your system. Members of Apple's developer programs may download - the tools for free from - Apple's developer - website, but normally there is no need. You can simply - use the optional Developer Tools installer on the Mac OS X - system disks to install the tools.

-
- -
-

Using Nibfiles

-
- -
-

Using InterfaceBuilder, you can quickly and easily create - windows, dialog boxes, text fields, buttons, and other - user-interface elements. The elements you create with - InterfaceBuilder have the standard appearance and behavior - specified by Apple's Human Interface Guidelines.

- -

InterfaceBuilder saves descriptions of these objects - in nibfiles. These files contain archived - representations of Objective-C classes and objects. When you - launch an application and it loads a nibfile, the Cocoa runtime - creates these Objective-C objects in memory, complete with any - instance-variable references to other objects that might have - been saved in the nibfile. In short, a nibfile is an archived - collection of user-interface objects that Cocoa can quickly and - easily revive in memory.

- -

The normal way that Objective-C programmers use nibfiles is - by storing them in an application bundle. The application's - Info.plist file (also stored in the bundle) specifies which - nibfile is the application's main nibfile, and that file is - loaded automatically when the application starts up. The - application can dynamically load other nibfiles from the bundle - by making method calls.

- -

Lisp applications written with Clozure CL can also use - nibfiles in this same fashion (see the "currency-converter" - HOWTO in the "cocoa" examples folder), but Lisp programmers are - accustomed to highly interactive development, and might want to - simply load an arbitrary nibfile into a running Clozure CL - session. Fortunately, this is easy to do.

-
- -
-

How To Load a Nibfile

-
- -
-

Let's start by loading a very simple nibfile from the Clozure - CL Listener window. Start by launching the Clozure CL - application.

- -

In the same directory as this HOWTO file, you'll find a - nibfile named "hello.nib". This is an extremely simple nibfile - that creates a single Cocoa window with a greeting in it. We'll - use forms typed into the Listener window to load it.

- -

We're going to call the Objective-C class - method loadNibFile:externalNameTable:withZone: to - load the nibfile into memory, creating the window that is - described in the file. First, though, we need to set up some - data structures that we'll pass to this method.

- -

The arguments - to loadNibFile:externalNameTable:withZone: are a - pathname, a dictionary object, and a memory zone. As with every - Objective-C method call, we also pass the object that receives - the message, which in this case is the class NSBundle.

- -

The pathname is just a reference to the nibfile we want to - load. The dictionary holds references to objects. In this - first simple example, we'll use it only to identify the - nibfile's owner, which in this case is the application - itself. The zone is a reference to the area of memory where - the nibfile objects will be allocated.

- -

Don't worry if none of this makes sense to you; the code to - create these objects is simple and straightforward, and should - help clarify what's going on.

- -
-

1. Get the Zone

-
- -

First, we'll get a memory zone. We'll tell Cocoa to allocate - the nibfile objects in the same zone that the application - uses, so getting a zone is a simple matter of asking the - application for the one it's using.

- -

Before we can ask the application anything, we need a - reference to it. When the Clozure CL application starts up, - it stores a reference to the Cocoa application object into - the special variable *NSApp*.

- -

Start by changing to the CCL package; most of the utility - functions we'll use are defined in that package:

- -
-        ? (in-package :ccl)
-        #<Package "CCL">
-      
- -

We have a reference to the running Clozure CL application - object in the special variable *NSApp*. We can ask it for its - zone, where it allocates objects in memory:

- -
-        ? (setf *my-zone* (#/zone *NSApp*))
-        #<A Foreign Pointer #x8B000>
-      
- -

Now we have a reference to the application's zone, which is - one of the parameters we need to pass - to loadNibFile:externalNameTable:withZone:.

- -
-

2. Make a Dictionary

-
- -

The dictionary argument - to loadNibFile:externalNameTable:withZone: is - used for two purposes: to identify the nibfile's owner, and - to collect toplevel objects.

- -

The nibfile's owner becomes the owner of all the toplevel - objects created when the nibfile is loaded, objects such as - windows, buttons, and so on. A nibfile's owner manages the - objects created when the nibfile is loaded, and provides a - way for your code to get references to those objects. You - supply an owner object in the dictionary, under the - key "NSNibOwner".

- -

The toplevel objects are objects, such as windows, that are - created when the nibfile is loaded. To collect these, you - can pass an NSMutableArray object under the - key NSNibTopLevelObjects.

- -

For this first example, we'll pass an owner object (the - application object), but we don't need to collect toplevel - objects, so we'll omit - the NSNibTopLevelObjects key.

- -
-        ? (setf *my-dict* 
-        (#/dictionaryWithObject:forKey: ns:ns-mutable-dictionary
-        *my-app* 
-        #@"NSNibOwner"))
-        #<NS-MUTABLE-DICTIONARY {
-        NSNibOwner = <LispApplication: 0x1b8e10>;
-        } (#x137F3DD0)>
-        
-      
- -
-

3. Load the Nibfile

-
- -

Now that we have the zone and the dictionary we need, we - can load the nibfile. We just need to create an NSString with - the proper pathname first:

- -
-        ? (setf *nib-path* 
-        (%make-nsstring 
-        (namestring "/usr/local/openmcl/ccl/examples/cocoa/nib-loading/hello.nib")))
-        #<NS-MUTABLE-STRING "/usr/local/openmcl/ccl/examples/cocoa/nib-loading/hello.nib" (#x13902C10)>
-      
- -

Now we can actually load the nibfile, passing the method - the objects we've created:

- -
-        ? (#/loadNibFile:externalNameTable:withZone: 
-        ns:ns-bundle
-        *nib-path*
-        *my-dict*
-        *my-zone*)
-        T
-      
- -

The window defined in the "hello.nib" file should appear - on the - screen. The loadNibFile:externalNameTable:withZone: - method returns T to indicate it loaded the - nibfile successfully; if it had failed, it would have - returned NIL.

- -

At this point we no longer need the pathname and - dictionary objects. The *nib-path* we must release:

- -
-        ? (setf *nib-path* (#/release *nib-path*))
-        NIL
-      
- -

The *my-dict* instance was not created with #/alloc (or with - MAKE-INSTANCE), so it is already autoreleased, and we don't need - to release it again. - -

-

Making a Nib-loading Function

-
- -

Loading a nibfile seems like something we might want to do - repeatedly, and so it makes sense to make it as easy as possible - to do. Let's make a single function we can call to load a nib as - needed.

- -

The nib-loading function can take the file to be loaded as a - parameter, and then perform the sequence of steps covered in the - previous section. If we just literally do that, the result will - look something like this:

- -
-(defun load-nibfile (nib-path)
-  (let* ((app-zone (#/zone *NSApp*))
-         (nib-name (%make-nsstring (namestring nib-path)))
-         (dict (#/dictionaryWithObject:forKey: 
-                 ns-mutable-dictionary app #@"NSNibOwner")))
-    (#/loadNibFile:externalNameTable:withZone: ns:ns-bundle
-                                               nib-name
-                                               dict
-                                               app-zone
-                                             )))
-      
- -

The trouble with this function is that it leaks a string - every time we call it. We need to release the - nib-name before returning. So how about this - version instead?

- -
-(defun load-nibfile (nib-path)
-  (let* ((app-zone (#/zone *NSApp*))
-         (nib-name (%make-nsstring (namestring nib-path)))
-         (dict (#/dictionaryWithObject:forKey: 
-                ns-mutable-dictionary app #@"NSNibOwner"))
-         (result (#/loadNibFile:externalNameTable:withZone: ns:ns-bundle
-                                                            nib-name
-                                                            dict
-                                                            app-zone)))
-    (#/release nib-name)
-    result))
-      
- -

This version solves the leaking problem by binding the result - of the load call to result, then releasing the - nib-name before returning the result of the - load.

- -

There's just one more problem: what if we want to use the - dictionary to collect the nibfile's toplevel objects, so that we - can get access to them from our code? We'll need another version - of our function.

- -

In order to collect toplevel objects, we'll want to pass an - NSMutableArray object in the dictionary, stored under the key - NSNibTopLevelObjects. So we first need to create such an - array object in the let form:

- -
-(let* (...
-       (objects-array (#/arrayWithCapacity: ns:ns-mutable-array 16))
-       ...)
-  ...)
-      
- -

Now that we have the array in which to store the nibfile's - toplevel objects, we need to change the code that creates the - dictionary, so that it contains not only the owner object, but - also the array we just created:

- -
-  (let* (...
-         (dict (#/dictionaryWithObjectsAndKeys: ns:ns-mutable-dictionary
-                    app #@"NSNibOwner"
-                    objects-array #&NSNibTopLevelObjects
-                    +null-ptr+))
-         ...)
-    ...)
-  
-      
- -

We now want to collect the objects in it. We'll do that by - making a local variable to store them, then iterating over the - array object to get them all. (Normally, when we want to keep - an object from an array, we have to retain it. Top-level nib - objects are a special case: they are created by the nib loading - process with a retain count of 1, and we are responsible for releasing - them when we're through with them.)

- -
-  (let* (...
-         (toplevel-objects (list))
-         ...)
-    (dotimes (i (#/count objects-array))
-      (setf toplevel-objects 
-            (cons (#/objectAtIndex: objects-array i)
-                  toplevel-objects)))
-    ...)
-      
- -

After collecting the objects, we can release the array, then - return the list of objects. It's still possible we might want - to know whether the load succeeded, so we - use values to return both the toplevel objects and - the success or failure of the load.

- -

The final version of the nib-loading code looks like - this:

- -
-(defun load-nibfile (nib-path)
-  (let* ((app-zone (#/zone *NSApp*))
-         (nib-name (%make-nsstring (namestring nib-path)))
-         (objects-array (#/arrayWithCapacity: ns:ns-mutable-array 16))
-         (dict (#/dictionaryWithObjectsAndKeys: ns:ns-mutable-dictionary
-                    *NSApp* #@"NSNibOwner"
-                    objects-array #&NSNibTopLevelObjects
-		    +null-ptr+))
-         (toplevel-objects (list))
-         (result (#/loadNibFile:externalNameTable:withZone: ns:ns-bundle
-                                                            nib-name
-                                                            dict
-                                                            app-zone)))
-    (dotimes (i (#/count objects-array))
-      (setf toplevel-objects 
-            (cons (#/objectAtIndex: objects-array i)
-                  toplevel-objects)))
-    (#/release nib-name)
-    (values toplevel-objects result)))
-      
- -

Now we can call this function with some suitable nibfile, - such as simple "hello.nib" that comes with this HOWTO:

- -
-? (ccl::load-nibfile "hello.nib")
-(#<LISP-APPLICATION <LispApplication: 0x1b8da0> (#x1B8DA0)>
- #<NS-WINDOW <NSWindow: 0x171344d0> (#x171344D0)>)
-T
-
-      
- -

The "Hello!" window appears on the screen, and two values are - returned. The first value is the list of toplevel objects that - were loaded. The second value, T indicates that the - nibfile was loaded successfully.

- -
-

What About Unloading Nibfiles?

-
- -

Cocoa provides no general nibfile-unloading API. Instead, if - you want to unload a nib, the accepted approach is to close all - the windows associated with a nibfile and release all the - toplevel objects. This is one reason that you might want to use - the "NSNibTopLevelObjects" key with the dictionary - object that you pass - to loadNibFile:externalNameTable:withZone:—to - obtain a collection of toplevel objects that you release when - the nibfile is no longer needed.

- -

In document-based Cocoa applications, the main nibfile is - usually owned by the application object, and is never unloaded - while the application runs. Auxliliary nibfiles are normally - owned by controller objects, usually instances of - NSWindowController subclasses. When you - use NSWindowController objects to load nibfiles, - they take responsibility for loading and unloading nibfile - objects.

- -

When you're experimenting interactively with nibfile loading, - you may not start out by - creating NSWindowController objects to load - nibfiles, and so you may need to do more of the object - management yourself. On the one hand, loading nibfiles by hand - is not likely to be the source of major application problems. On - the other hand, if you experiment with nib-loading for a long - time in an interactive session, it's possible that you'll end up - with numerous discarded objects cluttering memory, along with - various references to live and possibly released objects. Keep - this in mind when using the Listener to explore Cocoa. You can - always restore your Lisp system to a clean state by restarting - it, but of course you then lose whatever state you have built up - in your explorations. It's often a good idea to work from a text - file rather than directly in the Listener, so that you have a - record of the experimenting you've done. That way, if you need - to start fresh (or if you accidentally cause the application to - crash), you don't lose all the information you gained.

- -
- - - - diff --git a/examples/cocoa/nib-loading/HOWTO_files/images/bosco.jpg b/examples/cocoa/nib-loading/HOWTO_files/images/bosco.jpg deleted file mode 100644 index c7b33f661..000000000 Binary files a/examples/cocoa/nib-loading/HOWTO_files/images/bosco.jpg and /dev/null differ diff --git a/examples/cocoa/nib-loading/HOWTO_files/stylesheets/styles.css b/examples/cocoa/nib-loading/HOWTO_files/stylesheets/styles.css deleted file mode 100644 index bb6542461..000000000 --- a/examples/cocoa/nib-loading/HOWTO_files/stylesheets/styles.css +++ /dev/null @@ -1,55 +0,0 @@ -body { - background-color: white; - font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif; -} - -.title { - text-align: center; - font-size: 16pt; -} - -.subtitle { - font-size: medium; - font-weight: bold; - text-align: center; -} - -.byline { - text-align: center; - font-weight: bold; - font-size: small; -} - -.section-head { - padding-top: 2em; - padding-left: 1em; -} - -.body-text { - font: 12pt Georgia, "Times New Roman", Times, serif; - margin-left: 4em; - margin-right: 4em; - text-indent: 3em; -} - -.note { - font: 12pt Georgia, "Times New Roman", Times, serif; - margin-left: 6em; - margin-right: 6em; - text-indent: 0em; -} - -.inline-image { - text-align: center; -} - -.nav { - text-align: center; - font-size: large; - font-weight: bold; - padding-top: 4em; -} - -li, pre { - text-indent: 0; -} \ No newline at end of file diff --git a/examples/cocoa/nib-loading/hello.nib/designable.nib b/examples/cocoa/nib-loading/hello.nib/designable.nib deleted file mode 100644 index 3eb29b818..000000000 --- a/examples/cocoa/nib-loading/hello.nib/designable.nib +++ /dev/null @@ -1,269 +0,0 @@ - - - - 1050 - 9B18 - 629 - 949 - 343.00 - - YES - - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - - - YES - - NSObject - - - FirstResponder - - - NSApplication - - - 271 - 2 - {{196, 453}, {201, 57}} - 536870912 - Hello! - NSWindow - - - - 256 - - YES - - - 268 - {{17, 20}, {167, 17}} - - - YES - - 67239488 - 272630784 - Hello from the nib loader! - - LucidaGrande - 1.300000e+01 - 1044 - - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2OQA - - - - 6 - - controlTextColor - - 3 - MAA - - - - - - {201, 57} - - - - {{0, 0}, {1920, 1178}} - - - - - YES - - - - YES - - 0 - - YES - - - - - - -2 - - - RmlsZSdzIE93bmVyA - - - -1 - - - First Responder - - - -3 - - - Application - - - 1 - - - YES - - - - - - 2 - - - YES - - - - - - 3 - - - YES - - - - - - 4 - - - - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 1.IBPluginDependency - 1.IBWindowTemplateEditedContentRect - 1.NSWindowTemplate.visibleAtLaunch - 1.WindowOrigin - 1.editorWindowContentRectSynchronizationRect - 2.IBPluginDependency - 3.IBPluginDependency - 4.IBPluginDependency - - - YES - - - - - {{513, 516}, {201, 57}} - - {196, 240} - {{513, 516}, {201, 57}} - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - YES - - YES - - - YES - - - - - YES - - YES - - - YES - - - - 4 - - - - YES - - - 0 - - 3 - - YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxBCAAsADAAxADUANgA7ADwA -QQBVAFYAVwBYAAsAZQBpAHUAdgCGAIcAjwCQAJMAnACdAJ4AowClAKoAqwCuALIAuAC8AAsAvQC/AMAA -wwDHAMoA0gDVANYA2ADgAOkA8gDzAPQA9QD2APcA+AD7AP4BBwBSAKEBEAERARIBEwEUARcBGgEdVSRu -dWxs3xASAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAn -ACgAKQAqACsALAAtAC4ALwAwVk5TUm9vdFYkY2xhc3NdTlNPYmplY3RzS2V5c18QD05TQ2xhc3Nlc1Zh -bHVlc18QGU5TQWNjZXNzaWJpbGl0eU9pZHNWYWx1ZXNdTlNDb25uZWN0aW9uc1tOU05hbWVzS2V5c1tO -U0ZyYW1ld29ya11OU0NsYXNzZXNLZXlzWk5TT2lkc0tleXNdTlNOYW1lc1ZhbHVlc18QGU5TQWNjZXNz -aWJpbGl0eUNvbm5lY3RvcnNdTlNGb250TWFuYWdlcl8QEE5TVmlzaWJsZVdpbmRvd3NfEA9OU09iamVj -dHNWYWx1ZXNfEBdOU0FjY2Vzc2liaWxpdHlPaWRzS2V5c1lOU05leHRPaWRcTlNPaWRzVmFsdWVzgAKA -QYAngDWAQIAmgCyABYA0gDaALYA+gACABoArgD8QBoA30gAOADIAMwA0W05TQ2xhc3NOYW1lgASAA1hO -U09iamVjdNIANwA4ADkAOlgkY2xhc3Nlc1okY2xhc3NuYW1logA6ADVeTlNDdXN0b21PYmplY3RfEBBJ -QkNvY29hRnJhbWV3b3Jr0gAOAD0APgA/Wk5TLm9iamVjdHOAJaEAQIAH2gBCAA4AQwBEAEUARgBHAEgA -SQBKAEsATABNAE4ATwBQAFEAUgBTACtcTlNXaW5kb3dWaWV3XE5TU2NyZWVuUmVjdF1OU1dpbmRvd1Rp -dGxlWU5TV1RGbGFnc11OU1dpbmRvd0NsYXNzXE5TV2luZG93UmVjdF8QD05TV2luZG93QmFja2luZ18Q -EU5TV2luZG93U3R5bGVNYXNrW05TVmlld0NsYXNzgAuAJIAjgAkSIAAAAIAKgAgQAhEBD4AAXxAXe3sx -OTYsIDQ1M30sIHsyMDEsIDU3fX1WSGVsbG8hWE5TV2luZG931wBZAA4AWgBbAFwAVwBdAF4AXwBgAGEA -YgBeAGRfEA9OU05leHRSZXNwb25kZXJaTlNTdWJ2aWV3c1hOU3ZGbGFnc1tOU0ZyYW1lU2l6ZVtOU1N1 -cGVydmlld4AMgCKADREBAIAggAyAIdIADgA9AGYAZ4AfoQBogA7YAFkADgBqAGsAWwBsAFcAXQBLAG4A -bwBwAHEAcgBeAEtXTlNGcmFtZVZOU0NlbGxZTlNFbmFibGVkgAuAHoAPgBARAQwJgAyAC18QFXt7MTcs -IDIwfSwgezE2NywgMTd9fdgAdwAOAHgAeQB6AHsAfAB9AH4AfwCAAIEAggBoAIQAhVtOU0NlbGxGbGFn -c18QEU5TQmFja2dyb3VuZENvbG9yWk5TQ29udGVudHNZTlNTdXBwb3J0XU5TQ29udHJvbFZpZXdcTlND -ZWxsRmxhZ3MyW05TVGV4dENvbG9yEgQB/kCAHYAVgBGAEoAOEhBABACAGl8QGkhlbGxvIGZyb20gdGhl -IG5pYiBsb2FkZXIh1AAOAIgAiQCKAIsAjACNAI5WTlNTaXplVk5TTmFtZVhOU2ZGbGFnc4AUI0AqAAAA -AAAAgBMRBBRcTHVjaWRhR3JhbmRl0gA3ADgAkQCSogCSADVWTlNGb2501QAOAJQAlQCWAJcAmACZAC8A -mgCbV05TQ29sb3JcTlNDb2xvclNwYWNlW05TQ29sb3JOYW1lXU5TQ2F0YWxvZ05hbWWAGYAYgBeAFlZT -eXN0ZW1cY29udHJvbENvbG9y0wAOAJUAnwCYAKEAoldOU1doaXRlgBkQA0swLjY2NjY2NjY5ANIANwA4 -AKQAlKIAlAA11QAOAJQAlQCWAJcAmACnAC8AqACbgBmAHIAbgBZfEBBjb250cm9sVGV4dENvbG9y0wAO -AJUAnwCYAKEArYAZQjAA0gA3ADgArwCwpACwALEAawA1XxAPTlNUZXh0RmllbGRDZWxsXE5TQWN0aW9u -Q2VsbNIANwA4ALMAtKUAtAC1ALYAtwA1W05TVGV4dEZpZWxkWU5TQ29udHJvbFZOU1ZpZXdbTlNSZXNw -b25kZXLSADcAOAC5ALqjALoAuwA1Xk5TTXV0YWJsZUFycmF5V05TQXJyYXlZezIwMSwgNTd90gA3ADgA -vgC2owC2ALcANV8QFnt7MCwgMH0sIHsxOTIwLCAxMTc4fX3SADcAOADBAMKiAMIANV8QEE5TV2luZG93 -VGVtcGxhdGXSADcAOADEAMWjAMUAxgA1XE5TTXV0YWJsZVNldFVOU1NldNIADgA9AGYAyYAfoNIADgA9 -AMsAzIAqpQBLAGgAzwBAAHCAC4AOgCiAB4AQ0gAOADIAMwDUgASAKV1OU0FwcGxpY2F0aW9u0gA3ADgA -1wC7ogC7ADXSAA4APQDLANqAKqUAQABLAB8AHwBogAeAC4ACgAKADtIADgA9AMsA4oAqpgBLAGgAzwBA -AB8AcIALgA6AKIAHgAKAENIADgA9AMsA64AqpgDsAO0A7gDvAPAA8YAugC+AMIAxgDKAM1xDb250ZW50 -IFZpZXdfEChTdGF0aWMgVGV4dCAoSGVsbG8gZnJvbSB0aGUgbmliIGxvYWRlciEpW0FwcGxpY2F0aW9u -XxAPV2luZG93IChIZWxsbyEpXEZpbGUncyBPd25lcl8QLFRleHQgRmllbGQgQ2VsbCAoSGVsbG8gZnJv -bSB0aGUgbmliIGxvYWRlciEp0gAOAD0AywD6gCqg0gAOAD0AywD9gCqg0gAOAD0AywEAgCqmAEsAaADP -AEAAHwBwgAuADoAogAeAAoAQ0gAOAD0AywEJgCqmAQoBCwEMAQ0BDgEPgDiAOYA6gDuAPIA9E/////// -///9EAEQBRAE0gAOAD0AZgEWgB+g0gAOAD0AywEZgCqg0gAOAD0AywEcgCqg0gA3ADgBHgEfogEfADVe -TlNJQk9iamVjdERhdGEACAAZACIAJwAxADoAPwBEAFIAVABmAO0A8wE+AUUBTAFaAWwBiAGWAaIBrgG8 -AccB1QHxAf8CEgIkAj4CSAJVAlcCWQJbAl0CXwJhAmMCZQJnAmkCawJtAm8CcQJzAnUCdwJ5AoICjgKQ -ApICmwKkAq0CuAK9AswC3wLoAvMC9QL4AvoDIwMwAz0DSwNVA2MDcAOCA5YDogOkA6YDqAOqA68DsQOz -A7UDuAO6A9QD2wPkBAEEEwQeBCcEMwQ/BEEEQwRFBEgESgRMBE4EVwRZBFwEXgR/BIcEjgSYBJoEnASe -BKAEowSkBKYEqATABOEE7QUBBQwFFgUkBTEFPQVCBUQFRgVIBUoFTAVRBVMFcAWBBYgFjwWYBZoFowWl -BagFtQW+BcMFygXfBecF9AYABg4GEAYSBhQGFgYdBioGNwY/BkEGQwZPBlgGXQZyBnQGdgZ4BnoGjQaa -BpwGnwaoBrEGwwbQBtkG5AbwBvoHAQcNBxYHHQcsBzQHPgdHB04HZwdwB3UHiAeRB5gHpQerB7QHtge3 -B8AHwgfNB88H0QfTB9UH1wfgB+IH5AfyB/sIAAgJCAsIFggYCBoIHAgeCCAIKQgrCDgIOgg8CD4IQAhC -CEQITQhPCFwIXghgCGIIZAhmCGgIdQigCKwIvgjLCPoJAwkFCQYJDwkRCRIJGwkdCSoJLAkuCTAJMgk0 -CTYJPwlBCU4JUAlSCVQJVglYCVoJYwllCWcJaQlyCXQJdQl+CYAJgQmKCYwJjQmWCZsAAAAAAAACAgAA -AAAAAAEgAAAAAAAAAAAAAAAAAAAJqg - - - diff --git a/examples/cocoa/nib-loading/hello.nib/keyedobjects.nib b/examples/cocoa/nib-loading/hello.nib/keyedobjects.nib deleted file mode 100644 index 817849ec0..000000000 Binary files a/examples/cocoa/nib-loading/hello.nib/keyedobjects.nib and /dev/null differ diff --git a/examples/cocoa/nib-loading/nib-loading.lisp b/examples/cocoa/nib-loading/nib-loading.lisp deleted file mode 100644 index 049d617ab..000000000 --- a/examples/cocoa/nib-loading/nib-loading.lisp +++ /dev/null @@ -1,37 +0,0 @@ -;;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10; Package: cl-user -*- -;;;; *********************************************************************** -;;;; FILE IDENTIFICATION -;;;; -;;;; Name: nib-loading.lisp -;;;; Version: 0.1 -;;;; Project: cocoa examples -;;;; Purpose: examples of loading nibs dynamically in the IDE -;;;; -;;;; *********************************************************************** - -(in-package :ccl) - -(defun load-nibfile (nib-path) - (let* ((app-zone (#/zone *NSApp*)) - (nib-name (%make-nsstring (namestring nib-path))) - (objects-array (#/arrayWithCapacity: ns:ns-mutable-array 16)) - (dict (#/dictionaryWithObjectsAndKeys: ns:ns-mutable-dictionary - *NSApp* #&NSNibOwner - objects-array #&NSNibTopLevelObjects - +null-ptr+)) - (toplevel-objects (list)) - (result (#/loadNibFile:externalNameTable:withZone: ns:ns-bundle - nib-name - dict - app-zone))) - (dotimes (i (#/count objects-array)) - (setf toplevel-objects - (cons (#/objectAtIndex: objects-array i) - toplevel-objects))) - (#/release nib-name) - (values toplevel-objects result))) - -#| -(ccl::load-nibfile "/usr/local/openmcl/trunk/source/examples/cocoa/nib-loading/hello.nib") -|# -