From 5b54612d91129afb92aee01e14984e7e2e401709 Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 6 May 2015 20:41:51 -0700 Subject: [PATCH 1/3] Pass authtoken in from user, and add a wrapper for web UI on Mac. --- ext/mac-ui-macgap1-wrapper/LICENSE | 25 + .../MacGap.xcodeproj/project.pbxproj | 492 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/MacGap.xccheckout | 41 + .../UserInterfaceState.xcuserstate | Bin 0 -> 46675 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 18268 bytes .../WorkspaceSettings.xcsettings | 10 + .../UserInterfaceState.xcuserstate | Bin 0 -> 27811 bytes .../WorkspaceSettings.xcsettings | 10 + .../xcdebugger/Breakpoints.xcbkptlist | 131 + .../xcschemes/MacGap.xcscheme | 86 + .../xcschemes/xcschememanagement.plist | 22 + .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 + .../api.xcuserdatad/xcschemes/MacGap.xcscheme | 88 + .../xcschemes/xcschememanagement.plist | 22 + .../xcdebugger/Breakpoints.xcbkptlist | 161 + .../xcschemes/MacGap.xcscheme | 84 + .../xcschemes/xcschememanagement.plist | 22 + .../MacGap/AppDelegate.h | 18 + .../MacGap/AppDelegate.m | 110 + .../MacGap/Classes/CallbackDelegate.h | 20 + .../MacGap/Classes/CallbackDelegate.m | 168 + .../MacGap/Classes/Commands/App.h | 21 + .../MacGap/Classes/Commands/App.m | 128 + .../MacGap/Classes/Commands/Command.h | 18 + .../MacGap/Classes/Commands/Command.m | 28 + .../MacGap/Classes/Commands/Dock.h | 11 + .../MacGap/Classes/Commands/Dock.m | 31 + .../MacGap/Classes/Commands/MenuItemProxy.h | 31 + .../MacGap/Classes/Commands/MenuItemProxy.m | 150 + .../MacGap/Classes/Commands/MenuProxy.h | 31 + .../MacGap/Classes/Commands/MenuProxy.m | 233 ++ .../MacGap/Classes/Commands/Notice.h | 26 + .../MacGap/Classes/Commands/Notice.m | 108 + .../MacGap/Classes/Commands/Path.h | 21 + .../MacGap/Classes/Commands/Path.m | 53 + .../MacGap/Classes/Commands/Sound.h | 17 + .../MacGap/Classes/Commands/Sound.m | 97 + .../MacGap/Classes/Commands/UserDefaults.h | 43 + .../MacGap/Classes/Commands/UserDefaults.m | 211 + .../MacGap/Classes/Commands/fonts.h | 9 + .../MacGap/Classes/Commands/fonts.m | 48 + .../MacGap/Classes/Constants.h | 7 + .../MacGap/Classes/ContentView.h | 15 + .../MacGap/Classes/ContentView.m | 68 + .../MacGap/Classes/JSEventHelper.h | 20 + .../MacGap/Classes/JSEventHelper.m | 41 + .../MacGap/Classes/Utils.h | 20 + .../MacGap/Classes/Utils.m | 93 + .../MacGap/Classes/WebViewDelegate.h | 49 + .../MacGap/Classes/WebViewDelegate.m | 206 + .../MacGap/Classes/Window.h | 23 + .../MacGap/Classes/Window.m | 94 + ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h | 10 + ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m | 51 + .../MacGap/MacGap-Info.plist | 34 + .../MacGap/MacGap-Prefix.pch | 15 + .../MacGap/WindowController.h | 13 + .../MacGap/WindowController.m | 54 + .../MacGap/en.lproj/Credits.rtf | 13 + .../MacGap/en.lproj/InfoPlist.strings | 2 + .../MacGap/en.lproj/MainMenu.xib | 3404 +++++++++++++++++ .../MacGap/en.lproj/Window.xib | 337 ++ ext/mac-ui-macgap1-wrapper/MacGap/main.m | 14 + ext/mac-ui-macgap1-wrapper/README.md | 36 + ext/mac-ui-macgap1-wrapper/application.icns | Bin 0 -> 88566 bytes ext/mac-ui-macgap1-wrapper/public/index.html | 33 + ui/main.jsx | 49 +- 68 files changed, 7537 insertions(+), 1 deletion(-) create mode 100644 ext/mac-ui-macgap1-wrapper/LICENSE create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/Alex.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h create mode 100755 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/main.m create mode 100644 ext/mac-ui-macgap1-wrapper/README.md create mode 100644 ext/mac-ui-macgap1-wrapper/application.icns create mode 100644 ext/mac-ui-macgap1-wrapper/public/index.html diff --git a/ext/mac-ui-macgap1-wrapper/LICENSE b/ext/mac-ui-macgap1-wrapper/LICENSE new file mode 100644 index 000000000..c7fd4a4a5 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/LICENSE @@ -0,0 +1,25 @@ +MacGap was ported from phonegap-mac, and is under the same license (MIT) + +The MIT License +***************** + +Copyright (c) <2012> + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj new file mode 100644 index 000000000..ea339cf0a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj @@ -0,0 +1,492 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1495814F15C15CCC00E1CFE5 /* Notice.m in Sources */ = {isa = PBXBuildFile; fileRef = 1495814E15C15CCC00E1CFE5 /* Notice.m */; }; + 6F169DA718CC332E005EDDF3 /* Command.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DA618CC332E005EDDF3 /* Command.m */; }; + 6F169DAA18CC35FD005EDDF3 /* CallbackDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DA918CC35FD005EDDF3 /* CallbackDelegate.m */; }; + 6F169DAC18CD8A4A005EDDF3 /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F169DAB18CD8A4A005EDDF3 /* JavaScriptCore.framework */; }; + 6F169DB118CD906F005EDDF3 /* MenuItemProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DAE18CD906F005EDDF3 /* MenuItemProxy.m */; }; + 6F169DB218CD906F005EDDF3 /* MenuProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F169DB018CD906F005EDDF3 /* MenuProxy.m */; }; + 6FD672B618FE618E00C0DAAD /* UserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FD672B518FE618E00C0DAAD /* UserDefaults.m */; }; + 6FD6E4ED18C2D48C00DFFBE6 /* fonts.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FD6E4EC18C2D48C00DFFBE6 /* fonts.m */; }; + 88746BEE14CCA435001E160E /* JSEventHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 88746BED14CCA435001E160E /* JSEventHelper.m */; }; + 88C0646014BDE10A00E4BCE2 /* Window.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C0645F14BDE10A00E4BCE2 /* Window.m */; }; + 88C0646614BDEC5800E4BCE2 /* Window.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88C0646414BDEC5800E4BCE2 /* Window.xib */; }; + 88C0646D14BDF6A600E4BCE2 /* WindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C0646C14BDF6A600E4BCE2 /* WindowController.m */; }; + C1C2B9911AFB0CF10060D7C2 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1C2B9901AFB0CF10060D7C2 /* Security.framework */; }; + F2B80016179E0FC100B069A8 /* Clipboard.m in Sources */ = {isa = PBXBuildFile; fileRef = F2B80015179E0FC100B069A8 /* Clipboard.m */; }; + FA32509D14BA813600BF0781 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA32509C14BA813600BF0781 /* WebKit.framework */; }; + FA3250C314BA85E700BF0781 /* ContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250BC14BA85E700BF0781 /* ContentView.m */; }; + FA3250C514BA85E700BF0781 /* Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250BE14BA85E700BF0781 /* Utils.m */; }; + FA3250C714BA85E700BF0781 /* WebViewDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250C014BA85E700BF0781 /* WebViewDelegate.m */; }; + FA3250D314BA860800BF0781 /* App.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250C914BA860800BF0781 /* App.m */; }; + FA3250D514BA860800BF0781 /* Dock.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250CB14BA860800BF0781 /* Dock.m */; }; + FA3250D914BA860800BF0781 /* Path.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250CF14BA860800BF0781 /* Path.m */; }; + FA3250DB14BA860800BF0781 /* Sound.m in Sources */ = {isa = PBXBuildFile; fileRef = FA3250D114BA860800BF0781 /* Sound.m */; }; + FA3250E514BA883A00BF0781 /* public in Resources */ = {isa = PBXBuildFile; fileRef = FA3250E414BA883A00BF0781 /* public */; }; + FA3250E714BA8BCE00BF0781 /* application.icns in Resources */ = {isa = PBXBuildFile; fileRef = FA3250E614BA8BCE00BF0781 /* application.icns */; }; + FA3F7742168F70790027B324 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA3F7741168F70780027B324 /* Cocoa.framework */; }; + FAE451C914BA79C600190544 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = FAE451C714BA79C600190544 /* InfoPlist.strings */; }; + FAE451CB14BA79C600190544 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = FAE451CA14BA79C600190544 /* main.m */; }; + FAE451CF14BA79C600190544 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = FAE451CD14BA79C600190544 /* Credits.rtf */; }; + FAE451D214BA79C600190544 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FAE451D114BA79C600190544 /* AppDelegate.m */; }; + FAE451D514BA79C600190544 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = FAE451D314BA79C600190544 /* MainMenu.xib */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + FA3250DD14BA876F00BF0781 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1495814D15C15CCC00E1CFE5 /* Notice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Notice.h; path = Classes/Commands/Notice.h; sourceTree = ""; }; + 1495814E15C15CCC00E1CFE5 /* Notice.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Notice.m; path = Classes/Commands/Notice.m; sourceTree = ""; }; + 6F169DA518CC332E005EDDF3 /* Command.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Command.h; path = Classes/Commands/Command.h; sourceTree = ""; }; + 6F169DA618CC332E005EDDF3 /* Command.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Command.m; path = Classes/Commands/Command.m; sourceTree = ""; }; + 6F169DA818CC35FD005EDDF3 /* CallbackDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CallbackDelegate.h; path = Classes/CallbackDelegate.h; sourceTree = ""; }; + 6F169DA918CC35FD005EDDF3 /* CallbackDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CallbackDelegate.m; path = Classes/CallbackDelegate.m; sourceTree = ""; }; + 6F169DAB18CD8A4A005EDDF3 /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; + 6F169DAD18CD906F005EDDF3 /* MenuItemProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MenuItemProxy.h; path = Classes/Commands/MenuItemProxy.h; sourceTree = ""; }; + 6F169DAE18CD906F005EDDF3 /* MenuItemProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MenuItemProxy.m; path = Classes/Commands/MenuItemProxy.m; sourceTree = ""; }; + 6F169DAF18CD906F005EDDF3 /* MenuProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MenuProxy.h; path = Classes/Commands/MenuProxy.h; sourceTree = ""; }; + 6F169DB018CD906F005EDDF3 /* MenuProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MenuProxy.m; path = Classes/Commands/MenuProxy.m; sourceTree = ""; }; + 6FD672B418FE618E00C0DAAD /* UserDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UserDefaults.h; path = Classes/Commands/UserDefaults.h; sourceTree = ""; }; + 6FD672B518FE618E00C0DAAD /* UserDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UserDefaults.m; path = Classes/Commands/UserDefaults.m; sourceTree = ""; }; + 6FD6E4EB18C2D48200DFFBE6 /* fonts.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = fonts.h; path = Classes/Commands/fonts.h; sourceTree = ""; }; + 6FD6E4EC18C2D48C00DFFBE6 /* fonts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = fonts.m; path = Classes/Commands/fonts.m; sourceTree = ""; }; + 88746BEC14CCA435001E160E /* JSEventHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSEventHelper.h; path = Classes/JSEventHelper.h; sourceTree = ""; }; + 88746BED14CCA435001E160E /* JSEventHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = JSEventHelper.m; path = Classes/JSEventHelper.m; sourceTree = ""; }; + 88C0645E14BDE10A00E4BCE2 /* Window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Window.h; path = Classes/Window.h; sourceTree = ""; }; + 88C0645F14BDE10A00E4BCE2 /* Window.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Window.m; path = Classes/Window.m; sourceTree = ""; }; + 88C0646514BDEC5800E4BCE2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Window.xib; sourceTree = ""; }; + 88C0646B14BDF6A600E4BCE2 /* WindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowController.h; sourceTree = ""; }; + 88C0646C14BDF6A600E4BCE2 /* WindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WindowController.m; sourceTree = ""; }; + C1C2B9901AFB0CF10060D7C2 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + F2B80014179E0FC100B069A8 /* Clipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clipboard.h; sourceTree = ""; }; + F2B80015179E0FC100B069A8 /* Clipboard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Clipboard.m; sourceTree = ""; }; + FA32509C14BA813600BF0781 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; + FA3250BA14BA85E700BF0781 /* Constants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Constants.h; path = Classes/Constants.h; sourceTree = ""; }; + FA3250BB14BA85E700BF0781 /* ContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ContentView.h; path = Classes/ContentView.h; sourceTree = ""; }; + FA3250BC14BA85E700BF0781 /* ContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = ContentView.m; path = Classes/ContentView.m; sourceTree = ""; }; + FA3250BD14BA85E700BF0781 /* Utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Utils.h; path = Classes/Utils.h; sourceTree = ""; }; + FA3250BE14BA85E700BF0781 /* Utils.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Utils.m; path = Classes/Utils.m; sourceTree = ""; }; + FA3250BF14BA85E700BF0781 /* WebViewDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WebViewDelegate.h; path = Classes/WebViewDelegate.h; sourceTree = ""; }; + FA3250C014BA85E700BF0781 /* WebViewDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = WebViewDelegate.m; path = Classes/WebViewDelegate.m; sourceTree = ""; }; + FA3250C814BA860800BF0781 /* App.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = App.h; path = Classes/Commands/App.h; sourceTree = ""; }; + FA3250C914BA860800BF0781 /* App.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = App.m; path = Classes/Commands/App.m; sourceTree = ""; }; + FA3250CA14BA860800BF0781 /* Dock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Dock.h; path = Classes/Commands/Dock.h; sourceTree = ""; }; + FA3250CB14BA860800BF0781 /* Dock.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Dock.m; path = Classes/Commands/Dock.m; sourceTree = ""; }; + FA3250CE14BA860800BF0781 /* Path.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Path.h; path = Classes/Commands/Path.h; sourceTree = ""; }; + FA3250CF14BA860800BF0781 /* Path.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Path.m; path = Classes/Commands/Path.m; sourceTree = ""; }; + FA3250D014BA860800BF0781 /* Sound.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = Sound.h; path = Classes/Commands/Sound.h; sourceTree = ""; }; + FA3250D114BA860800BF0781 /* Sound.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = Sound.m; path = Classes/Commands/Sound.m; sourceTree = ""; }; + FA3250E414BA883A00BF0781 /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + FA3250E614BA8BCE00BF0781 /* application.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = application.icns; sourceTree = SOURCE_ROOT; }; + FA3F7741168F70780027B324 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Cocoa.framework; sourceTree = DEVELOPER_DIR; }; + FAE451BA14BA79C600190544 /* ZeroTier One.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ZeroTier One.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + FAE451BE14BA79C600190544 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + FAE451C114BA79C600190544 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + FAE451C214BA79C600190544 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + FAE451C314BA79C600190544 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + FAE451C614BA79C600190544 /* MacGap-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "MacGap-Info.plist"; sourceTree = ""; }; + FAE451C814BA79C600190544 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + FAE451CA14BA79C600190544 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + FAE451CC14BA79C600190544 /* MacGap-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MacGap-Prefix.pch"; sourceTree = ""; }; + FAE451CE14BA79C600190544 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; }; + FAE451D014BA79C600190544 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + FAE451D114BA79C600190544 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + FAE451D414BA79C600190544 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + FAE451B714BA79C600190544 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C1C2B9911AFB0CF10060D7C2 /* Security.framework in Frameworks */, + 6F169DAC18CD8A4A005EDDF3 /* JavaScriptCore.framework in Frameworks */, + FA3F7742168F70790027B324 /* Cocoa.framework in Frameworks */, + FA32509D14BA813600BF0781 /* WebKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + FA3250E014BA87B800BF0781 /* Classes */ = { + isa = PBXGroup; + children = ( + FA3250E114BA87DD00BF0781 /* Commands */, + FA3250BA14BA85E700BF0781 /* Constants.h */, + 6F169DA818CC35FD005EDDF3 /* CallbackDelegate.h */, + 6F169DA918CC35FD005EDDF3 /* CallbackDelegate.m */, + FA3250BB14BA85E700BF0781 /* ContentView.h */, + FA3250BC14BA85E700BF0781 /* ContentView.m */, + FA3250BF14BA85E700BF0781 /* WebViewDelegate.h */, + FA3250C014BA85E700BF0781 /* WebViewDelegate.m */, + 88C0646B14BDF6A600E4BCE2 /* WindowController.h */, + 88C0646C14BDF6A600E4BCE2 /* WindowController.m */, + ); + name = Classes; + sourceTree = ""; + }; + FA3250E114BA87DD00BF0781 /* Commands */ = { + isa = PBXGroup; + children = ( + 6F169DA518CC332E005EDDF3 /* Command.h */, + 6F169DA618CC332E005EDDF3 /* Command.m */, + 1495814D15C15CCC00E1CFE5 /* Notice.h */, + 1495814E15C15CCC00E1CFE5 /* Notice.m */, + FA3250CA14BA860800BF0781 /* Dock.h */, + FA3250CB14BA860800BF0781 /* Dock.m */, + 6FD6E4EB18C2D48200DFFBE6 /* fonts.h */, + 6FD6E4EC18C2D48C00DFFBE6 /* fonts.m */, + FA3250BD14BA85E700BF0781 /* Utils.h */, + FA3250BE14BA85E700BF0781 /* Utils.m */, + 6FD672B418FE618E00C0DAAD /* UserDefaults.h */, + 6FD672B518FE618E00C0DAAD /* UserDefaults.m */, + FA3250CE14BA860800BF0781 /* Path.h */, + FA3250CF14BA860800BF0781 /* Path.m */, + FA3250D014BA860800BF0781 /* Sound.h */, + FA3250D114BA860800BF0781 /* Sound.m */, + FA3250C814BA860800BF0781 /* App.h */, + FA3250C914BA860800BF0781 /* App.m */, + 6F169DAD18CD906F005EDDF3 /* MenuItemProxy.h */, + 6F169DAE18CD906F005EDDF3 /* MenuItemProxy.m */, + 6F169DAF18CD906F005EDDF3 /* MenuProxy.h */, + 6F169DB018CD906F005EDDF3 /* MenuProxy.m */, + 88C0645E14BDE10A00E4BCE2 /* Window.h */, + 88C0645F14BDE10A00E4BCE2 /* Window.m */, + 88746BEC14CCA435001E160E /* JSEventHelper.h */, + 88746BED14CCA435001E160E /* JSEventHelper.m */, + F2B80014179E0FC100B069A8 /* Clipboard.h */, + F2B80015179E0FC100B069A8 /* Clipboard.m */, + ); + name = Commands; + sourceTree = ""; + }; + FAE451AF14BA79C600190544 = { + isa = PBXGroup; + children = ( + FA3F7741168F70780027B324 /* Cocoa.framework */, + FA3250E414BA883A00BF0781 /* public */, + FAE451C414BA79C600190544 /* MacGap */, + FAE451BD14BA79C600190544 /* Frameworks */, + FAE451BB14BA79C600190544 /* Products */, + ); + sourceTree = ""; + }; + FAE451BB14BA79C600190544 /* Products */ = { + isa = PBXGroup; + children = ( + FAE451BA14BA79C600190544 /* ZeroTier One.app */, + ); + name = Products; + sourceTree = ""; + }; + FAE451BD14BA79C600190544 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C1C2B9901AFB0CF10060D7C2 /* Security.framework */, + 6F169DAB18CD8A4A005EDDF3 /* JavaScriptCore.framework */, + FA32509C14BA813600BF0781 /* WebKit.framework */, + FAE451BE14BA79C600190544 /* Cocoa.framework */, + FAE451C014BA79C600190544 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + FAE451C014BA79C600190544 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + FAE451C114BA79C600190544 /* AppKit.framework */, + FAE451C214BA79C600190544 /* CoreData.framework */, + FAE451C314BA79C600190544 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + FAE451C414BA79C600190544 /* MacGap */ = { + isa = PBXGroup; + children = ( + FA3250E014BA87B800BF0781 /* Classes */, + FAE451D014BA79C600190544 /* AppDelegate.h */, + FAE451D114BA79C600190544 /* AppDelegate.m */, + FAE451D314BA79C600190544 /* MainMenu.xib */, + 88C0646414BDEC5800E4BCE2 /* Window.xib */, + FAE451C514BA79C600190544 /* Supporting Files */, + ); + path = MacGap; + sourceTree = ""; + }; + FAE451C514BA79C600190544 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + FA3250E614BA8BCE00BF0781 /* application.icns */, + FAE451C614BA79C600190544 /* MacGap-Info.plist */, + FAE451C714BA79C600190544 /* InfoPlist.strings */, + FAE451CA14BA79C600190544 /* main.m */, + FAE451CC14BA79C600190544 /* MacGap-Prefix.pch */, + FAE451CD14BA79C600190544 /* Credits.rtf */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + FAE451B914BA79C600190544 /* MacGap */ = { + isa = PBXNativeTarget; + buildConfigurationList = FAE451D814BA79C600190544 /* Build configuration list for PBXNativeTarget "MacGap" */; + buildPhases = ( + FAE451B814BA79C600190544 /* Resources */, + FAE451B614BA79C600190544 /* Sources */, + FAE451B714BA79C600190544 /* Frameworks */, + FA3250DD14BA876F00BF0781 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MacGap; + productName = MacGap; + productReference = FAE451BA14BA79C600190544 /* ZeroTier One.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + FAE451B114BA79C600190544 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0450; + ORGANIZATIONNAME = Twitter; + }; + buildConfigurationList = FAE451B414BA79C600190544 /* Build configuration list for PBXProject "MacGap" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = FAE451AF14BA79C600190544; + productRefGroup = FAE451BB14BA79C600190544 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + FAE451B914BA79C600190544 /* MacGap */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + FAE451B814BA79C600190544 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FA3250E514BA883A00BF0781 /* public in Resources */, + FAE451C914BA79C600190544 /* InfoPlist.strings in Resources */, + FAE451CF14BA79C600190544 /* Credits.rtf in Resources */, + FAE451D514BA79C600190544 /* MainMenu.xib in Resources */, + FA3250E714BA8BCE00BF0781 /* application.icns in Resources */, + 88C0646614BDEC5800E4BCE2 /* Window.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FAE451B614BA79C600190544 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6F169DAA18CC35FD005EDDF3 /* CallbackDelegate.m in Sources */, + FA3250D314BA860800BF0781 /* App.m in Sources */, + FA3250D514BA860800BF0781 /* Dock.m in Sources */, + FA3250D914BA860800BF0781 /* Path.m in Sources */, + FA3250DB14BA860800BF0781 /* Sound.m in Sources */, + FA3250C314BA85E700BF0781 /* ContentView.m in Sources */, + FA3250C514BA85E700BF0781 /* Utils.m in Sources */, + FA3250C714BA85E700BF0781 /* WebViewDelegate.m in Sources */, + FAE451CB14BA79C600190544 /* main.m in Sources */, + 6F169DB118CD906F005EDDF3 /* MenuItemProxy.m in Sources */, + FAE451D214BA79C600190544 /* AppDelegate.m in Sources */, + 6F169DA718CC332E005EDDF3 /* Command.m in Sources */, + 6FD672B618FE618E00C0DAAD /* UserDefaults.m in Sources */, + 88C0646014BDE10A00E4BCE2 /* Window.m in Sources */, + 6F169DB218CD906F005EDDF3 /* MenuProxy.m in Sources */, + 88C0646D14BDF6A600E4BCE2 /* WindowController.m in Sources */, + 6FD6E4ED18C2D48C00DFFBE6 /* fonts.m in Sources */, + 88746BEE14CCA435001E160E /* JSEventHelper.m in Sources */, + 1495814F15C15CCC00E1CFE5 /* Notice.m in Sources */, + F2B80016179E0FC100B069A8 /* Clipboard.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 88C0646414BDEC5800E4BCE2 /* Window.xib */ = { + isa = PBXVariantGroup; + children = ( + 88C0646514BDEC5800E4BCE2 /* en */, + ); + name = Window.xib; + sourceTree = ""; + }; + FAE451C714BA79C600190544 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + FAE451C814BA79C600190544 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + FAE451CD14BA79C600190544 /* Credits.rtf */ = { + isa = PBXVariantGroup; + children = ( + FAE451CE14BA79C600190544 /* en */, + ); + name = Credits.rtf; + sourceTree = ""; + }; + FAE451D314BA79C600190544 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + FAE451D414BA79C600190544 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + FAE451D614BA79C600190544 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = ""; + }; + name = Debug; + }; + FAE451D714BA79C600190544 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_VERSION = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = ""; + }; + name = Release; + }; + FAE451D914BA79C600190544 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_CXX_LIBRARY = "compiler-default"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/MacGap\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MacGap/MacGap-Prefix.pch"; + GCC_VERSION = ""; + INFOPLIST_FILE = "MacGap/MacGap-Info.plist"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = macosx; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + FAE451DA14BA79C600190544 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_CXX_LIBRARY = "compiler-default"; + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"$(SRCROOT)/MacGap\"", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "MacGap/MacGap-Prefix.pch"; + GCC_VERSION = ""; + INFOPLIST_FILE = "MacGap/MacGap-Info.plist"; + MACOSX_DEPLOYMENT_TARGET = 10.7; + PRODUCT_NAME = "ZeroTier One"; + SDKROOT = macosx; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + FAE451B414BA79C600190544 /* Build configuration list for PBXProject "MacGap" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FAE451D614BA79C600190544 /* Debug */, + FAE451D714BA79C600190544 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + FAE451D814BA79C600190544 /* Build configuration list for PBXNativeTarget "MacGap" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + FAE451D914BA79C600190544 /* Debug */, + FAE451DA14BA79C600190544 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = FAE451B114BA79C600190544 /* Project object */; +} diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..88f36fc7b --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout new file mode 100644 index 000000000..b2ea215df --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 4D486E78-E297-4CC3-AAAE-1A58EDAC87E6 + IDESourceControlProjectName + MacGap + IDESourceControlProjectOriginsDictionary + + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + https://github.com/MacGapProject/MacGap1.git + + IDESourceControlProjectPath + MacGap.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + ../.. + + IDESourceControlProjectURL + https://github.com/MacGapProject/MacGap1.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + IDESourceControlWCCName + MacGap1 + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/Alex.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/Alex.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..20281812beaefed26ed5a7ceb16e431be71ad75f GIT binary patch literal 46675 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 z�t{*PwQ&dvrm-jK^z<2|DjBX} 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 D9oef! literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/WorkspaceSettings.xcsettings b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..659c8766e --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..822ed3cb6581b8e606bab5208852eff2f504b0a4 GIT binary patch literal 27811 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 literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..6ff33e603 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/liamks.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,10 @@ + + + + + IDEWorkspaceUserSettings_HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges + + IDEWorkspaceUserSettings_SnapshotAutomaticallyBeforeSignificantChanges + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 000000000..38f661269 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,131 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme new file mode 100644 index 000000000..0aaad5827 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..921f1a6fe --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + MacGap.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FAE451B914BA79C600190544 + + primary + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 000000000..fe2b45415 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,5 @@ + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme new file mode 100644 index 000000000..2555dc89c --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..921f1a6fe --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + MacGap.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FAE451B914BA79C600190544 + + primary + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist new file mode 100644 index 000000000..8e541eaba --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme new file mode 100644 index 000000000..872d6d7d5 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..921f1a6fe --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + MacGap.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + FAE451B914BA79C600190544 + + primary + + + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h new file mode 100644 index 000000000..bf7370b50 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.h @@ -0,0 +1,18 @@ +// +// AppDelegate.h +// MacGap +// +// Created by Alex MacCaw on 08/01/2012. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import "Classes/ContentView.h" + +#import "WindowController.h" + +@interface AppDelegate : NSObject + +@property (retain, nonatomic) WindowController *windowController; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m new file mode 100644 index 000000000..96a3e8201 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m @@ -0,0 +1,110 @@ +// +// AppDelegate.m +// MacGap +// +// Created by Alex MacCaw on 08/01/2012. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "AppDelegate.h" + +@implementation AppDelegate + +@synthesize windowController; + +- (void) applicationWillFinishLaunching:(NSNotification *)aNotification +{ +} + +-(BOOL)applicationShouldHandleReopen:(NSApplication*)application + hasVisibleWindows:(BOOL)visibleWindows{ + if(!visibleWindows){ + [self.windowController.window makeKeyAndOrderFront: nil]; + } + return YES; +} + +- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication { + return YES; +} + +- (void) applicationDidFinishLaunching:(NSNotification *)aNotification { + // Create authorization reference + OSStatus status; + AuthorizationRef authorizationRef; + + // AuthorizationCreate and pass NULL as the initial + // AuthorizationRights set so that the AuthorizationRef gets created + // successfully, and then later call AuthorizationCopyRights to + // determine or extend the allowable rights. + // http://developer.apple.com/qa/qa2001/qa1172.html + status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef); + if (status != errAuthorizationSuccess) + { + NSLog(@"Error Creating Initial Authorization: %d", status); + return; + } + + // kAuthorizationRightExecute == "system.privilege.admin" + AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; + AuthorizationRights rights = {1, &right}; + AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | + kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; + + // Call AuthorizationCopyRights to determine or extend the allowable rights. + status = AuthorizationCopyRights(authorizationRef, &rights, NULL, flags, NULL); + if (status != errAuthorizationSuccess) + { + NSLog(@"Copy Rights Unsuccessful: %d", status); + return; + } + + // use rm tool with -rf + char *tool = "/bin/cat"; + char *args[] = {"/Library/Application Support/ZeroTier/One/authtoken.secret", NULL}; + FILE *pipe = NULL; + + status = AuthorizationExecuteWithPrivileges(authorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe); + if (status != errAuthorizationSuccess) + { + NSLog(@"Error: %d", status); + } + + char url[16384]; + memset(url,0,sizeof(url)); + if (pipe) { + char buf[16384]; + + FILE *pf = fopen("/Library/Application Support/ZeroTier/One/zerotier-one.port","r"); + long n = fread(buf,1,sizeof(buf)-1,pf); + long port = 9993; // default + if (n > 0) { + buf[n] = (char)0; + port = strtol(buf,(char **)0,10); + } + fclose(pf); + + n = (long)fread(buf,1,sizeof(buf)-1,pipe); + if (n > 0) { + buf[n] = (char)0; + snprintf(url,sizeof(url),"http://127.0.0.1:%ld/index.html?authToken=%s",port,buf); + } + fclose(pipe); + } + + // The only way to guarantee that a credential acquired when you + // request a right is not shared with other authorization instances is + // to destroy the credential. To do so, call the AuthorizationFree + // function with the flag kAuthorizationFlagDestroyRights. + // http://developer.apple.com/documentation/Security/Conceptual/authorization_concepts/02authconcepts/chapter_2_section_7.html + status = AuthorizationFree(authorizationRef, kAuthorizationFlagDestroyRights); + + NSString *urlStr = [[NSString alloc] initWithCString:url]; + self.windowController = [[WindowController alloc] initWithURL: urlStr]; + [self.windowController showWindow: [NSApplication sharedApplication].delegate]; + self.windowController.contentView.webView.alphaValue = 1.0; + self.windowController.contentView.alphaValue = 1.0; + [self.windowController showWindow:self]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h new file mode 100755 index 000000000..0f31ee417 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.h @@ -0,0 +1,20 @@ +// +// CallbackDelegate.h +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" + +@interface CallbackDelegate : Command { +} + +@property JSObjectRef callback; + +- (id) initWithContext:(JSContextRef)aContext forCallback:(WebScriptObject*)aCallback; +- (id) call; +- (id) callWithParams:(id)firstOrNil, ... NS_REQUIRES_NIL_TERMINATION; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m new file mode 100755 index 000000000..5ce8fbe33 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/CallbackDelegate.m @@ -0,0 +1,168 @@ +// +// CallbackDelegate.m +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "CallbackDelegate.h" +#import + +@implementation CallbackDelegate + +@synthesize callback; + +- (id) initWithContext:(JSContextRef)aContext forCallback:(WebScriptObject*)aCallback +{ + if (!aCallback) + return nil; + if ([aCallback isKindOfClass:[WebUndefined class]]) + return nil; + + self = [super initWithContext:aContext]; + if (!self) + return nil; + + callback = [aCallback JSObject]; + JSValueProtect(context, callback); + return self; +} + +- (void) dealloc +{ + if (callback) + { + JSValueUnprotect(context, callback); + callback = nil; + } +} + +- (id) objectFromValue:(JSValueRef)val +{ + JSStringRef jstr; + NSString *rets; + + switch(JSValueGetType(context, val)) + { + case kJSTypeUndefined: + case kJSTypeNull: + return nil; + case kJSTypeBoolean: + return [NSNumber numberWithBool:JSValueToBoolean(context, val)]; + case kJSTypeNumber: + return [NSNumber numberWithDouble:JSValueToNumber(context, val, NULL)]; + case kJSTypeString: + jstr = JSValueToStringCopy(context, val, NULL); + size_t sz = JSStringGetMaximumUTF8CStringSize(jstr); + char *buf = (char*)malloc(sz); + JSStringGetUTF8CString(jstr, buf, sz); + rets = [NSString stringWithUTF8String:buf]; + free(buf); + return rets; + case kJSTypeObject: + // TODO: dictionary or something + return nil; + default: + NSAssert(false, @"Invalid JavaScript type"); + return nil; + } +} + +- (JSValueRef) valueFromObject:(id)obj +{ + JSValueRef val = nil; + if (!obj) + { + val = JSValueMakeNull(context); + } + else if ([obj isKindOfClass:[NSString class]]) + { + JSStringRef jstr = JSStringCreateWithUTF8CString([obj UTF8String]); + val = JSValueMakeString(context, jstr); + JSStringRelease(jstr); + } + else if ([obj isKindOfClass:[NSNumber class]]) + { + val = JSValueMakeNumber(context, [obj doubleValue]); + } + else if ([obj isKindOfClass:[NSDictionary class]]) + { + JSObjectRef o = JSObjectMake(context, NULL, NULL); + for (NSString *key in obj) + { + JSStringRef kstr = JSStringCreateWithUTF8CString([key UTF8String]); + JSValueRef v = [self valueFromObject:[obj objectForKey:key]]; + + JSObjectSetProperty(context, o, kstr, v, kJSPropertyAttributeNone, NULL); + JSStringRelease(kstr); + } + val = o; + } + else if ([obj isKindOfClass:[NSArray class]]) + { + NSUInteger pcount = [obj count]; + JSValueRef jsArgs[pcount]; + NSUInteger i=0; + for (id v in obj) + { + jsArgs[i++] = [self valueFromObject:v]; + } + val = JSObjectMakeArray(context, pcount, jsArgs, NULL); + } + else if ([obj isKindOfClass:[NSDate class]]) + { + NSTimeInterval secs = [obj timeIntervalSince1970]; + JSValueRef jsArgs[1]; + // call the Date(milliseconds) constructor in JS + jsArgs[0] = JSValueMakeNumber(context, secs * 1000.0); + val = JSObjectMakeDate(context, 1, jsArgs, NULL); + } + else + { + NSLog(@"Warning: unknown object type for: %@", obj); + val = JSValueMakeUndefined(context); + } + return val; +} + +- (id) call +{ + NSAssert(callback, @"Callback required"); + if (!JSObjectIsFunction(context, callback)) + return nil; + + JSValueRef jsArgs[0]; + JSValueRef ret = JSObjectCallAsFunction(context, callback, NULL, 0, jsArgs, NULL); + return [self objectFromValue:ret]; +} + +- (id) callWithParams:(id)firstOrNil, ... +{ + NSAssert(callback, @"Callback required"); + if (!JSObjectIsFunction(context, callback)) + return nil; + NSUInteger pcount = 0; + id p; + va_list args; + va_start(args, firstOrNil); + for (p=firstOrNil; p; p=va_arg(args, id)) + { + pcount++; + } + va_end(args); + + JSValueRef jsArgs[pcount]; + NSUInteger j = 0; + va_start(args, firstOrNil); + for (p=firstOrNil; p; p=va_arg(args, id)) + { + jsArgs[j++] = [self valueFromObject:p]; + } + va_end(args); + + JSValueRef ret = JSObjectCallAsFunction(context, callback, NULL, j, jsArgs, NULL); + return [self objectFromValue:ret]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h new file mode 100644 index 000000000..f65ba61e1 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.h @@ -0,0 +1,21 @@ +#import + +#import "WindowController.h" + +@interface App : NSObject { + +} + +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; + +- (void) terminate; +- (void) activate; +- (void) hide; +- (void) unhide; +- (void) beep; +- (void) bounce; +- (void) setCustomUserAgent:(NSString *)userAgentString; +- (NSNumber*) systemIdleTime; +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m new file mode 100644 index 000000000..6d47a17e1 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/App.m @@ -0,0 +1,128 @@ +#import "App.h" + +#import "JSEventHelper.h" + +@implementation App + +@synthesize webView; + +- (id) initWithWebView:(WebView *) view{ + self = [super init]; + + if (self) { + self.webView = view; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveSleepNotification:) + name: NSWorkspaceWillSleepNotification object: NULL]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveWakeNotification:) + name: NSWorkspaceDidWakeNotification object: NULL]; + [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self + selector: @selector(receiveActivateNotification:) + name: NSWorkspaceDidActivateApplicationNotification object: NULL]; + } + + return self; +} + +- (void) terminate { + [NSApp terminate:nil]; +} + +- (void) activate { + [NSApp activateIgnoringOtherApps:YES]; +} + +- (void) hide { + [NSApp hide:nil]; +} + +- (void) unhide { + [NSApp unhide:nil]; +} + +- (void)beep { + NSBeep(); +} + +- (void) bounce { + [NSApp requestUserAttention:NSInformationalRequest]; +} + +- (void)setCustomUserAgent:(NSString *)userAgentString { + [self.webView setCustomUserAgent: userAgentString]; +} + +- (void) open:(NSString*)url { + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:url]]; +} + +- (void) launch:(NSString *)name { + [[NSWorkspace sharedWorkspace] launchApplication:name]; +} + +- (void)receiveSleepNotification:(NSNotification*)note{ + [JSEventHelper triggerEvent:@"sleep" forWebView:self.webView]; +} + +- (void) receiveWakeNotification:(NSNotification*)note{ + [JSEventHelper triggerEvent:@"wake" forWebView:self.webView]; +} + +- (void) receiveActivateNotification:(NSNotification*)notification{ + NSDictionary* userInfo = [notification userInfo]; + NSRunningApplication* runningApplication = [userInfo objectForKey:NSWorkspaceApplicationKey]; + if (runningApplication) { + NSMutableDictionary* applicationDidGetFocusDict = [[NSMutableDictionary alloc] initWithCapacity:2]; + [applicationDidGetFocusDict setObject:runningApplication.localizedName + forKey:@"localizedName"]; + [applicationDidGetFocusDict setObject:[runningApplication.bundleURL absoluteString] + forKey:@"bundleURL"]; + + [JSEventHelper triggerEvent:@"appActivated" withArgs:applicationDidGetFocusDict forWebView:self.webView]; + } +} + + + + +/* + To get the elapsed time since the previous input event—keyboard, mouse, or tablet—specify kCGAnyInputEventType. + */ +- (NSNumber*)systemIdleTime { + CFTimeInterval timeSinceLastEvent = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType); + + return [NSNumber numberWithDouble:timeSinceLastEvent]; +} + + + + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(open:)) { + result = @"open"; + } else if (selector == @selector(launch:)) { + result = @"launch"; + } else if (selector == @selector(setCustomUserAgent:)) { + result = @"setCustomUserAgent"; + } else if (selector == @selector(systemIdleTime)) { + result = @"systemIdleTime"; + } + + return result; +} + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h new file mode 100755 index 000000000..65d6b6d48 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.h @@ -0,0 +1,18 @@ +// +// Command.h +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import + +@interface Command : NSObject { + JSContextRef context; +} + +- (id) initWithContext:(JSContextRef)aContext; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m new file mode 100755 index 000000000..39b85630a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Command.m @@ -0,0 +1,28 @@ +// +// Command.m +// MacGap +// +// Created by Joe Hildebrand on 1/10/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" +#import + +@implementation Command + +- (id) initWithContext:(JSContextRef)aContext { + self = [super init]; + if (!self) + return nil; + context = aContext; + JSGlobalContextRetain((JSGlobalContextRef)context); + return self; +} + +- (void)dealloc +{ + if (context) + JSGlobalContextRelease((JSGlobalContextRef)context); +} +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h new file mode 100644 index 000000000..b3c533d79 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.h @@ -0,0 +1,11 @@ +#import + +@interface Dock : NSObject { + +} +- (void) setBadge:(NSString*)value; +- (NSString *) badge; + +@property (readwrite, copy) NSString *badge; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m new file mode 100644 index 000000000..a4494d165 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Dock.m @@ -0,0 +1,31 @@ +#import "Dock.h" + +@implementation Dock + +@synthesize badge; + +- (void) setBadge:(NSString *)value +{ + NSDockTile *tile = [[NSApplication sharedApplication] dockTile]; + [tile setBadgeLabel:value]; +} + +- (NSString *) badge +{ + NSDockTile *tile = [[NSApplication sharedApplication] dockTile]; + return [tile badgeLabel]; +} + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h new file mode 100755 index 000000000..d765978fa --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.h @@ -0,0 +1,31 @@ +// +// MenuItemProxy.h +// MacGap +// +// Created by Joe Hildebrand on 1/15/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" +#import "CallbackDelegate.h" + +@class MenuProxy; + +@interface MenuItemProxy : Command { + NSMenuItem *item; + CallbackDelegate *callback; +} + ++ (MenuItemProxy*) proxyWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem; + +- (MenuProxy*)addSubmenu; + +- (void) remove; +- (void) setCallback:(WebScriptObject*)aCallback; +- (void) setKey:(NSString*)keyCommand; +- (void) setTitle:(NSString*)title; +- (void) enable; +- (void) disable; +- (MenuProxy*)submenu; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m new file mode 100755 index 000000000..7b9702cc4 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuItemProxy.m @@ -0,0 +1,150 @@ +// +// MenuItemProxy.m +// MacGap +// +// Created by Joe Hildebrand on 1/15/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "MenuItemProxy.h" +#import "MenuProxy.h" + +@implementation MenuItemProxy + +- (id) initWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem +{ + NSAssert(anItem, @"anItem required"); + self = [super initWithContext:aContext]; + if (!self) + return nil; + item = anItem; + item.representedObject = self; + + return self; +} + ++ (MenuItemProxy*) proxyWithContext:(JSContextRef)aContext andMenuItem:(NSMenuItem*)anItem +{ + MenuItemProxy *proxy = [anItem representedObject]; + if (proxy) + { + NSLog(@"MIP Cache hit"); + NSAssert([proxy class] == [MenuItemProxy class], @"Bad proxy"); + return proxy; + } + return [[MenuItemProxy alloc] initWithContext:aContext andMenuItem:anItem]; +} + +- (NSString*) description +{ + return [item description]; +} + +- (MenuProxy*)addSubmenu +{ + NSMenu *s = [item submenu]; + if (!s) + { + s = [[NSMenu alloc] initWithTitle:@"FFFFFFOOOOO"]; + [item setSubmenu:s]; + } + return [MenuProxy proxyWithContext:context andMenu:s]; +} + +- (void) remove +{ + NSMenu *menu = [item menu]; + [menu removeItem:item]; +} + +- (void)callCallback:(id)sender +{ + [callback callWithParams:[sender title], nil]; +} + +- (void) setCallback:(WebScriptObject*)aCallback +{ + NSAssert(item, @"item required"); + callback = [[CallbackDelegate alloc] initWithContext:context forCallback:aCallback]; + [item setAction:@selector(callCallback:)]; + [item setTarget:self]; +} + +- (void)setKey:(NSString*)keyCommand +{ + NSString *aKey = [MenuProxy getKeyFromString:keyCommand]; + [item setKeyEquivalent:aKey]; + + NSUInteger modifiers = [MenuProxy getModifiersFromString:keyCommand]; + [item setKeyEquivalentModifierMask:modifiers]; +} + +- (void) setTitle:(NSString*)title +{ + [item setTitle:title]; +} + +- (MenuProxy*)submenu; +{ + // TODO: make this work as a property + NSMenu *s = [item submenu]; + if (!s) + return nil; + return [MenuProxy proxyWithContext:context andMenu:s]; +} + +- (void) enable +{ + [item setEnabled:YES]; +} + +- (void) disable +{ + [item setEnabled:NO]; +} + +#pragma mark WebScripting protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return [self webScriptNameForSelector:selector] == nil; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(addSubmenu)) { + result = @"addSubmenu"; + } + else if (selector == @selector(remove)) { + result = @"remove"; + } + else if (selector == @selector(setCallback:)) { + result = @"setCallback"; + } + else if (selector == @selector(setKey:)) { + result = @"setKey"; + } + else if (selector == @selector(setTitle:)) { + result = @"setTitle"; + } + else if (selector == @selector(submenu)) { + result = @"submenu"; + } + else if (selector == @selector(enable)) { + result = @"enable"; + } + else if (selector == @selector(disable)) { + result = @"disable"; + } + + return result; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h new file mode 100755 index 000000000..afd6c6edb --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.h @@ -0,0 +1,31 @@ +// +// MenuProxy.h +// MacGap +// +// Created by Joe Hildebrand on 1/14/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Command.h" + +@class MenuItemProxy; + +@interface MenuProxy : Command { + NSMenu *menu; +} + ++ (MenuProxy*)proxyWithContext:(JSContextRef)aContext andMenu:(NSMenu*)aMenu; + +- (MenuItemProxy*)addItemWithTitle:(NSString*)title + keyEquivalent:(NSString*)aKey + callback:(WebScriptObject*)aCallback + atIndex:(NSInteger)index; + +- (MenuItemProxy*)addSeparator; +- (MenuItemProxy*)itemForKey:(id)key; +- (MenuProxy*)removeItem:(id)key; + ++ (NSString*)getKeyFromString:(NSString*)keyCommand; ++ (NSUInteger*)getModifiersFromString:(NSString*)keyCommand; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m new file mode 100755 index 000000000..5bc10a763 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/MenuProxy.m @@ -0,0 +1,233 @@ +// +// MenuProxy.m +// MacGap +// +// Created by Joe Hildebrand on 1/14/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import + +#import "MenuProxy.h" +#import "MenuItemProxy.h" + +static char REPRESENTED_OBJECT; + +@interface NSMenu (represented) +@property (strong) id representedObject; +@end + +@implementation NSMenu (represented) + +- (id) representedObject +{ + return objc_getAssociatedObject(self, &REPRESENTED_OBJECT); +} + +- (void) setRepresentedObject:(id)representedObject +{ + objc_setAssociatedObject(self, + &REPRESENTED_OBJECT, + representedObject, + OBJC_ASSOCIATION_RETAIN); +} + +@end + +@implementation MenuProxy + +- (id) initWithContext:(JSContextRef)aContext andMenu:(NSMenu*)aMenu +{ + self = [super initWithContext:aContext]; + if (!self) + return nil; + menu = aMenu; + menu.representedObject = self; + return self; +} + ++ (MenuProxy*)proxyWithContext:(JSContextRef)aContext andMenu:(NSMenu*)aMenu +{ + // singleton-ish. + MenuProxy *ret = [aMenu representedObject]; + if (ret) + { + NSLog(@"MP cache hit"); + return ret; + } + return [[MenuProxy alloc] initWithContext:aContext andMenu:aMenu]; +} + +- (void) dealloc +{ + menu.representedObject = nil; +} + +- (NSString*) description +{ + return [menu description]; +} + +static BOOL isNullish(id o) +{ + if (!o) + return YES; + if ([o isKindOfClass:[WebUndefined class]]) + return YES; + return NO; +} + +- (MenuItemProxy*)addItemWithTitle:(NSString*)title + keyEquivalent:(NSString*)keyCommand + callback:(WebScriptObject*)aCallback + atIndex:(NSInteger)index +{ + if (isNullish(title)) + title = @""; + + NSString *aKey = [MenuProxy getKeyFromString:keyCommand]; + NSMenuItem *item = nil; + + if(index) { + item = [menu insertItemWithTitle:title action:nil keyEquivalent:aKey atIndex:index ]; + } else { + item = [menu addItemWithTitle:title action:nil keyEquivalent:aKey ]; + + } + + // Set the modifiers. + NSUInteger modifiers = [MenuProxy getModifiersFromString:keyCommand]; + [item setKeyEquivalentModifierMask:modifiers]; + + if(!menu.supermenu) { + NSMenu *s = [[NSMenu alloc] initWithTitle:title]; + [item setSubmenu:s]; + } + + MenuItemProxy *mip = [MenuItemProxy proxyWithContext:context andMenuItem:item]; + if (!isNullish(aCallback)) + [mip setCallback:aCallback]; + + + return mip; +} + ++ (NSString*)getKeyFromString:(NSString*)keyCommand { + if (isNullish(keyCommand)) + keyCommand = @""; + + // Obtain the key (if there are modifiers, it will be the last character). + NSString *aKey = @""; + if ([keyCommand length] > 0) { + aKey = [keyCommand substringFromIndex:[keyCommand length] - 1]; + } + + return aKey; +} + ++ (NSUInteger*)getModifiersFromString:(NSString*)keyCommand { + // aKeys may optionally specify one or more modifiers. + NSUInteger modifiers = 0; + + if ([keyCommand rangeOfString:@"caps"].location != NSNotFound) modifiers += NSAlphaShiftKeyMask; + if ([keyCommand rangeOfString:@"shift"].location != NSNotFound) modifiers += NSShiftKeyMask; + if ([keyCommand rangeOfString:@"cmd"].location != NSNotFound) modifiers += NSCommandKeyMask; + if ([keyCommand rangeOfString:@"ctrl"].location != NSNotFound) modifiers += NSControlKeyMask; + if ([keyCommand rangeOfString:@"opt"].location != NSNotFound) modifiers += NSAlternateKeyMask; + if ([keyCommand rangeOfString:@"alt"].location != NSNotFound) modifiers += NSAlternateKeyMask; + + return modifiers; +} + +- (MenuItemProxy*)addSeparator +{ + NSMenuItem *sep = [NSMenuItem separatorItem]; + [menu addItem:sep]; + return [MenuItemProxy proxyWithContext:context andMenuItem:sep]; +} + +- (MenuItemProxy*)itemForKey:(id)key +{ + if (isNullish(key)) + return nil; + NSMenuItem *item = nil; + if ([key isKindOfClass:[NSNumber class]]) + { + item = [menu itemAtIndex:[key intValue]]; + } + else if ([key isKindOfClass:[NSString class]]) + { + item = [menu itemWithTitle:key]; + if (!item) + { + // Try again, with ... appended. e.g. "Save..." + item = [menu itemWithTitle: + [key stringByAppendingString:@"\u2026"]]; + } + } + if (!item) + return nil; + + return [MenuItemProxy proxyWithContext:context andMenuItem:item]; +} + +- (MenuProxy*)removeItem:(id)key +{ + if (isNullish(key)) + return nil; + + NSMenuItem *item = nil; + if ([key isKindOfClass:[NSNumber class]]) + { + item = [menu itemAtIndex:[key intValue]]; + } + else if ([key isKindOfClass:[NSString class]]) + { + item = [menu itemWithTitle:key]; + if (!item) + { + // Try again, with ... appended. e.g. "Save..." + item = [menu itemWithTitle: + [key stringByAppendingString:@"\u2026"]]; + } + } + if (!item) + return nil; + + [menu removeItem:item]; + return [MenuProxy proxyWithContext:context andMenu:menu]; +} + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return [self webScriptNameForSelector:selector] == nil; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(addItemWithTitle:keyEquivalent:callback:atIndex:)) { + result = @"addItem"; + } + else if (selector == @selector(addSeparator)) { + result = @"addSeparator"; + } + else if (selector == @selector(itemForKey:)) { + result = @"getItem"; + } + else if (selector == @selector(removeItem:)) { + result = @"removeMenu"; + } + + return result; +} + + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h new file mode 100644 index 000000000..51077a434 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.h @@ -0,0 +1,26 @@ +// +// Notice.h +// MacGap +// +// Created by Christian Sullivan on 7/26/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import "WindowController.h" + +#define APP_NOTICE_NOTIFICATION @"Notice" + +@interface Notice : NSObject { + +} + +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; +- (void) notify:(NSDictionary*)message; +- (void) close:(NSString*)notificationId; ++ (BOOL) available; + +@end + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m new file mode 100644 index 000000000..a4095f9f2 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Notice.m @@ -0,0 +1,108 @@ +// +// Notice.m +// MacGap +// +// Created by Christian Sullivan on 7/26/12. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "Notice.h" + +#import "JSEventHelper.h" + +@implementation Notice + +- (id) initWithWebView:(WebView*)view +{ + if(self = [super init]) { + self.webView = view; + [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self]; + } + return self; +} + +- (void) notify:(NSDictionary *)message { + NSUserNotification *notification = [[NSUserNotification alloc] init]; + [notification setTitle:[message valueForKey:@"title"]]; + [notification setInformativeText:[message valueForKey:@"content"]]; + [notification setDeliveryDate:[NSDate dateWithTimeInterval:0 sinceDate:[NSDate date]]]; + BOOL playSound = true; // optional parameter, false only when {sound: false} + @try { + NSNumber *s = [message valueForKey:@"sound"]; + if ([[s className] isEqual: @"__NSCFBoolean"]) { + playSound = [s boolValue]; + } + } + @catch (NSException *exception) { + } + if (playSound) { + [notification setSoundName:NSUserNotificationDefaultSoundName]; + } + NSString *id = @""; // optional, needed for close + @try { + id = [message valueForKey:@"id"]; + } + @catch (NSException *exception) { + } + [notification setUserInfo:[NSDictionary dictionaryWithObjectsAndKeys:id, @"id", nil]]; + NSUserNotificationCenter *center = [NSUserNotificationCenter defaultUserNotificationCenter]; + [center scheduleNotification:notification]; +} + +// close all notifications with id == notificationId or close all notifications if notificationId == "*" +- (void) close:(NSString*)notificationId { + NSUserNotificationCenter *center = [NSUserNotificationCenter defaultUserNotificationCenter]; + for(NSUserNotification * deliveredNote in center.deliveredNotifications) { + if ([notificationId isEqualToString:@"*"] || [deliveredNote.userInfo[@"id"] isEqualToString:notificationId]) { + [center removeDeliveredNotification: deliveredNote]; + } + } +} + ++ (BOOL) available { + if ([NSUserNotificationCenter respondsToSelector:@selector(defaultUserNotificationCenter)]) + return YES; + + return NO; +} + +- (void) userNotificationCenter:(NSUserNotificationCenter *)center didActivateNotification:(NSUserNotification *)notification +{ + NSString *notificationId = [notification.userInfo valueForKey:@"id"]; + [JSEventHelper triggerEvent:@"macgap.notify.activated" forDetail:notificationId forWebView:self.webView]; +} + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + BOOL result = YES; + if (selector == @selector(notify:)) + result = NO; + if (selector == @selector(close:)) + result = NO; + + return result; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(notify:)) { + result = @"notify"; + } + if (selector == @selector(close:)) { + result = @"close"; + } + + return result; +} + +// right now exclude all properties (eg keys) ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h new file mode 100644 index 000000000..f931340d0 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.h @@ -0,0 +1,21 @@ +#import + +@interface Path : NSObject { + +} + +- (NSString *) application; +- (NSString *) resource; +- (NSString *) documents; +- (NSString *) library; +- (NSString *) home; +- (NSString *) temp; + +@property (readonly,copy) NSString* application; +@property (readonly,copy) NSString* resource; +@property (readonly,copy) NSString* documents; +@property (readonly,copy) NSString* library; +@property (readonly,copy) NSString* home; +@property (readonly,copy) NSString* temp; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m new file mode 100644 index 000000000..8c54100f7 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Path.m @@ -0,0 +1,53 @@ +#import "Path.h" + +@implementation Path + +@synthesize application; +@synthesize resource; +@synthesize documents; +@synthesize library; +@synthesize home; +@synthesize temp; + +- (NSString *)application { + return [[NSBundle mainBundle] bundlePath]; +} + +- (NSString *)resource { + return [[NSBundle mainBundle] resourcePath]; +} + +- (NSString *)documents { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + return [paths objectAtIndex:0]; +} + +- (NSString *)library { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); + NSLog( @"%@", paths ); + return [paths objectAtIndex:0]; +} + +- (NSString *)home { + return NSHomeDirectory(); +} + +- (NSString *)temp { + return NSTemporaryDirectory(); +} + +#pragma mark WebScripting Protocol + +/* checks whether a selector is acceptable to be called from JavaScript */ ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + +// right now exclude all properties (eg keys) ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h new file mode 100644 index 000000000..067076439 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.h @@ -0,0 +1,17 @@ +#import +#import "Command.h" +#import "CallbackDelegate.h" + + +@interface Sound : Command { + +} + +// pending callbacks for sounds being played, to keep +// ARC from freeing them too early +@property (nonatomic, strong) NSMutableSet *pending; + +- (void) play:(NSString*)file onComplete:(WebScriptObject*)callback; +- (void) playSystem:(NSString*)name onComplete:(WebScriptObject*)callback; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m new file mode 100644 index 000000000..9f4a44dbc --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/Sound.m @@ -0,0 +1,97 @@ +#import "Sound.h" + + +@interface PlayDelegate : CallbackDelegate { +} + +@property (nonatomic, weak) Sound *sound; + +- (id) initWithContext:(JSContextRef)aContext + forCallback:(WebScriptObject*)aCallback + withSound:(Sound*)aSound; +@end + +@implementation PlayDelegate + +@synthesize sound; + +- (id) initWithContext:(JSContextRef)aContext + forCallback:(WebScriptObject*)aCallback + withSound:(Sound*)aSound +{ + self = [super initWithContext:aContext forCallback:aCallback]; + if (!self) + return nil; + sound = aSound; + return self; +} + +- (void)sound:(NSSound *)aSound didFinishPlaying:(BOOL)finishedPlaying { + [self callWithParams:[aSound name], nil]; + [sound.pending removeObject:self]; +} + +@end + +@implementation Sound + +@synthesize pending; + +- (id) initWithContext:(JSContextRef)aContext { + self = [super initWithContext:aContext]; + if (!self) { + return nil; + } + + pending = [NSMutableSet new]; + return self; +} + +- (void) playSound:(NSSound*)sound onComplete:(WebScriptObject*)callback { + if (callback != (id)[WebUndefined undefined]) { + PlayDelegate *d = [[PlayDelegate alloc] initWithContext:context + forCallback:callback + withSound:self]; + [pending addObject:d]; + [sound setDelegate:d]; + } + [sound play]; +} + +- (void) play:(NSString*)file onComplete:(WebScriptObject*)callback { + NSURL* fileUrl = [NSURL fileURLWithPath:[[Utils sharedInstance] pathForResource:file]]; + DebugNSLog(@"Sound file:%@", [fileUrl description]); + + NSSound* sound = [[NSSound alloc] initWithContentsOfURL:fileUrl byReference:YES]; + [self playSound:sound onComplete:callback]; +} + +- (void) playSystem:(NSString*)name onComplete:(WebScriptObject*)callback { + NSSound *systemSound = [NSSound soundNamed:name]; + [self playSound:systemSound onComplete:callback]; +} + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector { + return [self webScriptNameForSelector:selector] == nil; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name { + return YES; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector { + id result = nil; + + if (selector == @selector(play:onComplete:)) { + result = @"play"; + } + else if (selector == @selector(playSystem:onComplete:)) { + result = @"playSystem"; + } + + return result; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h new file mode 100644 index 000000000..269191b39 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.h @@ -0,0 +1,43 @@ +// +// UserDefaults.h +// MacGap +// +// Created by Jeff Hanbury on 16/04/2014. +// Copyright (c) 2014 Twitter. All rights reserved. +// + +#import + +#import "WindowController.h" + +@interface UserDefaults : NSObject + +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; +- (NSString*) getMyDefaults; +- (NSDictionary*) myDefaultsDictionary; +- (void) removeObjectForKey:(NSString*)key; +- (NSArray*) getUserDefaultsKeys; + +- (NSString*) addPrefix:(NSString*)key; + +- (void) setString:(NSString*)key withValue:(NSString*)value; +- (NSString*) getString:(NSString*)key; + +- (void) setInteger:(NSString*)key withValue:(NSString*)value; +- (NSNumber*) getInteger:(NSString*)key; + +- (void) setBool:(NSString*)key withValue:(NSString*)value; +- (NSNumber*) getBool:(NSString*)key; + +- (void) setFloat:(NSString*)key withValue:(NSString*)value; +- (NSNumber*) getFloat:(NSString*)key; + +// Could also be implemented: +//– setObject:forKey: +//– setDouble:forKey: +//– setURL:forKey: + +@end + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m new file mode 100644 index 000000000..485687108 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/UserDefaults.m @@ -0,0 +1,211 @@ +// +// UserDefaults.m +// MacGap +// +// Created by Jeff Hanbury on 16/04/2014. +// Copyright (c) 2014 Twitter. All rights reserved. +// + +#import "UserDefaults.h" +#import "JSEventHelper.h" + +@interface UserDefaults() { + +} + +-(void) setupNotificationCenter; + +@end + + +@implementation UserDefaults + +- (id) initWithWebView:(WebView *) view{ + self = [super init]; + + if (self) { + self.webView = view; + [self setupNotificationCenter]; + } + + return self; +} + + +-(void) setupNotificationCenter{ + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(defaultsChanged:) + name:NSUserDefaultsDidChangeNotification + object:nil]; +} + +- (void)defaultsChanged:(NSNotification *)notification { + NSDictionary* returnDict = [self myDefaultsDictionary]; + [JSEventHelper triggerEvent:@"userDefaultsChanged" withArgs:returnDict forWebView:self.webView]; +} + +- (NSString*) getMyDefaults { + NSDictionary* myDefaults = [self myDefaultsDictionary]; + + return [[Utils sharedInstance] convertDictionaryToJSON:myDefaults]; +} + +- (NSDictionary*) myDefaultsDictionary { + NSString* prefix = [kWebScriptNamespace stringByAppendingString:@"_"]; + NSMutableDictionary* returnDict = [[NSMutableDictionary alloc] init]; + + // Get the user defaults. + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // Build up a dictionary containing just the items beginning with our + // prefix. + for (NSString* key in [self getUserDefaultsKeys]) { + if ([key hasPrefix:prefix]) { + id val = [defaults valueForKey:key]; + [returnDict setObject:val forKey:key]; + } + } + + return returnDict; +} + +- (NSArray*) getUserDefaultsKeys { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [[prefs dictionaryRepresentation] allKeys]; +} + +- (void) removeObjectForKey:(NSString*)key { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + [[NSUserDefaults standardUserDefaults] removeObjectForKey:prefixedKey]; + [[NSUserDefaults standardUserDefaults] synchronize]; +} + +// Check we have a standard prefix for JS-modified keys, for security purposes. +// If not, add it. This stops JavaScript from ever being able to modify keys +// it did not create. +- (NSString*) addPrefix:(NSString*)key { + NSString* prefix; + prefix = [kWebScriptNamespace stringByAppendingString:@"_"]; + + if (![key hasPrefix:prefix]) { + key = [prefix stringByAppendingString:key]; + } + return key; +} + +// String + +- (void) setString:(NSString*)key withValue:(NSString*)value { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + [prefs setObject:value forKey:prefixedKey]; +} + +- (NSString*) getString:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [prefs stringForKey:key]; +} + +// All the following must convert their type to NSNumber for JavaScript. + +// Integer + +- (void) setInteger:(NSString*)key withValue:(NSString*)value { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + NSInteger myInt = [value intValue]; + [prefs setInteger:myInt forKey:prefixedKey]; +} + +- (NSNumber*) getInteger:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [NSNumber numberWithInteger:[prefs integerForKey:key]]; +} + +// Boolean + +- (void) setBool:(NSString*)key withValue:(NSString*)value { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + BOOL myBool = [value boolValue]; + [prefs setBool:myBool forKey:prefixedKey]; +} + +- (NSNumber*) getBool:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [NSNumber numberWithBool:[prefs boolForKey:key]]; +} + +// Float + +- (void) setFloat:(NSString*)key withValue:(NSString*)value { + NSString* prefixedKey; + prefixedKey = [self addPrefix:key]; + + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + float myFloat = [value floatValue]; + [prefs setFloat:myFloat forKey:prefixedKey]; +} + +- (NSNumber*) getFloat:(NSString *)key { + NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; + return [NSNumber numberWithFloat:[prefs floatForKey:key]]; +} + + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector { + return NO; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector { + id result = nil; + + if (selector == @selector(getMyDefaults)) { + result = @"getMyDefaults"; + } + + if (selector == @selector(removeObjectForKey:)) { + result = @"removeObjectForKey"; + } + + else if (selector == @selector(setString:withValue:)) { + result = @"setString"; + } else if (selector == @selector(getString:)) { + result = @"getString"; + } + + else if (selector == @selector(setInteger:withValue:)) { + result = @"setInteger"; + } else if (selector == @selector(getInteger:)) { + result = @"getInteger"; + } + + else if (selector == @selector(setBool:withValue:)) { + result = @"setBool"; + } else if (selector == @selector(getBool:)) { + result = @"getBool"; + } + + else if (selector == @selector(setFloat:withValue:)) { + result = @"setFloat"; + } else if (selector == @selector(getFloat:)) { + result = @"getFloat"; + } + + return result; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name { + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h new file mode 100644 index 000000000..62c7b7e83 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.h @@ -0,0 +1,9 @@ +@interface Fonts : NSObject { +} + +- (NSArray*) availableFonts; +- (NSArray*) availableFontFamilies; +- (NSArray*) availableMembersOfFontFamily:(NSString*)fontFamily; +- (CGFloat) defaultLineHeightForFont:(NSString *)theFontName ofSize:(CGFloat)theFontSize; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m new file mode 100644 index 000000000..b17818a53 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Commands/fonts.m @@ -0,0 +1,48 @@ +#import "fonts.h" + +@implementation Fonts + + +- (NSArray*) availableFonts { + return [[NSFontManager sharedFontManager] availableFonts]; +} + +- (NSArray*) availableFontFamilies { + return [[NSFontManager sharedFontManager] availableFontFamilies]; +} + +- (NSArray*) availableMembersOfFontFamily:(NSString *)fontFamily { + return [[NSFontManager sharedFontManager] availableMembersOfFontFamily:fontFamily]; +} + +- (CGFloat) defaultLineHeightForFont:(NSString*)theFontName ofSize:(CGFloat)theFontSize { + NSFont *theFont = [NSFont fontWithName:theFontName size:theFontSize]; + NSLayoutManager *lm = [[NSLayoutManager alloc] init]; + + return [lm defaultLineHeightForFont:theFont]; +} + + +#pragma mark WebScripting Protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector { + return NO; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector { + id result = nil; + + if (selector == @selector(availableMembersOfFontFamily:)) { + result = @"availableMembersOfFontFamily"; + } else if (selector == @selector(defaultLineHeightForFont:ofSize:)) { + result = @"defaultLineHeightForFont"; + } + + return result; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name { + return NO; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h new file mode 100644 index 000000000..1fe59d6cc --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Constants.h @@ -0,0 +1,7 @@ +// Application constants + +#define kStartPage @"http://127.0.0.1:9993/" + +#define kStartFolder @"." + +#define kWebScriptNamespace @"macgap" \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h new file mode 100644 index 000000000..65890a5ee --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.h @@ -0,0 +1,15 @@ +#import +#import + +@class WebViewDelegate; + +@interface ContentView : NSView { + IBOutlet WebView* webView; + WebViewDelegate* delegate; +} + +@property (retain) WebView* webView; +@property (retain) WebViewDelegate* delegate; +@property (strong) IBOutlet NSMenu *mainMenu; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m new file mode 100644 index 000000000..24e58cd1c --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/ContentView.m @@ -0,0 +1,68 @@ +#import "ContentView.h" +#import "WebViewDelegate.h" +#import "AppDelegate.h" +#import "JSEventHelper.h" + +@interface WebPreferences (WebPreferencesPrivate) + - (void)_setLocalStorageDatabasePath:(NSString *)path; + - (void) setLocalStorageEnabled: (BOOL) localStorageEnabled; + - (void) setDatabasesEnabled:(BOOL)databasesEnabled; + - (void) setDeveloperExtrasEnabled:(BOOL)developerExtrasEnabled; + - (void) setWebGLEnabled:(BOOL)webGLEnabled; + - (void) setOfflineWebApplicationCacheEnabled:(BOOL)offlineWebApplicationCacheEnabled; +@end + +@implementation ContentView + +@synthesize webView, delegate, mainMenu; + +- (void) awakeFromNib +{ + WebPreferences *webPrefs = [WebPreferences standardPreferences]; + + NSString *cappBundleName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"]; + NSString *applicationSupportFile = [@"~/Library/Application Support/" stringByExpandingTildeInPath]; + NSString *savePath = [NSString pathWithComponents:[NSArray arrayWithObjects:applicationSupportFile, cappBundleName, @"LocalStorage", nil]]; + [webPrefs _setLocalStorageDatabasePath:savePath]; + [webPrefs setLocalStorageEnabled:YES]; + [webPrefs setDatabasesEnabled:YES]; + [webPrefs setDeveloperExtrasEnabled:[[NSUserDefaults standardUserDefaults] boolForKey: @"developer"]]; + [webPrefs setOfflineWebApplicationCacheEnabled:YES]; + [webPrefs setWebGLEnabled:YES]; + + [self.webView setPreferences:webPrefs]; + + NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage + sharedHTTPCookieStorage]; + [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; + + [self.webView setApplicationNameForUserAgent: @"MacGap"]; + + self.delegate = [[WebViewDelegate alloc] initWithMenu:[NSApp mainMenu]]; + [self.webView setFrameLoadDelegate:self.delegate]; + [self.webView setUIDelegate:self.delegate]; + [self.webView setResourceLoadDelegate:self.delegate]; + [self.webView setDownloadDelegate:self.delegate]; + [self.webView setPolicyDelegate:self.delegate]; + [self.webView setDrawsBackground:NO]; + [self.webView setShouldCloseWithWindow:NO]; + + [self.webView setGroupName:@"MacGap"]; + +} + +- (void) windowResized:(NSNotification*)notification; +{ + NSWindow* window = (NSWindow*)notification.object; + NSSize size = [window frame].size; + + DebugNSLog(@"window width = %f, window height = %f", size.width, size.height); + + bool isFullScreen = (window.styleMask & NSFullScreenWindowMask) == NSFullScreenWindowMask; + int titleBarHeight = isFullScreen ? 0 : [[Utils sharedInstance] titleBarHeight:window]; + + [self.webView setFrame:NSMakeRect(0, 0, size.width, size.height - titleBarHeight)]; + [JSEventHelper triggerEvent:@"orientationchange" forWebView:self.webView]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h new file mode 100644 index 000000000..401f3e396 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.h @@ -0,0 +1,20 @@ +// +// Helper.h +// MacGap +// +// Created by Liam Kaufman Simpkins on 12-01-22. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import +#import "WindowController.h" + +@interface JSEventHelper : NSObject + ++ (void) triggerEvent:(NSString *)event forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forObject:(NSString *)objName forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forWebView:(WebView *)webView; ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forObject:(NSString *)objName forWebView:(WebView *)webView; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m new file mode 100644 index 000000000..65406b3c0 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/JSEventHelper.m @@ -0,0 +1,41 @@ +// +// Helper.m +// MacGap +// +// Created by Liam Kaufman Simpkins on 12-01-22. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import "JSEventHelper.h" + +@implementation JSEventHelper + ++ (void) triggerEvent:(NSString *)event forWebView:(WebView *)webView { + [self triggerEvent:event withArgs:[NSMutableDictionary dictionary] forObject:@"document" forWebView:webView]; +} + ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forWebView:(WebView *)webView { + [self triggerEvent:event withArgs:args forObject:@"document" forWebView:webView]; +} + ++ (void) triggerEvent:(NSString *)event withArgs:(NSDictionary *)args forObject:(NSString *)objName forWebView:(WebView *)webView { + + // Convert args Dictionary to JSON. + NSString* jsonString = [[Utils sharedInstance] convertDictionaryToJSON:args]; + + // Create the event JavaScript and run it. + NSString * str = [NSString stringWithFormat:@"var e = document.createEvent('Events'); e.initEvent('%@', true, false); e.data=%@; %@.dispatchEvent(e); ", event, jsonString, objName]; + [webView stringByEvaluatingJavaScriptFromString:str]; +} + ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forWebView:(WebView *)webView { + [self triggerEvent:event forDetail:detail forObject:@"document" forWebView:webView]; +} + ++ (void) triggerEvent:(NSString *)event forDetail:(NSString *)detail forObject:(NSString *)objName forWebView:(WebView *)webView { + NSString *detailEscaped = [detail stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; + NSString *str = [NSString stringWithFormat:@"var e = new CustomEvent('%@', { 'detail': decodeURIComponent(\"%@\") }); %@.dispatchEvent(e); ", event, detailEscaped, objName]; + [webView stringByEvaluatingJavaScriptFromString:str]; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h new file mode 100644 index 000000000..f573d881a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.h @@ -0,0 +1,20 @@ +#import +#import + +#define DEG_EPS 0.001 +#define fequal(a,b) (fabs((a) - (b)) < DEG_EPS) +#define fequalzero(a) (fabs(a) < DEG_EPS) + +@class LoadingView; + +@interface Utils : NSObject { +} + +- (float) titleBarHeight:(NSWindow*)aWindow; +- (NSString*) pathForResource:(NSString*)resourcepath; +- (NSString*) convertDictionaryToJSON:(NSDictionary*)dict; +- (NSArray*) convertJSarrayToNSArray:(WebScriptObject*)jsArray; + ++ (Utils*) sharedInstance; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m new file mode 100644 index 000000000..8d85c2949 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Utils.m @@ -0,0 +1,93 @@ +#import "Utils.h" +#import + +static Utils* sharedInstance = nil; + +@implementation Utils + +- (float) titleBarHeight:(NSWindow*)aWindow +{ + NSRect frame = [aWindow frame]; + NSRect contentRect = [NSWindow contentRectForFrameRect: frame + styleMask: NSTitledWindowMask]; + + return (frame.size.height - contentRect.size.height); +} + +- (NSString*) pathForResource:(NSString*)resourcepath +{ + NSBundle * mainBundle = [NSBundle mainBundle]; + NSMutableArray *directoryParts = [NSMutableArray arrayWithArray:[resourcepath componentsSeparatedByString:@"/"]]; + NSString *filename = [directoryParts lastObject]; + [directoryParts removeLastObject]; + + NSString *directoryStr = [NSString stringWithFormat:@"%@/%@", kStartFolder, [directoryParts componentsJoinedByString:@"/"]]; + return [mainBundle pathForResource:filename + ofType:@"" + inDirectory:directoryStr]; +} + +- (NSString*) convertDictionaryToJSON:(NSDictionary*)dict { + // Convert defaults Dictionary to JSON. + NSError *error; + NSData *jsonData = [NSJSONSerialization + dataWithJSONObject:dict + options:NSJSONWritingPrettyPrinted // Pass 0 if you don't care about the readability of the generated string + error:&error]; + + NSString *jsonString; + if (! jsonData) { + NSLog(@"Got an error converting to JSON: %@", error); + } + else { + jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + } + + return jsonString; +} + +// Convert JavaScript array (arrives as a WebScriptObject) into an NSArray of strings. +- (NSArray*) convertJSarrayToNSArray:(WebScriptObject*)jsArray { + NSInteger count = [[jsArray valueForKey:@"length"] integerValue]; + + NSMutableArray *args = [NSMutableArray array]; + for (int i = 0; i < count; i++) { + NSString *item = [jsArray webScriptValueAtIndex:i]; + if ([item isKindOfClass:[NSString class]]) { + [args addObject:item]; + } + } + + return args; +} + +#pragma mark - +#pragma mark Singleton methods + ++ (Utils*) sharedInstance +{ + @synchronized(self) + { + if (sharedInstance == nil){ + sharedInstance = [[Utils alloc] init]; + } + } + return sharedInstance; +} + ++ (id) allocWithZone:(NSZone *)zone { + @synchronized(self) { + if (sharedInstance == nil) { + sharedInstance = [super allocWithZone:zone]; + return sharedInstance; // assignment and return on first allocation + } + } + return nil; // on subsequent allocation attempts return nil +} + +- (id) copyWithZone:(NSZone *)zone +{ + return self; +} + +@end \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h new file mode 100644 index 000000000..49c6da6b9 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.h @@ -0,0 +1,49 @@ +#import +#import + +@class Sound; +@class Dock; +@class Growl; +@class Notice; +@class Path; +@class App; +@class Window; +@class Clipboard; +@class Fonts; +@class MenuProxy; +@class UserDefaults; + +@class WindowController; + +@interface WebViewDelegate : NSObject { + Sound* sound; + Dock* dock; + Growl* growl; + Notice* notice; + Path* path; + App* app; + Window* window; + Clipboard* clipboard; + Fonts* fonts; + NSMenu *mainMenu; + UserDefaults* userDefaults; +} + + + +@property (nonatomic, retain) Sound* sound; +@property (nonatomic, retain) Dock* dock; +@property (nonatomic, retain) Growl* growl; +@property (nonatomic, retain) Notice* notice; +@property (nonatomic, retain) Path* path; +@property (nonatomic, retain) App* app; +@property (nonatomic, retain) Window* window; +@property (nonatomic, retain) Clipboard* clipboard; +@property (nonatomic, retain) Fonts* fonts; +@property (nonatomic, retain) MenuProxy* menu; +@property (nonatomic, retain) UserDefaults* userDefaults; + +@property (nonatomic, retain) WindowController *requestedWindow; + +- (id) initWithMenu:(NSMenu*)menu; +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m new file mode 100644 index 000000000..505780183 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/WebViewDelegate.m @@ -0,0 +1,206 @@ +#import "WebViewDelegate.h" +#import "Sound.h" +#import "Dock.h" +#import "Notice.h" +#import "Path.h" +#import "App.h" +#import "Window.h" +#import "WindowController.h" +#import "Clipboard.h" +#import "Fonts.h" +#import "MenuProxy.h" +#import "UserDefaults.h" + +@implementation WebViewDelegate + +@synthesize sound; +@synthesize dock; +@synthesize growl; +@synthesize notice; +@synthesize path; +@synthesize app; +@synthesize window; +@synthesize requestedWindow; +@synthesize clipboard; +@synthesize fonts; +@synthesize menu; +@synthesize userDefaults; + +- (id) initWithMenu:(NSMenu*)aMenu +{ + self = [super init]; + if (!self) + return nil; + + mainMenu = aMenu; + return self; +} + +- (void) webView:(WebView*)webView didClearWindowObject:(WebScriptObject*)windowScriptObject forFrame:(WebFrame *)frame +{ + JSContextRef context = [frame globalContext]; + if (self.sound == nil) { self.sound = [[Sound alloc] initWithContext:context]; } + if (self.dock == nil) { self.dock = [Dock new]; } + if (self.path == nil) { self.path = [Path new]; } + if (self.clipboard == nil) { self.clipboard = [Clipboard new]; } + if (self.fonts == nil) { self.fonts = [Fonts new]; } + + if (self.notice == nil && [Notice available] == YES) { + self.notice = [[Notice alloc] initWithWebView:webView]; + } + + if (self.app == nil) { + self.app = [[App alloc] initWithWebView:webView]; + } + + if (self.window == nil) { + self.window = [[Window alloc] initWithWebView:webView]; + } + + if (self.menu == nil) { + self.menu = [MenuProxy proxyWithContext:context andMenu:mainMenu]; + } + + if (self.userDefaults == nil) { + self.userDefaults = [[UserDefaults alloc] initWithWebView:webView]; + } + + [windowScriptObject setValue:self forKey:kWebScriptNamespace]; +} + + +- (void)webView:(WebView *)sender runOpenPanelForFileButtonWithResultListener:(id < WebOpenPanelResultListener >)resultListener allowMultipleFiles:(BOOL)allowMultipleFiles{ + + NSOpenPanel * openDlg = [NSOpenPanel openPanel]; + + [openDlg setCanChooseFiles:YES]; + [openDlg setCanChooseDirectories:NO]; + + [openDlg beginWithCompletionHandler:^(NSInteger result){ + if (result == NSFileHandlingPanelOKButton) { + NSArray * files = [[openDlg URLs] valueForKey: @"relativePath"]; + [resultListener chooseFilenames: files]; + } else { + [resultListener cancel]; + } + }]; +} + +- (void) webView:(WebView*)webView addMessageToConsole:(NSDictionary*)message +{ + if (![message isKindOfClass:[NSDictionary class]]) { + return; + } + + NSLog(@"JavaScript console: %@:%@: %@", + [[message objectForKey:@"sourceURL"] lastPathComponent], // could be nil + [message objectForKey:@"lineNumber"], + [message objectForKey:@"message"]); +} + +- (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame +{ + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"OK"]; + [alert setMessageText:message]; + [alert setAlertStyle:NSWarningAlertStyle]; + [alert runModal]; +} + +- (BOOL)webView:(WebView *)sender runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame +{ + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"Yes"]; + [alert addButtonWithTitle:@"No"]; + [alert setMessageText:message]; + [alert setAlertStyle:NSWarningAlertStyle]; + + if ([alert runModal] == NSAlertFirstButtonReturn) + return YES; + else + return NO; +} + +/* + By default the size of a database is set to 0 [1]. When a database is being created + it calls this delegate method to get an increase in quota size - or call an error. + PS this method is defined in WebUIDelegatePrivate and may make it difficult, but + not impossible [2], to get an app accepted into the mac app store. + + Further reading: + [1] http://stackoverflow.com/questions/353808/implementing-a-webview-database-quota-delegate + [2] http://stackoverflow.com/questions/4527905/how-do-i-enable-local-storage-in-my-webkit-based-application/4608549#4608549 + */ +- (void)webView:(WebView *)sender frame:(WebFrame *)frame exceededDatabaseQuotaForSecurityOrigin:(id) origin database:(NSString *)databaseIdentifier +{ + static const unsigned long long defaultQuota = 5 * 1024 * 1024; + if ([origin respondsToSelector: @selector(setQuota:)]) { + [origin performSelector:@selector(setQuota:) withObject:[NSNumber numberWithLongLong: defaultQuota]]; + } else { + NSLog(@"could not increase quota for %lld", defaultQuota); + } +} + +- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element defaultMenuItems:(NSArray *)defaultMenuItems +{ + NSMutableArray *webViewMenuItems = [defaultMenuItems mutableCopy]; + + if (webViewMenuItems) + { + NSEnumerator *itemEnumerator = [defaultMenuItems objectEnumerator]; + NSMenuItem *menuItem = nil; + while ((menuItem = [itemEnumerator nextObject])) + { + NSInteger tag = [menuItem tag]; + + switch (tag) + { + case WebMenuItemTagOpenLinkInNewWindow: + case WebMenuItemTagDownloadLinkToDisk: + case WebMenuItemTagCopyLinkToClipboard: + case WebMenuItemTagOpenImageInNewWindow: + case WebMenuItemTagDownloadImageToDisk: + case WebMenuItemTagCopyImageToClipboard: + case WebMenuItemTagOpenFrameInNewWindow: + case WebMenuItemTagGoBack: + case WebMenuItemTagGoForward: + case WebMenuItemTagStop: + case WebMenuItemTagOpenWithDefaultApplication: + case WebMenuItemTagReload: + [webViewMenuItems removeObjectIdenticalTo: menuItem]; + } + } + } + + return webViewMenuItems; +} + +- (WebView *)webView:(WebView *)sender createWebViewWithRequest:(NSURLRequest *)request{ + requestedWindow = [[WindowController alloc] initWithRequest:request]; + return requestedWindow.contentView.webView; +} + +- (void)webViewShow:(WebView *)sender{ + [requestedWindow showWindow:sender]; +} + +- (void)webView:(WebView *)webView decidePolicyForNewWindowAction:(NSDictionary *)actionInformation request:(NSURLRequest *)request newFrameName:(NSString *)frameName decisionListener:(id < WebPolicyDecisionListener >)listener +{ + [[NSWorkspace sharedWorkspace] openURL:[request URL]]; + [listener ignore]; +} + +#pragma mark WebScripting protocol + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return YES; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return NO; +} + + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h new file mode 100644 index 000000000..f721376e0 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.h @@ -0,0 +1,23 @@ +#import + +#import "WindowController.h" + +@interface Window : NSObject{ + CGRect _oldRestoreFrame; +} + +@property (retain, nonatomic) WindowController *windowController; +@property (nonatomic, retain) WebView *webView; + +- (id) initWithWebView:(WebView *)view; +- (void) open:(NSDictionary *)properties; +- (void) move:(NSDictionary *)properties; +- (void) resize:(NSDictionary *) properties; +- (Boolean) isMaximized; +- (CGFloat) getX; +- (CGFloat) getY; +- (void) maximize; +- (void) restore; +- (void) toggleFullscreen; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m new file mode 100644 index 000000000..2444f62ea --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Classes/Window.m @@ -0,0 +1,94 @@ +#import "Window.h" + +@implementation Window + +@synthesize windowController, webView; + +- (id) initWithWebView:(WebView*)view +{ + if(self = [super init]) { + self.webView = view; + } + return self; +} + +- (void) open:(NSDictionary *)properties +{ + self.windowController = [[WindowController alloc] initWithURL:[properties valueForKey:@"url"]]; + [self.windowController showWindow: [NSApplication sharedApplication].delegate]; + [self.windowController.window makeKeyWindow]; +} + +- (void) minimize { + [[NSApp mainWindow] miniaturize:[NSApp mainWindow]]; +} + +- (void) toggleFullscreen { + [[NSApp mainWindow] toggleFullScreen:[NSApp mainWindow]]; +} + +- (void) maximize { + CGRect a = [NSApp mainWindow].frame; + _oldRestoreFrame = CGRectMake(a.origin.x, a.origin.y, a.size.width, a.size.height); + [[NSApp mainWindow] setFrame:[[NSScreen mainScreen] visibleFrame] display:YES]; +} + +- (Boolean) isMaximized { + NSRect a = [NSApp mainWindow].frame; + NSRect b = [[NSScreen mainScreen] visibleFrame]; + return a.origin.x == b.origin.x && a.origin.y == b.origin.y && a.size.width == b.size.width && a.size.height == b.size.height; +} + +- (CGFloat) getX { + NSRect frame = [self.webView window].frame; + return frame.origin.x; +} + +- (CGFloat) getY { + NSRect frame = [self.webView window].frame; + return frame.origin.y; +} + +- (void) move:(NSDictionary *)properties +{ + NSRect frame = [self.webView window].frame; + frame.origin.x = [[properties valueForKey:@"x"] doubleValue]; + frame.origin.y = [[properties valueForKey:@"y"] doubleValue]; + [[self.webView window] setFrame:frame display:YES]; + +} + +- (void) resize:(NSDictionary *) properties +{ + NSRect frame = [self.webView window].frame; + frame.size.width = [[properties valueForKey:@"width"] doubleValue]; + frame.size.height = [[properties valueForKey:@"height"] doubleValue]; + [[self.webView window] setFrame:frame display:YES]; +} + + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector{ + id result = nil; + + if (selector == @selector(open:)) { + result = @"open"; + }else if (selector == @selector(move:)){ + result = @"move"; + }else if (selector == @selector(resize:)){ + result = @"resize"; + } + + return result; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h new file mode 100644 index 000000000..6c1a2f513 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.h @@ -0,0 +1,10 @@ +#import + +@interface Clipboard : NSObject { + +} + +- (void) copy:(NSString*)text; +- (NSString *) paste; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m new file mode 100644 index 000000000..1c18dea38 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Clipboard.m @@ -0,0 +1,51 @@ +// +// clipboard.m +// MacGap +// +// Created by David Zorychta on 2013-07-22. +// Copyright (c) 2013 Twitter. All rights reserved. +// + +#import "Clipboard.h" + +@implementation Clipboard + +- (void) copy:(NSString*)text { + [[NSPasteboard generalPasteboard] clearContents]; + [[NSPasteboard generalPasteboard] setString:text forType:NSStringPboardType]; +} + +- (NSString *) paste { + NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; + NSArray *classArray = [NSArray arrayWithObject:[NSString class]]; + NSDictionary *options = [NSDictionary dictionary]; + BOOL ok = [pasteboard canReadObjectForClasses:classArray options:options]; + if (ok) { + NSArray *objectsToPaste = [pasteboard readObjectsForClasses:classArray options:options]; + return (NSString *) [objectsToPaste objectAtIndex:0]; + } + return @""; +} + ++ (NSString*) webScriptNameForSelector:(SEL)selector +{ + id result = nil; + + if (selector == @selector(copy:)) { + result = @"copy"; + } + + return result; +} + ++ (BOOL) isSelectorExcludedFromWebScript:(SEL)selector +{ + return NO; +} + ++ (BOOL) isKeyExcludedFromWebScript:(const char*)name +{ + return YES; +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist new file mode 100644 index 000000000..2031cefcc --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Info.plist @@ -0,0 +1,34 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ZeroTier One + CFBundleIconFile + application.icns + CFBundleIdentifier + com.zerotier.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ZeroTier One + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSApplicationCategoryType + public.app-category.utilities + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch new file mode 100644 index 000000000..ad05e8420 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/MacGap-Prefix.pch @@ -0,0 +1,15 @@ +// +// Prefix header for all source files of the 'MacGap' target in the 'MacGap' project +// + +#ifdef __OBJC__ + #ifdef _DEBUG + #define DebugNSLog(format, ...) NSLog(format, ## __VA_ARGS__) + #else + #define DebugNSLog(format, ...) + #endif + + #import + #import "Constants.h" + #import "Utils.h" +#endif diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h new file mode 100644 index 000000000..72927effa --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.h @@ -0,0 +1,13 @@ +#import +#import "ContentView.h" + +@interface WindowController : NSWindowController { + +} + +- (id) initWithURL:(NSString *) url; +- (id) initWithRequest: (NSURLRequest *)request; +@property (retain) NSURL * url; +@property (retain) IBOutlet ContentView *contentView; + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m new file mode 100644 index 000000000..2765a2e3c --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/WindowController.m @@ -0,0 +1,54 @@ +#import "WindowController.h" + + +@interface WindowController() { + +} + +-(void) notificationCenter; + +@end + +@implementation WindowController + +@synthesize contentView, url; + +- (id) initWithURL:(NSString *) relativeURL{ + self = [super initWithWindowNibName:@"Window"]; + self.url = [NSURL URLWithString:relativeURL relativeToURL:[[NSBundle mainBundle] resourceURL]]; + + [self.window setFrameAutosaveName:@"MacGapWindow"]; + [self notificationCenter]; + + return self; +} + +-(id) initWithRequest: (NSURLRequest *)request{ + self = [super initWithWindowNibName:@"Window"]; + [self notificationCenter]; + [[self.contentView.webView mainFrame] loadRequest:request]; + + return self; +} + +-(void) notificationCenter{ + [[NSNotificationCenter defaultCenter] addObserver:self.contentView + selector:@selector(windowResized:) + name:NSWindowDidResizeNotification + object:[self window]]; +} + +- (void)windowDidLoad +{ + [super windowDidLoad]; + + if (self.url != nil) { + [self.contentView.webView setMainFrameURL:[self.url absoluteString]]; + } + + + // Implement this method to handle any initialization after your + // window controller's window has been loaded from its nib file. +} + +@end diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf new file mode 100644 index 000000000..6f388f662 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Credits.rtf @@ -0,0 +1,13 @@ +{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570 +{\fonttbl\f0\fswiss\fcharset0 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\vieww9600\viewh8400\viewkind0 +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720 + +\f0\b\fs24 \cf0 (c)2011-2015 ZeroTier, Inc.\ +Licensed under the GNU GPLv3\ +\ +UI Wrapper MacGap (c) Twitter, Inc.\ +Licensed under the MIT License\ +http://macgap.com/\ +} \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib new file mode 100644 index 000000000..998c505a8 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/MainMenu.xib @@ -0,0 +1,3404 @@ + + + + 1080 + 14D136 + 7702 + 1347.57 + 758.70 + + com.apple.InterfaceBuilder.CocoaPlugin + 7702 + + + NSCustomObject + NSMenu + NSMenuItem + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AppDelegate + + + AMainMenu + + + + ZeroTier One + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + + ZeroTier One + + + + About ZeroTier One + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + + Services + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide MacGap + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit ZeroTier One + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save… + s + 1048576 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Page Setup... + P + 1179648 + 2147483647 + + + + + + + Print… + p + 1048576 + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Paste and Match Style + V + 1572864 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find and Replace… + f + 1572864 + 2147483647 + + + 12 + + + + 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: + + + Spelling and Grammar + + + + Show Spelling and Grammar + : + 1048576 + 2147483647 + + + + + + Check Document Now + ; + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + Correct Spelling Automatically + + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + + Substitutions + + + + Show Substitutions + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Dashes + + 2147483647 + + + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + Text Replacement + + 2147483647 + + + + + + + + + Transformations + + 2147483647 + + + submenuAction: + + + Transformations + + + + Make Upper Case + + 2147483647 + + + + + + Make Lower Case + + 2147483647 + + + + + + Capitalize + + 2147483647 + + + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + Format + + 2147483647 + + + submenuAction: + + + Format + + + + Font + + 2147483647 + + + submenuAction: + + + Font + + + + Show Fonts + t + 1048576 + 2147483647 + + + + + + Bold + b + 1048576 + 2147483647 + + + 2 + + + + Italic + i + 1048576 + 2147483647 + + + 1 + + + + Underline + u + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Bigger + + + 1048576 + 2147483647 + + + 3 + + + + Smaller + - + 1048576 + 2147483647 + + + 4 + + + + YES + YES + + + 2147483647 + + + + + + Kern + + 2147483647 + + + submenuAction: + + + Kern + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Tighten + + 2147483647 + + + + + + Loosen + + 2147483647 + + + + + + + + + Ligature + + 2147483647 + + + submenuAction: + + + Ligature + + + + Use Default + + 2147483647 + + + + + + Use None + + 2147483647 + + + + + + Use All + + 2147483647 + + + + + + + + + Baseline + + 2147483647 + + + submenuAction: + + + Baseline + + + + Use Default + + 2147483647 + + + + + + Superscript + + 2147483647 + + + + + + Subscript + + 2147483647 + + + + + + Raise + + 2147483647 + + + + + + Lower + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Colors + C + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Copy Style + c + 1572864 + 2147483647 + + + + + + Paste Style + v + 1572864 + 2147483647 + + + + + _NSFontMenu + + + + + Text + + 2147483647 + + + submenuAction: + + + Text + + + + Align Left + { + 1048576 + 2147483647 + + + + + + Center + | + 1048576 + 2147483647 + + + + + + Justify + + 2147483647 + + + + + + Align Right + } + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Writing Direction + + 2147483647 + + + submenuAction: + + + Writing Direction + + + + YES + Paragraph + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + YES + Selection + + 2147483647 + + + + + + CURlZmF1bHQ + + 2147483647 + + + + + + CUxlZnQgdG8gUmlnaHQ + + 2147483647 + + + + + + CVJpZ2h0IHRvIExlZnQ + + 2147483647 + + + + + + + + + YES + YES + + + 2147483647 + + + + + + Show Ruler + + 2147483647 + + + + + + Copy Ruler + c + 1310720 + 2147483647 + + + + + + Paste Ruler + v + 1310720 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 2147483647 + + + submenuAction: + + + Help + + + + ZeroTier One Help + ? + 1048576 + 2147483647 + + + + + _NSHelpMenu + + + + _NSMainMenu + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 547 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + print: + + + + 86 + + + + runPageLayout: + + + + 87 + + + + clearRecentDocuments: + + + + 127 + + + + 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 + + + + saveDocument: + + + + 362 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + unhideAllApplications: + + + + 370 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + raiseBaseline: + + + + 426 + + + + lowerBaseline: + + + + 427 + + + + copyFont: + + + + 428 + + + + subscript: + + + + 429 + + + + superscript: + + + + 430 + + + + tightenKerning: + + + + 431 + + + + underline: + + + + 432 + + + + orderFrontColorPanel: + + + + 433 + + + + useAllLigatures: + + + + 434 + + + + loosenKerning: + + + + 435 + + + + pasteFont: + + + + 436 + + + + unscript: + + + + 437 + + + + useStandardKerning: + + + + 438 + + + + useStandardLigatures: + + + + 439 + + + + turnOffLigatures: + + + + 440 + + + + turnOffKerning: + + + + 441 + + + + toggleAutomaticSpellingCorrection: + + + + 456 + + + + orderFrontSubstitutionsPanel: + + + + 458 + + + + toggleAutomaticDashSubstitution: + + + + 461 + + + + toggleAutomaticTextReplacement: + + + + 463 + + + + uppercaseWord: + + + + 464 + + + + capitalizeWord: + + + + 467 + + + + lowercaseWord: + + + + 468 + + + + pasteAsPlainText: + + + + 486 + + + + performFindPanelAction: + + + + 487 + + + + performFindPanelAction: + + + + 488 + + + + performFindPanelAction: + + + + 489 + + + + showHelp: + + + + 493 + + + + alignCenter: + + + + 518 + + + + pasteRuler: + + + + 519 + + + + toggleRuler: + + + + 520 + + + + alignRight: + + + + 521 + + + + copyRuler: + + + + 522 + + + + alignJustified: + + + + 523 + + + + alignLeft: + + + + 524 + + + + makeBaseWritingDirectionNatural: + + + + 525 + + + + makeBaseWritingDirectionLeftToRight: + + + + 526 + + + + makeBaseWritingDirectionRightToLeft: + + + + 527 + + + + makeTextWritingDirectionNatural: + + + + 528 + + + + makeTextWritingDirectionLeftToRight: + + + + 529 + + + + makeTextWritingDirectionRightToLeft: + + + + 530 + + + + performFindPanelAction: + + + + 535 + + + + delegate + + + + 545 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + + + + 19 + + + + + + + + 56 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + + + 75 + + + + + 78 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 77 + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 74 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 57 + + + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + + + 144 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 131 + + + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 375 + + + + + + + + 376 + + + + + + + + + 377 + + + + + + + + 388 + + + + + + + + + + + + + + + + + + + + + + + 389 + + + + + 390 + + + + + 391 + + + + + 392 + + + + + 393 + + + + + 394 + + + + + 395 + + + + + 396 + + + + + 397 + + + + + + + + 398 + + + + + + + + 399 + + + + + + + + 400 + + + + + 401 + + + + + 402 + + + + + 403 + + + + + 404 + + + + + 405 + + + + + + + + + + + + 406 + + + + + 407 + + + + + 408 + + + + + 409 + + + + + 410 + + + + + 411 + + + + + + + + + + 412 + + + + + 413 + + + + + 414 + + + + + 415 + + + + + + + + + + + 416 + + + + + 417 + + + + + 418 + + + + + 419 + + + + + 450 + + + + + + + + 451 + + + + + + + + + + 452 + + + + + 453 + + + + + 454 + + + + + 457 + + + + + 459 + + + + + 460 + + + + + 462 + + + + + 465 + + + + + 466 + + + + + 485 + + + + + 490 + + + + + + + + 491 + + + + + + + + 492 + + + + + 496 + + + + + + + + 497 + + + + + + + + + + + + + + + + + 498 + + + + + 499 + + + + + 500 + + + + + 501 + + + + + 502 + + + + + 503 + + + + + + + + 504 + + + + + 505 + + + + + 506 + + + + + 507 + + + + + 508 + + + + + + + + + + + + + + + + 509 + + + + + 510 + + + + + 511 + + + + + 512 + + + + + 513 + + + + + 514 + + + + + 515 + + + + + 516 + + + + + 517 + + + + + 534 + + + + + 546 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 547 + + + + + AppDelegate + NSObject + + IBProjectSource + ../MacGap/AppDelegate.h + + + + + + NSApplication + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSApplication.h + + + + NSBrowser + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSBrowser.h + + + + NSControl + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSControl.h + + + + NSDocument + NSObject + + id + id + id + id + id + id + + + + printDocument: + id + + + revertDocumentToSaved: + id + + + runPageLayout: + id + + + saveDocument: + id + + + saveDocumentAs: + id + + + saveDocumentTo: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocument.h + + + + NSDocumentController + NSObject + + id + id + id + id + + + + clearRecentDocuments: + id + + + newDocument: + id + + + openDocument: + id + + + saveAllDocuments: + id + + + + IBFrameworkSource + AppKit.framework/Headers/NSDocumentController.h + + + + NSFormatter + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFormatter.h + + + + NSMatrix + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSMatrix.h + + + + NSMenu + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenu.h + + + + NSMenuItem + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSMenuItem.h + + + + NSMovieView + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSMovieView.h + + + + NSPopover + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSPopover.h + + + + NSResponder + NSObject + + IBFrameworkSource + AppKit.framework/Headers/NSResponder.h + + + + NSTableView + NSControl + + IBFrameworkSource + AppKit.framework/Headers/NSTableView.h + + + + NSText + NSView + + IBFrameworkSource + AppKit.framework/Headers/NSText.h + + + + NSTextView + NSText + + IBFrameworkSource + AppKit.framework/Headers/NSTextView.h + + + + NSView + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSView.h + + + + NSViewController + NSResponder + + view + NSView + + + view + + view + NSView + + + + IBFrameworkSource + AppKit.framework/Headers/NSViewController.h + + + + NSWindow + NSResponder + + IBFrameworkSource + AppKit.framework/Headers/NSWindow.h + + + + WebView + NSView + + id + id + id + id + id + id + id + id + id + id + id + + + + goBack: + id + + + goForward: + id + + + makeTextLarger: + id + + + makeTextSmaller: + id + + + makeTextStandardSize: + id + + + reload: + id + + + reloadFromOrigin: + id + + + stopLoading: + id + + + takeStringURLFrom: + id + + + toggleContinuousSpellChecking: + id + + + toggleSmartInsertDelete: + id + + + + IBFrameworkSource + WebKit.framework/Headers/WebView.h + + + + + 0 + IBCocoaFramework + NO + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + {12, 12} + {10, 2} + + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib new file mode 100644 index 000000000..70d0c57b8 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/en.lproj/Window.xib @@ -0,0 +1,337 @@ + + + + 1070 + 11C74 + 1938 + 1138.23 + 567.00 + + YES + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + YES + 1938 + 822 + + + + YES + NSWindowTemplate + NSView + NSCustomObject + WebView + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + PluginDependencyRecalculationVersion + + + + YES + + WindowController + + + FirstResponder + + + NSApplication + + + 15 + 2 + {{196, 240}, {758, 410}} + 544735232 + Window + NSWindow + + + + + 256 + + YES + + + 274 + + YES + + YES + Apple HTML pasteboard type + Apple PDF pasteboard type + Apple PICT pasteboard type + Apple URL pasteboard type + Apple Web Archive pasteboard type + NSColor pasteboard type + NSFilenamesPboardType + NSStringPboardType + NeXT RTFD pasteboard type + NeXT Rich Text Format v1.0 pasteboard type + NeXT TIFF v4.0 pasteboard type + WebURLsWithTitlesPboardType + public.png + public.url + public.url-name + + + {758, 410} + + + + 2 + _NS:51 + + + + + + YES + + YES + WebKitDefaultFixedFontSize + WebKitDefaultFontSize + WebKitMinimumFontSize + + + YES + + + + + + + YES + YES + + + {758, 410} + + + + + {{0, 0}, {1920, 1178}} + {10000000000000, 10000000000000} + 128 + YES + + + + + YES + + + contentView + + + + 23 + + + + window + + + + 25 + + + + title: contentView.webView.mainFrameTitle + + + + + + title: contentView.webView.mainFrameTitle + title + contentView.webView.mainFrameTitle + 2 + + + 31 + + + + webView + + + + 19 + + + + + YES + + 0 + + YES + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 1 + + + YES + + + + + + 2 + + + YES + + + + + + 5 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 1.IBPluginDependency + 1.IBWindowTemplateEditedContentRect + 1.NSWindowTemplate.visibleAtLaunch + 2.CustomClassName + 2.IBPluginDependency + 5.IBPluginDependency + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{357, 418}, {480, 270}} + + ContentView + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.WebKitIBPlugin + + + + YES + + + + + + YES + + + + + 31 + + + + YES + + ContentView + NSView + + webView + WebView + + + webView + + webView + WebView + + + + IBProjectSource + ./Classes/ContentView.h + + + + WebView + + reloadFromOrigin: + id + + + reloadFromOrigin: + + reloadFromOrigin: + id + + + + IBProjectSource + ./Classes/WebView.h + + + + WindowController + NSWindowController + + contentView + ContentView + + + contentView + + contentView + ContentView + + + + IBProjectSource + ./Classes/WindowController.h + + + + + 0 + IBCocoaFramework + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/main.m b/ext/mac-ui-macgap1-wrapper/MacGap/main.m new file mode 100644 index 000000000..4ad50ad59 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/main.m @@ -0,0 +1,14 @@ +// +// main.m +// MacGap +// +// Created by Alex MacCaw on 08/01/2012. +// Copyright (c) 2012 Twitter. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **)argv); +} diff --git a/ext/mac-ui-macgap1-wrapper/README.md b/ext/mac-ui-macgap1-wrapper/README.md new file mode 100644 index 000000000..bc69b1326 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/README.md @@ -0,0 +1,36 @@ +#MacGap + +The MacGap project provides HTML/JS/CSS developers an Xcode project for developing Native OSX Apps that run in OSX's WebView and take advantage of WebKit technologies. + +The project exposes a JavaScript API for OS X integration, such as displaying native OS X 10.9 notifications. The MacGap project is extremely lightweight and nimble; a blank application is about 980KB. + +### Features: +* tiny compiled app sizes +* Mac App Store compatible +* access to many Mac OS X-specific features + +##Pre-requisites + +MacGap works on OSX 10.6 and later. + +Generate apps with the [macgap generator](http://github.com/maccman/macgap-rb), no compile necessary. + + gem install macgap + + macgap new myapp + macgap build myapp + +##API + +MacGap exposes an object called `macgap` inside JavaScript. You can use it to alter the Dock icon and display Growl notifications, amongst other things. The API is documented in the WIKI on GitHub: https://github.com/maccman/macgap/wiki + + +##Attributes + +MacGap was forked/ported from Phonegap-mac. It's under the same license (MIT). + +##Custom Build + +To build, make sure you have installed the latest Mac OSX Core Library. Download at [http://developer.apple.com/](http://developer.apple.com/). + +Just clone the repository and build in Xcode. The file `public/index.html` is loaded on startup. diff --git a/ext/mac-ui-macgap1-wrapper/application.icns b/ext/mac-ui-macgap1-wrapper/application.icns new file mode 100644 index 0000000000000000000000000000000000000000..e4bcb2819c56c81aad36c3bf615e777727a0a158 GIT binary patch literal 88566 zcmeEv2S60d((dfSE;$FuQIaGHDp|6MB1kr&2nG}t1O-uYP67fFBxeJnVniiMj*8@* zb5zOfyq?AEx%ZyqJ@5VZzt2`+cYCJ3>gww1s_NbzOY?KK5NiLtrLB}C1fd_e!zdii zA11=V@XEsC;;JW1h=Z3uuDK$gd%&b?3ybg_(~!F@FwPxzc@IZuaY6(TVLiM8!>e$g z6$h{A@D~kxd3UqKyP*E{NbafriZLE`|$1ZhS5uF@b4!6H}s;d%-J&# zgd&FU1-1U?>u*9LESBKQTQnhZ0qWCLD2NbJcQsMt2FipKLTIbbgAZ-3wR}L8!Dpnb z7o+mVn+lq@18o8-$E@lWmp9j4-nI*QkAgO7Iw!xJ>U`a90ukZg?{G@Yo$fAaKaRXd zL!7Etlb=rYlyzNLuO}C|6#HbhucYY;az8}4f%$mUi<#bru>hnV!qD+*S|m;O)ZO1t zPl)gXF~}Wuy6$mQn(0&Pu+%IZEOca;pIQm7wX{M8F41xo?1@W&AzU!{afOMNmzNe6 z7MIuJVASezAnb~xTmnPx{x+R+p*e5H*I?W=m|G0z*8`KaNaN-Zf)fQ z?7<|jMTf`?5f%SZAWXjo3xSsqR#{Pqot7A)9|FS}*aK!@9N_DE7a2+T1fb)~UE@oG z{c)r{VCdpJVI~|r!w8z__@YJL4elC1uH9A$*uZ(g8|Etc!wQ9-wRi8ZgJ;Lq;194` z4lo)xH<%R%2Kxyju`*ce6+EDI9-bLlfj`2#Q^BuwNS|Ko%9UMD;UT?K@cYqacn&rQ zh2MXwyw-cZ71n+P51E+3A4V5JrJ4Je%Fx-14e*}(@X!%s_~YmTs620vRN_&W;Uk(F zx$wR$c>I(u{Bh(XsCKdVQoRJHs_@){HPUBV&g_5}C+9)6zX|w-G?$k{F%Y1-CQ)5w5#B->U zNmAyf$LT#%Y^2DH_;VqIGWyt%PTTu)CAt(fc^ z?WwA+uB_$)lk67;P=s4mWdo9uLrSOmMtiFOz#EaT45A=vmYs%*fhj4W#Z!GFebrU9 zWlgep*9*@g3ZiA(X{_J}>I*@Ae@#_gX^Scn%dEEm1<|mAdf$|k>v^Dlpth>6q+J`h zR$uE`G>zqbQj@R0oJQ&^>qsS7edT}i|_q3#IIWzskLvI0oYtYyB z0p|uo$;)&)JjnOi%+T0qW6hh2)<__qPX&b`XJFaLYkemz_4WI)iGikuhKk0_uk{2Z zG|ar>TXs47Io=-Y?CtF78SI)0qGkkM559o==~#I;EA2dNaeaDxdUB+*>VBZgCU(j% zdWgo5vx=(jKjRvZ+gSNB_HaDdq>=`|iSj_-1|Vf#3h|ia)Bb zv_m2Qg$Se${!=9s_QHJtPMHtvft!S(W%mU%2o=1*y8#%rw&VrE{}p`ru<8xF<2qo9 zwY8OM=R-$NL}u6ZuL9Q)jayxET|g}Z-w*hAt-!JTcnpcV$)N2afEgUjxHKSh;=1KVF=tI zECGqcp{Fp2iU^jMR{#WN4en=#(B8l;_J&Y|7*}G%ND)A8@KPCQ&eEzYOom%oSzK8B zxZKAIp@Z-j5))!cAP*3Z;EG{d+$y}3Us2Z&QWJ<5JPfW12Uh_wA}9+u-MAu{c4gH| zh=`DoMPjq*LAS(v1q=}CCUD!)fJMpG)nb@<707`QjUfcBL!+>$BnV50DMxO81ydp| zcY-L8?ne_65`m@=5qKd{t2ZhL0vGBO<^M5}^DcQV=MBq3wbMVo&gL1i~2v*M|VXp#2~;8eB{a z?ja;_g-8HAF}N0xehPGB(RGDr6_7_R4}xd`X^6uqGdPbwv6jxfzYmiX%EO1C5+e%0!XH5a%6O3VsdhHq-UV_UFH4cAX|%l z+r+qNz+`|1RMgg~Fo0~)y~>8#_T`0@K@P++BT@o=NrZyvY6sr5G`Tfmnp&DBkl>PX zdAz;iD2fo=u7TYC2^*)Y)Q*^Ox% zgO`^V-4>{qmRE5goC*S+0jVQo9sm^qLbHc}Bnb$CE`baK2@4%L)*YflfgTPYZR%`m zZ|~>;KdqxkG)<0MU40LqhDacuG30)79EgnTslj~+1FnQ93<&PHP?*EFU*z0PjeU@s zs7gRV0o|Hy@9*sFXlv_i?`#`}*E~VM2cTErHZqWn=!e%HAj4z z;a{fiX?{ULe%{OcQTP&unThx=q9P!ogGXDtS_fgAFVcWT*c>8*iV=Zi!@>v~P6!bQ z12QfcLST`JAe-8kB?W~=#YLr)uq&2@8HA+>Ay*vXT6af#zdu4|0p#k)pXG12{4`zGs4Z~`WLSYiwX-03P)jYEDH-Z8X*EAUmQHq*3paeTc>j6GnH(36OuT{ z1-GIxTeMZ>Bt$k*LZpy=-Sfg%FY^lvi$>regih!eI&*CuJ)i0L06KZ=+=u{^0ixn( zKz-;QuOX~`TsC14r;ULp-cJsexap7U3j_5^_Rn?!aPe zaDklIW>HCA2t{4g+6g`c9bm>NNgoL=SX+VnUlsSmNeHbgUub=7>*!qhMC&nN${ne> z4U6O8aSp_OAY+I+<=Oq*IV5LroI#R4954nbPvsZ(!kHw1*u^iz7TP*Hm+{1w;Cvt} zy!pt4B@jLeP^83Uq+}!n5KUIz%ZIH7{8s z)``6@%I|<*Q*B@&Hu*$s1&n2oyTTJ2W+qs-CZC8ELPz1b<;6i+KItBKC9eS?W)C=X zT_^UTIKLgPq}jkiqK9w*I9u)NXayN7KV$$;aYGO%uq?NbPF;ozp@Ts3@T7vkmR@+} z)jNciBb_weRYXcaixFCN^o%T|d*EeH7z+kt8^~VygIQ@s9GHaxcO-~pbH7m)0NSMuK? z9JvBQ7ZE}*JYSO60=KZzvydwz*(I>*(A&{AjTjnIL=Ds-0%l;kzA&{;OF=-Q6JE`K z19DHW2fY-%4Za{&YMyjb^k>(pEtb7%g1fosSg0gtK@Jaa*5BSX{>21ZfZ_BExiSOZye|1q)C9#^ z;nl)=gf|~LDF#c>UclQ@`O8MQeu=x2OxS4H!_bekM1iARyZE znVdhZB*XD_a?2Gj-@(IzG|V)DBcI3(wY7nlcmurvyL`5Z88F9Zy#TyUDGG`-!D~ge z2zNnrl8k0ZmXTt$5>T5ErDmq(1s#WHZn(YuD>dIAs1-oQh?Y$&35qnrE5$VkwNN_A z4W{r4LapjW13V*1#Z1T9^NHF>d;8EA-ok-V^GACB8{XcpE{!V+ZfXF$RU_2G=p{A) zO?HE+)@ok7g+FYgWTt29K$6NJvkhjWw)TN9J#h=rbN)ha34RIjb%D`2r@BeF4(@)0 z?}6Q6Xn$qM1EN7g zQLmmn!BdL|)O6N>2TF~D>tEC_!p+0zQ#{?(_f~$Ww;JSvhEUn;;sNq0%1u= zNrAHy_4?^UAU-f}Fl=Vov$9U_ZEoEnyqlDTiSqRqdNW{-S)Z&{;Z7>-x;eT9W7g*d zcZiPw3d?;|2xf&PID>IB>rSv}hQqA^J*k<8_mMC&k>`P$b>3#%I=WT^5Gy&rNC;^n z7ED4%PQd3m@mY3X1Y8KEOwaS(r&4 ze4+BOt+N9xc@X2?3qa@%z+1|KMVFU>`-JOd2Gbs!TY5^kzoYFAVrl~3lG5U${FjA= z`4#Ws<6ufB%KVNDSot7cU6p{)%!4pshGcaG@A?9-(Hmj{uGsTJ;8zrb+skL+Gl)kJ zzkWMt!AxscI}j2uu82(}U;+fPfU^x8IUp+F2SWtJAW`B=<-N);E_}NH zyAiRm5qZP&xTVGU*@3o>_RdzYn&AnUB7;|!B!EkcH&}OoSBJzK-5VefTJWGD!JDru z$_k&~$t`|iLO@9k*}ZS=?Pzan1)TyM(K)cN0L&=`(vKAcKxywInsf^<7!usd!qWRq zh-cylaf4uvUs{}pnFfR_ppjT;&(OP$7R0*-E_P?zERsj3!L2NVh;0ep3tYa>gBCAi z5G8<-FtQ)q2iQUp5_&)!AUY&KfmSlswYIMN>42q{$<>8LWTgy*tK@4-r-27b41z)+ z@-&1?7`F%rt&|05QxJtf7(x&ep+Uq4c)~&_XY1a*Yiw|Ri)mu?LJ@N%Wg77P-zM1l6WL(Cu!9vkZK9~m1R8|;49@aAcv-}(KD z!W`2owBD}* zZ2|FoEEqd0a3&`RkuYw691^7hj~q(?!fPS|EC?cf0SgpJw-7;EpaWNz7MI*WA4UV~ zj2knA&{#rOs9S(1(90gENQe}} zvs3TM@*2=FTm)k5m*8WFK}JB|g3O7Bs{aNP`HXYeL3V@Os@Y>rKcHLbJg)yt}c?gTa3!@RKAp#y6 zQ26UG$ub;F2Vy4BY**CV^#J|^GF}1eOK`Ie7T5<6egoF)kPw#u;s(op;fS}qvTVLxd4oYdH4z#7T{>)=2z?0<%=nhCmP!SLz!vfDU*n`K8Bp)R@a_o@vt%_-|_l96?abX$1Z{;a6O~Y&R%UK|$g{-iy57}3E z3yNAh+8;st%|Lz9KSw-)~1TKIcw;qR@5U^l?uv9<8?zVrq7_twJyfUSj{zqc0t-dYIu zo&56FLdpM{t%Vc6w-&DNpZmSF@b}ij-&+g+zuH=8hd-P^`ENd)0Qy~iOW?NzeoNrD z1b$24w*-Dm;I{<+?@0iBg$Mao*8foXg8V;F&~&u0su$g{7{{^Y@fFHaI-G2r`?pUVGL%|O2Irj^^=(cW5L{2es?<6cNG4eHz@GUMsQ?n zTj`t1sw!}fS#2#~qqe#dNTam8s=f()6S$?e;CA>KmaoTi{X2Ny-1|kR(5UpL@|tRV z0Zafk03V;&CDmq4$`=qNsSDcR${XHCXJvlyw!EsM5@-OB{2#MXSzp=)&X)aq1V8|7_4V;^bNBM`^Y{1j_PqLLsI#-R z`Q6+4+M24$%F61W1p!1+|BC+afk#8EUd~rtTwR=zqh-i zsix`=7^tauEBW`RAR%Pnd)3p`)y>V#9TZpht99f3LxZ3U4Gj+ukBkhw1s(B20Y?P3 zY5qMOfFeBW?d*y#E-pX}?pJCi28M?|6~M;u@SC3)K#m|ZM83`Y?`t3md*0L8ZJhz| z+r`7NauS>(__YiUgCiAxC;-31{NKf2XC6gp<>~Y-{^j!T@rMS7-~MC}06ucS_pi5q z-QEGef&g>Y+r=I9J|Y4aS7(pQB~#zEe`s)|<&W^4{vCYa;t-Kwk+~EFo$$Eo;_Qrc zK48Mx!=Y%Zf8?w9hX8(SWzF|pfao7M0_~UE56+&FR8*9g*&-n(!tWRs5a{dU<>?O4 zLH|4C1AL(TU&`P}+fVqlWi8>qKK{V5acXKR$||aAYU-M**D?}Ql9Cb=;$m-J_i*xb zc=;24`%m((Eo+Vk_`g`dNd;;OD$2^+w{KTemiJ4IOH4>eNK8yhN{M&(aCi<*`TV~9 z9Y5ojH>RO}JcRPkb3-Jr3gDHMRaBJK6#dfUlM>fUd`g7-&4UKN1{WxJ|^&sY4!#5iwzaLVWp_}xF_SJpqL`DOKku!!{WWxJ}p_qX^7 z{+Ay7h(C;+`TBjSsj4mb?u^*KCJ3zjSA03I^tjLRPfSekznJwCe(z812i%k)=eYf1 z`37H2&NJg%{D4chf7JiszV924ysN3K;|KVET?O!=6rz8iApNf<>;5f%V!)-$AMDT2 zaR1LUFi^nFzwUw&$|@@=DJgBowZ)K!~rn=1$;slW~8ub8|>55+h@3IJHWr18Jqmc{v;+OU9*oH|LT8y zGDCGg4nV{KIQa|s1k5Z*VcTn{r?0PPxD&y@@)bWRAvxGSX6z^YpFAK0-}cw>S+&>k zwGjNvnQ@=npOlak>=5}AKJdVP&_FN&w>$n#_zvIUhg=RH`Jw%TBY)rk{aOU@N&cVP zzZ+@)rLXv)|3fZcA0GVH{{s`yaKld%AUGpC^cTk8_xJ{Qe7mpXAM}5yW5_piAO7Xw zNaIiVzyXN)1qa}d@NIvP;%zs+~}*RKSEL%zQ& zgCos9;RE~o06Dt9AGg2)aU+!1Moe*A=3Y{ z=f20k>f8OD`|-&E{=otQ2cQ@^$?Y$eKf*uz9e%izSLew00|4&;|9}tPR&oDz1^A4= zd)@x*LE3-jD}G`^a)h%-`{(YyA`WRkh`f z(tq6m{1N`C@7jOE#kJ`N13Wm=`J?_LhxoTB{W`wZH}XIEUHc|G)u8B0%F`#b;&KGQ!Wl2)>N@clc3m zPIW)w|4{~@wB6#bPk`&~XJy)j$2UOqU&idK{R8?R<$m?s1PI;`{(%FGOu*-U1s`#L zSeSMi0{=(P5I_Eoeup3J?pXPw1NH|FFyeq+{_FS<@c)1Z$f9LzU}#`~_y1%~zrjyT ziuQ2)F#+s@#FJFYz~m?`4lX=Hq+(q57X3U||1l{pvCR3MH+!eLVsN`1@18#gFx}fAK>A z2*$uq_~0QYZ*$20qV@SaS)x!<-{2d6hacx-|NKY%!Ji%AYVeqpm%o|<{tjQ>C?(-* z{FMaoe@uV?2juOK4mi-j+SlMg2%nqum;QqDZNIi(-tb%e#G9TDIY0LQA2`6scqm7n zLh~yHJkUk`OaChvrX(hV{1^D2n3Rxq-QDrW1PE}z-~BWJ0SBP=7aRaQyJ$#MT?wB7 zK=Mxp$q7lIBqyh&rl!Yv_*}`J?jJ>R-(TF&KXAaSt82>}B!AHWfJf?Rs({h2qN=X8 zL+xNjT6%hVT3TvyV!{m{uK<^O(*x`H2oIo)42`r@)&4L7fdkSc|BLvb+t^fhA{l_4 zni`6GW22)Y!b5|D0{s1a0{ntJvStR61qh_9GcYvTTK(ga5Mls#{DJ{S9(zFu&JU&J z5#;A)XJOnx$>;0q=jZ1i5EvMA?OJe9s81I1n4ZrZ;JFxWuc@o8#k26)5kV#(>}VvBV^#6yTWwtSKx;Sr$Rh=>Zwo*o$=`&95;jEuF` zy{Shy_{;(_0sYks016GBj|G}ePDw>WOV7B0iG_`Wi<^&UOBjHSjEszmijIzsiH?o9 zKRr4zj+8GvjJ$jM<_+NB8zCV0u79EZc*zqHlaf>5(V1A-Ik@(TzH$%IEo#l+ma z85yT zVrp`7YHE6VdTMfFY`D9nwY9aSrMVe!0oYh)qQ0T3BMMDLL=1LD{A(7FzDI<=-g*EJ zL=PIjS#rx(IhoxFN%6@k_>z{9dG}84%=FCk)WrDc&_G{LS0^~~8a!2|y}hjs;i3gE zig)kcHdgj}VK$Icl9Li6$1?wOA%Mkgr1_xl=@`IssyMiK`2>*GOK+8x+b(}7`F2Kn z#+|I}2M_Mw&5TPK864>E?dk49N;fFTU+_#CVL*(eSQ7lUtcf2 z^z`)L`9Qb;2Z{qJv@|u9iE(qWGBeWC;AQYnMew=(l+@q1UuuhtyrPo2s*1L;v7v#{ zfy2j6Se+_BsgZ;wSZWdj{G1=+t4z!wR8QbBeu zZeD&t5pjU8tiDTopW%MfV<#-nTH9T6x(FOVFaZO@kGH;v6&wYt@dE=xBV!Ze!<}_6 z(*y1F71R}Fq{T%9dAZn_feQQ!e6Y~DZhpzgselCngMf{llUG1kTxy$wiiXx+edB{i zElyck+d4S9IEM`bBycu6Vt&Svsc>{`5?F(Yf!4~W$=4h$4;$>=y+>PBNmhC@g3ro? z;1gs1`4Cv2c!}0+ATkVDIJo&YiGlX3XztcAFga{?;xrKc6&E*Ok4JOE024rujZaR` z&dyDb^){A1NsI8gYIpwZ=~E|;9X8slsfOSS3-EFR`BRaD)!cv9|9JC&p9Any5HJJ` zOl(|yLZ9$;4T1KZw6eK)+1cIOFF5ek)Xdc6)a=~**@>Z!`qxkIBu0h=`ulo&xPTFQ z;>do3y;_>e3Nn&nLVVn8Nb^ZS^Z&UC`osZ#3MM8Yr=r`y%E>1vDhcGTxf{W^usjEv z@9OCn6cTa$?i&yTbv9HMJiC889XMw3H>1L@`MO`Vx3M~T?2xgZ_6}7=S!wZ2d_3&T z4C}rBC*YAwK==iAaFJ5dGBR`U0{pG=DjK_W4eUf_wWe_4vV-6)`L^hGcz;Nk`v;hBf_rvd%HV1*q*aAH{EZbqotvY z3_ih)Tx=WYse$n!{1>|S0|x{c5;7{f&kCTZxa`o~>o3ob3%?_C$ZAZ|>Hwo}? zvM~Nh#s7ghu&mQ_$u-?>Lu-}u1c zqZTJlowho6-rC0If{nHHxwB_ZpFDmHU>oY`;K8>^i3^nbt%8a&#N z9C*M?teijqfProDN~#*WcJI|QFy4Rg@R6ft$IOv(%Ad#FZz1> zbak|~c4?}sD9OuikrWpZ;^*aL15eul(+yC%KVxt{Lw^4kxFetksA%cIG{6Zs*d!`0 zxn-NIyyA9c6*YBr4NXl=4Gj%-HC5&9it@7Cwn%Ok6&B1HSOOH^wg{EGo8HQc8Nu)@?FK*|u%#mMv0}o5e+ig#`F`xY&`0i_%bmhX3=4 z_D7_D^!^hElt?JT#LULQ$<4#d$1fltD6~mv6DUH0f&%<}8+o`nIoMd380l%L@m>~a z_&=ifS3d_6GTtReoKi3$GqJF;v9oh<;tK}{2Rj=p3p3LO27pXO0bES5_4nVC`Oo}; zL>!2PK}bkUOhQ6NMn;Yl3Z#I)WMrhIBqYRO2R3-{%fH#(KSTcqeuCeb@$IkwKpuay z^jiYICGcAUza{X$KmwNLn`IzKVUte zz*|PkQx@QQB%A<0>yK}OAS(0oRu|So3~ErrV{UQ$#HYpz$!@bVW)>GkFKrQ%6qA5Mz|)37QT77&gw+)aGMblY*d?Uk{5B~Mu`9*Asf!g5 z>!)$p;83N+X(USW@vv2LQ7|q`$yz`9j8VAzE>)7pZ8zJ{(?SbHaZ7qL?ZqNxCi9Kn z~-^^G!yeYXBjDWCA2?N}^TKBl}_>i-Zv z>Q&@yoZ$JSQJve-$37*ysePn&z}zj2tE|VC({0uH^RYYhi7RPa&sAb-=L_dW$$=BA1|3h3eR~_dvi6KqO;?9fx!;idG4wt@rsA)s58E-S&j00a4)#F`@YjtXW@gU zVM^R4Ckz}95D;p}XmH8O1hn6aZZhwn(c^h=bu&vL9qa7`ijI3WTi+2)bU*Oh|Djn^ zx+z2LpaSD2r$>P&y6!UHirvvMTS1}9M7`%d$B8A$)9LROqO{^!LvbOacaLdk+#bAK zS9>!dPKB!In)eMacvtYj7vuI}J9?W=V>mwUU3+%qJZDjYEg_Y$FHcGFR90;#*Q*L^zjPv4 z$#Zqb1K~4Eo5_v zJYkEW>Jj655e5rF7m4IHoE}>_yTI-yHyp`cC>P*K!gdgqsHVRpA;n9#54T^S{aU z8rw*G$;3J!!})aU*rBEi)uFuCY}9+>o>4^a>r%_GI-vga74J&O+gaJ6WxGqOkzEb( zx3{`lo-v)Jm5=S=vY5U3B$;HZy_Ah%U{CXQPssdCm#OG@{3{jdhYAncO%3G2{XURy z^}l|A`iXt~@(YzU2#@-CD^leC)wdC)^e} z=Z}&SbHi+nabsKvDBMi zx7_E>AZ17n5P&#bUCVj~IXw)vW9p+#EJw3;pYqWvQqSOxt2&%;?V!;67jnl+wrYl~ zl>ZbjbIL>X*qH))@pB2r!eR-^bqc+S&T~qFY9=V+(-ySbl5Ll=ivTb=le?2!A#>bnkZmra=8SVZrYlj%%c zc8S%pG3aAFZl``uwyTx|BaV()jB6ixSFXcV^F*5(#w!USQWb}17+BOFlcDZA5$k;v zKCYj-Bb~^4G@=McJFlx?R1z?2(|$xY$?;;nWn-^Fva(q~kI|MXS%sqq>e( zx(g~?3Y^0^J-+>DrVu5aPI2t8<740IS52#LH*H`c484ZqzbWkX>~YglL+t%P?S}4G zk@iz$B6;lXt>HRz=QoaMY-?&Wh%y?veukIN!eR@%R@gSisQkOK#SaF@>QKTAV!aHb znj`|#&3kQ4!l+%9!jv>xJuqUD#~1CoqPQM3+?cJcK3=vO(PzRzG?q8PyvK(`86ADf zPGYY!oBOccfo+2Zd&x;I`lQh}n(J*2Beh$;)|^V@Q8QnW6lp}?QgHNUu8ly|K4nFi zw}^vP;yza5iu$8oy2O;eV(&wG>CvR47aWcbovx_fwO2A`*>lU7v>!2NCsPy2vXNIx zfTP>e$vTRP^s=qo1U0);5-qG`(dpYN-1dyQpY*tJx_@V02xZ~)Gc{!gcPhP$UUoas z)Sk4rk9Q18P*_wXx+8|;I*Pg4=tT@={D zd?WXa3y<>Hp)7i=X}GrX`+XDEP~p{cFZ`-y#j-1Q?p*0)pCnWY=A}Jo)$QfCEIwJS zp66Em?&PkceH#Z?FE12k-grZ)B3)QS<=FgT*9+I!!eScn)_Y=1~8x<~3{ z8|~zc3qexV=-i_P50~Eg5879oym@-&xcUpJH`$bhllwOD>w3Uc57S|2pLWi@p^2s^ zqdS*l;zugn4^G?)bn~c>_Ix*+F z&NN>*c|Zx>6&v&+tz&zYcXW^>?~6n9jt>u%HaBi1Jw1<_h>>8~dNwQ7bopiCLt7fU z*fsT*2h~G2na7?P6Q>CVxl!c?bVOf43lAAiPA@bt!7@Z_rFSDKVy!a?c{(jF)4I6z zGKIO6+bbCt5cd#|LKF`$yfa|&yTKH>BgL}x=`@ZBTbi?Jmqrg ztAn}_lXYMHrO^N$yJ5iymZ9IneN7+ zh!bO{bnjnH&88fCA98wu_;in-St{=E@+)O^W?B(b$52e>!FN`V9lGwaZgYJQePR0& zH_M)rftw^XP28P3%3s?Rs=aO9^N|v##-^ElGA<_m=B)VbWV4MP^SLD&^FpW9wmjz% zRX+VLrbnfgUHUyc^w+y?vb z#`iPo7Tt>U<4>b{RwdYGQ5#t(l4FFLJo}84RC0!qe>~^T zwikwnsSE{)lf#rl+dIWNX~`GPt!{K=+dk`QN|$D_Et)ONV*aJ*=Bo&TY(M*;>xWBO1umxgIIPEI|nb`-})`L|M@4B(h0*TJz!;-YldXe7K+!a_57_ z263-3)Bb%mBa?xIqlrOsjq+GgsS=D_*CE%m?PrNlDQVMFzULRtUF>WbXliqfw+xW2 z=D=1eJ8nFcmpM_lZ*NNvEpLj_md-t+5Q}=?ZD;vcMH{3IQ_}9;bZE;WojbA86myLB zbXjlPfHV8m9lh`Bd*w6d`&Y<&L{)jKSKTWJZrtqCFHKG1<`S~I7{BNED6L(bR;mG| zI{i(-VI7q-5v?0e6=$VV_`F7?rnbUc?G)s~u%mfo7a9ms9T%j^{Ev=C8*sePv3{0D zfStZr9=1=5X2qznG5&7Ys@9%^RW5g|`Hy&r6Qxpj)Nbk6A zL-W$ei&2%Da?5avbMG!g%{ul8Pg#xQCW2Z}@V&nNl#aHG%Pns{%)=VFvC;wgxePQF z0@VZZ!A%q+LLDnStU0DogaxgdB3F9O?A2FdooL%ejAK#K=!S4(rBIxXskG+N6}sme z()N3eKDV&p98(I2YVr!B)qY=ifVne!LaJ~1&B_q}R`a_DuW4jSE%++ESEPEmnag0iBzltuP1HL!w2ZOl(3B6js(2Emt-sqW@@5qE3MuHQ5{@6 zulPQbF8yBFDK-V>aS|_6q8-BSR~Sp%f_Tp_&4#uQnZDI6Qfbh5ocL_~R>5|Qo98&U ziD--@JLd(+DJ7)Am)mu>D3*Z-IKL6izgn2YdHbHhl0dqtnhJZf_8DewZf+qivE&*L zTv2;Xo~euNv5!(B8cbLjOz8eyycChyAN$kM<=JAvgT*KO3O$$akV+ifO(`+fIS#cj z-amD3Muijs_1T#TEGxZ3G|W8Yin;!YWbf`OS#wt@ZEM{2HaCw3f()!q3Z{z?>2kdiOO zY=c0`LvDh1FE|ct9%rvKjw@oDX6a%%>CY(}%+MiDpwe!@beLfB@!P6rR#zixS-NLM z?iM`p5I@_d2Dy_N=d;pfp1bpLs}J`|4zISiJ)>2_nL4K_wScE9M$6tk2DT(T6W3kN zbp*t5Br)YQb&0@Kgc>l6IEI~!JZxmjK&6WJ{((jB@w2VRWzKuV_R9{w;}EbsR5ae z!5i`D#sJdim*cDUO_+43lNjXr5#L+Pk#&-3A(ceGZRK2wc>eHQ^E=iyMVVF(=jHBd zA^SWxtuvaeTPA3Cb!ptEcwiWJWG^P(S|nXt_BxYWhwds&ff4iEW2d3j%%7bT6ZMQv z#I)$_yYRG~XGompE`>^b@QtBsk@T}X)e>ICYtH{rSH;#|b)G0jVege0hl`;}$96;P zSL7G{L`$RwDC}DIe)yd+Rw3FOeb|dIm8VN0I zI!pPUS(tK|glHu8mIC|IBFUb9__*YU{J}c5+lQ*3^AB91qHpk2U6{+SZ?r#@^?Y>C z0Ri#Y?h1#70&paX^U)WWh3)hS?{4m!pA{Y5tn(PtLlDa_NX57Qp-8fuw=_r2WP!Xk26K6H^msb=W-=H@#3O%KTSpDD8q z(}eA)x+|9MV6wM&lr_%|@(Vk#6g&z`5s0xo;(7My)q0Hc>9X{`DF1s6;s&+mN2Lrn zmJ`L(%hJ6#3*Ri5vF0XQ-q(3+eag0*QNXol(xi0f)KLzm5F0;<6qx?G|8xCdod|tb z?<0fZ)<;6rWneVh%z}dBj-Xf5o?>y7MjI_+Eg5&1d6#$`w;6pVuh5l)-sN0B&zrNA(<11BvLt~Kh#mbT{B9STq`e_78E zc&Yjcp_VmstJ~|ysQum2$)0y^*vZ$?F`y-cB2FETsEl#0q>5`9d~Ge{Uo7(aXl2ya z0_Hu}mQJqBo7UgUP9fd78OCg~RQ1uQ)pi`Pcc{VD-oZVMbBcdLOCo0LJ*{*6;IoES zCF88TnF}-*>B&rN2%?0s?NyufdGlVCr0w%4&c15r|GxYre<$n8L87R+-F)5tYRa*& zyZdNo9&r?7UQf;OqB_s!{1qAKXs_G0L82m9WH&HDYWJbKDSr1e4E)YE*^A7Ad%(8TUY$`{L+~IU>Gfwz-hfF*)#{T{bbavgVas2Azo8w zqjULn%eW3^aWrk(Ut?QH9UnxlV4kbSiG^I3OD>s=ox7$jdD2tx%w}We!JzWtOP9qy zW=^!c1S)l|1Q(w# z7`j=cE$k#bNh*ILT{QE0DOJOD&MNEI@jL++=&NQ&s!BLJg9gaP+e#D+oHyj8jXgVS zf612V(y50A;}!5l{=KII`R%VHJ==T#z3Uv8#x9fA$*19+=msa+LluPDuXC7B1nQi; zZ}Rb8U8THSsePleQAwBYiC0E0D%JWjP8$qu_VB<5gLEzZ>26=rX7OYY@f3S7iG`Q zM{qqPd`jXR-><*pRa>pF;xtFjJAGg0On(w4{p8jIG^R@ZL)`_}`yR@N^6iMf_Cn_6 z$_-X(bH)O>SL`Pv&Yv@^&12$pKQc{R8{8Nac)y=YF?GrP^c>Of-lsuiu+8|c{=oUY zFWh&|JF6dLn5%bnocBF`%HimH&5zqe$_VSZn}bZaZ#>KS=qN%?ccaYMVpK}0@9O^S zHnT0Fh6>3Y{`&Q6X3RGaR9-(;U!c?Uru;>egI%kL-28BBKFt$@R3YXYoV$0Eu-~d8 zSx6KuC$f`PyYJ#Ya(M3tf|pgsO=6>`XOxL zxJHh5b`mr94ShJ(H-=a|L0d>&33=w*p*bUD)RbSb_&lY_dEhxJ>u-vTii=j0tTP*T=m-X~yLoX%VPsx-IcS z)=rJep03RCM@AGK)2TA}?+j*3CA>}n4WI4jn8^r#W1c9QElM43 zWkIEw6XUDzBQ|O+{N5w_=&g@AwUL}nvF;-w*8GnmPKpdYRGinj%<@2#4=Qy(Dtj@a z7%FpC7MN~4z*nIV>nCzl>%o=MceXR#3YV`samZdR;=S_b<%O=9P%lrOR$uL1>|Lo6 zW@bw?Q8x#CauRlDw{q`$#*T>+m&_vwJACqSCwXSBW>uz5m9WX2qxaTvYet6~OsGcP zAf=x3qr$m+?#BcfXY6m-bd#$#n_uhJb}jh4g4wQHj@$U&KA;P_I{BO&wSv91k2n4q ziP9c5Evc0uvhB`={p`zZLOt&Y5|*+#UBb2M%hS%}X4htksELmiQ6A=v;LlZi|MuSO zD;bI6KKGD?vW$hg;rarD1DqwQWf{1eFAK8STfJH@we1NzrQW{7r`8+38q{a0(VnaQ z+PBYA=wq&R@a7A8Yr><`*h9GldWt-3L$j8>D1X~xd3Fbithk$t1Uy5F`r(urq`3X` zSB^;EFrP_2@>JMlRITb2(}dU2>*u#UBh0WqpP15{wVE6L=J26S!$(fo+e){burAsn z<>+^oHk`x!QeBJZbGgA+!cMvmo)Ft~KRaZ820BISfAb8T&Iso2rl{J|Fo&7iu1#9< z#f~mSccZxsIw!qvD)7mbPly)CC--*Ay=Ap^W|``U4qiy<;NI+eR#}3w8r)+*o6_Y0#xviuRbBuIO=; zN)TV2|A(8$n_#Sk>O<*^yY)v>51t~Fd(+*T*=DsN(tE9W69Ko8=AqqLtkO>ku(f8H z9X?8pY6c6>T(-VV-05I38dF0?ee^I#xXk&;`bYt>fSD?N;fbhcDjL$8#fJ|b+&Fe5 zUX1y}y*tAjWv$NVSL^jrP-dMC^ci~274DLtTXNG!LoXs?5x1{qrBWS1u0E ze~4JQl)?G*LjJil=Pplpo6XGH3l*mWLMxYE%#SBddu87B2^rH>p?$buXe_ zaG3?MPt~qVlCgoFH%9ZB*1`^7-f#1i%~wA21^235o40pP_*w^RebM#O;WKja+SP-w*DleCLbedTX$6U zv9ou`qX$l%H+mUOJ!Dwjo#Jz?@=8tR`xRXJE|a)h1?n?XWCxGaTC9b=ivIJeoaRH-B>vOTfMRaA%j zw3@W$PFjf*H09J>fZ58|D z(HfKIw=liTNIq?45-e?)N94JS!R>Z3y)$p*TM{r|$)6OgP4y2q92jxLDh4<9TAuwed~ZSfsogDG1(PJs;Mz;Vd%B)HVH;#<<x?&#nbYV; zV>9_RF;Ce8xQ^_~IIJ6r&OJa%o*zk*z6&S#PLPP{q7J?IBNtok)2bihsRj5(P?lO( zZr)~mwm_^kT5$$z;|iH7xW4xp>UG>A&vvwGCa9o=`M~kU7pIvj;tMxpT^M+_=85pn z1ZjFV=4^2#4sMx!qxJETz$|Zc@uRgI^P|ro@v{v=Pg48L<5^AocWR%G$32_%7|?W- zN+P`DUK)Phzo#|X%pgN9`9_tMS5R$E!|mMOC%ps`a!?ss)S5_gc6x_b&Plq(F)OVi zA;zae+K-uIUIaR>zC0@?(0E|C4eCKDbgARyo+?kVnpP!$XIpQQ$UU+98K;IX9$w($ zwA`&dDiXgtWwzS|7Ov>$G``NEb>OlA@1Z$wE0VdHa~sS(B)rc@(ogu9XJ${I3m`BH zt$dV3PobS@vDapwUv0sByh&4|%|}7Xh~A_skNpZEd&B5!VpFZ0f~CT5$Z%$fT)9y> z&U;--{6$RF%H8{VntC^a1h?{Ay7JxC&#k%iA^m)Le5z_4I7DVo3yN)sxnEp((Vod! ziQ4;|K=?KP9tZw3O#S4_jBhJz^wTNQsty^BV?^mR5f~$t{jGT~1oXP@c-JQFwY}oZ z;AF*jm?CuKsF0ff88aUW)ouP7M?PG@FvgR)JBc+-%A6BBz#MK|HKu&{Dqs3mpH`C> zrJUz4r#{t7+@W}aLga2p*9Hm7JIZ!$HhwD)+qND)d?cy&)kGh!4Q)#KTS&ZiNK@p= z{y4=s4w1YrL50$wo%N8cu+0diixlM%{jfc~_l^b9R`;u)xKF#^wELl{#G^3n=&O41 zsWPWiu9UXYZcQEZ6}iT;C{WAAdHC4_Gn+|%M$vZe53jPU%`db|WYOp~=W7~0Rj#Ft z(~argvAu+md|W6}mej!Kp?gQei;p`pd4e_b(j|h9KJSpxDci>%cv%#)@-euzuDq&z zx3$ISz&11Aa1QMc9|wi0CBy1tk0j|qL@$jt$}iq&*s7mv_=eBqQt2|c{pkN;<(^_i ziMl<}FWa_l+qP|UFWa_l+qR9pY}>YR_t$-ro1FBy$xXVFdYJW4`M*?BV~#m~l+Zk2 zScO~E`EMMPd()iFnLD_0$ULM~sd?1+tz`YTKBA1LN&K;z%%|dum@k>&+)caCwk-ijf*8qS+t!!i z`bam0Flb0sGl~q@#fJy;mdXSdI2*a}`vo8@iyHtGTwvfWS!X8oveb`8E> zQg?%oW$aiibGxQQ@?^6+eC7=IAdmu_k(xe<1Ij9V;-X+v`s zOmF!?@nOXp`|9myxp|~tZJJ>l3-rdNpj$HAXPq$OH5+0~g+XTFmu%YfFSn91g1DBT z2Uru;nkn1A&2*>?;{kDS4*CubA;W?91`I147O+gsPDcI|M`LX zsT0+ z@{4mSDjtRNW|UaLTpTFAJ#N-Jm>f2%r%^-iyj{~RL!^irMIZDp$*0B`HA4zuDY=Y$ z$^l5#=;&g*hTaNdEejs<2;4zPE4rQySzn6MUwilD@4-LKMy`nBOhnBb>= zuZuV#ZeuH}@Tcm#3r^0F1e4)u5IYkK%~4A5*J6znWp#vX^rO+=x3L6h49w$PNM|^P zy6J#w5!4sY-eRv*re+!`MxSq=4NG ztX$2qWJTq@U!Yg1h3oN$L%$5~waNBj#t_V94BfxO5Nf&NK-$sW z#BFkZW?-{sUO(T0+dyn;uJWAu;=A6vnKV!Mn6IPM#uO|$zOEYT2zQREJ=FC4ZVBE$ z8XNKu<%eYH(AwZ4V6YX^ng`fKz<~rz385H5O%+1a)FjdOPmw8!gz6&${}r@c>4(xn za9!8>N|W8p;m$}aw9|9S#d|4}FX9ick^sZF*|gCW8R&~qyi0K@JLVnB;AaaYXh@fj zV2d~&<;FXRo>LdJxTwG*hnV|?BbpZVKK0rA13*iif+dctT6BT>dag}FkhfWLB<%SJ zSns+3bvo+iOWVq@^Gl_l++>nsV$!x2^WxzsCYUzFf zonHR69BEng3%(*`)-FpA_NDlJndHYiemB~TOT}>0#BILe|K$TQi7ymT%Rkeft<>-= zIoyXIX!p&2()@JaU7~fH3^_lVesTt3JV8Uf0X|EwAS0h!06J3rgL5YdMUK{WcHnX{ z144BUcq@^i8(PZlgjw7Y+Py&ydOCK?TmP|CE{^0|bshQ?F?;y!R(bKxWgh*4_XK^% z-_3RA<^a(*qss9!W>>C_+)DKMO^W20lEa0=!c;MR78=6LdnRIyANca2xn$$j^uDKd zCQg^BJa5vKq}^BBj{Zfh$wG(}Ev}7cqRxlcIDbdFr#HYy34vv&oRHFT8w!c!BkE1z zJ)N58MC2NIxBEFEcwh)z;_m`QBY+c1ed=J95GL2Wb>dcyVYQ~q#pW=^2DQvh-*($$1M@pq>+$E3yhWtDsgmaVUMJIP7rm*I_-HQg z!@t6f4W0rS_zqY$x=N%D%A-W*!$F9l^cw-fw8B`ucswNPr|Pe~F@+Ci*NILKo@yCO z>cXfGo2TKXoVpf58<6jag3$Nv*Ds>wWyRH=YUL0VR(U{F>-r~UXj^ON%Y?IigV)dkzXq+P8xrNjpG8IdPPj6 z0o0RxqFh&u^K^kYxmLyYESU5}_o)g;15x_70)UBMj)|zLCczH6$h75rJtnEO;MRf4 zXdHtoa4XU}SrKg!xR*JUvzR>-&{`HJv#E#ZWwTMX>zQ4^=-NZ#2N7sMlyfFnh)RF& z>dzGcf;>v>^LMxOUrvLso{~++)aJQ{Wcwp+54>F}z}XACzYSqo0X4A%(5bjql2JL8R@n1eYE2Ur;Jb`k6?{dbmptFDEUvPYuT|J0VgHL3674{`cs28Ap zzl7rpB9g9$cmX<_P$f-YcgDHu;{hWq+iX{iayMhM(xM8;f)CnH;gkuNxab7H91UzA z*O_C{*bHPt-lYYIlvd?-2cCBmN=y~Hd`srfdmucuWF2*_Vnrd#|bq^qqg?R z{&l{uvU~+mB%Koy2Qg?s+03p<3!UDOG~JIslusKmm8_Zt5$%AYB}>A9sDvU;6F)i$ z4}6+_b;AOb6%C`tH^lnzNlR*Nm9V!Eb(lhvm2vNt6o2W< zNW+~{nGVPrfKo6&;K9}ytbW?@z4}UH4nhE}HOF^e;GAR5^k0gOVJux-Ui0swJP}x4 z56N>V1jk~&sMZ6=Z46xH{s6)HL$fPMh%k^Br~o%`#U+l#JoM^jJ&2yw227WTd4acu z3*1$DPwju$g-?iIB2^NiS4-mD)D`NXs&%>2+DPr&#%bi#6$q2gOALRFs6M`Ir$y@; zs&kElPz(GhMe=+T8qfdLM$^?}b+y*F&lWpNaHt+o+xg`xk4c9m9OnxN*_ck$n-%sh zrBC#L3>vmve_EBl4+VGmwF_VBlWSvsbr|fvaLm{HIrT+^PSI9HUPbocy7*F*(r}jU z!`xG|`ZMKr+IzGewo$tm9=`*r!uqr7(Q&fk}&(nsk z<$mMAP-Sbps{fM&h>B)O!m5mxY+_NvRzF`Id1;=qQdr%%tJsPQDPD~i9T(%E=? zeY4hP>}!SsZp(3gxdA8QT!%F>tCXC@WUWzz8y99{Mb_ zt$hHSpb$(R8iIh>x5C+`gHWIy6E8ZR68UGoYWtH>5C@LQW01z04OJxF)Gz0+vBGZr zzQZ3n=v$(7t>j&}D2WEb`doJ1lM%8>`&MznW86#lB_^_{d-}|H6gYhk8uzbdGCWx> zf1^dmOkD@c`Pn23E2@43ChaE~;=bxfh7KhwwyuF{Ui#44dSQpqnvt}!duW`fWQry& z2nL+hNfysGQQGJ8aFd>`4nE51u%#sVX=BpPY5Km~N4b+rWUdp{}q0!p+Q&@yx z#a3T(i{?~!;8y0R&LtwuU%A#_tQ6uMqbws(8?@XW$0f=_EYWNPPMMgIgp+LyI_Y8i zLWKB*jGYUAta`MAxQbAsoW<^na`MA}&Gu|GmV*=?`gV3oCf2RYQX4- zj{PFvp^si3f8N673b<cmz&t)* zF&urW96ohbYz&!*%k#9$%r=kZ+^7*HUyqcCbxtfecf6ZMZdI3}$G?tLZ#@Ro;vAc3 zK~l;m;xf7)5%I87c ztPyU@1qmm^2*(S6=_~oI&1^!&^F*Ic7W#RowDd0?{E0iL^SJ`qo~#IUmold&J13J| zE!olC31DID>TfK>7>bCu8VL{-QBo`Wj$gW{178>VOBFdBU+a0XCujF*vzzN38J|y1 zQn5se)LbY<^PRnZ9*>>C?BZx4=j)NAum|hvqYUtD#noEg58G0?dX4ZDK_z(EvtA^$ zgIulFA5-#_0^~uT0MN#5vqU)~ z<|GEXAtuer5hLQ2^Dw1d=n;&QDUG*nki#WSnOD7S57z8I5v90VlK|Les`RV=lkk z<=1W2zJ0gtUf0rBxz<$~)PJ|uU6r%FKkf-h< zN^!7wv`&%bB3J1c8$En(Y3GL0;Po}RJ);=P5IGZl23Sj(Mf|XeXbo{++T78&123cT z3sth&+PK~J(dgDqZKi`IL{H9>(sv)MEy*qGDjNE4PRDaBH_(1fKZQ5t2yQMH%o~wd&ek0Ke@#xA*P6W+Sj3x>NYDor)+0B%o(FY0rH&_gR0-I^xVkY+FhNq}(j^pAD3U>uvDJu7MN` z%2sk>A8~hDTrbHklOOxUYaGB0+qfIQ*vW~4LT+?>D7_x|d_H^}J`NJKB55MpxyyYP zr+gp7Uw z?%_#|SHs{*iF6&b81cC|k8;HfaLQ==!!P$3F157|TYeBxq-kp)Ln%ldlbrn4oTR^f zj$`tY6lGwqk4n6WOV#Vv(?To_BCKGv-uWzmDfS)Fwc1{>Goa3~`Hne$aJdaS7I#T2 zQJM<6Plpg6!geP-dZ>ki1eIAfi_5%ij|5();%?uCn`r&L$vs;hfI2$vjtZOlo#F0i zE<#YJKYF|T(0D{VU>tD;a%1iXr7qJadXaQY{Q`TU(na0IzA5{0LmxoVpkceRP~j=N zwB0_21fb&MV&mMI!4$0A0oBf;s<8t^$;hQw*;xYjr5R%-SwZVIbR(f{m{3J7hEvwT z!%;q-i%Gg;T;k~#2Lr0XlMW!l9sNxo2^hyu`EexRi{9a7EZ{Z$Burgxj?k<~o zMTo{|)6rYO8-0O)r{qV+10`%AgD{3-pk7l*lbiCo9*xt^Q2@<>D?jF(CTou`z0Q3x z#6sqUk85O*LgdMtL@)6r{J>whPTO;70H4Ldj>t)dCxU zQ29Es{Ri5~C}RE9gcA#Qyr`rgKt!w^v`e7sXl6)Iilyc~ZEsm{6BTVs6g1Jdr@N_w z#F3%9R|RE<@8+^rrMn3v&GCHyUHM6WFQEg z3IKOyUdbFDKAo4H@dglR4pzJ6a;74pB;{TL-Y;1a2l$6-YscO8YR6g^8bBsrM<%V$ zXrww(%V^)^tn0_-=tCK%rZr&Xp&^T0K!xWy%8<|pkU;&ONkj6(C)<3Qo7WQLnrJX^@C5x@{+$IVXCVDAn~y;cC3-|D zeX=(m@u~}cZ^;$%*Qf4g^WHesnH)JQBvbl2-F+3!v|w|Xlz%++9uaLThQPRMoqeN5 zi2wMZ{6hL5cdJ&LKp)s}htTp9Bfa^MgemhKY2(Za=;KJYXziQf{Ek`udNsvb2~BtK zt8SXHj|4vp@kT3z?TKmC?p7t7uGL51QwQ|{nOd&>`U&o+^m!Rh6%7{qae1qsJD+?w zK|qg$R}<74#!fY&>ZxhujiCVK`TeJj98tLZ&1Lbs5NzJ^ub@92u+7S6hX}DuhbMyI zeB10RkvTtdU$NStH#Vy+Ng5+r(&WL2GRzf5RU_ZBWO96e7;M*NE>A!B555%)-TPqf zxr;0a$_9Mv${k5`sxX$)+gg7&)zzk3Mpdt*G&61Td>gj|!Ah$P2P+HLlh?f)>C8;e z#-x%hWsPJgB18WTgxX+MdJk|C0j3YuUv0G&OS)KvL3*wFBbG^4mDYWC6oHU#zk8PN zD|FvVV+FZkY{(j{f%NHIaC*=S4eCVMS&a8@R^aE2r^pw!w@~cS^K?O${?3Ach&{zd z=)6&nHSI4=wRW|Ewuqgr1NQdO5XG437tmSAB4^{e(8wlR#sNH9lrlcMu+__LAx%j3 zC)75GeQhwmD~CM^g}8Nqhvyp!=}Bnk>dD|$ev#92me^3qdhgrpw2J z-_X2doSJh7+)rWbnUwEPTdb}b51RkXmpik>VH{CkFhvFXwfbvwtqVnml6$5{%#hSo zJme8Om4921H_~w>ZDR2Htt4z*fq&4P?QjGHW17dgl7g#)xiy=v?fD;aBhcWPIX+Gu zwr6!id`f5-aHW+8Xyi7gj;3l|Sqr-N(|vvN@lKOlQIkPV3XMVlo0tRS+%e^bEl~So7CAEI2gN#pdBO9#0 zH=KXNxN@4k{3~*8S4}aR0&+Jg*5<6w9eXt0({uSNj{}|X1!{fuj>qte3xhsix97AW zD=e#-m7!{Y4ZIFO)~8-Z5<0(@zf8uP;y!9%@HfB+s4f%FM+wgFxd04H+~l7#H@f0oRNd4cDO1 z5&nIfFO;o@COK}iY8#M09uo_P1b{0xC~J#*?@$7Bp+X-U3+#B5+1bBv!;XY{gOqpA z--~1I;j$^A@1mJp*D-M)R~b2Ck{6BH1p#ZOggx&;2@o!uz$}le<-x;!w>OXxTY$^1 zooLs$KjQAHw$j*-M{%JP-C|!sCuWSMcb~vXSg{bi7XV>`8e1*6h}EhIy{7zr2v@$# zZK{b}eD8SbOFe0jO(&SVvX|Y*!DZqY?w?G zKY~7+REWjM+eP+GK?MZFmGGPu#+}m81C7gfpT8h3`x1$}@{fzH&so}1bAMSC=rhSk3xkrG+Wk2mF>J~~mfwvmV<~k44qBI< z2h#WUK?#Lo4lI{_I_AE}ZO;0tOWKwRR=h8V1cR>d41JSdJ9J=H!Wm@c$_o7n7g3;@ zG+4UzS1>`%h0*JAC1}*8QJ$p{p-6}EV*=e=)Xpt3$A6jUbWJ+0sn_xSus~?KZ$k@%08iwzksC3PNWwa&@Q#As1I`MA*JAf96oGtz1m~eox%@l zYq|yX_Tsvax5N%(Yy5Ib4b_$uhAq|56ME5s)7$+q5HIQ1oVI(`y^f{?~G{@95fB!FUq;p|^$JLJ1WKa6Z zgi^Z*Q@HnFxZtZ#)C!b%fy8X2=9BA^C!;KGRGrb=Y!I}}W}V*bb$&eVwedg`aewVs zxPAK$y$?*+?$|kAeP7=^)(jDrRjns+F_|L4$^=L@^TR6Qbf3XMw(FwpDhK=9A0~Z< z_?8E1J(i-HI(xO-4+Xi+e!hj?C+Q-h+@+|Lm!(OylJ>>Ho43ipY+mm8hmZ|f^9-cq zR(AqUK_A>ucSJJ08&hPl{-4pYE2ne+f}Kra2_L zi#^?1?;4zdkG4x(f36Bej*hKhYc!8wh$ZY6g=vWvy+(}E3NyaHU$>Sw7YO#^vjB(uGyt%6m==$T=H5IGk#vBbCG>YmJtIR2K+ z?jt#$NmeLX_QZ(S?-S{XJ->NuqR2@u`(6bx(R&EXcpSuy*Rz@>WURVL-Itwln5Z7Z z8lT2Qkiuqx0yEKs>$a3)75B6v=RBcDSF6X32cptOaU_E58wIO%_V3~5QyLODJ8lF@ z&P=uBo-@1$DZ86$c0t^$^Qt#~YT`r5j`wY(D=$(hFpdtE)EV%#Y~(h<); z|3Ssp_Ncfm+C-s%q5Q$#XftK;mv$0;%3cI?kwdi(ff)39pM>`sTZ6j`#7Zt4`lQ+~ z+%*$q4X4Oozy*IqU0cZSca<65R?M=9)URXACy8t3fK*+@@C^dv-3<4v?0GI8xl5(_ ztB7jByKx?#Ka&whL2XB7J8v}3raZM9+Ag6E;IO;L3dY)0ZFBrc+A(uRF)b{AO)Nx^ zS+==`I*@^C zF?gI)lEYCZ?{**3&a3!b596tU7Th!@b(37jLZbz*->B5_3?V4A!(|l)b2;eP`e2V! z0nEmNr@Vetp@nSmB)4$WkTAhBgbKD9_xO#Kj2+D3)0sr#>+nPb{;z_iCh3`W4z+>6 zj+%keN2kICp>w9dL4qLJx&y7-V4;-5QWZ3erd8cR&#^llK}(iL`#}YYEvcKy3rM;h zGDNjQk&n%NrJC;K3KV&MKR$HFyuZ{t3!CN!i$fDYCSD@GBqJw@I5;7vVyw>*cufe| zX+Xu0DoZ<%+kBm^@g!O8Z~_2CWBii{{(p)K|B(~^-T$}5h5vfpe@KM? zb^W*X|3z^jiu!+v3xoG`OvuxbG`o4Ebi4$_+OT~_?m)E(CjQ+IovPb7JiatB!{Cz{ zB{iCdCan3GZmd zo^J>e%dUzxDVZVX%t}Ajo+m{YQYX<9a(?NYNe5U9x$?5hOi0MvvGWO4?zgJUsoHK`yp?^H~xxUqJ2MZr6<)gIh>IiJt;nZ7Mp9 zy6w-DsXHNEa}l?;;@@b?!M|{(YyS@9-DT8tRVKm<;JfrKD|q_*g9&d`C~?`?9G$9oDj{o&`8WwNk|OmgCqvx9O>ey1#?&orw(Thz1g}>;dz&^`p^{DnPoZzarR4^mXxN4; z$!cEx+b=E9X*6vPa^060GyqMU^4k00*Z=yk>Q=%bPORg@09Z&XHoi>p*VKpe_NF*bw zVwcxe{1aizP+nqBW&5ZcD@FGuYj9{x{=vHAc~8EhS^fvVf=J62Og|9xu11LHTp$yZ zJV=Uri$#41b_yJhjn$tf8ungB?5Ebk_CUKt$bV*L>+VcPAMQecj`IsGsO!{qF`G&H zm#hEtSShZ+ETH-66L@2s+0Ay6#;{GY=_c^*@el8N;7p5qn%aMX3Nrj)0RJzj0A%=~ zg7R{1P_M?6ss&Nl6n$C0DZ!LJ{|hWY{Q{>xj=e`1_*@J@hGe#ERGcxOZ_t>>&NRo| z#HIei_6?{|pN@f7^&S@Vmg_Wa_|UfZ=Sg zUQA*K#NfMsi06u>JjDCnX|W3hjK_^o;el38;%(5O%g59jlX|Qhch%9gq>2ya!*z_L zPud7!MFULr$M$Ox->hl)VFfdNgiuBQwkpYUamm>G@n8+s(E7X@_e^7SiyTE93;9hn z^gME&9r}pzO28>|ta(RTFazJtcC8LCk2CXCb=hv+**!vJg87dC=&Epp2GdRm+p+*W z5M>e!Z`U%-N65ljU75}_Sp4kD%LiRlz7?D3c)_OlfvTV zi5y81^%1_>ZSycA42mL^T}4u$Pb2xKDsVN)^DuuQusBqHy6V!7zf@#(qZ*)}{g|)D zm&=gnFF!77hIX;9Z9I%if9Uj2;|`<(BH4ddI)_hc&jP!V*;xNT22kqx&kV`|f$rjI zjLQ8Lsb!*fBABI?MS2#2U`0@-VVz!$;S=Rl%RoA=UeDm9aW;42gTf{Ua_o({v=p7$?*QN2Ru<6*h*|LlCi4kllxerZ4d-&X z%V%zRDAm3|TKOta4qd{3p(3_0FMZ)Pu5mO2+n4w`i}-VM*OV&Usd~S&^x;dD&&u-f zTGx&7ia~c1Q$mk<1Ej{tiL?9+1oAhNf5VR_SciQv{FuJ>9)9%*vo%C{**Zd257b-Y zorDZ9xzlI}P->?{NV5dIgv6K|5M}|%|JH8Ad}zR#TMh(=Ft*ph7eT|NPKSh)N`k_# zFLVdu6hzbu7~UUlte>19jn_$%IbIHrevhgf?0sUIhOd@yV|f)>`{byRzg-A46e;d) zOf>GXD9zz9VVx%(HExw`Z?#P~v`C`{qO3A<*_}-0Te^vW4T1fM(fpPiFYJ}D;gJcn z5c>5i&oM;J;JYj74_ZJc)De2h2=vam{?=e;YB^e zor{G6LDu~Wnn)-9ZmMZN+xzhM9dU5TckdA`s}9fPOfHA2zxr*-<_SdGVA@x#2oJnJ zpR+*+Imd?W_%{0q{c;J-xlZI0Z&m+e-hVI!`+vGZSSib?Kw0T5LR!SD z*KVew8)PH3^&(_v2b{<0z`HFRDsXyzE@({bxfPfj9!d~NIX1ZNKuvFxQzEG44oVbT zw-uC_|0ozoGK_4jadx<-ADznh4mfP}o2=B|#QE$Z+s8dak1 z!L!Yvk5jFm5D$eja7}Ae)az43@`OSlw=AhVUIwUQ7)DjtkB>VBK$K|HcbwmtWWNqb+^vbVbb|* zaBKzjt`fUn<$L+5?zG{+aKQuAUVaxAJxoIjR!$}E))Z~MQ+rHp&E_`d?ANAP5F{AL z+5|f5maD!|Ag|p9gj?39c!Brz;53ARYiSm!!!##1L%f%wgnN&N<9ze3?h-XPeO3he zA#>cq9mS^3^Bhtg$$G(b=f?Kxfg9XE$5%Hj!r~NWV@H0Giubzq7AxFflXOt zz}k#P;hjm#2Y*YM1Swg3Z);Gj>UtK}NZz8?-HB*(_j>c%^xX%5woiX~ zTjW2l<49#ygXQ#~h-2phwTs^~z0s2}vZE9PI=`Ha&B;m;VyjI|V~SUsj+JHiL7Am3 zXYbUpa5Eb3u&RL)<#v6YMV)C#PSuB`eW4L#1b_LqDj6eUjC)j}Y1f@RNX@CF2%0H4 zLibQuUCBpWIsXz7UkH!wZ$|s#`VHM(y#4bQK8(DM?E>Hc&*&RWtvoo3gMbOD5aIhW zNSbQfr}`C9XdmLhupCszq>EQeFIB@#CuICa>Va*C52B2>)+X-^qQGF-xVe=l$^W7U zMdDtdV0fR&vw`G+L3w};ex;b_K=bIb(#%fT^2CW4-&o%o<%yx=r30d;^3&La=BsPq z6D>{AiONd8Mpq)_9lJgWsllxHj{(<4f=M zQksI@hYHS0ixAoSW7!?RAW6sXxFaGfsD8r{g{J;q8}~lF0ACl&9JLND z7dNt|U5KNXsQDmlmq8$I@zbuqbcr8td&}C$u&PVj*RfzpO(~j_b`T_{QJO0!1)`os zz*GVRs5Uc32{{>`JHc!A@MQO{g_0a{NA~pO-Mv;fxCI<633G_e)Ty)LyfHBPsJ9w% ziliIGHSuK2_8EWpm~S1k5A#0kFRcQ~D&IM^p@vL|J2uznB|VtE52sVv=NB((+l0My z!1F1cUPfAhL^%meDd3Bu=uNZw(L%U=!--x2X&La@Ix;#kIxl^-ZoYCR+rB)4Aw4aQ zn}f-I9fE}Mi%A9ldVNbF;l3f!_8gsz(9>Oy8t`KmMRH216XKzQoPa%>5;9{TdPmn& zJxsk`vdu(fXeYNb?lwosB|`2L$cqn5jLc^p^D7Ks4D|v*436C^njJ^HViGr|i}5Q~ z1yi0CxYc*S)0lW=lF`Lu0uSCtt7Tm(R58qo@YRh0ok`~`6L|Li>kn{}n5gfMSM^n~ zdCGiMnWA}RDQQpBTJ-i6$%C4trHb6nKw)%RIFfO{s1_AM zY`%MHD|GVH@^~tUtEGa^OnD^OH4WqJEa^f<>|NK)j!(ho5+$tGrV|LB{bEbpSBE~_ z0LK@SzUulaGYTL>9w{8GxAlIx4Dk*r;qHMrB({$S_=|BBuWfwf5V;{ZV52YntqC%$ ztdILA4ye+&>sm}2?9NQY;9onBwbDwqT$Xy}3?;=s1L!aSiw|rifuJgji2-D1yg6Yy z=vt%C;`7<|RROTQO4}r*N&~`n!O)T9Somuj9?O7#m5*pX#O8S)X|dKQ>x^9PiR;Xn zR^{)G%~0;_c&>~2wuNC z@nuiaFn>&BD-qFLD%K6SsycU=g4+bARBmLHO=5WZ`YBAQ7Z8s)EW~MLFwyl}a`qDw zi~0cokZ&laVgXNroH|JbAB#09f5DCm+4|_(OulPWZod1gjV36ZA!({6La;^HE!}yH zKXSvt+2_0p7zJO+>75+-6Q&MOT8K^&Pp8aFE(b;3T<+49xL5zx-fS>kejDF4%IFN` zsR9FcW1O1doT&Rfd1>7=Y;J2xWiOD=RF+t55SrPn-o5CD)z{X{4Qhz@=*i8>4m+tw zL&%MMcg_Aj?R^VBH`+kKAS;%CR4Lyjpffq5d54z zBL+XvL%bn`e#`+*&F#3C1v9$N(YhiAfaV-NL*V0vG?l5E|2C(fXHj6 zhU1IuBiq`>`{?&M=tSLNN$l-_;8x**!=UX&g%XE1$c=Gym#wcEZ9r5hTG@mY2VEO95Q*UkC5yW}_TGxtQ^2{@T?@GuRP2S=%rb{r18pMvO^~eX2ck zt0XNOGz-3r^t1?*gsoE290cg(frzj=9=5Cts*sM0kCwV25?hul_Tvn-&v!r%Fk|*n zK>rIG-@(;24CpTboeXQYKwBSWP;a9V+lZH0rlqaK2W38Ml6AVZrTvD#YceY$(6d)= zS=r5I4l=KixcGi)_7D`rHx)`1cazx%fZs&m^+_(gkp^Y4gDqbiDujtIzH=lgK1 zZTDH$XIrO61WE^yuOeC=1=Ye~3+@`J;w^;Opg!>yfiKrS7{F_gETfORmtU?_9BF#{ z=F{PCxNrcM;vZw2qD3Z*5n;u%Djj~)oRkWH&XWr=4{aq_3YH=Z^f!tK-GLy3iQD(tM3w+ZNV(}<+p5sdbx*HUD~o9g$hX7R8F}Lbm3Q7TT?6L{t~T zqiyH$R(m6wkEJoYAOb;Wz=T4(8GDG{BCYHWSGE1LNpi~XL(|}2tJdvC=h`DqJAPc_ zQ_F#^@Ow-#@fV%p{3TWj2d39>)ElJewGkt5nl{r)mKlp1-##(o&!DmJ z|JeJ6TsR55m2?zSw$3LHZ+&X>hA2>cVyqK{)5v{dTFBLQ_UqWW@gq$s-)^a1 z><~~6%Zg|pjZ6r1P#O|V^@cpqm3w3Nnmj%lX^khRikBDhE@;U`Ud{?a{|-CG;QA3W zswI$tj}VZP`G7DLO|t{5wc(=$-BXntY`ni_cKLDp5+x=*q;6LvM1e-1*YK#du{Lt!-n6Kq5e&?bXF!U}Ci!c7IdB^BI?+J&64T@9XeAc$1X>p9-0a11xyRM?9|(t%~-(s z`UY1p&?VFp@31?OH!~s{FN@MXbZ^$QQmgYq0v*d& z)k;d5LZF|9Qjnp>m0jaGaRgy<&2ZKmbv^YDi>B1YkUl z9I3jL_B=l^pJ(fB{jTrf&%(!23@(NwDGzLdbxLxBs0-)o0Rc3Gl23 zBd+hvfUn(rljc+{e=`eah!I$wwGbHF1;x-nuyyn;WP2pbSU3%Fmb}W6tVcmq?I^qe zeIGkdkUj{6^l>44@NA0YvJn-CotS(+KBeiCUFKx!&OCWeGk$&7&N6UwQrtQeBBm$` zo7?20Rr_UyB}JP2)oalEGDBihDC(N6`+_J{cwl}f_3EPQTQexMP&nuJ<7Nlv=wWR!h$OUgvr-bb-wKz{ICws%pgh*G#;yBIec>t z`(ovPbLRbG`+$yLVVA_}sIv0ZvSZs~v&eqnmHSBIhL`W*$-Tj37OQ&~V6WS+r+Y^2KWOUx@ zBwt$CeaH2YvukoP^QI10k3}7puXL zbG8gTvH>0*d$3)KWBl5C^21F zp&m(R`Nz&;c}RYJ3Q67&TArG!<^Zg9!1A%j5^anaXtUJz(dHXjew$;q2w_5F=478vvgB$2@Ui=d-BmlqY|t zlj~o1R@HIc=d&6K0^fPrhq$*VCs9qoTxpkGnvMeQuh0vjKU0MpebbZCX$Si(HgjqW zmx%1r)@3h-sOE{dtNFSRX&&z^?BUcVLGf$OLw4C#-sVZ>0SHt8%6g0oAXBWAvEqBx z2qvq$e^PX*UFn?{n~WQ+F3az?((y~?C- zN6@&McV+lYdH*4^#4OOwVj*lZrF-TVJ?iCb$$dKw{bFhl7)*RzY*=^6#`Ez8<_*4} z8Q@W`F_0^~e!&LmfH_pW)45V6tghcaQ$Kz7R4ydjy^xvIzwo8WF+|MN_Z>ICvT%Rs z9iZHdiclAp$64b^*0~P3n-k1~0qodALZH5v0_&AzE;EHR6-c?@|I8a_);2tR?_&zl zJir1`UkGRZW?uM(dx zgdX^{QnP8`OfB?}AlaaDFoEm~6o2W4$i9Dv45`gj8m#ESU!1&Xw1w!i7mf{8*Y}Pa z6r#M?a@qtYH4~x}q@OuGesGlqKk!TC5W$>5H>y#_RG+jLPVqQ?iZPABI&7|^w0<*=69u9?XsMnSU)Z|H^Bs@iZe6cDNr$Jy>;uxAUV?2J(z|gz!;DNGcV&fMbF0Q;l z4K%KvA$|-XutiVOh%OGLF|2;@SqYpk>;R+$8-919; zHKtpzJyFWn+sG^tb>0w%$I+nbDY8-=v5UMq-9=(hkupWonV zdOHA5TlkRBFPRC!H%2$lK4NG1?QK85CxH@|DApDR ztFc@REbY)zs?imyNO@1-4zG`mx%E|X0!`WrmN~i;AeO!Ignd1_bx;H9YwzMuDLmEji~1IYJ?&w zwO{JX$JIH^;&0R!pa>i+BLhGYWE&nKRCo7Z8%P&5FM-RfGyp++zbRGBQB4!J-i~q4 za>TV))E1ur;GeK7lAl4GT||f8gO%yHy!@C5m&C$-iy{a ztmR854;Q`st*0>D;X)UOYVAWhF}_J>`wtj4mus*|TqwKCbrg%!x9!5o=!BM8uDU*P z!uPRgc@T&JMtQgG!m7hmDmFprgao!e@)&RrU;5Si4_NeHd*tu9sZ+HtmmVZe)-JClh1U^8UzYnB=4daNf<+$;t z#nvCp=uIPe?v991PmQzuXu*6}=$0i{0s(oz^=SHo{tX5Z1GBEJ&&uf%Ep|4uY@W7J z$#v)TZ02bvn(4nF0+r8z{KJ0ql-lYHuVEG&z6uHYCO>|8jQ+u9U7Ni11h(UBP#i+% z$jbHylY1uErM)V`AsQpz-wUQ-f4dgOyu|0o3~G=uBhnOkH_7L%7E?O;50?G8>Tl4M zyEbnFC{MhiY10R@UCAsc^k7(+AAo~Mk3bl1YmHJ`#w8*2Vs@33NU+4KH=;fcz=C^_ zDGCllA$3)8&?ZnMnoBFjHinl!JBnfYRBq=VeBoEMl#f<8KgtA;mh_WWTED4@<~7Cyl}LYp$%?42d%{INk%Dus}H;>PA-O7>lm zK$;qZwL7En!3$2Mm{z`D+cz(&!)}!A9n5Wu%YG8lg3?-JJ1cDW8X1eTf;z#C$nm`phc9_gL2`{}Vp|@G26_lvzwWs&{9n=;#j2Ahu(K;Mz3VnUO9%=`Zcm@Pk`8 z`PeKvCN;M7-N@yie zN%=qtZ#2!m0{vHyaQPB7DXPD<41Y)6YGNo;1GU2XLQxo6Y7))gTBjD6+KAi zD3lf7Sa1?DbcGy_;7N~nue9Z0v^&uFkX#KY$CDI=L8ktjTU6uBv#Th0TO$tSCS?yW zX(eld(xmraPmMN^yjwJC!=^%ly#s>ZqT`yB?M|yBU(*7kV)h zflgEjyn6ZOd;spGAPn%J%d0WGUN7)`z=@LxFf`rL{#i zBfR90f><%0S(D0gK&w_jRy1!w<5eyNpJzZF&Z!pSKS89A2lvUS++U<)*C+S4sF2@` z3lVF#{;ztg4JmZ^L);O#v$L%EvXISM%?v9-PXB&#!afR6-05u}^Z}}MjY<7#a@^e( zhiEL)?8R(3IHz%@%C2JwFFDGNeAm)7+x|~R1^5Kg*LNi&J1x=kG-&` z-;sIzZB)xuP5`*6?>Rr|N~Z4iEa4^8#V}TslLQxOLjYtoZcyKOfmx449~Nc+y!OkR zwCL3?w9PeX!g&iIn3494>93yyfWZatkCIalcMV7LxfERm-D_!1>a0#Kp2qwHBATQg z&^4qmu95m-pyu%?vRyVySK3lz)-}`lRx|f2)(|^zeU!12dgN=1TLFNqTj{JjILYOp- z!y@@vsvmtu+25H?|7Ml;e|TR59`=dU?ZG23OfX)oGqH@X#+s3t3bZfhArxBkM%2}4 zI)DQ(1?Mgj9U6zG2@3o2f>a)P!0Ar-SPj|5v$tBP6Sv)nd>k4N+l41AXIm^i}TKCfY?^kfhq>5Z!ZB zh210WKNmANiUa0UoOHF5P5DAmCy#K-{8jcQWLgMygCBCCuazx{>&wEdP~aC64%C+m zZRW$lFR5At4!e}W3T^5o=(BdySYm)M82` z{@iHM|7hb4ScLonS3SQR;*oEOcD;rsS_~O&K|E=-0%4m>K)#BfRVkY7hu5oXM4$6z z#K=g5K2%nd)yY0-BLbd{PpAT_&fx8s%U9^Q5>TX_>w6^$njWJ?-=^a>m;y5Q5;N8b zK#k5?CX0VKzb^u!zOz&S>;-5YQ0<{u5Zc5pAB|$^^6y9jqySH={$h}{pUNB5rLWdb z1)nm2W$i&C=SrywSv&_Fm78%ec;xD0*r17(Gl;2C1$({hWAk$DIe() z`OO#hDmpC~rbmbJX{o$yovgCtrw6AI4c#NHB7>Vkh|{TtU8|Sozh+vZJF~Q+0}ypT z{l5geK)f@hAq5ESGU$%kzrZkcJPg}dw%;3Kt|d{)^xk= zM{RSrS4n7YF+CrkqmEljh2W>y#d6xN+DA)J3n?Db9uTsl&w(ys8gL;a`_H~MH?VQz zhVnT-RQiX8>XPD*>Bg?Q#tISQeVkAk?9NIEZUwm{M4}%%7CabG=I_`bU)aT!rVs*V zsP=Fr6S7fHkcj3$U43~Y6;_pqH!S>!Ay8{_8ps<)=fwXPsE-GepeCOLG_%=;^~i=3 zVG->o|3x?DM-{e$FgZaI#)v+Kt?$meh-b2k&<~dIYFaj∓fknCt7h{G6ay1jJaE z{9qMsiH|bcsFPG-5E?qvJMz$QVsb`G$=Fi@`diCzcm7vcf&V{6R<{KkQ|R#^g%i4? z3srBYk#at{Lq{bX=Y-sj9-XuV8zgkV@im0o(7|npTRm|OusPi?tnirH_z70SaMK(c zna6@6t{2?K{X^Iioi;I=VeqrhStioZXYX=n?>#>uTT_rp+44%5Bfj6}+`q8ut-)mj z3T0LB>~S%jQ0Xs$SVB-JF>#aTyUQbIvtl^O{0SZ12?ZMiI`HhmM8PhUC>L}eTKl)n zRy>9Ar4ityR_?Z;EF;vc-p+F}i!D*aqwzE^d( zRQc)b3Z%tFNN zqK)29Wo7l4u+RQYhp6*`OO8ksJoqGdJzF@Utu|r!B`S$<_uF+dQ*saF@rB?IOH!}{ zCOnJ*=~Q({_#}C!s$FzMtrj7T-cMy^_#}o$^MOl_NEAHyBzQerIHIjKVfZB~iE#JZ zbu&|P590fD|9mV-^>k1CHd`OU;=bB$eOupsyBmw`vA=~WeZ2r*Zpnb}amukc-=Cu* zs(v_cInkJ8B6u}`Kai1wthC%XB3taY%iRNCF8LMC+o{AyDKwFI4$!E&B%ZO0Sq0KGmwa~v3f!B!QXJ?}34XZz6*(6hfX&sKtM3(2lF!KcGqs=fDt41zv&Y%Z>A^Mmq&wdujUqVJ#WVIz zoYknZqKF@_j1j&5h30=AW*?`{S=U2dX2KUx^Dzk~(c!;GqQs|n@3e)WFJeX8+E;|Y zP;gU|@tZvSA)%J_=JtD-sBj)G*!ivz{+#W&R( zI!5C#wJg0R1l&PKmf|1UK@qYti%gzWvs$vex3{chHs%*$jCjb}jco;i6pmxI58*Mn zzGAa);kM;hn%)p!QM~=%@qbI56&IBxP&mA_1Qy}O8q}cnNLY%2=LpKSr1>Y zSqx74$f(ld1G9%rLIgM?eY$yD%QT^@r>VAN11c{<)>~cIXrfg2)w8p-o&|z+mCjSm z>{$i4770eMUPbxJM2BOdk7t-B_K?O?Fr+}7Y`%QJ+Fx!Q@b>q#fECS-@$FFQUiqr9A?MGK-))Uig1fXdjxMB zFMId*hdy4$QVwfQV9=}pi!XsxiE4rQ)*Dd@GmTvbI?nE>G%*~gvFoUNtgE#~`7^K@ z?MCg$!Bh5yo@J>jV|n{KK;@XMIy;*ik8L{%GvLq9bQ~KNE9c$9wpJHlH`zJT)L}mH zh&Qp;0P7MF7J|zI6DbqID0r^-CJsnHC6xv zks~hj$pLH+u6TJd6}_H9eTx@jhXD-Gp9?9nONXi=VdxjJYnoRor|i^#E5R6voaNlF zBtsViPkf9J@~n%EdUQvx8yt(|QcvspLjopa0a=;hPhgt{eF|JEWj-S}>pU8HB~bK3)icZukI`2!y2;^Ys&B8a8d(EL{q@LYd?K|)lKo;ic z=#bC<1FD=z>HhhY(vpC5Gkd;8PoKc=7?c=VRWI-e^7J=P`YZ|VkQ|#UHC2YZ?_iiJ zSeB79_WvLFkH#k^?FX;`;MY;9%r)DOgR!VBDfqQF*BGyai}x-PjK#`I#d(}5Ic}+* z=Eke$6m^70;Hj|Jgg&G@AKI`rAp}htD;UL_FsJm5&n;qE04jAz6b9(k+)~x@ zm)5{Q>@b$=o`qe`X#yMV<&YpEFz|J!$d4yKb4Q1cw_!3^9HuA)y;uO5{xwBK(nMRN zgD(*gzE{89nLS~;#PVtw{!-|En!^T$EWCO(E@Psa_m93ttJHRly%?^p9$Cvs9U)0>H~&Pg zdcdB}eTsl`I@V`dzrYG>)2bO~O8e-ZXXLF>Dg_&)BW)8xJZ=0CIl-u-4E3#--|Lyn z$~oIfv=6wHZloTug?OoN7_Q?8bhnPtvgg>LJW3w#ad(Ao#v~YS$WKCj;hVSI7vx4t z8c>^Trk9!n<3ji;tkC)eH~_9-tQBf$yA)vt%gj4u1MbPwm_68dAof;AF4L|E70y6h%91*zA-XdP-L2j&vJIj>0UxuG~AZCcS9 zF^F5(P}{VmAQi|TQg}7@yb(rWVD2}$<(INIA@@l-J{}CAF`R+AnFrf?S)2AwM2${5 znTl6hAfD#-xDJA1;Kg5#-VL8?s4RO!IH_V&7WujN0HM%u-KWVW%u?TNmIH*>BvABrFlma~h+d z*G{pvY;pbhh$XkCLZhkh=d_5o1B9%^j8OzE1n{nteMPW+y9luF0`JYjnj$cB(=JVH zNNQx4UegPcdQybcPKS{#nSoge0({)sC!AMLEPYbc&C$Wg94`)3jbTDZ$MUm>a1^#R zO03SQ^>$2K#bRJCBRNi{57Z!4n+R?hm#+KDF59<3!?k&$!WdMD&OUAzt`@7<8g$p4 zz5;&)453fxo$7JR{3z8gG%p)=HkOdm!b^`E`c3Kha49ZXSd?ubR5SP)^M9lwP?4=n z=@&zPi9Bj2P9W@q^B357!#MirgcZ?9=Kgj2G!_W68O|Q*Zaf2jm%Q@W8Al-UX-?3sOu2XFF0tQ(0S{4lGWjDR~=%B6GY+v!JA)5t0a(!<~{ zqs~)ck!lp~ZkRe-D>(X~mK19k0lMlWboJ^0i&PbPIFvUJCZj>w5x^lgZuF1!q~25k z2^Lpe;z7XZ{2TMpV5xp8S{R8E#^n)Qbb2y{-Dn^2HJe8TiwipVOZ81DYL02krKp$# zI*YD!%tvO`P+qm9SwiL^E=hdGR0)lkVsMQ0f_}z^B!w`e z=(3WrkI{6_-7kq2Pict+JBZQ0t1frDJ;2noB`W=)Dn-aQc=yK(9n1c-XxL(E1d78I z(ED6<^1=GxivFZUeZC-DpeGII8%(Ub>iS`jj#1%bVd4JABD=J)VRkv=j(%-kfmVP1 z1(2`<)D$$U#*>ip9rhns1!^U!b=LdpZL-;#RLF&MfvkT%Y>FToXL`I{*}i|=lRg=c zj`sDY$AAN5*S0#{VYeVfX6c~E_&+u-!H58oO3L=o>wCwmcDi!t(Te9o0$yYx<1a+w ziTP)zH`rynW-xVryHSsr0hNG18SPnnyVLoTm}VGHR`3z zfe}$Rd=_s4B{E{l?Nf%Xh0#c`UDe4eewkIEPGjPW9rBu@dT>1I$!sb5G&2Y8 z^53JqWgmpmj2?f^kjwr*E(4pMIP=Yb-)Fx6N(9$4d8iRE4u6ALB3k}n=%NM1MC;Nn zN%?+}zrcsg*VKVg#L8?P4X)0t0A2z3KhLI;#^^X?rx2g8kM2!V3QJ-k-w!i$1 zcWgqty+~s$Hl&m4ONcU;!tO-WLF;Tp_!OvjRTFoLRy70BkYpcuI~wQ}P0MX7zT$X@ zL23G6Q=$jH65)vy1mz^m-iRBtFrA9(#_XN}x0vOkyx^9rNKwm(k;bOg{z>+L!hn#) zY)N|tmmcbVmIeWO)2Qy5{3*}jS2FwL2Ise;Ap*3jHCP9d5K9)(tSrIOrbg)mNHF;q zu`!2bXAyA??>Ytr_kZ_-A;Ac7l@)3^fuDEI$!`^Tmq11E$dkfGw{(*?f2?{*37pW1 z8Yy+MT7mKfef60YoF4kJ0Ddb!ODyYMMQamn34wy++4q~_;D&L?GXmd{tAK6lpI2~& zhqP+Rehzq~8*fOhSxsMQ?_L{%Ij>1)#R&f%>}MJ6L+J9=W`3`nVSo|}@YBKi9~un6=4jlHlq`QmALz@5h@d zs7^1J!1S1hTZuG#W{lIBtye$`8Jd1To__n}T_g$yL*Sfk)lLa|OeQEC@KtsZRLJO0 zD+~-vFcD!L=rASUf8d{6u11`g#f{kZx?$5!%fwBt7$@M94)l#ON1l$E5caKn%Y@7QQdP@(l)UTUm=b%mt#$mlU6%o zcx9@Vkm$4c=c%gdfUL=qK)cZo*O^0?%^=f3A+;X9^=Dn=p*2%(a~yb+s7vLP?6ojY ze5=1XYFzN3;E3V%3G?<}Ibw0kMmi&{dNop0(6mPVpQUgxibIMDV-=fOu*J|s%ye)6 zCP!y8Q3XI6L1z9akf(F1R03dRv&6`#g|I|8 zHzcjMuC%0T7;AO-Dq}g{i?2S|;U|QTlbsAk))@WxH0KB;2i?&Rn19G-6i$0I|9D~# zK-yh$CLl0qs;4YxhEt+@mV|vF4`Xph91mZ2sbB{h%)L2&{gU44@k7}1m=UJef_g4; z=AEZ#YwKw%SE^t#(f2W)nPp_=wBR+~ke_~l8)4%blb*8zy)JhCME7xg+H^q3ZcYC= zBRg!6iv$CTczELoy`EI#ETu_+{u8yxL*uVE8bzSq#_p6dtYi1qa;u-3c#z3ils*$b+p9mfp?~)35ACskZEX*PyXsZ_v}T{+`~L+T{uV#*+-vR8xIPm9 zaL`-r*1r36clc00!k_*GAHl2mQ93`t!+zJ5_SP5Mu{YJAF!)B_w&uRA9^ba%{jT4( zoQJ|+?N9x*2=JXw_S-i6uWW9Wug*Y)+~%{! zn{!r9(l#!n^`$u9Q?wQG+79?=sSr4%C(aQpVv&*$*2o zEE#MTf}Wpwr2(jlA?k(gGa}Nnrf)@USz-nW5{r9tL2Ticx{X6*7PeNFV$H4`ic>(G@6c=kkuK7QfhHohA>K=9B{DY#@8(d3w<(I9+A<OtJ~GTM6o zAL{@cH_XjIek$=lt0KzO=#pL9<5Z5n3V*WC$LvWmps;gi4JB~x0oo<{Vuo(?yVJek z`tM+dr0o~HSVuU9Dc<8OLV8VYf!JSI+xbj$Ve`8?Ak`^&*N?4LnuG2jSb$jPj?DqY z9x8m91Y`UKo7X(9ybuvk7{|#G^`hMrdS%iub=*23*lMQ%XR&WZM7EW1=|>h9Mq0L5 z{?qC4JWm%W3K7$@@u_}Ophs%2zA_Gxdj??b_CRn}*|ajG8{LuM9kN1wB5nZor}Xzt z+*KAlix>~l^> za_w;3vk-wr?fxn&N=Ia<%3Qt#4X1>L38PDH`Itaf$ZKyHd8Bercw2ucnPNK}PVOX8 zQFTFbx|LZMXy{w(3fPe8Xe2?}e-Q)K;O+rKx5Sk`!E;UBa9;%MF(#fKb;UE{dnXtf zdbik#q5eyF)f%xHOJ=clhLO&9Axy34gb#$RsRZ)ulNKY91sW~CjZ!gD?ux zs=98BJYLsXd)OkyZ9ir2$wN*y%Tfz3@2|Q=+;kdJl))yRy%vXpJ2u1ivWF%$Jad+s2O_lGS*PQ zwCQLp{p`XA`VLr*1z=e(tT@hZ+>zC67jy)Vr~xQUQ<8Vugf9ClWyU0c?y4`uM+01A z<8pVk%SZC$uYQa!C424`$>_P<*CxRq$wOQP^*i5*$@J?+VrLyqs~-?C1`P8uo_4qI zVV2`gr&X_T_HM1??GJ(8{X~HXQzEPO&3-B|ghOkS-q^uE)&7@L1Z{Cp3;SHZ51ySr=z`zWp=`MEM~`mwm4p)WE(_%l?0Q1#S1|gN%9?Hg zP<5%3@Fr_i&LpA#8!Hh79zs+9WBQh{G(Ip(S(b4UUss1fx&yQ*XHO7;r-Lp7Imq1 z9FOQ%ftc(W86#XHHa}JU?O^Qn@1!w4v>6LtUigYjESjc<{{q%$F0yoz^Oamn8t@p! zJ>u3q+5L%OGiOPf8`OCzU%u|nvO{w9;iY?J>HDx>HgvH72sX8)=$n1XhcFD z>yX6f5^J>YcDpqo8CP3Bigx48xU|5cSCYK&KQJUfYjmRCT_XQiuK=OiIwHxEXiHm+ zD*{_POzixrTp&UedTu@iR(#tVvFhgI46JANn~!4G*Y>1}g|M>DBLdpRa;i$GEQb@p z-P;^({kaW`nbY9eSG#^MS0;~~`)dpxD{awydNy_1-ygYA>dKu@haF;>qeo?Pvbob* zxE%)t|7%jNd!$={7&C@9>1AiaOtob9rO@x(RY57`Ew_OjavNw2tEi4u#`G`2SwoM3aL?2@cpBh%cUHpSSm6n?qAc> z>9D@De}61!8M>YEhfdAyDr@7D-b653roB)+i$BA{{S2;qQN=))w<3dz>rI`m%d?SN zC`FCDbwI9-e&SNh7^)!iC_vOq2Moe^4vloRIkBbdg-rCV-w9VJ2vs}sKA;4Hc*qh%c3gaEnbV|LhM@dW@BR%I&@ zh6pm^?FFNX5(NIhk8}!e2KT^G61hXTods1f+~SE<0#R$iT#HQ<~;xPtqx zE+=1z-a&gmeYJIJg^Q6yl47>{4kkNxuID_Un}q-+PqG9y%tPdwW%WiHFM=2ZUDDM zY|)Ms&q|-ULs=Bko_V^n?NtS3nAfGOwaSR=WBkj?jaQ{$0aJQlB&gEtT10q*65lHy zUL@fB*B+=mQ7Rn`kopg#%JP2H2bC+YGZnwS8KA{`j`q=>s+xK{c4#Ij1Sdw{3*0n1 z{=PjirORY@Vn_Pc3fKu!?0&ishwr?d?5Gc#E2;T%Z=zg<_&!?<;-uA#W8hz>Qv)bk z+IzkxOO-LUz!eKhBK0f4HAFi?07WR-+*p}wo^?giye^Y-);4V43f8?BAdOFZWojCE zJ(F|SExd3J@a=^{KC{L0+U653Mg*c9A%%BDdzHFu;2%Vt7;poqjRxOaFRr}EpGY)4 zpo&?^;f`Oe$%tY*f;TF|*mH7bjA4kCp%44%bSSy_o`z`qUXgE4HG1=%+mRwuNYAA^ z7wJT?mk}wiq7;nL&3hV`fsN6yQ4%g%NJHBHX#aMam9i@j?xY+JQZVlxVo~*j#w`)0 zdoD#LUvdkd05R(P0s!5F02wF91mO>NbuEr@%^Z_1Jo9!F%nc2~r7lzs${JZA%_)G) zDMW;eCXe?*$nVHpW(gN6=}IMLwAPiX#}Q_@N@(uSe^=-poBn@%?~-0&nZ(;?JummD z%!bTY#mCtxfP(umc(dziTNqDqO@iXRDA(z;?m)7X759PngPU^FxU!@&n>qt347|nid?D_T~ERL_QxAnC6FRYUrS6G0YzC0kRm( zm@49{9CUS4GsO@M6dE)hy^VbNcYLO@mGTC-GP0ulKi)ob+cI=HMr{6k^r8q1^s^rB z7PA}neF^M7pBjil!zVGku_oPGKC4mb8vOOdhCLH{Dftu7P7WP)LY(35x0`c?1|Mo|ERs}kK=EiQeOE@UvoUbtIz>MzF<$rQ^z`(* zPmyIzc{p8q5Y*D6Z62)e_^>%{&}xlDc3!T;=bXhPY(3(F()v;i z8V(d>xiy(OCYegE9gw)@5GLl>ld~6FcY+_aID2GbG&0-px>B$8C%d;~vWj(p+977?8=X9!CJVzx4 zamvdB?arbSr;i+!IYPF@Pl8`AuyWjcgP2n5wY|!@jWVGPRdv&3x0yIb{Y4&{D z=+XAZ6jpxG0;F5xQCoNh-FFdU&}Fv9W`I=3il%o}4}$l}21e^~7%5KdAcb zLHP1OR(|RtdNylY#Nww!eq8bnpdB(Y-vOrZ!n+=TaZS+HA>A#Zjs9!< zo%aQZ^kwsD2~X2hc`NtFJK?y+3G$TbIx0=k5NzP3b8Xk(FTCCoaGeI-QcmwV=Q*(h zdbw4>uYO4S+_0G3ef{@==7x}AYk)CxSVXXT=NV7;lISup^a{=!oDpX0L`z&JZMF|M z|0~_t&&Occk(sV&N21nhrZTV>{*N;MawCm%i+=O6iX;s6jK_VB1EoqJD8deeUyo_edh&AdJV`Ak!1 zbpsC?2<5O-4O!;f);pPm0N&WHrBDYiG6#sDyQl-f@`9|-uhk7UIWpcOcP;dajjRF+-*?&bFO--xMhEIyUue!ePJ9(fQ zi(5ihuEhP?gtmKOk!3LQyigsmJ%ub4kfK-1dECV(S-snjZTCmcn9kUJXzB@`zr%|EOEqgDRm({|vGnbSSho(Ch&HJ)vUC15f>#-jnT1)*CK=j>7Csrgc2N5Q_rflQ zEqAge8!clJrU}1;_-Z7bO%_cs=wXa`T0jI9mN~giUd&LqSdArS8eqVh`7p4i3 zR{8v~c#PISs|DN7>MvvHv>YHk`u4&7@9GIs??4#{q{Tu#!8aRmIMQzbUUt;Q>H(QW z^6c53kgHZv5NH70N>Zy7YKFwM5YrcuERV*%6{IAb2^lCin)1_b%*fTuBMZU#u_n;s z|1u`%)cN2g4Q}T*Bf)xM-NxUSj)>7kx z!U0a!nX_~-<})Wm9(c8d{a!j>DyMjUEOC_M$m=0M(i@is>O+luv7PXBQ%8$3qi?VU z-A{cYY?`>)YgrcR2D~VAG9k0RT^Sc(u_^juos7KJL+P%bo`k34EXY-#`g4Ba8#)?y z20?3pO2Pz{ec>RM^@0Sn_m2pQe4ZjTWcROL6&HAYxsZJTieMuaLtK0~7-QiP7ui}{ z?HdLItwVVabuh1&46^SgX{?6@!R8s{N4=N|JaNR#Q*W96II3qLB(;$Cw6lL0D%Ga8 zM}5j_xeg^Sc4g>Jv1&S^`x+L`3j623a7udgnHm)8qv0D2HVDB;Na<~~+tbFmoIQA) z{tt>i@Pz{t@d|{A*C509?hVV~`^}99ERZLT-e8Eq9OF0XNkT zKcnFdpjo;|#5nzpj#ltU;`F80oJ)9$6c)_9if^4+ow`>T|?8C zx#ri3af=bSnuHaWpe(XN5{WUU%YDN(J1Iw+6p0NG8zu-$Zpd~S337?|NPPbU#r=dm z{@w9r%Vb$x|50qWtVmVC7Ln5ucM(_(2`JftmhoN`?FTw_ud)F5$Un2|^VNzwDkFr& zPDU{372M}5o?L~YNPhr0l26V1^KGKL$JC1#-r3ZbC?1V_MyfHsmIbU|mmkASn_IlaCV%}1fx|3=0mu!mj z)gf>;QHRAd=EvTB#j0R2%)q$7NPWzw6>$N(XoBn+5yZC8vR$p$cV2C{!wV4Vp zo>*T?c|=bwnNr%v={de85ZjRD{~Ws~6p_OY%{kgJ8Qix7-@y{Xrusj3S?6kqp>KW zJeL1vG_YnT^=@-vRmeu+aRA0l*c0)I%K=xTXI!nyrX!(ErjUsWj##L7bkm3}PV<@HqW^4o}(G{bw5obR7eS=8rws{~c9 zn)n(Pt8oP2gKUW#dzmks15`Mx7JW<~|9|XWQx)uDqH2TZI7hNFy2>H1pf<;v?r&); z5B&5v1f=47x1xhFr%CfHfdedoAT^b;&S@*s;r5amuI<%LC^3o?yILVJqNvR*YvEyR zQ6(^(-cM0h(H<2rZ=*XiKlcUkFGWQ0G4$1Ei5q+BN}Xn^=*~~3aV22-gsmNAo~d@c zmxz$>afCblE2KC9YB;yT3{qLU^XRFtxN_{zMOWFm!2fg2L%T~X8v#WxOwC0ARs|G2 zonQe*k2(jfJRSAXcqvg{8$}N5zf^bVMIT0Ii!nP!597&55fpw?2AMkqrRNQsq+WaQ zAVXTy6X5EfTb+lmuo=Gdm@5lS@Ce6}FBn^@U(4+{_sYg0>&C#CYMwD9_5*0I&9*N( zK!3G@Wo_3{23GxAhSuo`{_*{jhJyPER}g+L=bRtTc!ogh-pV!ZfiX3FC%nS()hju?q|%Cy0B5k^1%c!mn8R@-SZL*EKM^G(hhJf2+} zD{3?a=aykEk9uB|8GbSomB{Lye4MJ!QXY0R^tw^kA^k*6R1Io8yD$=Es+INvdQG_; zAtJgk_Iok1{~}4N!K|ENoXUgUIa&@FT?+@xXUGtz|9@x`#sR{XkMV1fL`L1z%l~DJ#&^-@GYCVvlsg4&HCR z5XELTz#>=>9v`yf92`?>^>{hobs)MZirKKTch;odTYnNNGl}gLkNodWa6gaT=~?^78via>wpA1 zNfjJtM5vp$?CF_6V*R@h&ojFwsfU`0VUBX8{1~jWoWL}iAq#|PVNT-6zy!`>R)QUy z{&+I=+o!D+b2=f%`29|E%~H25r1kxDXb+0!EA%T>eLV=pnMy(f(0GRcbsr&G(A(cv zKGpfoVK|Yd2FX5^Ei4SDK`Hzrs_CQTuM!~jXH^gn5{n`7*zBBOa2gWf7;-i6yH>X@j>o4my==;g<8vWx52S3M=a0V5(a9sZtXt zi>=xgRG$liwt>iAW(@nS(3)=@ZnN(fBTlH96^=m*#bNJY>&5!LyE{MxhpAV)J!^{J3Bq1&WFvy!`pnFe&2 zUI~SdmRYx<0$g#`ujkJ)d4w}nQ1ICbxur2DzigE;t3RH&cQs%T_k|>#%lds0u{cVb zM%1`(zfaH|c5{*OH2hbb_A_};*#$Dh&1mpRrHo|&GS+R8x~9z?OyAUg;i3#_VSm=jHKldK8F(XC}S6oum_jC{A7! zqB<3bp7!Vz>uTKM0fK*hT5(h(nrWGmw%Z5F!AE`%3(0vw2U=G$L=z{*kY|<1(xSo1 zIL_`7=AMK{(W2Ej{zPeDH;yOX zq>yS^0RJMUy9jJOpOV~aakdd-k>3fFC-j4rKNwuBhD^A@u>K1jaKg|7y>o7*5Wp$t zi&hxtlc1n)T0@g16Wpzo@<%tNK$PEwldT&4p%SH8tNuZOLhHY7Q9Yi6wP-{+hhO5x ze2fcDxJv+?k2pbe2?;1CX=bYo6{{gaA;gAjgLxtT`A&$GJ{;u;y(75#v z;-UpN)jc)J5cE*sfZu2sEaqq$qz8Y$bjt`%f$?7Rk)nq9wohCkrXe~hyj0Iq`HIk4 zSJf1F7dVW;hCkV}ib1^`MKvjdVwtV_6HK4N9TYD#@U$gTlxz!|82<^W9$1&P7jJ4Atx=;K3(&5`2l50im{>GaE`T5sCbZ#EpZp;B&D%F&0pkMW>s* zahp{TmC~Ceq*SA_1DrWlpFLWjK27*VMCRb1HJQy8(vE{}@B!>kSMyTACm5tYvE-Bn zZLOO9p^xBIno5zO7>$Hax4cSuIgIrxyA6lXQE=_`vT_}r@p+*BRp zf##%xx4*=zK0(Ui|C637*!1BjCW( z+K*$*(owf(Rw+So@|+a8yoz&%&)&)^+daLZm3PJV!BJ5d4X%}Ut!{6eG$&e@WM!8@|YBg7FzK!Ot~S6eK_&|1@Q9a zLqe?Hx)3Sd3PY55Lj7!}$|-TbL~~0RHK{_gzf9GjYHI$%+Aq7lv(NfsinN)gN6n_}P*tQQe4V_r4M}5Re2%A2+x>f+^FyxJ zV8{3BS`+tw?P*Q+{-lF!sMjPgg}g_N9;sCnmh)a^{-}i%_QsF#@YwOBZi!navQ(Oj z$^k4#6({rcW^?#>gj5#Ef*-@;Y~@VySzw z*Qiovct5>j(JC;vRmRh1ZFwru=4OdSvaG4^I(}j`2Xznn^UH7#+67zzOq&~3Ys8Pz z*xXzTjq%^H{hs4@SEwIs@uIrY|7O5e-PkAj_&o=Y1iyKMxw2L8S8D*92!7i}wk@B7 z71z>#8^O)anb@Cn#U$tzum6j`Ap7X3@_&W@kk^whXVo!(9;w;&MCBH2L1)Q$zb!|a z836gG$Ek@{D(HV;Z}^5B`hQaI$)B7TRr|y%`qjPVJ_Zf-zeocu;HeU}P!49RWBQ%& z=%tR%4+=$_y?xs%yJ(qY>ELJ$_GTjgld_po+9P<~Ye)j#HyUxySkC`H;GXPf&-GS= zGj1uU*5J!g%!$QKivA=yVV2@fUxva0c`0v{<;-{^fYl$6Uzk=)5 zIgi2ze>?8K8^45ruCGtsuUE>HtFzr-^#0suOWr4o4OiDbe?$8;K8Ct_L*H_RH(v6| z|D3G+xHBM;N*|xApWRe=YhikQ6!$0<7A|;s@jVC!>OEzrj+cr7M%ggBHtaW^`}F}d z$s1{0XPMp)G@QD*U3f$O1KI&C%nj}tYn$X_@Q4Ngtd%af5;AWB=;WpB2})T3iTf?Nvah@CFHfy@OxI(3*c%znw7F;4muT z0bwwKlahNs8%FF?rfXfxdp*C{O;|N{1_<>5soA5%+JzU3u^JZ!3B_LezZAL2!fR+6 z!;0~ImH8Ih+TW`P6RLB%dq_^MfYiy0i9*} z>!Q=i&>Go!&rJ(I03mo}-bR;k>yv^|LICQ_<%EIBq$GuI=f=#evOs*JpCq;@F0@PS zgyM2K4IO_?1@RvSHR&m-mywz^faULr=YI34(z>Q|!1Mt7Tbc&y9Kv2LJvRmmWFQpU zCrvFA;ga=t)8UU|Atmr2S8FNAHO(1FsjZ+pOzZc|ypeA7U!!F@ee6S>6`0y(nXDCb zr&)()wuoX#3KMT8#naSy1VJ2egj)bkKza=&?MTW%g5ITu$x)q#hJB*rJboXB8&T-5 zXRNW`pNl*Xu2f2m#hs)=1tK$AjAG^ORdUrk1VyruR>GgyBb{B;aFE$}1)Ij+fl_cE z6@!A^Fp!{Rw<;Hujm(XkyA;y^@oq^Q2p|n~5x+q=@r7@j-N0MZrT`3Ikg|DGJc@Y= z%;#r-&cY>z+V$+Uy0zycCcAnUfvXD+IsaSI}n76VFWz4uV4(9dq8eEq{=x zUX&$#b2#YvHVfm3GYL$`iiCT;Cb+&ummI@y+_td6ZXd;lLXf*qpE3#_1UH6hDF$?L ze^SJDC4M3s_V)^e?Rhd7NZjy#t9?jflP*qnZiOA3vRQ7o|2gaFOU{Z)s#st@q#T{~ zWa7XkAFz5>A?mr}#a_=cpwd0Vadj!x_~o@L#Ss*yTvV)NMuqMhcHUcV8eBFzzL`A5 zkC2qTsXulT`Vi-F*F;EbTpsA!43;%7(m#sWTavCM1n!W`M(Sn==Q@~4)qv7hoZe3+ z<0RCfI4i{qsKTH)8mpo0W00igg4mGm(yUPvPRrDL#vz-Zf}SV8=zB`kJI((~sUg^h z5K1^x4So`Ibw3sOFdZ4>|J5LewW#?NAbxwqMhGUX3t*&-uzI+4}XFz_%1;JV( z$;266JNm%2lIwBG3W4i(D4W}^SF3?K^iF#>{lpIgY_rfp6CMnon}@yr@MRdAHi+H+ z$t*kLZRryOocO&dEWzXm;S0na8dY&{k6RDmXp3s9{zCfcWLLAPLO4;sw)^YPG@DTr z+{I2oDK?XsdgukTf!19l&*ET~p!5W_z;fE%tO#R!SB$ApLR?C=nvj$4+=En?pwNc_ z7|zoeS2vmQtWG89TM`yxYk=2gvx^gP*i|HZr0)(X`eNbbSS}z1NGgBx;C*8GD3mFj zMv+H3R5EcLBzt3iRXq4fRh=dNiPZae?r3(nW$kRir0pvX(!cSyt27LQd5WbAKWX-_ zCnfnwEqj5OpsvRs+5CktSMG>;<@RM1hxBPC1F%-R!_ZW%-CHF5iDL4Di<>+M&jLUt znHqiiXZq9#cTbDOemhm2v_Gwnc40=e^$9L{7;>EQgBD%R=b(A8OsWam46;C`dB(mKT9E|vMy(}c7| zxV%j?6|E=Ds@!CScO65R1!-94g)wzYP1nTjlg|`rSjQ~M62{QpRJQa|&rJ{>!w45O z(s*+ybEcl?HO4BoYNj_D8tA(#UoDUIhQCWhi}Y@A4H~V2dv8P0^F_HVvz~y+rf38~ zWF;p|!j^{H%4az1mb!G*1)&E0r53v20&h3d&U1lhhWKJMxi6cRQN+ES!pXEkZQhd| zjYs1NhaEvRtrxR^gH;YdNigblH4R~TOgz*61b27Vp~u_dS4yy`1f48rr}CgD(l45j z{mXxwsVo|29T)t^Gp!E$D|$~2?M#&LNu5T#N$u*jFb>J74m9Whh$o}6+9jJkbIR#O zMPay6N#PTIqBa8Os-mXn@)UFL)>4I4=a-MBuv``=rQ2%Bl*e=}dUx+B7yV#fa>uSE z2K|SPY!a@bkNBJ1uW%j@oW;E-H5P>U?y1#yS^BK^IHb5VMIxXM6dY4$;xOb;_6k2Qy%0@u zJ=Y9!VdDfW>CH*9^!mOW3dB7tnEi<&^Eg{K2~L^-O!0xu(9JY zPn&ufWg4Ls#=3>$hh$yM+w}lOj#NmaJp&J0c?Q?v?TB0$F^To8tSH>aaZ^85%Vj!; zc7)-7%*FlYuOOH`d)Q({?JKDfHzQQ208c^;Rf8alqCmlKc-8yG%22Adl5%a8?5^-= z3#mJzL^`{H#2}uMbcwnet{WX1I}OW`xtj2E?I4uHYx>&qYIAD z>Pu?uUOLf2`1g&bI+vue;o&lMi*b@+TUM6OJ$C^YJ9CY|eza99b|>(PvbomV>{b>G z&4~Js7kuQNYgHcVZ72b=yGPIc3+GN*S%FOC#gOYbBtDngvuR;??|BYsNPq+07bg2e}sUCMzN7* zoJGY*@n0mPI2`z{g;4Csp)RfSp-?^17ZoBb^oP}rKyqNe9T!9Umi7BM`3(-22v@~D zVH@Vugw)kAujfN|MsSbthu*=y{d32z4^WcjT~5`U>psOT0{in`-PT$s?VW zWyD0pn{{xvz}%`K8=dBmg3S)o=EB;^G)&Zi!1>^Wx(u=K*lkXmdohaXyt_7s^D_xz z#9ud7jf_Vr(jtn8RmeiMI2(+5Xw!pgn%^d#{he?OFwo&eUK3I>XQ=C&1Rq-2GD{>c zLl!sB!F@{y6Q2TS$t4kIKwTxrBXcBJwYVcQf!+lxK1jk#3mvp(P%g^IJwSRcmS)+;;XX>H4IdHn}(AewLTWtP5-uZ>rwYQ5ovwN}LVfB$sUI#nF)ITnv@ zb!}{1ULbXrxXNqpJ`9OW!Gk&dv?xOj-ZCMSMU7}b58Q6mj~*fG>i+HB$EwSD*Dr(g z**y6QHh2SSa?tkddYdEFMuhnt#7nQ6_hm^MfCj2TI@b-SEK%O}G4FK5SyCjEhIzw1 zID6hBdkX_U;El0gAK#|gB)!SUDQG0_ZCriY6~E8FCp9(Icl1|h#fTTBZ8fUqlbL>4 zL;AULC$1emHk-G@W@y_}$Xh1uLjPqBpIJKz0>~$&VVY@qC#WvmQ$t4Fi-uQL`qF$) zxHFDh1k;HRX8ED8qvYTx#FUpqF13>gfAtuvXM_=56(WU{-hUxHUtyCxyFS9N@;>{K zM&w45y9tEc{0x0XI`~FyoYmDTK|~R^9&eg@%Rp#E9&@-Mg)H8eVd4RTtK7uFtBU8g z#{U;}CM?^R73_c8%`TTOd?YmPkxYGH6CQ=(k(>X)=u54^Gf0JTb7{w24@UdyViKaB z+STf`$M-WEf#9uIxp*L~C$;&Ejrx*S>LLF#lRbXspOjCN1>-rCFt`Ma`sy*$;C)-2 z8?nT&Hc?ei0L%mbkM+0JIX>V}hAGcWArU?e9$v<1`(J{m=RBMk%|E!x)d89Oc`rL)LHSyziu& zgSJ&#gPttK&hjm}8Pi~!UGPHM!ZIZ(Ar!3pCZtLqv5*c;dF`F}hp7kj)ig6yEI44g zxN8(6tHl8f!+`iP77Z^CUyxg9D)grKZ>vl%6zQq)t}^Cf{Cy)B4!wGHp;4k5o5i^) zM`bMgLqhKySi@0ZXRtz{*~_UD?c$R^YQq=gRH7hT@K^{YB606HTN(DOv0N!#&k zpHajW#a}u6%8%N+aG5BlDnm}Qf5ErcHc7N~FX|FlI+9$wfBdcp>LL=@kGMvMW=>rm z!gKECuJ>>BbCKWJcC;<*<8D++ilD;m3{|#JrxQhvSIP>ob)+-@qMNXqXq z$aS6n(8c>ODq|+A7wE&4=*1{A*?5lOUHoF_*9rPg&}Pu0posub8|X-b*9RLKNP4)F zFHAVq4P3atMjql`B~R;*8M#4_wtP%p)31_pOOYdw=i#%WkSsLbhz!clkKh&=2;gTEPTgoS9^5#9^xH>#N_V5`k@$ zk=S>4%6!-2B;gx6{jqo$Ny_p|+h|-m47ty=rdKpJdQ9aI5=AcZ$U#Nf(c65CFsh9k z>rHQi4_#<)sI$`@I5A>x+(Rui$XkS(<(LOQ8Ih*pc-9Tx(I}c#Y0MWErGxQ}gblB6r!eXGIGP zNhx%3Cpo~qxp5oZ2qBWIiagmNSC`T{Dw|TrP8QjC_s1dcyXD^E+twiM`7yG}l9_%h z;P6X*#!>^j;ar~--lYk=NGv00KH5D@ZtLhHNunF!^qe)#qj3La>(3Vrepz$K0wQx~ zC1)>RJy=bm0u+h9iL1Y`oxsOacCyM1^lrf>jM2EpwJ)Xk0ahMS9>sQvr{@@DO>UzQ zVp6?i91h~<$cvH)7~<`}CFIp2t+h73YZZ>yVT^hB&DCAnwKGczmN@`I>Rq*sH!XgS z9wAG~v8eL3+Svz3*@5uP)C(N0_84T@sYY=hb|%}F#u^x;sR zmeh^p9I}7T1xFaRmJyFDs|RU*-*~!P2O*=%!tw-F5W8ryhAdq>HA3hMW6_tzD@xz{ zo={y)fcrWzQu+sIc!@%c=);SZ9j`#+=JTQ49hBBY`}P|n>V6YG2YiNU`H!@1LF6i! zOFFbs)=?fkQIEa)&!3zA3wsiByVO$qx{BzmGy>PPjF$rUP%N3x!o_k*8RD26S>pJ9 zCOXHN;bU{@(2uzk+RK!LjE-@B>JWRZFVM)vHHj;tgP1%CWR;lrc~0d5{Ti@GjTEh z_3G}OC%uwaF#2JzD|GA{?G;?D_GL&1QiyCmp)S@&0oKWo>_BE~F>m&hv~>>JzQg8c z`@=o^;q~;@w`+-+k$nE6x|BCzIM2N~>d9E8cTBGDs`(_RI7eC@s0&nQ{s8)8Hfa@dbAj5S-Zw!o z%L~%C@Cg+1A4_GJzg_-$K%QEE-#Mxhhkuy%qFT$WUjww5siYilWsVwmJZrstOd2bz>C5WEt*2(wZn zd7ISx`E>xtn$eET>?V%DfGd6{?F_8XE<4Z4#z`W+^=9`Pl(?QlE6jYUU zy~eB}J*+(WTh)wh+d+`a+8L`bi<*@vpb3c5E;hTMTm2gXgPR>TP$J*TfNuNHav%}?EoJbPE|;>S1PUt*=fG&9Fc9o>k>pQ5g>G-krMSpcq*|cGTQ>(N9MvxB<(!*0LiTIYLM zQOf0ml5}8z0P7y+crIxME9uH2Ei}#2TiPJ93HM}YL{;UjH{GD=2&a2Rs@3V!Rk&L7 z1RfHrCJ*+^AQ$J~<#w6DdkkhWw;A^71*L;3cv=$ozQnQ>T9i?pUA36G3nV4#coa>o zHgq7t!DKo7z$$G^0oK(cZDFojTZR|G>tYLu_?B*_%{8%hM`N({r)E9;{WwjX7a?|n zwIHyeFnQC8Y&m(gWKM)>O!p#*Af4T^;E%oM*s94zrvz)#fEX%ZNA=7L(tTP2xF;Rn z?$~S88g4P#d;dw#O7#N@P|fc7f)om%XV=F}7<_ug}ybO_=R88WdeB^u^j7bbBwtv&U88+f8fHSix& zLBe~0un$p%Co} z?C}epvh5ip?q9YGoFgFfghqJEW|wh=<`+Y1(VG|SZI-C64$?P!adw1nFDyCEAo~wb z!br~hn`Q32kU<|UllC7KEX0cDmEOL|@OK8CoKGB$oi+rGbHI(jIXq?#maoez)Y=qjvpg6=-oAt? ztRPHiI>w~Iy#yw|S=w^ABF8{kL%!1QHIAxQp2d3S-ucyBh;bwx)+`Or8{^gY-4=am z6UUPv@EKzRff+)uj8fh9{`BAmvRshxu;CY4&uDcjrlm4XCBN;0I-#u*EB<-t)Vsfo z-j{ixID6_{!os*&M-_K|h-_`)U@01o#cln#J*F)Zf4uI+#5OLKcVJNAg3oMt*@d)u z3G;)AJhcA;^!anNEzOP7HD@w$;8b4ae<9yVZ`6V0YWShk_O%YdUXMpcv>z;G+@SabL(Ejzg1 zP+VoYJfbR<)!BZtTdyg9EAo*>0PTKYM!v`*3nc+*U;uy^BsO)iAm`WREBd9Kr&5GK zq2ph-^$Ua4G)sPGt}k84EKkL;66|d%`AQ`n4LZv6^Z5Gj&eQd=(B!r$hh<*DFU?^i zeL%6?29x4G{jMSLs%?qruQ%U1y4`PO75MbJ!qzy3gm4Zf9R5RW&ur7(xHE@&p(Rg) zT0dg_J}lt`e!u^0vKvl(jT=|}_T>-_^~O)&;BLG-Un{ctSRJ1+M-^he_F*}<*QRF* z)tOA*pf$8HsT5Z@x%u06EBd^$|GRG+dUL+FIek1l%`@JT)2DN4(d>~pREi)?KXG^W z#m%3;L1KPcVpSdXN?vNwlnI~%sysu?%Pb%?fF61R`IUxYJaGL`yUiZ7nw^n<;1g2? zsT`3ZtL5yFN9{zP&Y-;#s2a#unmCYXWsRdh>U=;zqV99wBkDaQ%-3IX8t+IF;ao{s z%in6R7T*A-b=rnn4R@{y{BZG4%6J$8Z^qMpIK0fz+A~>79&2;qe!4D!0Yo+tB!C4K z-*lr82wWM@!*;wd_t4QVrfu&-Oog)dd5wrvQIbCsr71hvpc7V!X6;UL?c!#=Uymhl zvafNfgh9kmLr9l%;qMyBCS7PL9Qcwncz#0qE~H&#g6Mw6xaF0 z9mTFqG;o%vvWAWg;@xHlX~!sJl{w)`yeP7SS(=|52gq4S*BiPgcdcZU3B+s5=r`x|2BoK12-dCoT1xmb;FOesMej}9rb_U$yflOM-7cZeI@{eAcNK1i+O;u z4nNa737&(TDa5j9UFEkWeiN!FG<1=TH~2^(cS+#o_!x=zpa2=t7;1ldUmA2Ek`N=E z>%H9}W&TJl!n-#j_ta+g*s+s`9!PTg%T^nKh8wwIgBLpn1S9>3k*A<0H7&VPnmxr}HkXUq85E z;3=Lqfux}NnId_$Jy3Q9S`9+Z`)b?;cvRfkDnz46XGBY&8@$Dnb_08}xm*5z=@mCW zF86tS|NEsL0()z5!(bClzQTs-t^R?b1I~B<)O~4!G)KFCoR&@oYcV&)rPupiPRqhz zuV{@!eYe>HEZqXi$UeI{`oLC8GacWVriyiEMX{P&(NshIN*0jj&4N-7V3<0anBUX!(0EN8gqYqq6eFHF301s z&2cUac!Uo^vFx@Yrh-}yjvS7UIA5L0EShp&EcUL1W8aW&!8GEh@j)1U-Th)gGY}do z!{M>HMD8ZR*?9E~7f_SABPpt&kx&r7D)ECL3~>scl(v@m(q$d;+@kGU60!@E8i33R z2L`MJ_Qtg2EIyL`;Gx3TjBgbP^|LXl^IW(}1hgaK1KxnQx+a$|NcOy7)Iv-KXDq<<`$1JWwd2X`c{mk7UwALx85tLZ`cy_ zl~ zeuN`)!pmZrAi!&DKKM6KNg5`#q%Moy590P+gE2hFPwK5oTkR|spXHy0{I2gJ;-3qm z-zD$LLg8OAvf2G!gF1bg5~5!8PFH+_A^3W?!pKjVZ_7r8;Quz%!laiTcf!r%g-g~e zv3Kc&B+BatVvrSDQAxlp_#7*pn_o}9&DtT>xMJMZ25t4TUBi@v^Z=Tnqauj&-&0My z`2ZglWeX^4rl@tvCey$zn2w+Cm@6RWW(Hv5D)C70NM;1E8HXD$eNg2(gmNxSSSq^gbs_H3|!XG)HJxYNO@x~kU zlZtP+rZo=&c*QhHwN9sI_p;wtm5>z#-h2H7Sqrc)8^!J+^RfHzPQdMc|GaG@xw z0ct3p^0+%D7;@`KJ3PX;G^hmNXl;2GnKqRr*NC9l=xf_YDr9+Q&a&K}Bp)g%ob`f( U^|fwgYOnFH>KIY%ueteu01?E2761SM literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/public/index.html b/ext/mac-ui-macgap1-wrapper/public/index.html new file mode 100644 index 000000000..9fab93250 --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/public/index.html @@ -0,0 +1,33 @@ + + + + MacGap + + + + + + + +

MacGap

+ + \ No newline at end of file diff --git a/ui/main.jsx b/ui/main.jsx index 01c300e99..aa4c8bf1c 100644 --- a/ui/main.jsx +++ b/ui/main.jsx @@ -1,4 +1,51 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2015 ZeroTier, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + +function getUrlParameter(parameter) +{ + var currLocation = window.location.search; + if (currLocation.indexOf('?') < 0) + return ''; + var parArr = currLocation.split("?")[1].split("&"); + for(var i = 0; i < parArr.length; i++){ + parr = parArr[i].split("="); + if (parr[0] == parameter) { + return decodeURIComponent(parr[1]); + } + } + return ''; +} + +var ztAuthToken = getUrlParameter('authToken'); +if ((!ztAuthToken)||(ztAuthToken.length <= 0)) { + ztAuthToken = prompt('No authToken specified in URL. Enter token from\nauthtoken.secret to authorize.'); +} + React.render( - , + , document.getElementById('main') ); From d56e9fce415e5b764091921dd5cedde175fbcf7d Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 6 May 2015 20:45:02 -0700 Subject: [PATCH 2/3] Get user data out of repo. --- .gitignore | 1 + .../MacGap.xcodeproj/project.pbxproj | 6 + .../xcshareddata/MacGap.xccheckout | 18 +- .../UserInterfaceState.xcuserstate | Bin 18268 -> 19568 bytes .../xcdebugger/Breakpoints.xcbkptlist | 131 -------------- .../xcschemes/MacGap.xcscheme | 86 ---------- .../xcschemes/xcschememanagement.plist | 22 --- .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 - .../xcdebugger/Breakpoints.xcbkptlist | 161 ------------------ .../xcschemes/MacGap.xcscheme | 84 --------- .../xcschemes/xcschememanagement.plist | 22 --- .../AppIcon.appiconset/Contents.json | 63 +++++++ .../AppIcon.appiconset/application128x128.png | Bin 0 -> 11247 bytes .../AppIcon.appiconset/application16x16.png | Bin 0 -> 715 bytes .../AppIcon.appiconset/application256x256.png | Bin 0 -> 29043 bytes .../AppIcon.appiconset/application32x32.png | Bin 0 -> 1787 bytes .../AppIcon.appiconset/application512x512.png | Bin 0 -> 57374 bytes .../MacGap/MacGap-Info.plist | 2 - ext/mac-ui-macgap1-wrapper/README.md | 38 +---- 19 files changed, 83 insertions(+), 556 deletions(-) delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application128x128.png create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application16x16.png create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application256x256.png create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application32x32.png create mode 100644 ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application512x512.png diff --git a/.gitignore b/.gitignore index db660e147..f789b3b78 100755 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ /root-topology/*.secret /root-topology/test/supernodes /root-topology/test/test-root-topology +xcuserdata diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj index ea339cf0a..9d71ceccd 100644 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.pbxproj @@ -19,6 +19,7 @@ 88C0646014BDE10A00E4BCE2 /* Window.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C0645F14BDE10A00E4BCE2 /* Window.m */; }; 88C0646614BDEC5800E4BCE2 /* Window.xib in Resources */ = {isa = PBXBuildFile; fileRef = 88C0646414BDEC5800E4BCE2 /* Window.xib */; }; 88C0646D14BDF6A600E4BCE2 /* WindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 88C0646C14BDF6A600E4BCE2 /* WindowController.m */; }; + C13A649D1AFB171100CB31FE /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C13A649C1AFB171100CB31FE /* Images.xcassets */; }; C1C2B9911AFB0CF10060D7C2 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1C2B9901AFB0CF10060D7C2 /* Security.framework */; }; F2B80016179E0FC100B069A8 /* Clipboard.m in Sources */ = {isa = PBXBuildFile; fileRef = F2B80015179E0FC100B069A8 /* Clipboard.m */; }; FA32509D14BA813600BF0781 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA32509C14BA813600BF0781 /* WebKit.framework */; }; @@ -74,6 +75,7 @@ 88C0646514BDEC5800E4BCE2 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Window.xib; sourceTree = ""; }; 88C0646B14BDF6A600E4BCE2 /* WindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WindowController.h; sourceTree = ""; }; 88C0646C14BDF6A600E4BCE2 /* WindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WindowController.m; sourceTree = ""; }; + C13A649C1AFB171100CB31FE /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; C1C2B9901AFB0CF10060D7C2 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; F2B80014179E0FC100B069A8 /* Clipboard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clipboard.h; sourceTree = ""; }; F2B80015179E0FC100B069A8 /* Clipboard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Clipboard.m; sourceTree = ""; }; @@ -227,6 +229,7 @@ FAE451D114BA79C600190544 /* AppDelegate.m */, FAE451D314BA79C600190544 /* MainMenu.xib */, 88C0646414BDEC5800E4BCE2 /* Window.xib */, + C13A649C1AFB171100CB31FE /* Images.xcassets */, FAE451C514BA79C600190544 /* Supporting Files */, ); path = MacGap; @@ -299,6 +302,7 @@ files = ( FA3250E514BA883A00BF0781 /* public in Resources */, FAE451C914BA79C600190544 /* InfoPlist.strings in Resources */, + C13A649D1AFB171100CB31FE /* Images.xcassets in Resources */, FAE451CF14BA79C600190544 /* Credits.rtf in Resources */, FAE451D514BA79C600190544 /* MainMenu.xib in Resources */, FA3250E714BA8BCE00BF0781 /* application.icns in Resources */, @@ -426,6 +430,7 @@ FAE451D914BA79C600190544 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; CLANG_CXX_LIBRARY = "compiler-default"; COMBINE_HIDPI_IMAGES = YES; @@ -447,6 +452,7 @@ FAE451DA14BA79C600190544 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; CLANG_CXX_LIBRARY = "compiler-default"; COMBINE_HIDPI_IMAGES = YES; diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout index b2ea215df..2a06dbc55 100644 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout +++ b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcshareddata/MacGap.xccheckout @@ -10,31 +10,31 @@ MacGap IDESourceControlProjectOriginsDictionary - 60776BB1B4F98ABFCF3BD8223221516D7FB415ED - https://github.com/MacGapProject/MacGap1.git + ABA3617E9F0148F844A82502F0D808DE6591AA97 + http://adam.ierymenko@git.int.zerotier.com/zerotier/zerotierone IDESourceControlProjectPath - MacGap.xcodeproj + ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj IDESourceControlProjectRelativeInstallPathDictionary - 60776BB1B4F98ABFCF3BD8223221516D7FB415ED - ../.. + ABA3617E9F0148F844A82502F0D808DE6591AA97 + ../../../.. IDESourceControlProjectURL - https://github.com/MacGapProject/MacGap1.git + http://adam.ierymenko@git.int.zerotier.com/zerotier/zerotierone IDESourceControlProjectVersion 111 IDESourceControlProjectWCCIdentifier - 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + ABA3617E9F0148F844A82502F0D808DE6591AA97 IDESourceControlProjectWCConfigurations IDESourceControlRepositoryExtensionIdentifierKey public.vcs.git IDESourceControlWCCIdentifierKey - 60776BB1B4F98ABFCF3BD8223221516D7FB415ED + ABA3617E9F0148F844A82502F0D808DE6591AA97 IDESourceControlWCCName - MacGap1 + ZeroTierOne diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate index 04ade238606e9d7a8d4efba88066f44ffaac7322..6dfcf6d063cad694d23a1f13b2cf3f49bbd662ca 100644 GIT binary patch delta 11184 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 Y27V6Qi0n=P$5nj_lB+(euYsHY2apst3jhEB diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist deleted file mode 100644 index 38f661269..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme deleted file mode 100644 index 0aaad5827..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/MacGap.xcscheme +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 921f1a6fe..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/Alex.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - MacGap.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - FAE451B914BA79C600190544 - - primary - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b45415..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist deleted file mode 100644 index 8e541eaba..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist +++ /dev/null @@ -1,161 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme deleted file mode 100644 index 872d6d7d5..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/MacGap.xcscheme +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 921f1a6fe..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/liamks.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - MacGap.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - FAE451B914BA79C600190544 - - primary - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/Contents.json b/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..2592eae9a --- /dev/null +++ b/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,63 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "application16x16.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "application32x32.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "application128x128.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "application256x256.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "application512x512.png", + "scale" : "1x" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application128x128.png b/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..93dd80a1e3b10f09d5f640d062e0790217f231da GIT binary patch literal 11247 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 literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application256x256.png b/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..c30106b7df58bb6f81f42b33a5b4e042dff4a7c4 GIT binary patch literal 29043 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 literal 0 HcmV?d00001 diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application512x512.png b/ext/mac-ui-macgap1-wrapper/MacGap/Images.xcassets/AppIcon.appiconset/application512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..b6b9da6143b8f04ccde78fbcab7ea623e4f79d79 GIT binary patch literal 57374 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 V|LfV|%bS4DH@-nen CFBundleExecutable ZeroTier One - CFBundleIconFile - application.icns CFBundleIdentifier com.zerotier.$(PRODUCT_NAME:rfc1034identifier) CFBundleInfoDictionaryVersion diff --git a/ext/mac-ui-macgap1-wrapper/README.md b/ext/mac-ui-macgap1-wrapper/README.md index bc69b1326..daf3eae9c 100644 --- a/ext/mac-ui-macgap1-wrapper/README.md +++ b/ext/mac-ui-macgap1-wrapper/README.md @@ -1,36 +1,6 @@ -#MacGap +Mac Web UI Wrapper +====== -The MacGap project provides HTML/JS/CSS developers an Xcode project for developing Native OSX Apps that run in OSX's WebView and take advantage of WebKit technologies. +This is a modified version of MacGap1 which launches a WebKit view and accesses the local ZeroTier service at its web URL. It builds the URL from the authtoken.secret file in the system home (or the user home) and the zerotier-one.port file that ZeroTier creates to advertise its control port. -The project exposes a JavaScript API for OS X integration, such as displaying native OS X 10.9 notifications. The MacGap project is extremely lightweight and nimble; a blank application is about 980KB. - -### Features: -* tiny compiled app sizes -* Mac App Store compatible -* access to many Mac OS X-specific features - -##Pre-requisites - -MacGap works on OSX 10.6 and later. - -Generate apps with the [macgap generator](http://github.com/maccman/macgap-rb), no compile necessary. - - gem install macgap - - macgap new myapp - macgap build myapp - -##API - -MacGap exposes an object called `macgap` inside JavaScript. You can use it to alter the Dock icon and display Growl notifications, amongst other things. The API is documented in the WIKI on GitHub: https://github.com/maccman/macgap/wiki - - -##Attributes - -MacGap was forked/ported from Phonegap-mac. It's under the same license (MIT). - -##Custom Build - -To build, make sure you have installed the latest Mac OSX Core Library. Download at [http://developer.apple.com/](http://developer.apple.com/). - -Just clone the repository and build in Xcode. The file `public/index.html` is loaded on startup. +It's based on the original MacGap1 source by Twitter, Inc. which is licensed under the MIT license. From 4426899e8c9469518325f39f173151b3535ac20e Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Wed, 6 May 2015 21:02:59 -0700 Subject: [PATCH 3/3] Add support for local user account caching of authtoken.secret as in old UI -- this is now pretty much working. --- .gitignore | 2 +- .../UserInterfaceState.xcuserstate | Bin 19568 -> 0 bytes .../api.xcuserdatad/xcschemes/MacGap.xcscheme | 88 ---------- .../xcschemes/xcschememanagement.plist | 22 --- .../MacGap/AppDelegate.m | 157 +++++++++++------- 5 files changed, 97 insertions(+), 172 deletions(-) delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme delete mode 100644 ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/.gitignore b/.gitignore index f789b3b78..4a24c4db6 100755 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,4 @@ /root-topology/*.secret /root-topology/test/supernodes /root-topology/test/test-root-topology -xcuserdata +/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/* diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/project.xcworkspace/xcuserdata/api.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 6dfcf6d063cad694d23a1f13b2cf3f49bbd662ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19568 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 AW&i*H diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme deleted file mode 100644 index 2555dc89c..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/MacGap.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist b/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 921f1a6fe..000000000 --- a/ext/mac-ui-macgap1-wrapper/MacGap.xcodeproj/xcuserdata/api.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - MacGap.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - FAE451B914BA79C600190544 - - primary - - - - - diff --git a/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m index 96a3e8201..3e25ca13f 100644 --- a/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m +++ b/ext/mac-ui-macgap1-wrapper/MacGap/AppDelegate.m @@ -7,6 +7,8 @@ // #import "AppDelegate.h" +#include +#include @implementation AppDelegate @@ -29,75 +31,108 @@ } - (void) applicationDidFinishLaunching:(NSNotification *)aNotification { - // Create authorization reference - OSStatus status; - AuthorizationRef authorizationRef; - - // AuthorizationCreate and pass NULL as the initial - // AuthorizationRights set so that the AuthorizationRef gets created - // successfully, and then later call AuthorizationCopyRights to - // determine or extend the allowable rights. - // http://developer.apple.com/qa/qa2001/qa1172.html - status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef); - if (status != errAuthorizationSuccess) - { - NSLog(@"Error Creating Initial Authorization: %d", status); - return; - } - - // kAuthorizationRightExecute == "system.privilege.admin" - AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; - AuthorizationRights rights = {1, &right}; - AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | - kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; - - // Call AuthorizationCopyRights to determine or extend the allowable rights. - status = AuthorizationCopyRights(authorizationRef, &rights, NULL, flags, NULL); - if (status != errAuthorizationSuccess) - { - NSLog(@"Copy Rights Unsuccessful: %d", status); - return; - } - - // use rm tool with -rf - char *tool = "/bin/cat"; - char *args[] = {"/Library/Application Support/ZeroTier/One/authtoken.secret", NULL}; - FILE *pipe = NULL; - - status = AuthorizationExecuteWithPrivileges(authorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe); - if (status != errAuthorizationSuccess) - { - NSLog(@"Error: %d", status); - } - - char url[16384]; - memset(url,0,sizeof(url)); - if (pipe) { - char buf[16384]; + char buf[16384],userAuthTokenPath[4096]; - FILE *pf = fopen("/Library/Application Support/ZeroTier/One/zerotier-one.port","r"); + FILE *pf = fopen("/Library/Application Support/ZeroTier/One/zerotier-one.port","r"); + long port = 9993; // default + if (pf) { long n = fread(buf,1,sizeof(buf)-1,pf); - long port = 9993; // default if (n > 0) { buf[n] = (char)0; port = strtol(buf,(char **)0,10); } fclose(pf); - - n = (long)fread(buf,1,sizeof(buf)-1,pipe); - if (n > 0) { - buf[n] = (char)0; - snprintf(url,sizeof(url),"http://127.0.0.1:%ld/index.html?authToken=%s",port,buf); - } - fclose(pipe); } - - // The only way to guarantee that a credential acquired when you - // request a right is not shared with other authorization instances is - // to destroy the credential. To do so, call the AuthorizationFree - // function with the flag kAuthorizationFlagDestroyRights. - // http://developer.apple.com/documentation/Security/Conceptual/authorization_concepts/02authconcepts/chapter_2_section_7.html - status = AuthorizationFree(authorizationRef, kAuthorizationFlagDestroyRights); + + char url[16384]; + memset(url,0,sizeof(url)); + + const char *homeDir = getenv("HOME"); + if (homeDir) { + snprintf(userAuthTokenPath,sizeof(userAuthTokenPath),"%s/Library/Application Support/ZeroTier/One/authtoken.secret",homeDir); + pf = fopen(userAuthTokenPath,"r"); + if (pf) { + long n = fread(buf,1,sizeof(buf)-1,pf); + if (n > 0) { + buf[n] = (char)0; + snprintf(url,sizeof(url),"http://127.0.0.1:%ld/index.html?authToken=%s",port,buf); + } + fclose(pf); + } + } + + if (!url[0]) { + // Create authorization reference + OSStatus status; + AuthorizationRef authorizationRef; + + // AuthorizationCreate and pass NULL as the initial + // AuthorizationRights set so that the AuthorizationRef gets created + // successfully, and then later call AuthorizationCopyRights to + // determine or extend the allowable rights. + // http://developer.apple.com/qa/qa2001/qa1172.html + status = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef); + if (status != errAuthorizationSuccess) + { + NSLog(@"Error Creating Initial Authorization: %d", status); + return; + } + + // kAuthorizationRightExecute == "system.privilege.admin" + AuthorizationItem right = {kAuthorizationRightExecute, 0, NULL, 0}; + AuthorizationRights rights = {1, &right}; + AuthorizationFlags flags = kAuthorizationFlagDefaults | kAuthorizationFlagInteractionAllowed | + kAuthorizationFlagPreAuthorize | kAuthorizationFlagExtendRights; + + // Call AuthorizationCopyRights to determine or extend the allowable rights. + status = AuthorizationCopyRights(authorizationRef, &rights, NULL, flags, NULL); + if (status != errAuthorizationSuccess) + { + NSLog(@"Copy Rights Unsuccessful: %d", status); + return; + } + + // use rm tool with -rf + char *tool = "/bin/cat"; + char *args[] = {"/Library/Application Support/ZeroTier/One/authtoken.secret", NULL}; + FILE *pipe = NULL; + + status = AuthorizationExecuteWithPrivileges(authorizationRef, tool, kAuthorizationFlagDefaults, args, &pipe); + if (status != errAuthorizationSuccess) + { + NSLog(@"Error: %d", status); + } + + if (pipe) { + long n = (long)fread(buf,1,sizeof(buf)-1,pipe); + if (n > 0) { + buf[n] = (char)0; + snprintf(url,sizeof(url),"http://127.0.0.1:%ld/index.html?authToken=%s",port,buf); + + if (homeDir) { + snprintf(userAuthTokenPath,sizeof(userAuthTokenPath),"%s/Library/Application Support/ZeroTier",homeDir); + mkdir(userAuthTokenPath,0755); + snprintf(userAuthTokenPath,sizeof(userAuthTokenPath),"%s/Library/Application Support/ZeroTier/One",homeDir); + mkdir(userAuthTokenPath,0755); + snprintf(userAuthTokenPath,sizeof(userAuthTokenPath),"%s/Library/Application Support/ZeroTier/One/authtoken.secret",homeDir); + pf = fopen(userAuthTokenPath,"w"); + if (pf) { + fwrite(buf,1,strlen(buf),pf); + fclose(pf); + chmod(userAuthTokenPath,0600); + } + } + } + fclose(pipe); + } + + // The only way to guarantee that a credential acquired when you + // request a right is not shared with other authorization instances is + // to destroy the credential. To do so, call the AuthorizationFree + // function with the flag kAuthorizationFlagDestroyRights. + // http://developer.apple.com/documentation/Security/Conceptual/authorization_concepts/02authconcepts/chapter_2_section_7.html + status = AuthorizationFree(authorizationRef, kAuthorizationFlagDestroyRights); + } NSString *urlStr = [[NSString alloc] initWithCString:url]; self.windowController = [[WindowController alloc] initWithURL: urlStr];