├── Assets
├── Screen.png
└── Silicon.psd
├── Silicon
├── UI
│ ├── Images
│ │ └── Icon.icns
│ ├── zh-HK.lproj
│ │ └── MainWindowController.strings
│ ├── zh-Hans.lproj
│ │ └── MainWindowController.strings
│ └── Base.lproj
│ │ ├── AboutWindowController.xib
│ │ ├── MainMenu.xib
│ │ └── MainWindowController.xib
├── Assets.xcassets
│ └── Contents.json
├── Silicon.entitlements
├── Info.plist
└── Classes
│ ├── NumberToString.swift
│ ├── IsZero.swift
│ ├── IsNotZero.swift
│ ├── AboutWindowController.swift
│ ├── ApplicationDelegate.swift
│ ├── AppInfo.swift
│ ├── DropView.swift
│ ├── MachOFile.swift
│ ├── App.swift
│ ├── BinaryStream.swift
│ └── MainWindowController.swift
├── Silicon.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── project.pbxproj
├── .gitmodules
├── .gitignore
├── README.md
├── LICENSE
├── .github
└── workflows
│ └── ci-mac.yaml
└── CODE_OF_CONDUCT.md
/Assets/Screen.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DigiDNA/Silicon/HEAD/Assets/Screen.png
--------------------------------------------------------------------------------
/Assets/Silicon.psd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DigiDNA/Silicon/HEAD/Assets/Silicon.psd
--------------------------------------------------------------------------------
/Silicon/UI/Images/Icon.icns:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DigiDNA/Silicon/HEAD/Silicon/UI/Images/Icon.icns
--------------------------------------------------------------------------------
/Silicon/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Silicon.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Silicon/Silicon.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Silicon.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "xcconfig"]
2 | path = xcconfig
3 | url = https://github.com/macmade/xcconfig.git
4 | [submodule "Submodules/xcconfig"]
5 | path = Submodules/xcconfig
6 | url = https://github.com/macmade/xcconfig.git
7 | [submodule "Submodules/GitHubUpdates"]
8 | path = Submodules/GitHubUpdates
9 | url = https://github.com/macmade/GitHubUpdates.git
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Mac Finder
2 | .DS_Store
3 | .Trashes
4 | Icon?
5 |
6 | # Thumbnails
7 | ._*
8 |
9 | # Files that might appear on external disk
10 | .Spotlight-V100
11 | .Trashes
12 |
13 | # Xcode
14 | *.pbxuser
15 | *.mode1v3
16 | *.mode2v3
17 | *.perspectivev3
18 | *.xccheckout
19 | *.profraw
20 | !default.pbxuser
21 | !default.mode1v3
22 | !default.mode2v3
23 | !default.perspectivev3
24 | xcuserdata
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Silicon
2 | =======
3 |
4 | [](https://github.com/DigiDNA/Silicon/actions/workflows/ci-mac.yaml)
5 | [](https://github.com/DigiDNA/Silicon/issues)
6 | 
7 | 
8 | [](https://twitter.com/digidna)
9 |
10 | About
11 | -----
12 |
13 | Identify Intel-Only Apps on your Mac with ease:
14 |
15 | 
16 |
17 | License
18 | -------
19 |
20 | Project is released under the terms of the MIT License.
21 |
22 | Repository Infos
23 | ----------------
24 |
25 | Owner: DigiDNA SARL
26 | Web: www.imazing.com
27 | Blog: blog.imazing.com
28 | Twitter: @DigiDNA
29 | GitHub: github.com/DigiDNA
30 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2017 DigiDNA - www.digidna.net
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/.github/workflows/ci-mac.yaml:
--------------------------------------------------------------------------------
1 | name: ci-mac
2 | on: [push]
3 | jobs:
4 | ci:
5 | runs-on: macos-latest
6 | strategy:
7 | matrix:
8 | run-config:
9 | - { scheme: 'Silicon', configuration: 'Debug', project: 'Silicon.xcodeproj', build: 1, analyze: 1, test: 0, info: 1, destination: 'platform=macOS' }
10 | - { scheme: 'Silicon', configuration: 'Release', project: 'Silicon.xcodeproj', build: 1, analyze: 1, test: 0, info: 1, destination: 'platform=macOS' }
11 | steps:
12 |
13 | - uses: actions/checkout@v1
14 | with:
15 | submodules: 'recursive'
16 |
17 | - uses: macmade/action-xcodebuild@v1.0.0
18 |
19 | - uses: macmade/action-slack@v1.0.0
20 | if: ${{ always() }}
21 | env:
22 | SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
23 | with:
24 | channel: '#ci'
25 | status: ${{ job.status }}
26 | title: ${{ matrix.run-config[ 'scheme' ] }} - ${{ matrix.run-config[ 'configuration' ] }}
27 |
--------------------------------------------------------------------------------
/Silicon/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 | Icon.icns
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
19 | CFBundleShortVersionString
20 | 1.0.5
21 | CFBundleVersion
22 | 68
23 | LSApplicationCategoryType
24 | public.app-category.utilities
25 | LSMinimumSystemVersion
26 | $(MACOSX_DEPLOYMENT_TARGET)
27 | NSHumanReadableCopyright
28 | Copyright © 2020 DigiDNA. All rights reserved.
29 | NSMainNibFile
30 | MainMenu
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/Silicon/UI/zh-HK.lproj/MainWindowController.strings:
--------------------------------------------------------------------------------
1 | /* Class = "NSWindow"; title = "Silicon"; ObjectID = "4ss-uf-DBv"; */
2 | "4ss-uf-DBv.title" = "Silicon";
3 |
4 | /* Class = "NSTextFieldCell"; title = "You can also drop an application here to verify it."; ObjectID = "9uz-mz-Can"; */
5 | "9uz-mz-Can.title" = "您也可以將應用程序放在此處進行驗證.";
6 |
7 | /* Class = "NSTextFieldCell"; title = "Identify Intel-Only Apps on your Mac"; ObjectID = "DFM-dV-koX"; */
8 | "DFM-dV-koX.title" = "在您的Mac電腦上識別Intel專用的應用程序";
9 |
10 | /* Class = "NSButton"; ibShadowedToolTip = "Reveal in Finder"; ObjectID = "GPh-5t-rfW"; */
11 | "GPh-5t-rfW.ibShadowedToolTip" = "在Finder中顯示";
12 |
13 | /* Class = "NSButtonCell"; title = "Recurse into Applications"; ObjectID = "HUW-pw-w0O"; */
14 | "HUW-pw-w0O.title" = "包含應用程序子目錄";
15 |
16 | /* Class = "NSButtonCell"; title = "Start Scanning"; ObjectID = "MEb-Ef-ukk"; */
17 | "MEb-Ef-ukk.title" = "開始掃描";
18 |
19 | /* Class = "NSTextFieldCell"; title = "Applications Found:"; ObjectID = "MJD-Yn-xAC"; */
20 | "MJD-Yn-xAC.title" = "找到的應用程序:";
21 |
22 | /* Class = "NSMenuItem"; title = "Show All Apps"; ObjectID = "QoR-x6-4UR"; */
23 | "QoR-x6-4UR.title" = "顯示所有應用";
24 |
25 | /* Class = "NSButtonCell"; title = "Only Scan the Applications Folder"; ObjectID = "b2W-HI-GII"; */
26 | "b2W-HI-GII.title" = "僅掃描應用程序文件夾";
27 |
28 | /* Class = "NSButtonCell"; title = "Exclude Apple Applications"; ObjectID = "d0l-gf-yml"; */
29 | "d0l-gf-yml.title" = "排除Apple應用程序";
30 |
31 | /* Class = "NSMenuItem"; title = "Show Apple SIlicon Compatible Apps"; ObjectID = "uJw-yo-gLb"; */
32 | "uJw-yo-gLb.title" = "顯示Apple Silicon兼容的應用程序";
33 |
34 | /* Class = "NSMenuItem"; title = "Show Intel-Only Apps"; ObjectID = "ux4-9b-ut4"; */
35 | "ux4-9b-ut4.title" = "僅顯示Intel應用程序";
36 |
--------------------------------------------------------------------------------
/Silicon/UI/zh-Hans.lproj/MainWindowController.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "NSWindow"; title = "Silicon"; ObjectID = "4ss-uf-DBv"; */
3 | "4ss-uf-DBv.title" = "Silicon";
4 |
5 | /* Class = "NSTextFieldCell"; title = "You can also drop an application here to verify it."; ObjectID = "9uz-mz-Can"; */
6 | "9uz-mz-Can.title" = "您也可以将应用程序放在此处进行验证.";
7 |
8 | /* Class = "NSTextFieldCell"; title = "Identify Intel-Only Apps on your Mac"; ObjectID = "DFM-dV-koX"; */
9 | "DFM-dV-koX.title" = "在您的Mac电脑上识别Intel专用的应用程序";
10 |
11 | /* Class = "NSButton"; ibShadowedToolTip = "Reveal in Finder"; ObjectID = "GPh-5t-rfW"; */
12 | "GPh-5t-rfW.ibShadowedToolTip" = "在Finder中显示";
13 |
14 | /* Class = "NSButtonCell"; title = "Recurse into Applications"; ObjectID = "HUW-pw-w0O"; */
15 | "HUW-pw-w0O.title" = "包含应用程序子目录";
16 |
17 | /* Class = "NSButtonCell"; title = "Start Scanning"; ObjectID = "MEb-Ef-ukk"; */
18 | "MEb-Ef-ukk.title" = "开始扫描";
19 |
20 | /* Class = "NSTextFieldCell"; title = "Applications Found:"; ObjectID = "MJD-Yn-xAC"; */
21 | "MJD-Yn-xAC.title" = "找到的应用程序:";
22 |
23 | /* Class = "NSMenuItem"; title = "Show All Apps"; ObjectID = "QoR-x6-4UR"; */
24 | "QoR-x6-4UR.title" = "显示所有应用";
25 |
26 | /* Class = "NSButtonCell"; title = "Only Scan the Applications Folder"; ObjectID = "b2W-HI-GII"; */
27 | "b2W-HI-GII.title" = "仅扫描应用程序文件夹";
28 |
29 | /* Class = "NSButtonCell"; title = "Exclude Apple Applications"; ObjectID = "d0l-gf-yml"; */
30 | "d0l-gf-yml.title" = "排除Apple应用程序";
31 |
32 | /* Class = "NSMenuItem"; title = "Show Apple SIlicon Compatible Apps"; ObjectID = "uJw-yo-gLb"; */
33 | "uJw-yo-gLb.title" = "显示Apple Silicon兼容的应用程序";
34 |
35 | /* Class = "NSMenuItem"; title = "Show Intel-Only Apps"; ObjectID = "ux4-9b-ut4"; */
36 | "ux4-9b-ut4.title" = "仅显示Intel应用程序";
37 |
--------------------------------------------------------------------------------
/Silicon/Classes/NumberToString.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Foundation
26 |
27 | public class NumberToString: ValueTransformer
28 | {
29 | public override class func transformedValueClass() -> AnyClass
30 | {
31 | return NSString.self
32 | }
33 |
34 | public override class func allowsReverseTransformation() -> Bool
35 | {
36 | return false
37 | }
38 |
39 | public override func transformedValue( _ value: Any? ) -> Any?
40 | {
41 | guard let number = value as? NSNumber else
42 | {
43 | return "" as NSString
44 | }
45 |
46 | if number.uint64Value == 0
47 | {
48 | return "--" as NSString
49 | }
50 |
51 | return "\( number.uint64Value )" as NSString
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/Silicon/Classes/IsZero.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Foundation
26 |
27 | public class IsZero: ValueTransformer
28 | {
29 | public override class func transformedValueClass() -> AnyClass
30 | {
31 | return NSNumber.self
32 | }
33 |
34 | public override class func allowsReverseTransformation() -> Bool
35 | {
36 | return false
37 | }
38 |
39 | public override func transformedValue( _ value: Any? ) -> Any?
40 | {
41 | guard let number = value as? NSNumber else
42 | {
43 | return NSNumber( booleanLiteral: true )
44 | }
45 |
46 | if number.uint64Value == 0
47 | {
48 | return NSNumber( booleanLiteral: true )
49 | }
50 |
51 | return NSNumber( booleanLiteral: false )
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/Silicon/Classes/IsNotZero.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Foundation
26 |
27 | public class IsNotZero: ValueTransformer
28 | {
29 | public override class func transformedValueClass() -> AnyClass
30 | {
31 | return NSNumber.self
32 | }
33 |
34 | public override class func allowsReverseTransformation() -> Bool
35 | {
36 | return false
37 | }
38 |
39 | public override func transformedValue( _ value: Any? ) -> Any?
40 | {
41 | guard let number = value as? NSNumber else
42 | {
43 | return NSNumber( booleanLiteral: false )
44 | }
45 |
46 | if number.uint64Value == 0
47 | {
48 | return NSNumber( booleanLiteral: false )
49 | }
50 |
51 | return NSNumber( booleanLiteral: true )
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/Silicon/Classes/AboutWindowController.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Cocoa
26 |
27 | public class AboutWindowController: NSWindowController
28 | {
29 | @objc private dynamic var name: String?
30 | @objc private dynamic var version: String?
31 | @objc private dynamic var copyright: String?
32 |
33 | public override var windowNibName: NSNib.Name?
34 | {
35 | return "AboutWindowController"
36 | }
37 |
38 | override public func windowDidLoad()
39 | {
40 | super.windowDidLoad()
41 |
42 | let version = Bundle.main.object( forInfoDictionaryKey: "CFBundleShortVersionString" ) as? String ?? "0.0.0"
43 |
44 | if let build = Bundle.main.object( forInfoDictionaryKey: "CFBundleVersion" ) as? String
45 | {
46 | self.version = "\(version) (\(build))"
47 | }
48 | else
49 | {
50 | self.version = version
51 | }
52 |
53 | self.name = Bundle.main.object( forInfoDictionaryKey: "CFBundleName" ) as? String
54 | self.copyright = Bundle.main.object( forInfoDictionaryKey: "NSHumanReadableCopyright" ) as? String
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/Silicon/Classes/ApplicationDelegate.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Cocoa
26 | import GitHubUpdates
27 |
28 | @main class ApplicationDelegate: NSObject, NSApplicationDelegate
29 | {
30 | @objc public private( set ) dynamic var mainWindowController = MainWindowController()
31 | @objc public private( set ) dynamic var aboutWindowController = AboutWindowController()
32 |
33 | @IBOutlet private var updater: GitHubUpdater!
34 |
35 | func applicationDidFinishLaunching( _ notification: Notification )
36 | {
37 | self.mainWindowController.window?.center()
38 | self.mainWindowController.window?.makeKeyAndOrderFront( nil )
39 |
40 | NotificationCenter.default.addObserver( self, selector: #selector( windowWillClose( _: ) ), name: NSWindow.willCloseNotification, object: nil )
41 | NotificationCenter.default.addObserver( self, selector: #selector( applicationWillTerminate( _: ) ), name: NSApplication.willTerminateNotification, object: nil )
42 |
43 | DispatchQueue.main.asyncAfter( deadline: .now() + .seconds( 2 ) )
44 | {
45 | self.updater.checkForUpdatesInBackground()
46 | }
47 | }
48 |
49 | func applicationWillTerminate( _ notification: Notification )
50 | {}
51 |
52 | @IBAction func showAboutWindow( _ sender: Any? )
53 | {
54 | if self.aboutWindowController.window?.isVisible ?? false == false
55 | {
56 | self.aboutWindowController.window?.layoutIfNeeded()
57 | self.aboutWindowController.window?.center()
58 | }
59 |
60 | self.aboutWindowController.window?.makeKeyAndOrderFront( nil )
61 | }
62 |
63 | @objc private func willTerminateNotification( _ notification: NSNotification )
64 | {
65 | self.mainWindowController.stopLoading()
66 | }
67 |
68 | @objc private func windowWillClose( _ notification: NSNotification )
69 | {
70 | guard let window = notification.object as? NSWindow else
71 | {
72 | return
73 | }
74 |
75 | if window == self.mainWindowController.window
76 | {
77 | NSApp.terminate( nil )
78 | }
79 | }
80 |
81 | @IBAction public func checkForUpdates( _ sender: Any? )
82 | {
83 | self.updater.checkForUpdates( sender )
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/Silicon/Classes/AppInfo.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Cocoa
26 |
27 | public class AppInfo
28 | {
29 | public enum Kind
30 | {
31 | case macOS
32 | case iOS
33 | }
34 |
35 | public let info: [ String : Any ]
36 | public let executable: URL
37 | public let kind: Kind
38 |
39 | private class func readPropertyList( at path: String ) -> [ String : Any ]?
40 | {
41 | if let data = FileManager.default.contents( atPath: path )
42 | {
43 | return try? PropertyListSerialization.propertyList( from: data, options: [], format: nil ) as? [ String : Any ]
44 | }
45 |
46 | return nil
47 | }
48 |
49 | private class func getExecutableName( from info: [ String : Any ], path: String ) -> String?
50 | {
51 | if let e = info[ "CFBundleExecutable" ] as? String, e != "WRAPPEDPRODUCTNAME"
52 | {
53 | return e
54 | }
55 |
56 | return ( ( path as NSString ).lastPathComponent as NSString ).deletingPathExtension
57 | }
58 |
59 | public init?( path: String )
60 | {
61 | let macOS = "\( path )/Contents/Info.plist"
62 | let iOS = "\( path )/WrappedBundle/Info.plist"
63 |
64 | if FileManager.default.fileExists( atPath: macOS )
65 | {
66 | guard let info = AppInfo.readPropertyList( at: macOS ),
67 | let exec = AppInfo.getExecutableName( from: info, path: path )
68 | else
69 | {
70 | return nil
71 | }
72 |
73 | self.info = info
74 | self.executable = URL( fileURLWithPath: "\( path )/Contents/MacOS/\( exec )" )
75 | self.kind = .macOS
76 | }
77 | else if FileManager.default.fileExists( atPath: iOS )
78 | {
79 | guard let info = AppInfo.readPropertyList( at: iOS ),
80 | let exec = AppInfo.getExecutableName( from: info, path: path )
81 | else
82 | {
83 | return nil
84 | }
85 |
86 | self.info = info
87 | self.executable = URL( fileURLWithPath: "\( path )/WrappedBundle/\( exec )" )
88 | self.kind = .iOS
89 | }
90 | else
91 | {
92 | return nil
93 | }
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/Silicon/Classes/DropView.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Cocoa
26 |
27 | public class DropView: NSView
28 | {
29 | public var onDrag: ( ( [ URL ] ) -> Bool )?
30 | public var onDrop: ( ( [ URL ] ) -> Bool )?
31 |
32 | @objc public private( set ) dynamic var dragging = false
33 | @objc public dynamic var allowDrop = true
34 | {
35 | didSet
36 | {
37 | self.unregisterDraggedTypes()
38 |
39 | if self.allowDrop
40 | {
41 | self.registerForDraggedTypes( [ .fileURL ] )
42 | }
43 | }
44 | }
45 |
46 | public override func awakeFromNib()
47 | {
48 | if self.allowDrop
49 | {
50 | self.registerForDraggedTypes( [ .fileURL ] )
51 | }
52 | }
53 |
54 | public override func draggingEntered( _ sender: NSDraggingInfo ) -> NSDragOperation
55 | {
56 | if self.onDrop == nil || self.allowDrop == false
57 | {
58 | return []
59 | }
60 |
61 | if let onDrag = self.onDrag
62 | {
63 | guard let urls = sender.draggingPasteboard.readObjects( forClasses: [ NSURL.self ], options: nil ) as? [ URL ] else
64 | {
65 | return []
66 | }
67 |
68 | if onDrag( urls ) == false
69 | {
70 | return []
71 | }
72 | }
73 |
74 | self.dragging = true
75 |
76 | return .copy
77 | }
78 |
79 | public override func draggingExited( _ sender: NSDraggingInfo? )
80 | {
81 | self.dragging = false
82 | }
83 |
84 | public override func draggingEnded( _ sender: NSDraggingInfo )
85 | {
86 | self.dragging = false
87 | }
88 |
89 | public override func performDragOperation( _ sender: NSDraggingInfo ) -> Bool
90 | {
91 | if self.allowDrop == false
92 | {
93 | return false
94 | }
95 |
96 | guard let onDrop = self.onDrop else
97 | {
98 | return false
99 | }
100 |
101 | guard let urls = sender.draggingPasteboard.readObjects( forClasses: [ NSURL.self ], options: nil ) as? [ URL ] else
102 | {
103 | return false
104 | }
105 |
106 | return onDrop( urls )
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/Silicon/Classes/MachOFile.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Foundation
26 |
27 | public class MachOFile
28 | {
29 | public private( set ) var architectures: [ String ] = []
30 |
31 | public init?( path: String )
32 | {
33 | do
34 | {
35 | let stream = try BinaryStream( path: path )
36 | let magic = try stream.readBigEndianUnsignedInteger()
37 |
38 | if magic == 0xCAFEBABE
39 | {
40 | let count = try stream.readBigEndianUnsignedInteger()
41 |
42 | for _ in 0 ..< count
43 | {
44 | let cpu = try stream.readBigEndianUnsignedInteger()
45 | let _ = try stream.readBigEndianUnsignedInteger()
46 | let _ = try stream.readBigEndianUnsignedInteger()
47 | let _ = try stream.readBigEndianUnsignedInteger()
48 | let _ = try stream.readBigEndianUnsignedInteger()
49 |
50 | self.architectures.append( MachOFile.cpuToArch( type: cpu ) )
51 | }
52 | }
53 | else if magic == 0xCEFAEDFE
54 | {
55 | let cpu = try stream.readLittleEndianUnsignedInteger()
56 |
57 | self.architectures.append( MachOFile.cpuToArch( type: cpu ) )
58 | }
59 | else if magic == 0xFEEDFACE
60 | {
61 | let cpu = try stream.readBigEndianUnsignedInteger()
62 |
63 | self.architectures.append( MachOFile.cpuToArch( type: cpu ) )
64 | }
65 | else if magic == 0xCFFAEDFE
66 | {
67 | let cpu = try stream.readLittleEndianUnsignedInteger()
68 |
69 | self.architectures.append( MachOFile.cpuToArch( type: cpu ) )
70 | }
71 | else if magic == 0xFEEDFACF
72 | {
73 | let cpu = try stream.readBigEndianUnsignedInteger()
74 |
75 | self.architectures.append( MachOFile.cpuToArch( type: cpu ) )
76 | }
77 | else
78 | {
79 | return nil
80 | }
81 | }
82 | catch
83 | {
84 | return nil
85 | }
86 | }
87 |
88 | public static func cpuToArch( type: UInt32 ) -> String
89 | {
90 | if type == 7
91 | {
92 | return "i386"
93 | }
94 | else if type == 7 | 0x01000000
95 | {
96 | return "x86_64"
97 | }
98 | else if type == 12
99 | {
100 | return "arm"
101 | }
102 | else if type == 12 | 0x01000000
103 | {
104 | return "arm64"
105 | }
106 | else if type == 18
107 | {
108 | return "ppc"
109 | }
110 |
111 | return ""
112 | }
113 | }
114 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our
6 | community a harassment-free experience for everyone, regardless of age, body
7 | size, visible or invisible disability, ethnicity, sex characteristics, gender
8 | identity and expression, level of experience, education, socio-economic status,
9 | nationality, personal appearance, race, religion, or sexual identity
10 | and orientation.
11 |
12 | We pledge to act and interact in ways that contribute to an open, welcoming,
13 | diverse, inclusive, and healthy community.
14 |
15 | ## Our Standards
16 |
17 | Examples of behavior that contributes to a positive environment for our
18 | community include:
19 |
20 | * Demonstrating empathy and kindness toward other people
21 | * Being respectful of differing opinions, viewpoints, and experiences
22 | * Giving and gracefully accepting constructive feedback
23 | * Accepting responsibility and apologizing to those affected by our mistakes,
24 | and learning from the experience
25 | * Focusing on what is best not just for us as individuals, but for the
26 | overall community
27 |
28 | Examples of unacceptable behavior include:
29 |
30 | * The use of sexualized language or imagery, and sexual attention or
31 | advances of any kind
32 | * Trolling, insulting or derogatory comments, and personal or political attacks
33 | * Public or private harassment
34 | * Publishing others' private information, such as a physical or email
35 | address, without their explicit permission
36 | * Other conduct which could reasonably be considered inappropriate in a
37 | professional setting
38 |
39 | ## Enforcement Responsibilities
40 |
41 | Community leaders are responsible for clarifying and enforcing our standards of
42 | acceptable behavior and will take appropriate and fair corrective action in
43 | response to any behavior that they deem inappropriate, threatening, offensive,
44 | or harmful.
45 |
46 | Community leaders have the right and responsibility to remove, edit, or reject
47 | comments, commits, code, wiki edits, issues, and other contributions that are
48 | not aligned to this Code of Conduct, and will communicate reasons for moderation
49 | decisions when appropriate.
50 |
51 | ## Scope
52 |
53 | This Code of Conduct applies within all community spaces, and also applies when
54 | an individual is officially representing the community in public spaces.
55 | Examples of representing our community include using an official e-mail address,
56 | posting via an official social media account, or acting as an appointed
57 | representative at an online or offline event.
58 |
59 | ## Enforcement
60 |
61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
62 | reported to the community leaders responsible for enforcement at
63 | digidna.net.
64 | All complaints will be reviewed and investigated promptly and fairly.
65 |
66 | All community leaders are obligated to respect the privacy and security of the
67 | reporter of any incident.
68 |
69 | ## Enforcement Guidelines
70 |
71 | Community leaders will follow these Community Impact Guidelines in determining
72 | the consequences for any action they deem in violation of this Code of Conduct:
73 |
74 | ### 1. Correction
75 |
76 | **Community Impact**: Use of inappropriate language or other behavior deemed
77 | unprofessional or unwelcome in the community.
78 |
79 | **Consequence**: A private, written warning from community leaders, providing
80 | clarity around the nature of the violation and an explanation of why the
81 | behavior was inappropriate. A public apology may be requested.
82 |
83 | ### 2. Warning
84 |
85 | **Community Impact**: A violation through a single incident or series
86 | of actions.
87 |
88 | **Consequence**: A warning with consequences for continued behavior. No
89 | interaction with the people involved, including unsolicited interaction with
90 | those enforcing the Code of Conduct, for a specified period of time. This
91 | includes avoiding interactions in community spaces as well as external channels
92 | like social media. Violating these terms may lead to a temporary or
93 | permanent ban.
94 |
95 | ### 3. Temporary Ban
96 |
97 | **Community Impact**: A serious violation of community standards, including
98 | sustained inappropriate behavior.
99 |
100 | **Consequence**: A temporary ban from any sort of interaction or public
101 | communication with the community for a specified period of time. No public or
102 | private interaction with the people involved, including unsolicited interaction
103 | with those enforcing the Code of Conduct, is allowed during this period.
104 | Violating these terms may lead to a permanent ban.
105 |
106 | ### 4. Permanent Ban
107 |
108 | **Community Impact**: Demonstrating a pattern of violation of community
109 | standards, including sustained inappropriate behavior, harassment of an
110 | individual, or aggression toward or disparagement of classes of individuals.
111 |
112 | **Consequence**: A permanent ban from any sort of public interaction within
113 | the community.
114 |
115 | ## Attribution
116 |
117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118 | version 2.0, available at
119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
120 |
121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct
122 | enforcement ladder](https://github.com/mozilla/diversity).
123 |
124 | [homepage]: https://www.contributor-covenant.org
125 |
126 | For answers to common questions about this code of conduct, see the FAQ at
127 | https://www.contributor-covenant.org/faq. Translations are available at
128 | https://www.contributor-covenant.org/translations.
129 |
--------------------------------------------------------------------------------
/Silicon/Classes/App.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Cocoa
26 |
27 | @objc public class App: NSObject
28 | {
29 | @objc public private( set ) var name: String
30 | @objc public private( set ) var path: String
31 | @objc public private( set ) var version: String?
32 | @objc public private( set ) var icon: NSImage?
33 | @objc public private( set ) var architectures: [ String ]
34 | @objc public private( set ) var isAppleSiliconReady: Bool
35 | @objc public private( set ) var architecture: String
36 | @objc public private( set ) var bundleID: String?
37 |
38 | public init?( path: String )
39 | {
40 | var isDir = ObjCBool( booleanLiteral: false )
41 |
42 | if FileManager.default.fileExists( atPath: path, isDirectory: &isDir ) == false || isDir.boolValue == false
43 | {
44 | return nil
45 | }
46 |
47 | guard let info = AppInfo( path: path ) else
48 | {
49 | return nil
50 | }
51 |
52 | if FileManager.default.fileExists( atPath: info.executable.path ) == false
53 | {
54 | return nil
55 | }
56 |
57 | guard let macho = MachOFile( path: info.executable.path ) else
58 | {
59 | return nil
60 | }
61 |
62 | self.bundleID = info.info[ "CFBundleIdentifier" ] as? String
63 | self.name = FileManager.default.displayName( atPath: path )
64 | self.path = path
65 | self.icon = NSWorkspace.shared.icon( forFile: path )
66 | self.architectures = macho.architectures
67 |
68 | if macho.architectures.count == 1
69 | {
70 | if macho.architectures.contains( "arm64" )
71 | {
72 | self.isAppleSiliconReady = true
73 | self.architecture = info.kind == .iOS ? "Apple (iOS)" : "Apple"
74 | }
75 | else if( macho.architectures.contains( "x86_64" ) )
76 | {
77 | self.isAppleSiliconReady = false
78 | self.architecture = "Intel 64"
79 | }
80 | else if macho.architectures.contains( "i386" )
81 | {
82 | self.isAppleSiliconReady = false
83 | self.architecture = "Intel 32"
84 | }
85 | else if macho.architectures.contains( "ppc" )
86 | {
87 | self.isAppleSiliconReady = false
88 | self.architecture = "PowerPC"
89 | }
90 | else
91 | {
92 | self.isAppleSiliconReady = false
93 | self.architecture = "Unknown"
94 | }
95 | }
96 | else
97 | {
98 | if macho.architectures.contains( "arm64" )
99 | {
100 | self.isAppleSiliconReady = true
101 | self.architecture = info.kind == .iOS ? "Universal (iOS)" : "Universal"
102 | }
103 | else if macho.architectures.contains( "ppc" ) && macho.architectures.contains( "i386" ) && macho.architectures.contains( "x86_64" )
104 | {
105 | self.isAppleSiliconReady = false
106 | self.architecture = "PowerPC/Intel 32/64"
107 | }
108 | else if macho.architectures.contains( "ppc" ) && macho.architectures.contains( "x86_64" )
109 | {
110 | self.isAppleSiliconReady = false
111 | self.architecture = "PowerPC/Intel 64"
112 | }
113 | else if macho.architectures.contains( "ppc" ) && macho.architectures.contains( "i386" )
114 | {
115 | self.isAppleSiliconReady = false
116 | self.architecture = "PowerPC/Intel 32"
117 | }
118 | else if macho.architectures.contains( "i386" ) && macho.architectures.contains( "x86_64" )
119 | {
120 | self.isAppleSiliconReady = false
121 | self.architecture = "Intel 32/64"
122 | }
123 | else
124 | {
125 | self.isAppleSiliconReady = false
126 | self.architecture = "Unknown"
127 | }
128 | }
129 | }
130 |
131 | @IBAction public func showInFinder( _ sender: Any? )
132 | {
133 | NSWorkspace.shared.selectFile( self.path, inFileViewerRootedAtPath: "/" )
134 | }
135 | }
136 |
--------------------------------------------------------------------------------
/Silicon/Classes/BinaryStream.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Foundation
26 |
27 | public class BinaryStream
28 | {
29 | public enum Error: Swift.Error
30 | {
31 | case FileDoesNotExist( String )
32 | case FileIsADirectory( String )
33 | case FileIsNotReadable( String )
34 | case ReadError( String )
35 | case InvalidFixedFloatingPointFormat( String )
36 | }
37 |
38 | private var stream: InputStream
39 | private var url: URL
40 |
41 | public convenience init( path: String ) throws
42 | {
43 | do
44 | {
45 | try self.init( url: URL( fileURLWithPath: path ) )
46 | }
47 | catch let e
48 | {
49 | throw e
50 | }
51 | }
52 |
53 | public init( url: URL ) throws
54 | {
55 | var dir: ObjCBool = false
56 |
57 | if FileManager.default.fileExists( atPath: url.path, isDirectory: &dir ) == false
58 | {
59 | throw Error.FileDoesNotExist( url.path )
60 | }
61 |
62 | if dir.boolValue
63 | {
64 | throw Error.FileIsADirectory( url.path )
65 | }
66 |
67 | guard let s = InputStream( url: url ) else
68 | {
69 | throw Error.FileIsNotReadable( url.path )
70 | }
71 |
72 | self.url = url
73 | self.stream = s
74 |
75 | self.stream.open()
76 | }
77 |
78 | deinit
79 | {
80 | self.stream.close()
81 | }
82 |
83 | public func readUnsignedChar() throws -> UInt8
84 | {
85 | do
86 | {
87 | let buf = try self.read( size: 1 )
88 |
89 | return buf[ 0 ]
90 | }
91 | catch let e
92 | {
93 | throw e
94 | }
95 | }
96 |
97 | public func readSignedChar() throws -> Int8
98 | {
99 | do
100 | {
101 | let buf = try self.read( size: 1 )
102 |
103 | return Int8( buf[ 0 ] )
104 | }
105 | catch let e
106 | {
107 | throw e
108 | }
109 | }
110 |
111 | public func readBigEndianUnsignedShort() throws -> UInt16
112 | {
113 | do
114 | {
115 | let buf = try self.read( size: 2 )
116 | let n1 = UInt16( buf[ 0 ] )
117 | let n2 = UInt16( buf[ 1 ] )
118 |
119 | return ( n1 << 8 ) | n2
120 | }
121 | catch let e
122 | {
123 | throw e
124 | }
125 | }
126 |
127 | public func readLittleEndianUnsignedShort() throws -> UInt16
128 | {
129 | do
130 | {
131 | let buf = try self.read( size: 2 )
132 | let n1 = UInt16( buf[ 1 ] )
133 | let n2 = UInt16( buf[ 0 ] )
134 |
135 | return ( n1 << 8 ) | n2
136 | }
137 | catch let e
138 | {
139 | throw e
140 | }
141 | }
142 |
143 | public func readBigEndianUnsignedInteger() throws -> UInt32
144 | {
145 | do
146 | {
147 | let buf = try self.read( size: 4 )
148 | let n1 = UInt32( buf[ 0 ] )
149 | let n2 = UInt32( buf[ 1 ] )
150 | let n3 = UInt32( buf[ 2 ] )
151 | let n4 = UInt32( buf[ 3 ] )
152 |
153 | return ( n1 << 24 ) | ( n2 << 16 ) | ( n3 << 8 ) | n4
154 | }
155 | catch let e
156 | {
157 | throw e
158 | }
159 | }
160 |
161 | public func readLittleEndianUnsignedInteger() throws -> UInt32
162 | {
163 | do
164 | {
165 | let buf = try self.read( size: 4 )
166 | let n1 = UInt32( buf[ 3 ] )
167 | let n2 = UInt32( buf[ 2 ] )
168 | let n3 = UInt32( buf[ 1 ] )
169 | let n4 = UInt32( buf[ 0 ] )
170 |
171 | return ( n1 << 24 ) | ( n2 << 16 ) | ( n3 << 8 ) | n4
172 | }
173 | catch let e
174 | {
175 | throw e
176 | }
177 | }
178 |
179 | public func readBigEndianUnsignedLong() throws -> UInt64
180 | {
181 | do
182 | {
183 | let buf = try self.read( size: 8 )
184 | let n1 = UInt64( buf[ 0 ] )
185 | let n2 = UInt64( buf[ 1 ] )
186 | let n3 = UInt64( buf[ 2 ] )
187 | let n4 = UInt64( buf[ 3 ] )
188 | let n5 = UInt64( buf[ 4 ] )
189 | let n6 = UInt64( buf[ 5 ] )
190 | let n7 = UInt64( buf[ 6 ] )
191 | let n8 = UInt64( buf[ 7 ] )
192 |
193 | var res = ( n1 << 56 )
194 | res |= ( n2 << 48 )
195 | res |= ( n3 << 40 )
196 | res |= ( n4 << 32 )
197 | res |= ( n5 << 24 )
198 | res |= ( n6 << 16 )
199 | res |= ( n7 << 8 )
200 | res |= n8
201 |
202 | return res
203 | }
204 | catch let e
205 | {
206 | throw e
207 | }
208 | }
209 |
210 | public func readLittleEndianUnsignedLong() throws -> UInt64
211 | {
212 | do
213 | {
214 | let buf = try self.read( size: 8 )
215 | let n1 = UInt64( buf[ 7 ] )
216 | let n2 = UInt64( buf[ 6 ] )
217 | let n3 = UInt64( buf[ 5 ] )
218 | let n4 = UInt64( buf[ 4 ] )
219 | let n5 = UInt64( buf[ 3 ] )
220 | let n6 = UInt64( buf[ 2 ] )
221 | let n7 = UInt64( buf[ 1 ] )
222 | let n8 = UInt64( buf[ 0 ] )
223 |
224 | var res = ( n1 << 56 )
225 | res |= ( n2 << 48 )
226 | res |= ( n3 << 40 )
227 | res |= ( n4 << 32 )
228 | res |= ( n5 << 24 )
229 | res |= ( n6 << 16 )
230 | res |= ( n7 << 8 )
231 | res |= n8
232 |
233 | return res
234 | }
235 | catch let e
236 | {
237 | throw e
238 | }
239 | }
240 |
241 | public func readNULLTerminatedString() throws -> String
242 | {
243 | var s = String()
244 |
245 | while true
246 | {
247 | do
248 | {
249 | let c = try self.read( size: 1 )[ 0 ]
250 |
251 | if c == 0
252 | {
253 | break
254 | }
255 |
256 | s.append( Character( UnicodeScalar( c ) ) )
257 | }
258 | catch let e
259 | {
260 | throw e
261 | }
262 | }
263 |
264 | return s
265 | }
266 |
267 | public func read( size: UInt ) throws -> [ UInt8 ]
268 | {
269 | if size == 0
270 | {
271 | return []
272 | }
273 |
274 | let buf = UnsafeMutablePointer< UInt8 >.allocate( capacity: Int( size ) )
275 |
276 | defer
277 | {
278 | buf.deallocate()
279 | }
280 |
281 | if self.stream.read( buf, maxLength: Int( size ) ) != Int( size )
282 | {
283 | throw Error.ReadError( self.url.path )
284 | }
285 |
286 | var array = [ UInt8 ]()
287 |
288 | for i in 0 ..< size
289 | {
290 | array.append( buf[ Int( i ) ] )
291 | }
292 |
293 | return array
294 | }
295 | }
296 |
--------------------------------------------------------------------------------
/Silicon/UI/Base.lproj/AboutWindowController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/Silicon/Classes/MainWindowController.swift:
--------------------------------------------------------------------------------
1 | /*******************************************************************************
2 | * The MIT License (MIT)
3 | *
4 | * Copyright (c) 2020 DigiDNA - www.imazing.com
5 | *
6 | * Permission is hereby granted, free of charge, to any person obtaining a copy
7 | * of this software and associated documentation files (the "Software"), to deal
8 | * in the Software without restriction, including without limitation the rights
9 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | * copies of the Software, and to permit persons to whom the Software is
11 | * furnished to do so, subject to the following conditions:
12 | *
13 | * The above copyright notice and this permission notice shall be included in
14 | * all copies or substantial portions of the Software.
15 | *
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | * THE SOFTWARE.
23 | ******************************************************************************/
24 |
25 | import Cocoa
26 |
27 | public class MainWindowController: NSWindowController
28 | {
29 | @objc public private( set ) dynamic var started = false
30 | @objc public private( set ) dynamic var loading = false
31 | @objc private dynamic var stop = false
32 | @objc public private( set ) dynamic var appCount = UInt64( 0 )
33 |
34 | @objc public private( set ) dynamic var appsFolderOnly = UserDefaults.standard.value( forKey: "appsFolderOnly" ) == nil ? true : UserDefaults.standard.bool( forKey: "appsFolderOnly" )
35 | {
36 | didSet
37 | {
38 | UserDefaults.standard.set( self.appsFolderOnly, forKey: "appsFolderOnly" )
39 | }
40 | }
41 |
42 | @objc public private( set ) dynamic var recurseIntoApps = UserDefaults.standard.bool( forKey: "recurseIntoApps" )
43 | {
44 | didSet
45 | {
46 | UserDefaults.standard.set( self.recurseIntoApps, forKey: "recurseIntoApps" )
47 | }
48 | }
49 |
50 | @objc public private( set ) dynamic var excludeAppleApps = UserDefaults.standard.bool( forKey: "excludeAppleApps" )
51 | {
52 | didSet
53 | {
54 | UserDefaults.standard.set( self.excludeAppleApps, forKey: "excludeAppleApps" )
55 | }
56 | }
57 |
58 | @objc public private( set ) dynamic var archFilter = UserDefaults.standard.integer( forKey: "archFilter" )
59 | {
60 | didSet
61 | {
62 | self.updateArchFilter()
63 | UserDefaults.standard.set( self.archFilter, forKey: "archFilter" )
64 | }
65 | }
66 |
67 | @IBOutlet public private( set ) dynamic var allApps: NSArrayController!
68 | @IBOutlet public private( set ) dynamic var archFilteredApps: NSArrayController!
69 | @IBOutlet public private( set ) dynamic var arrayController: NSArrayController!
70 | @IBOutlet public private( set ) dynamic var dropView: DropView!
71 |
72 | public override var windowNibName: NSNib.Name?
73 | {
74 | "MainWindowController"
75 | }
76 |
77 | public override func windowDidLoad()
78 | {
79 | super.windowDidLoad()
80 | self.updateArchFilter()
81 |
82 | self.arrayController.sortDescriptors = [
83 | NSSortDescriptor( key: "name", ascending: true, selector: #selector( NSString.localizedCaseInsensitiveCompare( _: ) ) ),
84 | NSSortDescriptor( key: "path", ascending: true )
85 | ]
86 |
87 | self.window?.setContentBorderThickness( 0, for: .minY )
88 |
89 | self.dropView.onDrag = { _ in return true }
90 | self.dropView.onDrop =
91 | {
92 | urls in
93 |
94 | guard let window = self.window, let url = urls.first else
95 | {
96 | NSSound.beep()
97 |
98 | return false
99 | }
100 |
101 | guard let app = App( path: url.path ) else
102 | {
103 | let alert = NSAlert()
104 |
105 | alert.messageText = "Not an Application"
106 | alert.informativeText = "The file you dropped was not detected as a macOS application."
107 | alert.alertStyle = .critical
108 |
109 | alert.beginSheetModal( for: window, completionHandler: nil )
110 |
111 | return true
112 | }
113 |
114 | if app.architectures.contains( "arm64" )
115 | {
116 | let alert = NSAlert()
117 |
118 | alert.messageText = "Apple Silicon Supported"
119 | alert.informativeText = "The application will run natively on Apple Silicon hardware."
120 |
121 | alert.beginSheetModal( for: window, completionHandler: nil )
122 |
123 | return true
124 | }
125 |
126 | let alert = NSAlert()
127 |
128 | alert.messageText = "No Apple Silicon Support"
129 | alert.informativeText = "The application will be emulated on Apple Silicon hardware."
130 | alert.alertStyle = .critical
131 |
132 | alert.beginSheetModal( for: window, completionHandler: nil )
133 |
134 | return true
135 | }
136 | }
137 |
138 | private func updateArchFilter()
139 | {
140 | if self.archFilter == 1
141 | {
142 | self.archFilteredApps.filterPredicate = NSPredicate( format: "isAppleSiliconReady=NO" )
143 | }
144 | else if self.archFilter == 2
145 | {
146 | self.archFilteredApps.filterPredicate = NSPredicate( format: "isAppleSiliconReady=YES" )
147 | }
148 | else
149 | {
150 | self.archFilteredApps.filterPredicate = nil
151 | }
152 | }
153 |
154 | public func stopLoading()
155 | {
156 | self.stop = true
157 | }
158 |
159 | @IBAction public func newDocument( _ sender: Any? )
160 | {
161 | let reset =
162 | {
163 | self.appCount = 0
164 | self.archFilter = 0
165 | self.loading = false
166 | self.stop = false
167 | self.started = false
168 | }
169 |
170 | if self.loading
171 | {
172 | self.stop = true
173 |
174 | DispatchQueue.global( qos: .userInitiated ).async
175 | {
176 | while self.loading
177 | {
178 | Thread.sleep( forTimeInterval: 0.1 )
179 | }
180 |
181 | DispatchQueue.main.async
182 | {
183 | reset()
184 | }
185 | }
186 | }
187 | else
188 | {
189 | reset()
190 | }
191 | }
192 |
193 | @IBAction public func reload( _ sender: Any? )
194 | {
195 | if self.loading
196 | {
197 | NSSound.beep()
198 |
199 | return
200 | }
201 |
202 | self.window?.setContentBorderThickness( 32, for: .minY )
203 |
204 | self.started = true
205 | self.loading = true
206 | self.appCount = 0
207 |
208 | self.allApps.remove( contentsOf: self.allApps.content as? [ Any ] ?? [] )
209 |
210 | DispatchQueue.global( qos: .userInitiated ).async
211 | {
212 | self.findApps()
213 |
214 | DispatchQueue.main.async
215 | {
216 | self.loading = false
217 | }
218 | }
219 | }
220 |
221 | @IBAction private func revealApp( _ sender: Any? )
222 | {
223 | guard let app = self.arrayController.selectedObjects.first as? App else
224 | {
225 | NSSound.beep()
226 |
227 | return
228 | }
229 |
230 | app.showInFinder( sender )
231 | }
232 |
233 | private func findApps()
234 | {
235 | if self.appsFolderOnly
236 | {
237 | let paths = NSSearchPathForDirectoriesInDomains( .applicationDirectory, .allDomainsMask, true )
238 |
239 | for path in paths
240 | {
241 | self.findApps( in: path )
242 | }
243 | }
244 | else
245 | {
246 | self.findApps( in: "/" )
247 | }
248 | }
249 |
250 | private func findApps( in directory: String )
251 | {
252 | guard let enumerator = FileManager.default.enumerator( atPath: directory ) else
253 | {
254 | return
255 | }
256 |
257 | var e = enumerator.nextObject()
258 |
259 | while e != nil
260 | {
261 | if self.stop
262 | {
263 | return
264 | }
265 |
266 | autoreleasepool
267 | {
268 | guard var path = e as? String else
269 | {
270 | e = enumerator.nextObject()
271 |
272 | return
273 | }
274 |
275 | path = ( directory as NSString ).appendingPathComponent( path )
276 |
277 | if path.hasPrefix( "/Volumes" )
278 | {
279 | e = enumerator.nextObject()
280 |
281 | return
282 | }
283 |
284 | if path.hasSuffix( ".app" ) == false
285 | {
286 | e = enumerator.nextObject()
287 |
288 | return
289 | }
290 |
291 | if self.recurseIntoApps == false
292 | {
293 | enumerator.skipDescendents()
294 | }
295 |
296 | if let app = App( path: path )
297 | {
298 | DispatchQueue.main.async
299 | {
300 | if self.excludeAppleApps && ( app.bundleID?.starts( with: "com.apple." ) ?? false )
301 | {
302 | return
303 | }
304 |
305 | self.allApps.addObject( app )
306 |
307 | self.appCount += 1
308 | }
309 | }
310 |
311 | e = enumerator.nextObject()
312 | }
313 | }
314 | }
315 | }
316 |
--------------------------------------------------------------------------------
/Silicon.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 54;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 055568432567831F00B42091 /* GitHubUpdates.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0555683C2567831700B42091 /* GitHubUpdates.framework */; };
11 | 055568442567831F00B42091 /* GitHubUpdates.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0555683C2567831700B42091 /* GitHubUpdates.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
12 | 05680C07256F7E0C000520F2 /* IsZero.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05680C06256F7E0C000520F2 /* IsZero.swift */; };
13 | 05680C0B256F7FA1000520F2 /* IsNotZero.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05680C0A256F7FA1000520F2 /* IsNotZero.swift */; };
14 | 057BA11E28884F1E00324D16 /* AppInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 057BA11D28884F1E00324D16 /* AppInfo.swift */; };
15 | 0586D54B256696D900CBBD48 /* ApplicationDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0586D54A256696D900CBBD48 /* ApplicationDelegate.swift */; };
16 | 0586D550256696DA00CBBD48 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0586D54E256696DA00CBBD48 /* MainMenu.xib */; };
17 | 0586D55D2566978100CBBD48 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0586D55C2566978100CBBD48 /* App.swift */; };
18 | 0586D560256697A500CBBD48 /* MainWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0586D55F256697A500CBBD48 /* MainWindowController.swift */; };
19 | 0586D5682566995800CBBD48 /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0586D5672566995800CBBD48 /* AboutWindowController.swift */; };
20 | 0586D56C2566996500CBBD48 /* AboutWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0586D56A2566996500CBBD48 /* AboutWindowController.xib */; };
21 | 0586D56E2566997000CBBD48 /* MainWindowController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0586D5702566997000CBBD48 /* MainWindowController.xib */; };
22 | 0586D5732566A31200CBBD48 /* NumberToString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0586D5722566A31200CBBD48 /* NumberToString.swift */; };
23 | 0586D5762566B14200CBBD48 /* BinaryStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0586D5752566B14200CBBD48 /* BinaryStream.swift */; };
24 | 0586D5792566B31A00CBBD48 /* MachOFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0586D5782566B31A00CBBD48 /* MachOFile.swift */; };
25 | 0586D5922566C30600CBBD48 /* Icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = 0586D5912566C30600CBBD48 /* Icon.icns */; };
26 | 0586D6212566CED200CBBD48 /* DropView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0586D6202566CED200CBBD48 /* DropView.swift */; };
27 | 05F025552575FF1200ADB3EA /* MainWindowController.strings in Resources */ = {isa = PBXBuildFile; fileRef = 05F025512575FF1200ADB3EA /* MainWindowController.strings */; };
28 | /* End PBXBuildFile section */
29 |
30 | /* Begin PBXContainerItemProxy section */
31 | 0555683B2567831700B42091 /* PBXContainerItemProxy */ = {
32 | isa = PBXContainerItemProxy;
33 | containerPortal = 055568362567831700B42091 /* GitHubUpdates.xcodeproj */;
34 | proxyType = 2;
35 | remoteGlobalIDString = 05F82B251EF32EA700EC8A93;
36 | remoteInfo = GitHubUpdates;
37 | };
38 | 0555683D2567831700B42091 /* PBXContainerItemProxy */ = {
39 | isa = PBXContainerItemProxy;
40 | containerPortal = 055568362567831700B42091 /* GitHubUpdates.xcodeproj */;
41 | proxyType = 2;
42 | remoteGlobalIDString = 0555EBA01EF3DDA10016167F;
43 | remoteInfo = Relauncher;
44 | };
45 | /* End PBXContainerItemProxy section */
46 |
47 | /* Begin PBXCopyFilesBuildPhase section */
48 | 055568452567831F00B42091 /* Embed Frameworks */ = {
49 | isa = PBXCopyFilesBuildPhase;
50 | buildActionMask = 2147483647;
51 | dstPath = "";
52 | dstSubfolderSpec = 10;
53 | files = (
54 | 055568442567831F00B42091 /* GitHubUpdates.framework in Embed Frameworks */,
55 | );
56 | name = "Embed Frameworks";
57 | runOnlyForDeploymentPostprocessing = 0;
58 | };
59 | /* End PBXCopyFilesBuildPhase section */
60 |
61 | /* Begin PBXFileReference section */
62 | 055568362567831700B42091 /* GitHubUpdates.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GitHubUpdates.xcodeproj; path = Submodules/GitHubUpdates/GitHubUpdates.xcodeproj; sourceTree = ""; };
63 | 05680C06256F7E0C000520F2 /* IsZero.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsZero.swift; sourceTree = ""; };
64 | 05680C0A256F7FA1000520F2 /* IsNotZero.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsNotZero.swift; sourceTree = ""; };
65 | 057BA11D28884F1E00324D16 /* AppInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppInfo.swift; sourceTree = ""; };
66 | 0586D547256696D900CBBD48 /* Silicon.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Silicon.app; sourceTree = BUILT_PRODUCTS_DIR; };
67 | 0586D54A256696D900CBBD48 /* ApplicationDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationDelegate.swift; sourceTree = ""; };
68 | 0586D54F256696DA00CBBD48 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
69 | 0586D551256696DA00CBBD48 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
70 | 0586D552256696DA00CBBD48 /* Silicon.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Silicon.entitlements; sourceTree = ""; };
71 | 0586D55C2566978100CBBD48 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; };
72 | 0586D55F256697A500CBBD48 /* MainWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainWindowController.swift; sourceTree = ""; };
73 | 0586D5672566995800CBBD48 /* AboutWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = ""; };
74 | 0586D56B2566996500CBBD48 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/AboutWindowController.xib; sourceTree = ""; };
75 | 0586D56F2566997000CBBD48 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainWindowController.xib; sourceTree = ""; };
76 | 0586D5722566A31200CBBD48 /* NumberToString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumberToString.swift; sourceTree = ""; };
77 | 0586D5752566B14200CBBD48 /* BinaryStream.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BinaryStream.swift; sourceTree = ""; };
78 | 0586D5782566B31A00CBBD48 /* MachOFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MachOFile.swift; sourceTree = ""; };
79 | 0586D5912566C30600CBBD48 /* Icon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Icon.icns; sourceTree = ""; };
80 | 0586D5E92566C7E700CBBD48 /* Release - ccache.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Release - ccache.xcconfig"; sourceTree = ""; };
81 | 0586D5EA2566C7E700CBBD48 /* Common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Common.xcconfig; sourceTree = ""; };
82 | 0586D5EB2566C7E700CBBD48 /* Debug - ccache.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Debug - ccache.xcconfig"; sourceTree = ""; };
83 | 0586D5EC2566C7E700CBBD48 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; };
84 | 0586D5ED2566C7E700CBBD48 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; };
85 | 0586D5EE2566C7E700CBBD48 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; };
86 | 0586D5EF2566C7E700CBBD48 /* Release - Library.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Release - Library.xcconfig"; sourceTree = ""; };
87 | 0586D5F12566C7E700CBBD48 /* Signing.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Signing.xcconfig; sourceTree = ""; };
88 | 0586D5F22566C7E700CBBD48 /* Architectures.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Architectures.xcconfig; sourceTree = ""; };
89 | 0586D5F42566C7E700CBBD48 /* Issues.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Issues.xcconfig; sourceTree = ""; };
90 | 0586D5F62566C7E700CBBD48 /* Apple-APIs.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Apple-APIs.xcconfig"; sourceTree = ""; };
91 | 0586D5F72566C7E700CBBD48 /* Generic-Issues.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Generic-Issues.xcconfig"; sourceTree = ""; };
92 | 0586D5F82566C7E700CBBD48 /* Security.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Security.xcconfig; sourceTree = ""; };
93 | 0586D5F92566C7E700CBBD48 /* Objective-C.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Objective-C.xcconfig"; sourceTree = ""; };
94 | 0586D5FA2566C7E700CBBD48 /* Analysis-Policy.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Analysis-Policy.xcconfig"; sourceTree = ""; };
95 | 0586D5FB2566C7E700CBBD48 /* Deployment.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Deployment.xcconfig; sourceTree = ""; };
96 | 0586D5FC2566C7E700CBBD48 /* Build-Options.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Build-Options.xcconfig"; sourceTree = ""; };
97 | 0586D5FD2566C7E700CBBD48 /* Swift-Compiler.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Swift-Compiler.xcconfig"; sourceTree = ""; };
98 | 0586D5FE2566C7E700CBBD48 /* Static-Analyzer.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Static-Analyzer.xcconfig"; sourceTree = ""; };
99 | 0586D6002566C7E700CBBD48 /* Warnings-Policies.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Warnings-Policies.xcconfig"; sourceTree = ""; };
100 | 0586D6012566C7E700CBBD48 /* Code-Generation.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Code-Generation.xcconfig"; sourceTree = ""; };
101 | 0586D6022566C7E700CBBD48 /* Language.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Language.xcconfig; sourceTree = ""; };
102 | 0586D6032566C7E700CBBD48 /* General.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = General.xcconfig; sourceTree = ""; };
103 | 0586D6042566C7E700CBBD48 /* Search-Paths.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Search-Paths.xcconfig"; sourceTree = ""; };
104 | 0586D6052566C7E700CBBD48 /* Apple-LLVM.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Apple-LLVM.xcconfig"; sourceTree = ""; };
105 | 0586D6082566C7E700CBBD48 /* Modules.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Modules.xcconfig; sourceTree = ""; };
106 | 0586D6092566C7E700CBBD48 /* Objective-C.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Objective-C.xcconfig"; sourceTree = ""; };
107 | 0586D60A2566C7E700CBBD48 /* C++.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "C++.xcconfig"; sourceTree = ""; };
108 | 0586D60B2566C7E700CBBD48 /* Code-Generation.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Code-Generation.xcconfig"; sourceTree = ""; };
109 | 0586D60C2566C7E700CBBD48 /* Address-Sanitizer.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Address-Sanitizer.xcconfig"; sourceTree = ""; };
110 | 0586D60D2566C7E700CBBD48 /* Language.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Language.xcconfig; sourceTree = ""; };
111 | 0586D60E2566C7E700CBBD48 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; };
112 | 0586D60F2566C7E700CBBD48 /* Undefined-Behavior-Sanitizer.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Undefined-Behavior-Sanitizer.xcconfig"; sourceTree = ""; };
113 | 0586D6102566C7E700CBBD48 /* Warning-Policies.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Warning-Policies.xcconfig"; sourceTree = ""; };
114 | 0586D6122566C7E700CBBD48 /* Objective-C-ARC.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Objective-C-ARC.xcconfig"; sourceTree = ""; };
115 | 0586D6132566C7E700CBBD48 /* Objective-C.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Objective-C.xcconfig"; sourceTree = ""; };
116 | 0586D6142566C7E700CBBD48 /* C++.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "C++.xcconfig"; sourceTree = ""; };
117 | 0586D6152566C7E700CBBD48 /* All-Languages.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "All-Languages.xcconfig"; sourceTree = ""; };
118 | 0586D6162566C7E700CBBD48 /* Preprocessing.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Preprocessing.xcconfig; sourceTree = ""; };
119 | 0586D6172566C7E700CBBD48 /* Debug - Library.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Debug - Library.xcconfig"; sourceTree = ""; };
120 | 0586D6182566C7E700CBBD48 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; path = .gitignore; sourceTree = ""; };
121 | 0586D61A2566C7E700CBBD48 /* ccache-config.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = "ccache-config.sh"; sourceTree = ""; };
122 | 0586D61B2566C7E700CBBD48 /* ccache.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ccache.sh; sourceTree = ""; };
123 | 0586D61C2566C7E700CBBD48 /* Debug - zld.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Debug - zld.xcconfig"; sourceTree = ""; };
124 | 0586D6202566CED200CBBD48 /* DropView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DropView.swift; sourceTree = ""; };
125 | 05F025522575FF1200ADB3EA /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/MainWindowController.strings"; sourceTree = ""; };
126 | 05F025562575FF1A00ADB3EA /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "zh-HK.lproj/MainWindowController.strings"; sourceTree = ""; };
127 | /* End PBXFileReference section */
128 |
129 | /* Begin PBXFrameworksBuildPhase section */
130 | 0586D544256696D900CBBD48 /* Frameworks */ = {
131 | isa = PBXFrameworksBuildPhase;
132 | buildActionMask = 2147483647;
133 | files = (
134 | 055568432567831F00B42091 /* GitHubUpdates.framework in Frameworks */,
135 | );
136 | runOnlyForDeploymentPostprocessing = 0;
137 | };
138 | /* End PBXFrameworksBuildPhase section */
139 |
140 | /* Begin PBXGroup section */
141 | 055568372567831700B42091 /* Products */ = {
142 | isa = PBXGroup;
143 | children = (
144 | 0555683C2567831700B42091 /* GitHubUpdates.framework */,
145 | 0555683E2567831700B42091 /* Relauncher */,
146 | );
147 | name = Products;
148 | sourceTree = "";
149 | };
150 | 055568422567831F00B42091 /* Frameworks */ = {
151 | isa = PBXGroup;
152 | children = (
153 | );
154 | name = Frameworks;
155 | sourceTree = "";
156 | };
157 | 0586D53E256696D900CBBD48 = {
158 | isa = PBXGroup;
159 | children = (
160 | 055568362567831700B42091 /* GitHubUpdates.xcodeproj */,
161 | 0586D5E82566C7E700CBBD48 /* xcconfig */,
162 | 0586D549256696D900CBBD48 /* Silicon */,
163 | 0586D548256696D900CBBD48 /* Products */,
164 | 055568422567831F00B42091 /* Frameworks */,
165 | );
166 | sourceTree = "";
167 | };
168 | 0586D548256696D900CBBD48 /* Products */ = {
169 | isa = PBXGroup;
170 | children = (
171 | 0586D547256696D900CBBD48 /* Silicon.app */,
172 | );
173 | name = Products;
174 | sourceTree = "";
175 | };
176 | 0586D549256696D900CBBD48 /* Silicon */ = {
177 | isa = PBXGroup;
178 | children = (
179 | 0586D55A2566974A00CBBD48 /* Classes */,
180 | 0586D562256697BB00CBBD48 /* UI */,
181 | 0586D551256696DA00CBBD48 /* Info.plist */,
182 | 0586D552256696DA00CBBD48 /* Silicon.entitlements */,
183 | );
184 | path = Silicon;
185 | sourceTree = "";
186 | };
187 | 0586D55A2566974A00CBBD48 /* Classes */ = {
188 | isa = PBXGroup;
189 | children = (
190 | 0586D5672566995800CBBD48 /* AboutWindowController.swift */,
191 | 0586D55C2566978100CBBD48 /* App.swift */,
192 | 057BA11D28884F1E00324D16 /* AppInfo.swift */,
193 | 0586D54A256696D900CBBD48 /* ApplicationDelegate.swift */,
194 | 0586D5752566B14200CBBD48 /* BinaryStream.swift */,
195 | 0586D6202566CED200CBBD48 /* DropView.swift */,
196 | 05680C06256F7E0C000520F2 /* IsZero.swift */,
197 | 05680C0A256F7FA1000520F2 /* IsNotZero.swift */,
198 | 0586D5782566B31A00CBBD48 /* MachOFile.swift */,
199 | 0586D55F256697A500CBBD48 /* MainWindowController.swift */,
200 | 0586D5722566A31200CBBD48 /* NumberToString.swift */,
201 | );
202 | path = Classes;
203 | sourceTree = "";
204 | };
205 | 0586D562256697BB00CBBD48 /* UI */ = {
206 | isa = PBXGroup;
207 | children = (
208 | 05F025512575FF1200ADB3EA /* MainWindowController.strings */,
209 | 0586D5902566C30600CBBD48 /* Images */,
210 | 0586D54E256696DA00CBBD48 /* MainMenu.xib */,
211 | 0586D56A2566996500CBBD48 /* AboutWindowController.xib */,
212 | 0586D5702566997000CBBD48 /* MainWindowController.xib */,
213 | );
214 | path = UI;
215 | sourceTree = "";
216 | };
217 | 0586D5902566C30600CBBD48 /* Images */ = {
218 | isa = PBXGroup;
219 | children = (
220 | 0586D5912566C30600CBBD48 /* Icon.icns */,
221 | );
222 | path = Images;
223 | sourceTree = "";
224 | };
225 | 0586D5E82566C7E700CBBD48 /* xcconfig */ = {
226 | isa = PBXGroup;
227 | children = (
228 | 0586D5E92566C7E700CBBD48 /* Release - ccache.xcconfig */,
229 | 0586D5EA2566C7E700CBBD48 /* Common.xcconfig */,
230 | 0586D5EB2566C7E700CBBD48 /* Debug - ccache.xcconfig */,
231 | 0586D5EC2566C7E700CBBD48 /* Debug.xcconfig */,
232 | 0586D5ED2566C7E700CBBD48 /* Release.xcconfig */,
233 | 0586D5EE2566C7E700CBBD48 /* README.md */,
234 | 0586D5EF2566C7E700CBBD48 /* Release - Library.xcconfig */,
235 | 0586D5F02566C7E700CBBD48 /* Common */,
236 | 0586D6172566C7E700CBBD48 /* Debug - Library.xcconfig */,
237 | 0586D6182566C7E700CBBD48 /* .gitignore */,
238 | 0586D6192566C7E700CBBD48 /* Scripts */,
239 | 0586D61C2566C7E700CBBD48 /* Debug - zld.xcconfig */,
240 | );
241 | name = xcconfig;
242 | path = Submodules/xcconfig;
243 | sourceTree = "";
244 | };
245 | 0586D5F02566C7E700CBBD48 /* Common */ = {
246 | isa = PBXGroup;
247 | children = (
248 | 0586D5F12566C7E700CBBD48 /* Signing.xcconfig */,
249 | 0586D5F22566C7E700CBBD48 /* Architectures.xcconfig */,
250 | 0586D5F32566C7E700CBBD48 /* Static-Analyzer */,
251 | 0586D5FB2566C7E700CBBD48 /* Deployment.xcconfig */,
252 | 0586D5FC2566C7E700CBBD48 /* Build-Options.xcconfig */,
253 | 0586D5FD2566C7E700CBBD48 /* Swift-Compiler.xcconfig */,
254 | 0586D5FE2566C7E700CBBD48 /* Static-Analyzer.xcconfig */,
255 | 0586D5FF2566C7E700CBBD48 /* Swift-Compiler */,
256 | 0586D6042566C7E700CBBD48 /* Search-Paths.xcconfig */,
257 | 0586D6052566C7E700CBBD48 /* Apple-LLVM.xcconfig */,
258 | 0586D6062566C7E700CBBD48 /* Apple-LLVM */,
259 | );
260 | path = Common;
261 | sourceTree = "";
262 | };
263 | 0586D5F32566C7E700CBBD48 /* Static-Analyzer */ = {
264 | isa = PBXGroup;
265 | children = (
266 | 0586D5F42566C7E700CBBD48 /* Issues.xcconfig */,
267 | 0586D5F52566C7E700CBBD48 /* Issues */,
268 | );
269 | path = "Static-Analyzer";
270 | sourceTree = "";
271 | };
272 | 0586D5F52566C7E700CBBD48 /* Issues */ = {
273 | isa = PBXGroup;
274 | children = (
275 | 0586D5F62566C7E700CBBD48 /* Apple-APIs.xcconfig */,
276 | 0586D5F72566C7E700CBBD48 /* Generic-Issues.xcconfig */,
277 | 0586D5F82566C7E700CBBD48 /* Security.xcconfig */,
278 | 0586D5F92566C7E700CBBD48 /* Objective-C.xcconfig */,
279 | 0586D5FA2566C7E700CBBD48 /* Analysis-Policy.xcconfig */,
280 | );
281 | path = Issues;
282 | sourceTree = "";
283 | };
284 | 0586D5FF2566C7E700CBBD48 /* Swift-Compiler */ = {
285 | isa = PBXGroup;
286 | children = (
287 | 0586D6002566C7E700CBBD48 /* Warnings-Policies.xcconfig */,
288 | 0586D6012566C7E700CBBD48 /* Code-Generation.xcconfig */,
289 | 0586D6022566C7E700CBBD48 /* Language.xcconfig */,
290 | 0586D6032566C7E700CBBD48 /* General.xcconfig */,
291 | );
292 | path = "Swift-Compiler";
293 | sourceTree = "";
294 | };
295 | 0586D6062566C7E700CBBD48 /* Apple-LLVM */ = {
296 | isa = PBXGroup;
297 | children = (
298 | 0586D6072566C7E700CBBD48 /* Language */,
299 | 0586D60B2566C7E700CBBD48 /* Code-Generation.xcconfig */,
300 | 0586D60C2566C7E700CBBD48 /* Address-Sanitizer.xcconfig */,
301 | 0586D60D2566C7E700CBBD48 /* Language.xcconfig */,
302 | 0586D60E2566C7E700CBBD48 /* Warnings.xcconfig */,
303 | 0586D60F2566C7E700CBBD48 /* Undefined-Behavior-Sanitizer.xcconfig */,
304 | 0586D6102566C7E700CBBD48 /* Warning-Policies.xcconfig */,
305 | 0586D6112566C7E700CBBD48 /* Warnings */,
306 | 0586D6162566C7E700CBBD48 /* Preprocessing.xcconfig */,
307 | );
308 | path = "Apple-LLVM";
309 | sourceTree = "";
310 | };
311 | 0586D6072566C7E700CBBD48 /* Language */ = {
312 | isa = PBXGroup;
313 | children = (
314 | 0586D6082566C7E700CBBD48 /* Modules.xcconfig */,
315 | 0586D6092566C7E700CBBD48 /* Objective-C.xcconfig */,
316 | 0586D60A2566C7E700CBBD48 /* C++.xcconfig */,
317 | );
318 | path = Language;
319 | sourceTree = "";
320 | };
321 | 0586D6112566C7E700CBBD48 /* Warnings */ = {
322 | isa = PBXGroup;
323 | children = (
324 | 0586D6122566C7E700CBBD48 /* Objective-C-ARC.xcconfig */,
325 | 0586D6132566C7E700CBBD48 /* Objective-C.xcconfig */,
326 | 0586D6142566C7E700CBBD48 /* C++.xcconfig */,
327 | 0586D6152566C7E700CBBD48 /* All-Languages.xcconfig */,
328 | );
329 | path = Warnings;
330 | sourceTree = "";
331 | };
332 | 0586D6192566C7E700CBBD48 /* Scripts */ = {
333 | isa = PBXGroup;
334 | children = (
335 | 0586D61A2566C7E700CBBD48 /* ccache-config.sh */,
336 | 0586D61B2566C7E700CBBD48 /* ccache.sh */,
337 | );
338 | path = Scripts;
339 | sourceTree = "";
340 | };
341 | /* End PBXGroup section */
342 |
343 | /* Begin PBXNativeTarget section */
344 | 0586D546256696D900CBBD48 /* Silicon */ = {
345 | isa = PBXNativeTarget;
346 | buildConfigurationList = 0586D555256696DA00CBBD48 /* Build configuration list for PBXNativeTarget "Silicon" */;
347 | buildPhases = (
348 | 0586D543256696D900CBBD48 /* Sources */,
349 | 0586D544256696D900CBBD48 /* Frameworks */,
350 | 0586D59D2566C47900CBBD48 /* ShellScript */,
351 | 0586D545256696D900CBBD48 /* Resources */,
352 | 055568452567831F00B42091 /* Embed Frameworks */,
353 | );
354 | buildRules = (
355 | );
356 | dependencies = (
357 | );
358 | name = Silicon;
359 | productName = Silicon;
360 | productReference = 0586D547256696D900CBBD48 /* Silicon.app */;
361 | productType = "com.apple.product-type.application";
362 | };
363 | /* End PBXNativeTarget section */
364 |
365 | /* Begin PBXProject section */
366 | 0586D53F256696D900CBBD48 /* Project object */ = {
367 | isa = PBXProject;
368 | attributes = {
369 | LastSwiftUpdateCheck = 1220;
370 | LastUpgradeCheck = 1410;
371 | TargetAttributes = {
372 | 0586D546256696D900CBBD48 = {
373 | CreatedOnToolsVersion = 12.2;
374 | };
375 | };
376 | };
377 | buildConfigurationList = 0586D542256696D900CBBD48 /* Build configuration list for PBXProject "Silicon" */;
378 | compatibilityVersion = "Xcode 9.3";
379 | developmentRegion = en;
380 | hasScannedForEncodings = 0;
381 | knownRegions = (
382 | en,
383 | Base,
384 | "zh-Hans",
385 | "zh-HK",
386 | );
387 | mainGroup = 0586D53E256696D900CBBD48;
388 | productRefGroup = 0586D548256696D900CBBD48 /* Products */;
389 | projectDirPath = "";
390 | projectReferences = (
391 | {
392 | ProductGroup = 055568372567831700B42091 /* Products */;
393 | ProjectRef = 055568362567831700B42091 /* GitHubUpdates.xcodeproj */;
394 | },
395 | );
396 | projectRoot = "";
397 | targets = (
398 | 0586D546256696D900CBBD48 /* Silicon */,
399 | );
400 | };
401 | /* End PBXProject section */
402 |
403 | /* Begin PBXReferenceProxy section */
404 | 0555683C2567831700B42091 /* GitHubUpdates.framework */ = {
405 | isa = PBXReferenceProxy;
406 | fileType = wrapper.framework;
407 | path = GitHubUpdates.framework;
408 | remoteRef = 0555683B2567831700B42091 /* PBXContainerItemProxy */;
409 | sourceTree = BUILT_PRODUCTS_DIR;
410 | };
411 | 0555683E2567831700B42091 /* Relauncher */ = {
412 | isa = PBXReferenceProxy;
413 | fileType = "compiled.mach-o.executable";
414 | path = Relauncher;
415 | remoteRef = 0555683D2567831700B42091 /* PBXContainerItemProxy */;
416 | sourceTree = BUILT_PRODUCTS_DIR;
417 | };
418 | /* End PBXReferenceProxy section */
419 |
420 | /* Begin PBXResourcesBuildPhase section */
421 | 0586D545256696D900CBBD48 /* Resources */ = {
422 | isa = PBXResourcesBuildPhase;
423 | buildActionMask = 2147483647;
424 | files = (
425 | 0586D56C2566996500CBBD48 /* AboutWindowController.xib in Resources */,
426 | 0586D56E2566997000CBBD48 /* MainWindowController.xib in Resources */,
427 | 0586D5922566C30600CBBD48 /* Icon.icns in Resources */,
428 | 0586D550256696DA00CBBD48 /* MainMenu.xib in Resources */,
429 | 05F025552575FF1200ADB3EA /* MainWindowController.strings in Resources */,
430 | );
431 | runOnlyForDeploymentPostprocessing = 0;
432 | };
433 | /* End PBXResourcesBuildPhase section */
434 |
435 | /* Begin PBXShellScriptBuildPhase section */
436 | 0586D59D2566C47900CBBD48 /* ShellScript */ = {
437 | isa = PBXShellScriptBuildPhase;
438 | alwaysOutOfDate = 1;
439 | buildActionMask = 2147483647;
440 | files = (
441 | );
442 | inputFileListPaths = (
443 | );
444 | inputPaths = (
445 | );
446 | outputFileListPaths = (
447 | );
448 | outputPaths = (
449 | );
450 | runOnlyForDeploymentPostprocessing = 0;
451 | shellPath = /bin/sh;
452 | shellScript = "#!/bin/bash\nif [ \"${CONFIGURATION}\" = \"Release\" ]; then\n plist=\"Silicon/Info.plist\"\n rev=$(git rev-list `git branch | grep -e \"^*\" | cut -d' ' -f 2` | wc -l)\n /usr/libexec/PlistBuddy -c \"Set :CFBundleVersion $rev\" \"$plist\"\nfi\n";
453 | };
454 | /* End PBXShellScriptBuildPhase section */
455 |
456 | /* Begin PBXSourcesBuildPhase section */
457 | 0586D543256696D900CBBD48 /* Sources */ = {
458 | isa = PBXSourcesBuildPhase;
459 | buildActionMask = 2147483647;
460 | files = (
461 | 0586D5762566B14200CBBD48 /* BinaryStream.swift in Sources */,
462 | 0586D6212566CED200CBBD48 /* DropView.swift in Sources */,
463 | 0586D5792566B31A00CBBD48 /* MachOFile.swift in Sources */,
464 | 057BA11E28884F1E00324D16 /* AppInfo.swift in Sources */,
465 | 0586D5732566A31200CBBD48 /* NumberToString.swift in Sources */,
466 | 0586D54B256696D900CBBD48 /* ApplicationDelegate.swift in Sources */,
467 | 0586D5682566995800CBBD48 /* AboutWindowController.swift in Sources */,
468 | 0586D55D2566978100CBBD48 /* App.swift in Sources */,
469 | 05680C0B256F7FA1000520F2 /* IsNotZero.swift in Sources */,
470 | 0586D560256697A500CBBD48 /* MainWindowController.swift in Sources */,
471 | 05680C07256F7E0C000520F2 /* IsZero.swift in Sources */,
472 | );
473 | runOnlyForDeploymentPostprocessing = 0;
474 | };
475 | /* End PBXSourcesBuildPhase section */
476 |
477 | /* Begin PBXVariantGroup section */
478 | 0586D54E256696DA00CBBD48 /* MainMenu.xib */ = {
479 | isa = PBXVariantGroup;
480 | children = (
481 | 0586D54F256696DA00CBBD48 /* Base */,
482 | );
483 | name = MainMenu.xib;
484 | sourceTree = "";
485 | };
486 | 0586D56A2566996500CBBD48 /* AboutWindowController.xib */ = {
487 | isa = PBXVariantGroup;
488 | children = (
489 | 0586D56B2566996500CBBD48 /* Base */,
490 | );
491 | name = AboutWindowController.xib;
492 | sourceTree = "";
493 | };
494 | 0586D5702566997000CBBD48 /* MainWindowController.xib */ = {
495 | isa = PBXVariantGroup;
496 | children = (
497 | 0586D56F2566997000CBBD48 /* Base */,
498 | );
499 | name = MainWindowController.xib;
500 | sourceTree = "";
501 | };
502 | 05F025512575FF1200ADB3EA /* MainWindowController.strings */ = {
503 | isa = PBXVariantGroup;
504 | children = (
505 | 05F025522575FF1200ADB3EA /* zh-Hans */,
506 | 05F025562575FF1A00ADB3EA /* zh-HK */,
507 | );
508 | name = MainWindowController.strings;
509 | sourceTree = "";
510 | };
511 | /* End PBXVariantGroup section */
512 |
513 | /* Begin XCBuildConfiguration section */
514 | 0586D553256696DA00CBBD48 /* Debug */ = {
515 | isa = XCBuildConfiguration;
516 | baseConfigurationReference = 0586D5EC2566C7E700CBBD48 /* Debug.xcconfig */;
517 | buildSettings = {
518 | MACOSX_DEPLOYMENT_TARGET = 10.13;
519 | };
520 | name = Debug;
521 | };
522 | 0586D554256696DA00CBBD48 /* Release */ = {
523 | isa = XCBuildConfiguration;
524 | baseConfigurationReference = 0586D5ED2566C7E700CBBD48 /* Release.xcconfig */;
525 | buildSettings = {
526 | MACOSX_DEPLOYMENT_TARGET = 10.13;
527 | };
528 | name = Release;
529 | };
530 | 0586D556256696DA00CBBD48 /* Debug */ = {
531 | isa = XCBuildConfiguration;
532 | buildSettings = {
533 | CODE_SIGN_ENTITLEMENTS = Silicon/Silicon.entitlements;
534 | CODE_SIGN_STYLE = Automatic;
535 | DEVELOPMENT_TEAM = J5PR93692Y;
536 | ENABLE_HARDENED_RUNTIME = YES;
537 | INFOPLIST_FILE = Silicon/Info.plist;
538 | LD_RUNPATH_SEARCH_PATHS = (
539 | "$(inherited)",
540 | "@executable_path/../Frameworks",
541 | );
542 | PRODUCT_BUNDLE_IDENTIFIER = com.DigiDNA.Silicon;
543 | PRODUCT_NAME = "$(TARGET_NAME)";
544 | };
545 | name = Debug;
546 | };
547 | 0586D557256696DA00CBBD48 /* Release */ = {
548 | isa = XCBuildConfiguration;
549 | buildSettings = {
550 | CODE_SIGN_ENTITLEMENTS = Silicon/Silicon.entitlements;
551 | CODE_SIGN_STYLE = Automatic;
552 | DEVELOPMENT_TEAM = J5PR93692Y;
553 | ENABLE_HARDENED_RUNTIME = YES;
554 | INFOPLIST_FILE = Silicon/Info.plist;
555 | LD_RUNPATH_SEARCH_PATHS = (
556 | "$(inherited)",
557 | "@executable_path/../Frameworks",
558 | );
559 | PRODUCT_BUNDLE_IDENTIFIER = com.DigiDNA.Silicon;
560 | PRODUCT_NAME = "$(TARGET_NAME)";
561 | };
562 | name = Release;
563 | };
564 | /* End XCBuildConfiguration section */
565 |
566 | /* Begin XCConfigurationList section */
567 | 0586D542256696D900CBBD48 /* Build configuration list for PBXProject "Silicon" */ = {
568 | isa = XCConfigurationList;
569 | buildConfigurations = (
570 | 0586D553256696DA00CBBD48 /* Debug */,
571 | 0586D554256696DA00CBBD48 /* Release */,
572 | );
573 | defaultConfigurationIsVisible = 0;
574 | defaultConfigurationName = Release;
575 | };
576 | 0586D555256696DA00CBBD48 /* Build configuration list for PBXNativeTarget "Silicon" */ = {
577 | isa = XCConfigurationList;
578 | buildConfigurations = (
579 | 0586D556256696DA00CBBD48 /* Debug */,
580 | 0586D557256696DA00CBBD48 /* Release */,
581 | );
582 | defaultConfigurationIsVisible = 0;
583 | defaultConfigurationName = Release;
584 | };
585 | /* End XCConfigurationList section */
586 | };
587 | rootObject = 0586D53F256696D900CBBD48 /* Project object */;
588 | }
589 |
--------------------------------------------------------------------------------
/Silicon/UI/Base.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
703 |
--------------------------------------------------------------------------------
/Silicon/UI/Base.lproj/MainWindowController.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
64 |
74 |
84 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 | NSNegateBoolean
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 | Silicon.IsZero
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 | Silicon.IsNotZero
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 |
335 |
336 |
337 |
338 |
339 |
340 |
341 | Silicon.NumberToString
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 | NSNegateBoolean
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 |
379 |
380 |
381 |
382 |
383 |
384 | predicate
385 | name contains[c] $value
386 |
387 |
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 |
420 |
421 |
422 | NSNegateBoolean
423 |
424 |
425 |
426 |
427 |
428 |
429 |
430 |
431 |
432 |
433 |
434 |
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 |
445 |
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
--------------------------------------------------------------------------------