<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.59" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.68" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
<dependencies>
<deployment identifier="macosx"/>
- <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.59"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.68"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
</menuItem>
</items>
</menu>
- <customObject id="4963" customClass="SUUpdater"/>
+ <customObject id="4963" customClass="SPUStandardUpdaterController"/>
<customObject id="6lr-Yy-GMc" customClass="HBAppDelegate">
<connections>
<outlet property="presetsMenu" destination="1949" id="7YL-mr-2tO"/>
-//
-// HBSecurityAccessToken.h
-// HandBrake
-//
-// Created by Damiano Galassi on 24/01/17.
-//
-//
+/* HBSecurityAccessToken.h $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
#import <Foundation/Foundation.h>
+NS_ASSUME_NONNULL_BEGIN
+
@protocol HBSecurityScope <NSObject>
/* Given an instance, make the resource referenced by the job accessible to the process.
- (instancetype)initWithObject:(id<HBSecurityScope>)object;
@end
+
+NS_ASSUME_NONNULL_END
-//
-// HBSecurityAccessToken.m
-// HandBrake
-//
-// Created by Damiano Galassi on 24/01/17.
-//
-//
+/* HBSecurityAccessToken.m $
+
+ This file is part of the HandBrake source code.
+ Homepage: <http://handbrake.fr/>.
+ It may be used under the terms of the GNU General Public License. */
#import "HBSecurityAccessToken.h"
273F20B514ADBE670021BE6D /* HBPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F20A014ADBE670021BE6D /* HBPreferencesController.m */; };
273F20B714ADBE670021BE6D /* HBPreviewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F20A414ADBE670021BE6D /* HBPreviewController.m */; };
273F20BA14ADBE670021BE6D /* HBPictureController.m in Sources */ = {isa = PBXBuildFile; fileRef = 273F20AA14ADBE670021BE6D /* HBPictureController.m */; };
- 273F20CC14ADC8A10021BE6D /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 273F20C014ADC1250021BE6D /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
273F218B14ADDDA10021BE6D /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 273F217C14ADDDA10021BE6D /* InfoPlist.strings */; };
- 273F21C214ADE7BC0021BE6D /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 273F20C014ADC1250021BE6D /* Sparkle.framework */; };
27D6C72614B1019100B785E4 /* libhandbrake.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72414B1019100B785E4 /* libhandbrake.a */; };
27D6C74414B102DA00B785E4 /* libass.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72814B102DA00B785E4 /* libass.a */; };
27D6C74614B102DA00B785E4 /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27D6C72914B102DA00B785E4 /* libavcodec.a */; };
A9294CC91DC4BBF7004D3415 /* HBJob+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = A9294CC71DC4BBF7004D3415 /* HBJob+Private.h */; settings = {ATTRIBUTES = (Private, ); }; };
A92B148220CA9F7700146FD8 /* HBHUDView.m in Sources */ = {isa = PBXBuildFile; fileRef = A92B148120CA9F7600146FD8 /* HBHUDView.m */; };
A937EECB1C6C7C0300EEAE6D /* dsa_pub.pem in Resources */ = {isa = PBXBuildFile; fileRef = A937EECA1C6C7C0300EEAE6D /* dsa_pub.pem */; };
+ A939854F22315575001DCAEB /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A939854D2231556D001DCAEB /* Sparkle.framework */; };
+ A939855022315592001DCAEB /* Sparkle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = A939854D2231556D001DCAEB /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ A939855622315638001DCAEB /* org.sparkle-project.InstallerConnection.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = A939855222315628001DCAEB /* org.sparkle-project.InstallerConnection.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+ A939855722315638001DCAEB /* org.sparkle-project.InstallerLauncher.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = A939855322315628001DCAEB /* org.sparkle-project.InstallerLauncher.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+ A939855822315638001DCAEB /* org.sparkle-project.InstallerStatus.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = A939855422315628001DCAEB /* org.sparkle-project.InstallerStatus.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
+ A939855A22315993001DCAEB /* org.sparkle-project.Downloader.xpc in CopyFiles */ = {isa = PBXBuildFile; fileRef = A939855922315987001DCAEB /* org.sparkle-project.Downloader.xpc */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
A939DD8B1FC8826A00135F2A /* HBPresetsMenuBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = A939DD8A1FC8826A00135F2A /* HBPresetsMenuBuilder.m */; };
A93B49221DA3AA6900DD70A3 /* HBToolbarBadgedItem.m in Sources */ = {isa = PBXBuildFile; fileRef = A93B49211DA3AA6900DD70A3 /* HBToolbarBadgedItem.m */; };
A93E0ED31972957000FD67FB /* HBVideoController.m in Sources */ = {isa = PBXBuildFile; fileRef = A93E0ED11972957000FD67FB /* HBVideoController.m */; };
dstPath = "";
dstSubfolderSpec = 10;
files = (
- 273F20CC14ADC8A10021BE6D /* Sparkle.framework in CopyFiles */,
A9736F181C7DA5FE008F1D18 /* HandBrakeKit.framework in CopyFiles */,
+ A939855022315592001DCAEB /* Sparkle.framework in CopyFiles */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ A939855522315630001DCAEB /* CopyFiles */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "$(CONTENTS_FOLDER_PATH)/XPCServices";
+ dstSubfolderSpec = 16;
+ files = (
+ A939855622315638001DCAEB /* org.sparkle-project.InstallerConnection.xpc in CopyFiles */,
+ A939855722315638001DCAEB /* org.sparkle-project.InstallerLauncher.xpc in CopyFiles */,
+ A939855822315638001DCAEB /* org.sparkle-project.InstallerStatus.xpc in CopyFiles */,
+ A939855A22315993001DCAEB /* org.sparkle-project.Downloader.xpc in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
273F20A914ADBE670021BE6D /* HBPictureController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBPictureController.h; sourceTree = "<group>"; };
273F20AA14ADBE670021BE6D /* HBPictureController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBPictureController.m; sourceTree = "<group>"; };
273F20BD14ADC09F0021BE6D /* main.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = main.mm; sourceTree = "<group>"; };
- 273F20C014ADC1250021BE6D /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Sparkle.framework; sourceTree = "<group>"; };
275916DA14B2AB27007211E9 /* native.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = native.xcconfig; sourceTree = "<group>"; };
277EFE8D17ED5628001D4A6A /* supplemental.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = supplemental.xcconfig; sourceTree = "<group>"; };
277EFE9217ED799E001D4A6A /* libfdk-aac.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libfdk-aac.a"; path = "external/contrib/lib/libfdk-aac.a"; sourceTree = BUILT_PRODUCTS_DIR; };
A932E271198834130047D13E /* HBAudioDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HBAudioDefaults.h; sourceTree = "<group>"; };
A932E272198834130047D13E /* HBAudioDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HBAudioDefaults.m; sourceTree = "<group>"; };
A937EECA1C6C7C0300EEAE6D /* dsa_pub.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = dsa_pub.pem; sourceTree = "<group>"; };
+ A939854D2231556D001DCAEB /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = Sparkle/Sparkle.framework; sourceTree = "<group>"; };
+ A939855222315628001DCAEB /* org.sparkle-project.InstallerConnection.xpc */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.xpc-service"; name = "org.sparkle-project.InstallerConnection.xpc"; path = "Sparkle/org.sparkle-project.InstallerConnection.xpc"; sourceTree = SOURCE_ROOT; };
+ A939855322315628001DCAEB /* org.sparkle-project.InstallerLauncher.xpc */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.xpc-service"; name = "org.sparkle-project.InstallerLauncher.xpc"; path = "Sparkle/org.sparkle-project.InstallerLauncher.xpc"; sourceTree = SOURCE_ROOT; };
+ A939855422315628001DCAEB /* org.sparkle-project.InstallerStatus.xpc */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.xpc-service"; name = "org.sparkle-project.InstallerStatus.xpc"; path = "Sparkle/org.sparkle-project.InstallerStatus.xpc"; sourceTree = SOURCE_ROOT; };
+ A939855922315987001DCAEB /* org.sparkle-project.Downloader.xpc */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.xpc-service"; name = "org.sparkle-project.Downloader.xpc"; path = "Sparkle/org.sparkle-project.Downloader.xpc"; sourceTree = SOURCE_ROOT; };
A939DD891FC8826A00135F2A /* HBPresetsMenuBuilder.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HBPresetsMenuBuilder.h; sourceTree = "<group>"; };
A939DD8A1FC8826A00135F2A /* HBPresetsMenuBuilder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HBPresetsMenuBuilder.m; sourceTree = "<group>"; };
A93B0DF61C804CF50051A3FA /* NSDictionary+HBAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+HBAdditions.h"; sourceTree = "<group>"; };
files = (
273F203C14ADBC210021BE6D /* Cocoa.framework in Frameworks */,
A9E1467B16BC2ABD00C307BC /* QuartzCore.framework in Frameworks */,
- 273F21C214ADE7BC0021BE6D /* Sparkle.framework in Frameworks */,
A9736F171C7DA5FE008F1D18 /* HandBrakeKit.framework in Frameworks */,
+ A939854F22315575001DCAEB /* Sparkle.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
27D6C72314B1013400B785E4 /* Products (external) */,
273F20CD14ADC8E60021BE6D /* Resources */,
273F203414ADBAC30021BE6D /* Frameworks */,
+ A9398551223155EF001DCAEB /* XPCService */,
277A3FCF14AE848400A835E4 /* xcconfig */,
);
sourceTree = "<group>";
273F20CE14ADC9210021BE6D /* Bundled */ = {
isa = PBXGroup;
children = (
- 273F20C014ADC1250021BE6D /* Sparkle.framework */,
+ A939854D2231556D001DCAEB /* Sparkle.framework */,
);
name = Bundled;
sourceTree = "<group>";
name = "Audio Defaults";
sourceTree = "<group>";
};
+ A9398551223155EF001DCAEB /* XPCService */ = {
+ isa = PBXGroup;
+ children = (
+ A939855922315987001DCAEB /* org.sparkle-project.Downloader.xpc */,
+ A939855222315628001DCAEB /* org.sparkle-project.InstallerConnection.xpc */,
+ A939855322315628001DCAEB /* org.sparkle-project.InstallerLauncher.xpc */,
+ A939855422315628001DCAEB /* org.sparkle-project.InstallerStatus.xpc */,
+ );
+ path = XPCService;
+ sourceTree = "<group>";
+ };
A93E6F2E1CD774960096C0DE /* Player */ = {
isa = PBXGroup;
children = (
273F203614ADBC200021BE6D /* Frameworks */,
273F203714ADBC200021BE6D /* Resources */,
273F20CA14ADC86C0021BE6D /* CopyFiles */,
+ A939855522315630001DCAEB /* CopyFiles */,
);
buildRules = (
);
com.apple.ApplicationGroups.Mac = {
enabled = 0;
};
+ com.apple.HardenedRuntime = {
+ enabled = 0;
+ };
com.apple.Push = {
enabled = 0;
};
com.apple.Sandbox = {
- enabled = 0;
+ enabled = 1;
};
};
};
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
CLANG_ENABLE_OBJC_ARC = YES;
+ CODE_SIGN_ENTITLEMENTS = HandBrake.entitlements;
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
- "\"$(SRCROOT)\"",
+ "$(SRCROOT)",
+ "$(PROJECT_DIR)/Sparkle",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
HEADER_SEARCH_PATHS = (
CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = YES;
CLANG_ANALYZER_SECURITY_INSECUREAPI_STRCPY = YES;
CLANG_ENABLE_OBJC_ARC = YES;
+ CODE_SIGN_ENTITLEMENTS = HandBrake.entitlements;
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
- "\"$(SRCROOT)\"",
+ "$(SRCROOT)",
+ "$(PROJECT_DIR)/Sparkle",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
HEADER_SEARCH_PATHS = (
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
- "\"$(SRCROOT)\"",
+ "$(SRCROOT)",
+ "$(PROJECT_DIR)/Sparkle",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
HEADER_SEARCH_PATHS = (
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_ENTITLEMENTS = "";
CODE_SIGN_IDENTITY = "";
- COPY_PHASE_STRIP = YES;
+ COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_STRICT_OBJC_MSGSEND = YES;
EXTERNAL_BUILD = "$(CONFIGURATION_BUILD_DIR)/external";
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
- "\"$(SRCROOT)\"",
+ "$(SRCROOT)",
+ "$(PROJECT_DIR)/Sparkle",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
HEADER_SEARCH_PATHS = (
+++ /dev/null
-Versions/Current/PrivateHeaders
\ No newline at end of file
+++ /dev/null
-//
-// SPUDownloader.h
-// Downloader
-//
-// Created by Mayur Pawashe on 4/1/16.
-// Copyright © 2016 Sparkle Project. All rights reserved.
-//
-
-#if __has_feature(modules)
-@import Foundation;
-#else
-#import <Foundation/Foundation.h>
-#endif
-#import "SPUDownloaderProtocol.h"
-
-@protocol SPUDownloaderDelegate;
-
-// This object implements the protocol which we have defined. It provides the actual behavior for the service. It is 'exported' by the service to make it available to the process hosting the service over an NSXPCConnection.
-@interface SPUDownloader : NSObject <SPUDownloaderProtocol>
-
-// Due to XPC remote object reasons, this delegate is strongly referenced
-// Invoke cleanup when done with this instance
-- (instancetype)initWithDelegate:(id <SPUDownloaderDelegate>)delegate;
-
-@end
+++ /dev/null
-//
-// SPUDownloaderDelegate.h
-// Sparkle
-//
-// Created by Mayur Pawashe on 4/1/16.
-// Copyright © 2016 Sparkle Project. All rights reserved.
-//
-
-#if __has_feature(modules)
-@import Foundation;
-#else
-#import <Foundation/Foundation.h>
-#endif
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class SPUDownloadData;
-
-@protocol SPUDownloaderDelegate <NSObject>
-
-// This is only invoked for persistent downloads
-- (void)downloaderDidSetDestinationName:(NSString *)destinationName temporaryDirectory:(NSString *)temporaryDirectory;
-
-// Under rare cases, this may be called more than once, in which case the current progress should be reset back to 0
-// This is only invoked for persistent downloads
-- (void)downloaderDidReceiveExpectedContentLength:(int64_t)expectedContentLength;
-
-// This is only invoked for persistent downloads
-- (void)downloaderDidReceiveDataOfLength:(uint64_t)length;
-
-// downloadData is nil if this is a persisent download, otherwise it's non-nil if it's a temporary download
-- (void)downloaderDidFinishWithTemporaryDownloadData:(SPUDownloadData * _Nullable)downloadData;
-
-- (void)downloaderDidFailWithError:(NSError *)error;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// SPUDownloaderDeprecated.h
-// Sparkle
-//
-// Created by Deadpikle on 12/20/17.
-// Copyright © 2017 Sparkle Project. All rights reserved.
-//
-
-#import "SPUDownloader.h"
-
-@interface SPUDownloaderDeprecated : SPUDownloader <SPUDownloaderProtocol>
-
-@end
+++ /dev/null
-//
-// SPUDownloaderProtocol.h
-// PersistentDownloader
-//
-// Created by Mayur Pawashe on 4/1/16.
-// Copyright © 2016 Sparkle Project. All rights reserved.
-//
-
-#if __has_feature(modules)
-@import Foundation;
-#else
-#import <Foundation/Foundation.h>
-#endif
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class SPUURLRequest;
-
-// The protocol that this service will vend as its API. This header file will also need to be visible to the process hosting the service.
-@protocol SPUDownloaderProtocol
-
-- (void)startPersistentDownloadWithRequest:(SPUURLRequest *)request bundleIdentifier:(NSString *)bundleIdentifier desiredFilename:(NSString *)desiredFilename;
-
-- (void)startTemporaryDownloadWithRequest:(SPUURLRequest *)request;
-
-- (void)downloadDidFinish;
-
-- (void)cleanup;
-
-- (void)cancel;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// SPUDownloaderSession.h
-// Sparkle
-//
-// Created by Deadpikle on 12/20/17.
-// Copyright © 2017 Sparkle Project. All rights reserved.
-//
-
-#if __has_feature(modules)
-@import Foundation;
-#else
-#import <Foundation/Foundation.h>
-#endif
-#import "SPUDownloader.h"
-#import "SPUDownloaderProtocol.h"
-
-NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0)
-@interface SPUDownloaderSession : SPUDownloader <SPUDownloaderProtocol>
-
-@end
+++ /dev/null
-//
-// SPUURLRequest.h
-// Sparkle
-//
-// Created by Mayur Pawashe on 5/19/16.
-// Copyright © 2016 Sparkle Project. All rights reserved.
-//
-
-#if __has_feature(modules)
-@import Foundation;
-#else
-#import <Foundation/Foundation.h>
-#endif
-
-NS_ASSUME_NONNULL_BEGIN
-
-// A class that wraps NSURLRequest and implements NSSecureCoding
-// This class exists because NSURLRequest did not support NSSecureCoding in macOS 10.8
-// I have not verified if NSURLRequest in 10.9 implements NSSecureCoding or not
-@interface SPUURLRequest : NSObject <NSSecureCoding>
-
-// Creates a new URL request
-// Only these properties are currently tracked:
-// * URL
-// * Cache policy
-// * Timeout interval
-// * HTTP header fields
-// * networkServiceType
-+ (instancetype)URLRequestWithRequest:(NSURLRequest *)request;
-
-@property (nonatomic, readonly) NSURLRequest *request;
-
-@end
-
-NS_ASSUME_NONNULL_END
+++ /dev/null
-//
-// SUCodeSigningVerifier.h
-// Sparkle
-//
-// Created by Andy Matuschak on 7/5/12.
-//
-//
-
-#ifndef SUCODESIGNINGVERIFIER_H
-#define SUCODESIGNINGVERIFIER_H
-
-#import <Foundation/Foundation.h>
-#import "SUExport.h"
-
-SU_EXPORT @interface SUCodeSigningVerifier : NSObject
-+ (BOOL)codeSignatureAtBundleURL:(NSURL *)oldBundlePath matchesSignatureAtBundleURL:(NSURL *)newBundlePath error:(NSError **)error;
-+ (BOOL)codeSignatureIsValidAtBundleURL:(NSURL *)bundlePath error:(NSError **)error;
-+ (BOOL)bundleAtURLIsCodeSigned:(NSURL *)bundlePath;
-+ (NSDictionary *)codeSignatureInfoAtBundleURL:(NSURL *)bundlePath;
-@end
-
-#endif
+++ /dev/null
-//
-// Sparkle.h
-// Sparkle
-//
-// Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07)
-// Copyright 2006 Andy Matuschak. All rights reserved.
-//
-
-#ifndef SPARKLE_H
-#define SPARKLE_H
-
-// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless
-// there are name-space collisions) so we can list all of them to start with:
-
-#import "SUAppcast.h"
-#import "SUAppcastItem.h"
-#import "SUStandardVersionComparator.h"
-#import "SUUpdater.h"
-#import "SUUpdaterDelegate.h"
-#import "SUVersionComparisonProtocol.h"
-#import "SUVersionDisplayProtocol.h"
-#import "SUErrors.h"
-
-#import "SPUDownloader.h"
-#import "SPUDownloaderDelegate.h"
-#import "SPUDownloaderDeprecated.h"
-#import "SPUDownloadData.h"
-#import "SPUDownloaderProtocol.h"
-#import "SPUDownloaderSession.h"
-#import "SPUURLRequest.h"
-#import "SUCodeSigningVerifier.h"
-
-#endif
+++ /dev/null
-//
-// SUUnarchiver.h
-// Sparkle
-//
-// Created by Andy Matuschak on 3/16/06.
-// Copyright 2006 Andy Matuschak. All rights reserved.
-//
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@protocol SUUnarchiverProtocol;
-
-@interface SUUnarchiver : NSObject
-
-+ (nullable id <SUUnarchiverProtocol>)unarchiverForPath:(NSString *)path updatingHostBundlePath:(nullable NSString *)hostPath decryptionPassword:(nullable NSString *)decryptionPassword;
-
-@end
-
-NS_ASSUME_NONNULL_END
#import <Foundation/Foundation.h>
#endif
-#import "SUExport.h"
+#import <Sparkle/SUExport.h>
NS_ASSUME_NONNULL_BEGIN
--- /dev/null
+//
+// SPUStandardUpdaterController.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 2/28/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#if __has_feature(modules)
+@import Cocoa;
+#else
+#import <Cocoa/Cocoa.h>
+#endif
+
+#import <Sparkle/SUExport.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class SPUUpdater;
+@protocol SPUUserDriver, SPUStandardUserDriverProtocol, SPUUpdaterDelegate, SPUStandardUserDriverDelegate;
+
+/*!
+ A controller class that instantiates a SPUUpdater and allows binding UI to it.
+
+ This class can be instantiated in a nib or created using initWithUpdaterDelegate:userDriverDelegate:. The controller's updater targets the application's main bundle
+ and uses Sparkle's standard user interface. Typically, this class is used by sticking it as a custom NSObject subclass in an Interface Builder nib (probably in MainMenu).
+
+ The controller creates an SPUUpdater instance and allows hooking up the check for updates action and menu item validation. It also allows hooking
+ up the updater's and user driver's delegates.
+
+ This controller class may not be valuable to you if:
+ * You want to control or defer the instantiation of an SPUUpdater, or don't want to be tied into a nib's instantiation, or don't want to use a nib
+ * You want to target a bundle that's not the main bundle
+ * You want to provide a custom user interface, or perhaps one that provides little-to-none
+ * You don't want to use a convenience class that provides very little glue ;)
+
+ */
+SU_EXPORT @interface SPUStandardUpdaterController : NSObject
+
+/*!
+ Interface builder outlet for the updater's delegate.
+
+ This property should only be set using Interface Builder by creating a connection using the outlet
+ */
+@property (nonatomic, weak, nullable) IBOutlet id<SPUUpdaterDelegate> updaterDelegate;
+
+/*!
+ Interface builder outlet for the user driver's delegate.
+
+ This property should only be set using Interface Builder by creating a connection using the outlet
+ */
+@property (nonatomic, weak, nullable) IBOutlet id<SPUStandardUserDriverDelegate> userDriverDelegate;
+
+/*!
+ Accessible property for the updater. Some properties on the updater can be binded via KVO
+
+ This is nil before being loaded from the nib.
+ You may access this property after your application has finished launching, or after your window controller has finished loading.
+ */
+@property (nonatomic, readonly, nullable) SPUUpdater *updater;
+
+/*!
+ Accessible property for the updater's user driver.
+
+ This is nil before being loaded from the nib.
+ You may access this property after your application has finished launching, or after your window controller has finished loading.
+ */
+@property (nonatomic, readonly, nullable) id <SPUStandardUserDriverProtocol> userDriver;
+
+/*!
+ Use initWithUpdaterDelegate:userDriverDelegate: instead.
+ */
+- (instancetype)init NS_UNAVAILABLE;
+
+/*!
+ Create a new SPUStandardUpdaterController programmatically.
+ */
+- (instancetype)initWithUpdaterDelegate:(nullable id<SPUUpdaterDelegate>)updaterDelegate userDriverDelegate:(nullable id<SPUStandardUserDriverDelegate>)userDriverDelegate;
+
+/*!
+ Explicitly checks for updates and displays a progress dialog while doing so.
+
+ This method is meant for a main menu item.
+ Connect any menu item to this action in Interface Builder,
+ and Sparkle will check for updates and report back its findings verbosely
+ when it is invoked.
+
+ This action checks updates by invoking -[SPUUpdater checkForUpdates]
+ */
+- (IBAction)checkForUpdates:(id)sender;
+
+/*!
+ Validates if the menu item for checkForUpdates: can be invoked or not
+
+ This validates the menu item by checking -[SPUStandardUserDriver canCheckForUpdates]
+ */
+- (BOOL)validateMenuItem:(NSMenuItem *)item;
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// SPUStandardUserDriver.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 2/14/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#if __has_feature(modules)
+@import Cocoa;
+#else
+#import <Cocoa/Cocoa.h>
+#endif
+
+#import <Sparkle/SPUUserDriver.h>
+#import <Sparkle/SPUStandardUserDriverProtocol.h>
+#import <Sparkle/SUExport.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@protocol SPUStandardUserDriverDelegate;
+
+/*!
+ Sparkle's standard built-in user driver for updater interactions
+ */
+SU_EXPORT @interface SPUStandardUserDriver : NSObject <SPUUserDriver, SPUStandardUserDriverProtocol>
+
+/*!
+ Initializes a Sparkle's standard user driver for user update interactions
+
+ @param hostBundle The target bundle of the host that is being updated.
+ @param delegate The delegate to this user driver. Pass nil if you don't want to provide one.
+ */
+- (instancetype)initWithHostBundle:(NSBundle *)hostBundle delegate:(nullable id<SPUStandardUserDriverDelegate>)delegate;
+
+/*!
+ * Enable or disable hideOnDeactivate for standard update window.
+ */
+@property (nonatomic) BOOL hideOnDeactivate;
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// SPUStandardUserDriverDelegate.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 3/3/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#if __has_feature(modules)
+@import Foundation;
+#else
+#import <Foundation/Foundation.h>
+#endif
+
+#import <Sparkle/SUExport.h>
+
+@protocol SUVersionDisplay;
+
+/*!
+ A protocol for Sparkle's standard user driver's delegate
+
+ This includes methods related to UI interactions
+ */
+SU_EXPORT @protocol SPUStandardUserDriverDelegate <NSObject>
+
+@optional
+
+/*!
+ Called before showing a modal alert window,
+ to give the opportunity to hide attached windows that may get in the way.
+ */
+- (void)standardUserDriverWillShowModalAlert;
+
+/*!
+ Called after showing a modal alert window,
+ to give the opportunity to hide attached windows that may get in the way.
+ */
+- (void)standardUserDriverDidShowModalAlert;
+
+/*!
+ Returns an object that formats version numbers for display to the user.
+ If you don't implement this method or return \c nil,
+ the standard version formatter will be used.
+ */
+- (_Nullable id <SUVersionDisplay>)standardUserDriverRequestsVersionDisplayer;
+
+@end
--- /dev/null
+//
+// SPUStandardUserDriverProtocol.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 3/5/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@protocol SPUStandardUserDriverDelegate;
+
+/*!
+ Protocol for Sparkle's standard built-in user driver for updater interactions.
+
+ Other user drivers may wish to implement this protocol.
+ Note that this protocol does not adopt SUUserDriver because one may want to *only* export properties from this protocol.
+ */
+@protocol SPUStandardUserDriverProtocol <NSObject>
+
+/*!
+ Indicates whether or not an update is in progress as far as the user's perspective is concerned
+
+ A typical application may rely on this property for its check for updates menu item validation
+ */
+@property (nonatomic, readonly) BOOL canCheckForUpdates;
+
+@end
--- /dev/null
+//
+// SPUStatusCompletionResults.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 2/29/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#ifndef SPUStatusCompletionResults_h
+#define SPUStatusCompletionResults_h
+
+#if __has_feature(modules)
+@import Foundation;
+#else
+#import <Foundation/Foundation.h>
+#endif
+
+typedef NS_ENUM(NSUInteger, SPUUserInitiatedCheckStatus) {
+ SPUUserInitiatedCheckDone,
+ SPUUserInitiatedCheckCanceled
+};
+
+typedef NS_ENUM(NSUInteger, SPUDownloadUpdateStatus) {
+ SPUDownloadUpdateDone,
+ SPUDownloadUpdateCanceled
+};
+
+typedef NS_ENUM(NSUInteger, SPUInstallUpdateStatus) {
+ SPUInstallUpdateNow,
+ SPUInstallAndRelaunchUpdateNow,
+ SPUDismissUpdateInstallation
+};
+
+typedef NS_ENUM(NSInteger, SPUUpdateAlertChoice) {
+ SPUInstallUpdateChoice,
+ SPUInstallLaterChoice,
+ SPUSkipThisVersionChoice
+};
+
+typedef NS_ENUM(NSInteger, SPUInformationalUpdateAlertChoice) {
+ SPUDismissInformationalNoticeChoice,
+ SPUSkipThisInformationalVersionChoice
+};
+
+#endif /* SPUStatusCompletionResults_h */
--- /dev/null
+//
+// SPUUpdatePermissionRequest.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 8/14/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#if __has_feature(modules)
+@import Foundation;
+#else
+#import <Foundation/Foundation.h>
+#endif
+
+#import <Sparkle/SUExport.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/*!
+ This class represents information needed to make a permission request for checking updates.
+ */
+SU_EXPORT @interface SPUUpdatePermissionRequest : NSObject<NSSecureCoding>
+
+/*!
+ Initializes a new update permission request instance.
+
+ @param systemProfile The system profile information.
+ */
+- (instancetype)initWithSystemProfile:(NSArray<NSDictionary<NSString *, NSString *> *> *)systemProfile;
+
+/*!
+ A read-only property for the user's system profile.
+ */
+@property (nonatomic, readonly) NSArray<NSDictionary<NSString *, NSString *> *> *systemProfile;
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// SPUUpdater.h
+// Sparkle
+//
+// Created by Andy Matuschak on 1/4/06.
+// Copyright 2006 Andy Matuschak. All rights reserved.
+//
+
+#if __has_feature(modules)
+@import Foundation;
+#else
+#import <Foundation/Foundation.h>
+#endif
+#import <Sparkle/SUExport.h>
+#import <Sparkle/SPUUserDriver.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class SUAppcastItem, SUAppcast;
+
+@protocol SPUUpdaterDelegate;
+
+/*!
+ The main API in Sparkle for controlling the update mechanism.
+
+ This class is used to configure the update parameters as well as manually
+ and automatically schedule and control checks for updates.
+ */
+SU_EXPORT @interface SPUUpdater : NSObject
+
+/*!
+ Initializes a new SPUUpdater instance
+
+ This does not start the updater. To start it, see -[SPUUpdater startUpdater:]
+
+ Note that this is a normal initializer and doesn't implement the singleton pattern (i.e, instances aren't cached, so no surprises)
+ This also means that updater instances can be deallocated, and that they will be torn down properly.
+
+ Related: See SPUStandardUpdaterController which wraps a SPUUpdater instance and is suitable for instantiating in nib files
+
+ @param hostBundle The bundle that should be targetted for updating. This must not be nil.
+ @param applicationBundle The application bundle that should be relaunched and waited for termination. Usually this can be the same as hostBundle. This may differ when updating a plug-in or other non-application bundle.
+ @param userDriver The user driver that Sparkle uses for user update interaction
+ @param delegate The delegate for SPUUpdater. This may be nil.
+ */
+- (instancetype)initWithHostBundle:(NSBundle *)hostBundle applicationBundle:(NSBundle *)applicationBundle userDriver:(id <SPUUserDriver>)userDriver delegate:(id<SPUUpdaterDelegate> _Nullable)delegate;
+
+/*!
+ Starts the updater.
+
+ This method checks if Sparkle is configured properly. A valid feed URL should be set before this method is invoked.
+ Other properties of this SPUUpdater instance can be set before this method is invoked as well, such as automatic update checks.
+
+ If the configuration is valid, this method may bring up a permission prompt (if needed) for checking if the user wants automatic update checking.
+ This method then starts the regular update cycle if automatic update checks are enabled.
+
+ One of -checkForUpdates, -checkForUpdatesInBackground, or -checkForUpdateInformation can be invoked before starting the updater.
+ This preschedules an update action before starting the updater. When the updater is started, the prescheduled action is immediately invoked.
+ This may be useful for example if you want to check for updates right away without a permission prompt potentially showing.
+
+ This must be called on the main thread.
+
+ @param error The error that is populated if this method fails. Pass NULL if not interested in the error information.
+ @return YES if the updater started otherwise NO with a populated error
+ */
+- (BOOL)startUpdater:(NSError * __autoreleasing *)error;
+
+/*!
+ Checks for updates, and displays progress while doing so.
+
+ This is meant for users initiating an update check.
+ This may find a resumable update that has already been downloaded or has begun installing, or
+ this may find a new update that can start to be downloaded if the user requests it.
+ This will find updates that the user has opted into skipping.
+ */
+- (void)checkForUpdates;
+
+/*!
+ Checks for updates, but does not display any UI unless an update is found.
+
+ This is meant for programmatically initating a check for updates.
+ That is, it will display no UI unless it finds an update, in which case it proceeds as usual.
+ This will not find updates that the user has opted into skipping.
+
+ Note if there is no resumable update found, and automated updating is turned on,
+ the update will be downloaded in the background without disrupting the user.
+ */
+- (void)checkForUpdatesInBackground;
+
+/*!
+ Begins a "probing" check for updates which will not actually offer to
+ update to that version.
+
+ However, the delegate methods
+ SPUUpdaterDelegate::updater:didFindValidUpdate: and
+ SPUUpdaterDelegate::updaterDidNotFindUpdate: will be called,
+ so you can use that information in your UI.
+
+ Updates that have been skipped by the user will not be found.
+ */
+- (void)checkForUpdateInformation;
+
+/*!
+ A property indicating whether or not to check for updates automatically.
+
+ Setting this property will persist in the host bundle's user defaults.
+ The update schedule cycle will be reset in a short delay after the property's new value is set.
+ This is to allow reverting this property without kicking off a schedule change immediately
+ */
+@property (nonatomic) BOOL automaticallyChecksForUpdates;
+
+/*!
+ A property indicating the current automatic update check interval.
+
+ Setting this property will persist in the host bundle's user defaults.
+ The update schedule cycle will be reset in a short delay after the property's new value is set.
+ This is to allow reverting this property without kicking off a schedule change immediately
+ */
+@property (nonatomic) NSTimeInterval updateCheckInterval;
+
+/*!
+ A property indicating whether or not updates can be automatically downloaded in the background.
+
+ Note that the developer can disallow automatic downloading of updates from being enabled.
+ In this case, -automaticallyDownloadsUpdates will return NO regardless of how this property is set.
+
+ Setting this property will persist in the host bundle's user defaults.
+ */
+@property (nonatomic) BOOL automaticallyDownloadsUpdates;
+
+/*!
+ The URL of the appcast used to download update information.
+
+ If the updater's delegate implements -[SPUUpdaterDelegate feedURLStringForUpdater:], this will return that feed URL.
+ Otherwise if the feed URL has been set before, the feed URL returned will be retrieved from the host bundle's user defaults.
+ Otherwise the feed URL in the host bundle's Info.plist will be returned.
+ If no feed URL can be retrieved, this will raise an exception.
+
+ This property must be called on the main thread.
+ */
+@property (nonatomic, readonly) NSURL *feedURL;
+
+/*!
+ Set the URL of the appcast used to download update information. Using this method is discouraged.
+
+ Setting this property will persist in the host bundle's user defaults.
+ To avoid this, you should consider instead implementing
+ -[SPUUpdaterDelegate feedURLStringForUpdater:] or -[SPUUpdaterDelegate feedParametersForUpdater:sendingSystemProfile:]
+
+ Passing nil will remove any feed URL that has been set in the host bundle's user defaults.
+
+ This method must be called on the main thread.
+ */
+- (void)setFeedURL:(NSURL * _Nullable)feedURL;
+
+/*!
+ The host bundle that is being updated.
+ */
+@property (nonatomic, readonly) NSBundle *hostBundle;
+
+/*!
+ The bundle this class (SPUUpdater) is loaded into
+ */
+@property (nonatomic, readonly) NSBundle *sparkleBundle;
+
+/*!
+ * The user agent used when checking for updates.
+ *
+ * The default implementation can be overrided.
+ */
+@property (nonatomic, copy) NSString *userAgentString;
+
+/*!
+ The HTTP headers used when checking for updates.
+
+ The keys of this dictionary are HTTP header fields (NSString) and values are corresponding values (NSString)
+ */
+#if __has_feature(objc_generics)
+@property (nonatomic, copy, nullable) NSDictionary<NSString *, NSString *> *httpHeaders;
+#else
+@property (nonatomic, copy, nullable) NSDictionary *httpHeaders;
+#endif
+
+/*!
+ A property indicating whether or not the user's system profile information is sent when checking for updates.
+
+ Setting this property will persist in the host bundle's user defaults.
+ */
+@property (nonatomic) BOOL sendsSystemProfile;
+
+/*!
+ Returns the date of last update check.
+
+ \returns \c nil if no check has been performed.
+ */
+@property (nonatomic, readonly, copy, nullable) NSDate *lastUpdateCheckDate;
+
+/*!
+ Appropriately schedules or cancels the update checking timer according to
+ the preferences for time interval and automatic checks.
+
+ This call does not change the date of the next check,
+ but only the internal timer.
+ */
+- (void)resetUpdateCycle;
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// SPUUpdaterDelegate.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 8/12/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#if __has_feature(modules)
+@import Foundation;
+#else
+#import <Foundation/Foundation.h>
+#endif
+
+#import <Sparkle/SUExport.h>
+
+@protocol SUVersionComparison;
+@class SPUUpdater, SUAppcast, SUAppcastItem;
+
+NS_ASSUME_NONNULL_BEGIN
+
+// -----------------------------------------------------------------------------
+// SUUpdater Notifications for events that might be interesting to more than just the delegate
+// The updater will be the notification object
+// -----------------------------------------------------------------------------
+SU_EXPORT extern NSString *const SUUpdaterDidFinishLoadingAppCastNotification;
+SU_EXPORT extern NSString *const SUUpdaterDidFindValidUpdateNotification;
+SU_EXPORT extern NSString *const SUUpdaterDidNotFindUpdateNotification;
+SU_EXPORT extern NSString *const SUUpdaterWillRestartNotification;
+#define SUUpdaterWillRelaunchApplicationNotification SUUpdaterWillRestartNotification;
+#define SUUpdaterWillInstallUpdateNotification SUUpdaterWillRestartNotification;
+
+// Key for the SUAppcastItem object in the SUUpdaterDidFindValidUpdateNotification userInfo
+SU_EXPORT extern NSString *const SUUpdaterAppcastItemNotificationKey;
+// Key for the SUAppcast object in the SUUpdaterDidFinishLoadingAppCastNotification userInfo
+SU_EXPORT extern NSString *const SUUpdaterAppcastNotificationKey;
+
+// -----------------------------------------------------------------------------
+// SPUUpdater Delegate:
+// -----------------------------------------------------------------------------
+
+typedef NS_ENUM(NSInteger, SPUUpdateCheck)
+{
+ SPUUpdateCheckUserInitiated = 0,
+ SPUUpdateCheckBackgroundScheduled = 1
+};
+
+/*!
+ Provides methods to control the behavior of an SPUUpdater object.
+ */
+@protocol SPUUpdaterDelegate <NSObject>
+@optional
+
+/*!
+ Called when a background update will be scheduled after a delay.
+
+ Automatic update checks need to be enabled for this to trigger.
+
+ \param delay The delay until the next scheduled update will occur.
+
+ \param updater The updater instance.
+ */
+- (void)updater:(SPUUpdater *)updater willScheduleUpdateCheckAfterDelay:(NSTimeInterval)delay;
+
+/*!
+ Called when no updates will be scheduled in the future.
+
+ This may later change if automatic update checks become enabled.
+
+ \param updater The updater instance.
+ */
+- (void)updaterWillIdleSchedulingUpdates:(SPUUpdater *)updater;
+
+/*!
+ Returns whether to allow Sparkle to pop up.
+
+ For example, this may be used to prevent Sparkle from interrupting a setup assistant.
+ Alternatively, you may want to consider starting the updater after eg: the setup assistant finishes
+
+ \param updater The updater instance.
+ */
+- (BOOL)updaterMayCheckForUpdates:(SPUUpdater *)updater;
+
+/*!
+ Returns additional parameters to append to the appcast URL's query string.
+
+ This is potentially based on whether or not Sparkle will also be sending along the system profile.
+
+ \param updater The updater instance.
+ \param sendingProfile Whether the system profile will also be sent.
+
+ \return An array of dictionaries with keys: "key", "value", "displayKey", "displayValue", the latter two being specifically for display to the user.
+ */
+#if __has_feature(objc_generics)
+- (NSArray<NSDictionary<NSString *, NSString *> *> *)feedParametersForUpdater:(SPUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile;
+#else
+- (NSArray *)feedParametersForUpdater:(SPUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile;
+#endif
+
+/*!
+ Returns a custom appcast URL.
+
+ Override this to dynamically specify the entire URL.
+ Alternatively you may want to consider adding a feed parameter using -feedParametersForUpdater:sendingSystemProfile:
+ and having the server which appcast to serve.
+
+ \param updater The updater instance.
+ */
+- (nullable NSString *)feedURLStringForUpdater:(SPUUpdater *)updater;
+
+/*!
+ Returns whether Sparkle should prompt the user about automatic update checks.
+
+ Use this to override the default behavior.
+
+ \param updater The updater instance.
+ */
+- (BOOL)updaterShouldPromptForPermissionToCheckForUpdates:(SPUUpdater *)updater;
+
+/*!
+ Called after Sparkle has downloaded the appcast from the remote server.
+
+ Implement this if you want to do some special handling with the appcast once it finishes loading.
+
+ \param updater The updater instance.
+ \param appcast The appcast that was downloaded from the remote server.
+ */
+- (void)updater:(SPUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast;
+
+/*!
+ Returns the item in the appcast corresponding to the update that should be installed.
+
+ If you're using special logic or extensions in your appcast,
+ implement this to use your own logic for finding a valid update, if any,
+ in the given appcast.
+
+ \param appcast The appcast that was downloaded from the remote server.
+ \param updater The updater instance.
+ \return The best valid appcast item, or nil if you don't want to be delegated this task.
+ */
+- (nullable SUAppcastItem *)bestValidUpdateInAppcast:(SUAppcast *)appcast forUpdater:(SPUUpdater *)updater;
+
+/*!
+ Called when a valid update is found by the update driver.
+
+ \param updater The updater instance.
+ \param item The appcast item corresponding to the update that is proposed to be installed.
+ */
+- (void)updater:(SPUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)item;
+
+/*!
+ Called when a valid update is not found.
+
+ \param updater The updater instance.
+ */
+- (void)updaterDidNotFindUpdate:(SPUUpdater *)updater;
+
+/*!
+ Returns whether the release notes (if available) should be downloaded after an update is found and shown.
+
+ This is specifically for the releaseNotesLink element in the appcast.
+
+ \param updater The updater instance.
+
+ \return \c YES to download and show the release notes if available, otherwise NO. The default behavior is YES.
+ */
+- (BOOL)updaterShouldDownloadReleaseNotes:(SPUUpdater *)updater;
+
+/*!
+ Called immediately before downloading the specified update.
+
+ \param updater The updater instance.
+ \param item The appcast item corresponding to the update that is proposed to be downloaded.
+ \param request The mutable URL request that will be used to download the update.
+ */
+- (void)updater:(SPUUpdater *)updater willDownloadUpdate:(SUAppcastItem *)item withRequest:(NSMutableURLRequest *)request;
+
+/*!
+ Called after the specified update failed to download.
+
+ \param updater The updater instance.
+ \param item The appcast item corresponding to the update that failed to download.
+ \param error The error generated by the failed download.
+ */
+- (void)updater:(SPUUpdater *)updater failedToDownloadUpdate:(SUAppcastItem *)item error:(NSError *)error;
+
+/*!
+ Called when the user clicks the cancel button while and update is being downloaded.
+
+ \param updater The updater instance.
+ */
+- (void)userDidCancelDownload:(SPUUpdater *)updater;
+
+/*!
+ Called immediately before installing the specified update.
+
+ \param updater The updater instance.
+ \param item The appcast item corresponding to the update that is proposed to be installed.
+ */
+- (void)updater:(SPUUpdater *)updater willInstallUpdate:(SUAppcastItem *)item;
+
+/*!
+ Returns whether the relaunch should be delayed in order to perform other tasks.
+
+ This is not called if the user didn't relaunch on the previous update,
+ in that case it will immediately restart.
+
+ This may also not be called if the application is not going to relaunch after it terminates.
+
+ \param updater The updater instance.
+ \param item The appcast item corresponding to the update that is proposed to be installed.
+ \param installHandler The install handler that must be completed before continuing with the relaunch.
+
+ \return \c YES to delay the relaunch until \p installHandler is invoked.
+ */
+- (BOOL)updater:(SPUUpdater *)updater shouldPostponeRelaunchForUpdate:(SUAppcastItem *)item untilInvokingBlock:(void (^)(void))installHandler;
+
+/*!
+ Returns whether the application should be relaunched at all.
+
+ Some apps \b cannot be relaunched under certain circumstances.
+ This method can be used to explicitly prevent a relaunch.
+
+ \param updater The updater instance.
+ \return YES if the updater should be relaunched, otherwise NO if it shouldn't.
+ */
+- (BOOL)updaterShouldRelaunchApplication:(SPUUpdater *)updater;
+
+/*!
+ Called immediately before relaunching.
+
+ \param updater The updater instance.
+ */
+- (void)updaterWillRelaunchApplication:(SPUUpdater *)updater;
+
+/*!
+ Returns an object that compares version numbers to determine their arithmetic relation to each other.
+
+ This method allows you to provide a custom version comparator.
+ If you don't implement this method or return \c nil,
+ the standard version comparator will be used. Note that the
+ standard version comparator may be used during installation for preventing
+ a downgrade, even if you provide a custom comparator here.
+
+ \sa SUStandardVersionComparator
+
+ \param updater The updater instance.
+ \return The custom version comparator or nil if you don't want to be delegated this task.
+ */
+- (nullable id<SUVersionComparison>)versionComparatorForUpdater:(SPUUpdater *)updater;
+
+/*!
+ Returns whether or not the updater should allow interaction from the installer
+
+ Use this to override the default behavior which is to allow interaction with the installer.
+
+ If interaction is allowed, then an authorization prompt may show up to the user if they do
+ not curently have sufficient privileges to perform the installation of the new update.
+ The installer may also show UI and progress when interaction is allowed.
+
+ On the other hand, if interaction is not allowed, then an installation may fail if the user does not
+ have sufficient privileges to perform the installation. In this case, the feed and update may not even be downloaded.
+
+ Note this has no effect if the update has already been downloaded in the background silently and ready to be resumed.
+
+ \param updater The updater instance.
+ \param updateCheck The type of update check being performed.
+ */
+- (BOOL)updater:(SPUUpdater *)updater shouldAllowInstallerInteractionForUpdateCheck:(SPUUpdateCheck)updateCheck;
+
+/*!
+ Returns the decryption password (if any) which is used to extract the update archive DMG.
+
+ Return nil if no password should be used.
+
+ \param updater The updater instance.
+ \return The password used for decrypting the archive, or nil if no password should be used.
+ */
+- (nullable NSString *)decryptionPasswordForUpdater:(SPUUpdater *)updater;
+
+/*!
+ Called when an update is scheduled to be silently installed on quit after downloading the update automatically.
+
+ \param updater The updater instance.
+ \param item The appcast item corresponding to the update that is proposed to be installed.
+ \param immediateInstallHandler The install handler to immediately install the update. No UI interaction will be shown and the application will be relaunched after installation.
+ \return Return YES if the delegate will handle installing the update or NO if the updater should be given responsibility.
+
+ If the updater is given responsibility, it can later remind the user an update is available if they have not terminated the application for a long time.
+ Also if the updater is given responsibility and the update item is marked critical, the new update will be presented to the user immediately after.
+ Even if the immediateInstallHandler is not invoked, the installer will attempt to install the update on termination.
+ */
+- (BOOL)updater:(SPUUpdater *)updater willInstallUpdateOnQuit:(SUAppcastItem *)item immediateInstallationBlock:(void (^)(void))immediateInstallHandler;
+
+/*!
+ Called after an update is aborted due to an error.
+
+ \param updater The updater instance.
+ \param error The error that caused the abort
+ */
+- (void)updater:(SPUUpdater *)updater didAbortWithError:(NSError *)error;
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// SPUUpdaterSettings.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 3/27/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#if __has_feature(modules)
+@import Foundation;
+#else
+#import <Foundation/Foundation.h>
+#endif
+
+#import <Sparkle/SUExport.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/*!
+ This class can be used for reading certain updater settings.
+
+ It retrieves the settings by first looking into the host's user defaults.
+ If the setting is not found in there, then the host's Info.plist file is looked at.
+ */
+SU_EXPORT @interface SPUUpdaterSettings : NSObject
+
+- (instancetype)initWithHostBundle:(NSBundle *)hostBundle;
+
+/*!
+ * Indicates whether or not automatic update checks are enabled.
+ */
+@property (readonly, nonatomic) BOOL automaticallyChecksForUpdates;
+
+/*!
+ * The regular update check interval.
+ */
+@property (readonly, nonatomic) NSTimeInterval updateCheckInterval;
+
+/*!
+ * Indicates whether or not automatically downloading updates is allowed to be turned on by the user.
+ */
+@property (readonly, nonatomic) BOOL allowsAutomaticUpdates;
+
+/*!
+ * Indicates whether or not automatically downloading updates is enabled by the user or developer.
+ *
+ * Note this does not indicate whether or not automatic downloading of updates is allowable.
+ * See `-allowsAutomaticUpdates` property for that.
+ */
+@property (readonly, nonatomic) BOOL automaticallyDownloadsUpdates;
+
+/*!
+ * Indicates whether or not anonymous system profile information is sent when checking for updates.
+ */
+@property (readonly, nonatomic) BOOL sendsSystemProfile;
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// SPUUserDriver.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 2/14/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#if __has_feature(modules)
+@import Foundation;
+#else
+#import <Foundation/Foundation.h>
+#endif
+
+#import <Sparkle/SPUStatusCompletionResults.h>
+#import <Sparkle/SUExport.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class SPUUpdatePermissionRequest, SUUpdatePermissionResponse, SUAppcastItem, SPUDownloadData;
+
+/*!
+ The API in Sparkle for controlling the user interaction.
+
+ This protocol is used for implementing a user interface for the Sparkle updater. Sparkle's internal drivers tell
+ an object that implements this protocol what actions to take and show to the user.
+
+ Every method in this protocol is required (i.e, not optional) and has a void return type and can optionally take a single parameter block, which waits for
+ a response back from the user driver. Note that every parameter block, or reply, *must* be responded to eventually -
+ that is, none can be ignored. Furthermore, they can only be replied to *once* - a reply or completion block should be considered
+ invalidated after it's once used. The faster a reply can be made, the more Sparkle may be able to idle, and so the better.
+ Lastly, every method in this protocol can be called from any thread. Thus, an implementor may choose to always
+ dispatch asynchronously to the main thread. However, an implementor should also avoid unnecessary nested asynchronous dispatches.
+
+ An implementor of this protocol should act defensively. For example, it may be possible for an action that says to
+ invalidate or dismiss something to be called multiple times in succession, and the implementor may choose to ignore further requests.
+
+ Note: Once upon a time, when first developing the user driver API, I had the user driver exist in a separate process from the rest of the framework.
+ If you're familiar with how the higher level XPC APIs work, this explains why some of the decisions above were made
+ (reply block executed on any thread, reply block replied only once, single reply block, void return types, idleness, no optional methods, ...)
+ This is somewhat of an artifact (maybe?) now, but I think most of these set of restrictions still enforces a well designed API.
+ */
+SU_EXPORT @protocol SPUUserDriver <NSObject>
+
+/*!
+ * Show that an update can be checked by the user or not
+ *
+ * A client may choose to update the interface letting the user know if they can check for updates.
+ * For example, this can be used for menu item validation on the "Check for Updates" action.
+ *
+ * This can be called from any thread.
+ */
+- (void)showCanCheckForUpdates:(BOOL)canCheckForUpdates;
+
+/*!
+ * Show an updater permission request to the user
+ *
+ * Ask the user for their permission regarding update checks.
+ * This is typically only called once per app installation.
+ *
+ * @param request The update permission request.
+ * @param reply A reply with a update permission response.
+ *
+ * This can be called from any thread
+ */
+- (void)showUpdatePermissionRequest:(SPUUpdatePermissionRequest *)request reply:(void (^)(SUUpdatePermissionResponse *))reply;
+
+/*!
+ * Show the user initating an update check
+ *
+ * Respond to the user initiating an update check. Sparkle uses this to show the user a window with an indeterminate progress bar.
+ *
+ * @param updateCheckStatusCompletion A reply indicating whether the initiated update check is done or canceled.
+ * Attempts to canceling can be made before -dismissUserInitiatedUpdateCheck is invoked. Replying with SPUUserInitiatedCheckDone
+ * on the other hand should not be done until -dismissUserInitiatedUpdateCheck is invoked.
+ *
+ * This can be called from any thread
+ */
+- (void)showUserInitiatedUpdateCheckWithCompletion:(void (^)(SPUUserInitiatedCheckStatus))updateCheckStatusCompletion;
+
+/*!
+ * Dismiss the user initiated update check from the user
+ *
+ * Dismiss whatever was started in -showUserInitiatedUpdateCheckWithCompletion:
+ * This is an appropriate time to reply with SPUUserInitiatedCheckDone if not having done so already
+ *
+ * This can be called from any thread
+ */
+- (void)dismissUserInitiatedUpdateCheck;
+
+/*!
+ * Show the user a new update is found and can be downloaded and installed
+ *
+ * Let the user know a new update is found and ask them what they want to do.
+ *
+ * @param appcastItem The Appcast Item containing information that reflects the new update
+ *
+ * @param userInitiated A flag indicating whether or not a user initiated this update check
+ *
+ * @param reply
+ * A reply of SPUInstallUpdateChoice begins downloading and installing the new update.
+ *
+ * A reply of SPUInstallLaterChoice reminds the user later of the update, which can act as a "do nothing" option.
+ *
+ * A reply of SPUSkipThisVersionChoice skips this particular version and won't bother the user again,
+ * unless they initiate an update check themselves.
+ *
+ * This can be called from any thread
+ */
+- (void)showUpdateFoundWithAppcastItem:(SUAppcastItem *)appcastItem userInitiated:(BOOL)userInitiated reply:(void (^)(SPUUpdateAlertChoice))reply;
+
+/*!
+ * Show the user a new update has been downloaded and can be installed
+ *
+ * This method behaves just like -showUpdateFoundWithAppcastItem:reply: except the update has already been downloaded.
+ */
+- (void)showDownloadedUpdateFoundWithAppcastItem:(SUAppcastItem *)appcastItem userInitiated:(BOOL)userInitiated reply:(void (^)(SPUUpdateAlertChoice))reply;
+
+/*!
+ * Show the user an update that has started installing can be resumed and installed immediately
+ *
+ * Let the user know an update that has already been downloaded and started installing can be resumed.
+ * Note at this point the update cannot be canceled.
+ *
+ * @param appcastItem The Appcast Item containing information that reflects the new update
+ *
+ * @param userInitiated A flag indicating whether or not a user initiated this update check
+ *
+ * @param reply
+ * A reply of SPUInstallAndRelaunchUpdateNow installs the update immediately and relaunches the new update.
+ * Note: the application is not relaunched if it was not running before installing the update.
+ * A reply of SPUInstallUpdateNow installs the update immediately but does not relaunch the new update.
+ * A reply of SPUDismissUpdateInstallation dismisses the update installation. Note the update will attempt to finish installation
+ * after the application terminates.
+ *
+ * This can be called from any thread
+ */
+- (void)showResumableUpdateFoundWithAppcastItem:(SUAppcastItem *)appcastItem userInitiated:(BOOL)userInitiated reply:(void (^)(SPUInstallUpdateStatus))reply;
+
+/*!
+ * Show the user a new informational only update has been found
+ *
+ * Let the user know a new informational update is found and ask them what they want to do.
+ *
+ * @param appcastItem The Appcast Item containing information that reflects the new update.
+ * The infoURL property for the appcastItem may be of interest.
+ *
+ * @param userInitiated A flag indicating whether or not a user initiated this update check
+ *
+ * @param reply
+ * A reply of SPUDismissInformationalNoticeChoice dismisses this notice.
+ * An implementor may decide to invoke another action before dismissing the notice.
+ *
+ * A reply of SPUSkipThisInformationalVersionChoice skips this particular version and won't bother the user again,
+ * unless they initiate an update check themselves.
+ *
+ * This can be called from any thread
+ */
+- (void)showInformationalUpdateFoundWithAppcastItem:(SUAppcastItem *)appcastItem userInitiated:(BOOL)userInitiated reply:(void (^)(SPUInformationalUpdateAlertChoice))reply;
+
+/*!
+ * Show the user the release notes for the new update
+ *
+ * Display the release notes to the user. This will be called after showing the new update.
+ * This is only applicable if the release notes are linked from the appcast, and are not directly embedded inside of the appcast file.
+ * That is, this may be invoked if the releaseNotesURL from the appcast item is non-nil.
+ *
+ * @param downloadData The data for the release notes that was downloaded from the new update's appcast.
+ *
+ * This can be called from any thread
+ */
+- (void)showUpdateReleaseNotesWithDownloadData:(SPUDownloadData *)downloadData;
+
+/*!
+ * Show the user that the new update's release notes could not be downloaded
+ *
+ * This will be called after showing the new update.
+ * This is only applicable if the release notes are linked from the appcast, and are not directly embedded inside of the appcast file.
+ * That is, this may be invoked if the releaseNotesURL from the appcast item is non-nil.
+ *
+ * @param error The error associated with why the new update's release notes could not be downloaded.
+ *
+ * This can be called from any thread
+ */
+- (void)showUpdateReleaseNotesFailedToDownloadWithError:(NSError *)error;
+
+/*!
+ * Show the user a new update was not found
+ *
+ * Let the user know a new update was not found after they tried initiating an update check.
+ *
+ * @param acknowledgement Acknowledge to the updater that no update found was shown.
+ *
+ * This can be called from any thread
+ */
+- (void)showUpdateNotFoundWithAcknowledgement:(void (^)(void))acknowledgement;
+
+/*!
+ * Show the user an update error occurred
+ *
+ * Let the user know that the updater failed with an error. This will not be invoked without the user having been
+ * aware that an update was in progress.
+ *
+ * @param acknowledgement Acknowledge to the updater that the error was shown.
+ *
+ * This can be called from any thread
+ */
+- (void)showUpdaterError:(NSError *)error acknowledgement:(void (^)(void))acknowledgement;
+
+/*!
+ * Show the user that downloading the new update initiated
+ *
+ * Let the user know that downloading the new update started.
+ *
+ * @param downloadUpdateStatusCompletion A reply of SPUDownloadUpdateCanceled can be used to cancel
+ * the download at any point before -showDownloadDidStartExtractingUpdate is invoked.
+ * A reply of SPUDownloadUpdateDone signifies that the download is done, which should not be invoked until
+ * -showDownloadDidStartExtractingUpdate
+ *
+ * This can be called from any thread
+ */
+- (void)showDownloadInitiatedWithCompletion:(void (^)(SPUDownloadUpdateStatus))downloadUpdateStatusCompletion;
+
+/*!
+ * Show the user the content length of the new update that will be downloaded
+ *
+ * @param expectedContentLength The expected content length of the new update being downloaded.
+ * An implementor should be able to handle if this value is invalid (more or less than actual content length downloaded).
+ * Additionally, this method may be called more than once for the same download in rare scenarios.
+ *
+ * This can be called from any thread
+ */
+- (void)showDownloadDidReceiveExpectedContentLength:(uint64_t)expectedContentLength;
+
+/*!
+ * Show the user that the update download received more data
+ *
+ * This may be an appropriate time to advance a visible progress indicator of the download
+ * @param length The length of the data that was just downloaded
+ *
+ * This can be called from any thread
+ */
+- (void)showDownloadDidReceiveDataOfLength:(uint64_t)length;
+
+/*!
+ * Show the user that the update finished downloading and started extracting
+ *
+ * This is an appropriate time to reply with SPUDownloadUpdateDone if not done so already
+ * Sparkle uses this to show an indeterminate progress bar.
+ *
+ * Note that an update can resume at this point after having been downloaded before,
+ * so this may be called without any of the download callbacks being invoked prior.
+ *
+ * This can be called from any thread
+ */
+- (void)showDownloadDidStartExtractingUpdate;
+
+/*!
+ * Show the user that the update is extracting with progress
+ *
+ * Let the user know how far along the update extraction is.
+ *
+ * @param progress The progress of the extraction from a 0.0 to 1.0 scale
+ *
+ * This can be called from any thread
+ */
+- (void)showExtractionReceivedProgress:(double)progress;
+
+/*!
+ * Show the user that the update is ready to install
+ *
+ * Let the user know that the update is ready and ask them whether they want to install or not.
+ * Note if the target application is already terminated and an update can be performed silently, this method may not be invoked.
+ *
+ * @param installUpdateHandler
+ * A reply of SPUInstallAndRelaunchUpdateNow installs the update immediately and relaunches the new update.
+ * Note: the application is not relaunched if it was not running before installing the update.
+ * A reply of SPUInstallUpdateNow installes the update immediately but does not relaunch the new update.
+ * A reply of SPUDismissUpdateInstallation dismisses the update installation. Note the update may still be installed after
+ * the application terminates, however there is not a strong guarantee that this will happen.
+ *
+ * This can be called from any thread
+ */
+- (void)showReadyToInstallAndRelaunch:(void (^)(SPUInstallUpdateStatus))installUpdateHandler;
+
+/*!
+ * Show the user that the update is installing
+ *
+ * Let the user know that the update is currently installing. Sparkle uses this to show an indeterminate progress bar.
+ *
+ * This can be called from any thread
+ */
+- (void)showInstallingUpdate;
+
+/*!
+ * Show or dismiss progress while a termination signal is being sent to the application
+ *
+ * Terminating and relaunching the application (if requested to be relaunched) may happen quickly,
+ * or it may take some time to perform the final installation, or the termination signal can be canceled or delayed by the application or user.
+ *
+ * It is up to the implementor whether or not to decide to continue showing installation progress
+ * or dismissing UI that won't remain obscuring other parts of the user interface.
+ *
+ * This can be called from any thread
+ */
+- (void)showSendingTerminationSignal;
+
+/*!
+ * Show the user that the update installation finished
+ *
+ * Let the user know that the update finished installing.
+ * This will only be invoked if the updater process is still alive, which is typically not the case if
+ * the updater's lifetime is tied to the application it is updating.
+ *
+ * @param acknowledgement Acknowledge to the updater that the installation finish was shown.
+ *
+ * This can be called from any thread
+ */
+- (void)showUpdateInstallationDidFinishWithAcknowledgement:(void (^)(void))acknowledgement;
+
+/*!
+ * Dismiss the current update installation
+ *
+ * Stop and tear down everything. Reply to all outstanding reply/completion blocks.
+ * Dismiss all update windows, alerts, progress, etc from the user.
+ * Basically, stop everything that could have been started. Sparkle may invoke this when aborting or finishing an update.
+ *
+ * This can be called from any thread
+ */
+- (void)dismissUpdateInstallation;
+
+@end
+
+NS_ASSUME_NONNULL_END
--- /dev/null
+//
+// SUUserDriverCoreComponent.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 3/4/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#if __has_feature(modules)
+@import Foundation;
+#else
+#import <Foundation/Foundation.h>
+#endif
+
+#import <Sparkle/SPUStatusCompletionResults.h>
+#import <Sparkle/SUExport.h>
+
+@protocol SPUStandardUserDriverDelegate;
+
+SU_EXPORT @interface SPUUserDriverCoreComponent : NSObject
+
+- (void)showCanCheckForUpdates:(BOOL)canCheckForUpdates;
+
+@property (nonatomic, readonly) BOOL canCheckForUpdates;
+
+- (void)registerInstallUpdateHandler:(void (^)(SPUInstallUpdateStatus))installUpdateHandler;
+- (void)installUpdateWithChoice:(SPUInstallUpdateStatus)choice;
+
+- (void)registerUpdateCheckStatusHandler:(void (^)(SPUUserInitiatedCheckStatus))updateCheckStatusCompletion;
+- (void)cancelUpdateCheckStatus;
+- (void)completeUpdateCheckStatus;
+
+- (void)registerDownloadStatusHandler:(void (^)(SPUDownloadUpdateStatus))downloadUpdateStatusCompletion;
+- (void)cancelDownloadStatus;
+- (void)completeDownloadStatus;
+
+- (void)registerAcknowledgement:(void (^)(void))acknowledgement;
+- (void)acceptAcknowledgement;
+
+- (void)dismissUpdateInstallation;
+
+@end
#else
#import <Foundation/Foundation.h>
#endif
-#import "SUExport.h"
+#import <Sparkle/SUExport.h>
NS_ASSUME_NONNULL_BEGIN
@class SUAppcastItem;
-SU_EXPORT @interface SUAppcast : NSObject
+SU_EXPORT @interface SUAppcast : NSObject<NSURLDownloadDelegate>
@property (copy, nullable) NSString *userAgentString;
@property (copy, nullable) NSDictionary<NSString *, NSString *> *httpHeaders;
#else
#import <Foundation/Foundation.h>
#endif
-#import "SUExport.h"
-@class SUSignatures;
+#import <Sparkle/SUExport.h>
-SU_EXPORT @interface SUAppcastItem : NSObject
+SU_EXPORT @interface SUAppcastItem : NSObject<NSSecureCoding>
@property (copy, readonly) NSString *title;
@property (copy, readonly) NSString *dateString;
@property (copy, readonly) NSString *itemDescription;
@property (strong, readonly) NSURL *releaseNotesURL;
-@property (strong, readonly) SUSignatures *signatures;
+@property (copy, readonly) NSString *DSASignature;
@property (copy, readonly) NSString *minimumSystemVersion;
@property (copy, readonly) NSString *maximumSystemVersion;
@property (strong, readonly) NSURL *fileURL;
@property (copy, readonly) NSString *displayVersionString;
@property (copy, readonly) NSDictionary *deltaUpdates;
@property (strong, readonly) NSURL *infoURL;
+@property (nonatomic, copy, readonly) NSString *installationType;
// Initializes with data from a dictionary provided by the RSS class.
- (instancetype)initWithDictionary:(NSDictionary *)dict;
#else
#import <Foundation/Foundation.h>
#endif
-#import "SUExport.h"
+#import <Sparkle/SUExport.h>
/**
* Error domain used by Sparkle
*/
SU_EXPORT extern NSString *const SUSparkleErrorDomain;
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wc++98-compat"
typedef NS_ENUM(OSStatus, SUError) {
+ // Configuration phase errors
+ SUNoPublicDSAFoundError = 0001,
+ SUInsufficientSigningError = 0002,
+ SUInsecureFeedURLError = 0003,
+ SUInvalidFeedURLError = 0004,
+ SUInvalidUpdaterError = 0005,
+ SUInvalidHostBundleIdentifierError = 0006,
+ SUInvalidHostVersionError = 0007,
+
// Appcast phase errors.
SUAppcastParseError = 1000,
SUNoUpdateError = 1001,
SUAppcastError = 1002,
SURunningFromDiskImageError = 1003,
+ SUResumeAppcastError = 1004,
// Download phase errors.
SUTemporaryDirectoryError = 2000,
SURelaunchError = 4004,
SUInstallationError = 4005,
SUDowngradeError = 4006,
- SUInstallationCancelledError = 4007,
-
- // System phase errors
- SUSystemPowerOffError = 5000
+ SUInstallationCanceledError = 4007,
+ SUInstallationAuthorizeLaterError = 4008,
+ SUNotAllowedInteractionError = 4009
};
-#pragma clang diagnostic pop
#endif
#else
#import <Foundation/Foundation.h>
#endif
-#import "SUExport.h"
-#import "SUVersionComparisonProtocol.h"
+#import <Sparkle/SUExport.h>
+#import <Sparkle/SUVersionComparisonProtocol.h>
NS_ASSUME_NONNULL_BEGIN
/*!
Initializes a new instance of the standard version comparator.
- */
+*/
- (instancetype)init;
/*!
Returns a singleton instance of the comparator.
-
+
It is usually preferred to alloc/init new a comparator instead.
-*/
+ */
+ (SUStandardVersionComparator *)defaultComparator;
/*!
--- /dev/null
+//
+// SUUpdatePermissionResponse.h
+// Sparkle
+//
+// Created by Mayur Pawashe on 2/8/16.
+// Copyright © 2016 Sparkle Project. All rights reserved.
+//
+
+#if __has_feature(modules)
+@import Foundation;
+#else
+#import <Foundation/Foundation.h>
+#endif
+
+#import <Sparkle/SUExport.h>
+
+/*!
+ This class represents a response for permission to check updates.
+*/
+SU_EXPORT @interface SUUpdatePermissionResponse : NSObject<NSSecureCoding>
+
+/*!
+ Initializes a new update permission response instance.
+
+ @param automaticUpdateChecks Flag for whether to allow automatic update checks.
+ @param sendSystemProfile Flag for if system profile information should be sent to the server hosting the appcast.
+ */
+- (instancetype)initWithAutomaticUpdateChecks:(BOOL)automaticUpdateChecks sendSystemProfile:(BOOL)sendSystemProfile;
+
+/*!
+ A read-only property indicating whether automatic update checks are allowed or not.
+ */
+@property (nonatomic, readonly) BOOL automaticUpdateChecks;
+
+/*!
+ A read-only property indicating if system profile should be sent or not.
+ */
+@property (nonatomic, readonly) BOOL sendSystemProfile;
+
+@end
#else
#import <Cocoa/Cocoa.h>
#endif
-#import "SUExport.h"
-#import "SUVersionComparisonProtocol.h"
-#import "SUVersionDisplayProtocol.h"
+#import <Sparkle/SUExport.h>
+#import <Sparkle/SUVersionComparisonProtocol.h>
+#import <Sparkle/SUVersionDisplayProtocol.h>
+#import <Sparkle/SUUpdaterDelegate.h>
-@class SUAppcastItem, SUAppcast;
+@class SUAppcastItem, SUAppcast, NSMenuItem;
@protocol SUUpdaterDelegate;
/*!
- The main API in Sparkle for controlling the update mechanism.
+ The main API in Sparkle for controlling the update mechanism.
- This class is used to configure the update paramters as well as manually
- and automatically schedule and control checks for updates.
+ This class is used to configure the update paramters as well as manually
+ and automatically schedule and control checks for updates.
+
+ Note: This class is now deprecated and acts as a thin wrapper around SPUUpdater and SPUStandardUserDriver
*/
+__deprecated_msg("Use SPUStandardUpdaterController or SPUUpdater instead")
SU_EXPORT @interface SUUpdater : NSObject
-@property (unsafe_unretained) IBOutlet id<SUUpdaterDelegate> delegate;
+@property (unsafe_unretained, nonatomic) IBOutlet id<SUUpdaterDelegate> delegate;
/*!
The shared updater for the main bundle.
/*!
The shared updater for a specified bundle.
-
If an updater has already been initialized for the provided bundle, that shared instance will be returned.
*/
+ (SUUpdater *)updaterForBundle:(NSBundle *)bundle;
The update schedule cycle will be reset in a short delay after the property's new value is set.
This is to allow reverting this property without kicking off a schedule change immediately
*/
-@property BOOL automaticallyChecksForUpdates;
+@property (nonatomic) BOOL automaticallyChecksForUpdates;
/*!
A property indicating whether or not updates can be automatically downloaded in the background.
- Note that automatic downloading of updates can be disallowed by the developer
- or by the user's system if silent updates cannot be done (eg: if they require authentication).
+ Note that automatic downloading of updates can be disallowed by the developer.
In this case, -automaticallyDownloadsUpdates will return NO regardless of how this property is set.
Setting this property will persist in the host bundle's user defaults.
*/
-@property BOOL automaticallyDownloadsUpdates;
+@property (nonatomic) BOOL automaticallyDownloadsUpdates;
/*!
A property indicating the current automatic update check interval.
The update schedule cycle will be reset in a short delay after the property's new value is set.
This is to allow reverting this property without kicking off a schedule change immediately
*/
-@property NSTimeInterval updateCheckInterval;
+@property (nonatomic) NSTimeInterval updateCheckInterval;
/*!
Begins a "probing" check for updates which will not actually offer to
This property must be called on the main thread.
*/
-@property (copy) NSURL *feedURL;
+@property (nonatomic, copy) NSURL *feedURL;
/*!
The host bundle that is being updated.
*/
-@property (readonly, strong) NSBundle *hostBundle;
+@property (readonly, nonatomic) NSBundle *hostBundle;
/*!
The bundle this class (SUUpdater) is loaded into.
*/
-@property (strong, readonly) NSBundle *sparkleBundle;
+@property (nonatomic, readonly) NSBundle *sparkleBundle;
/*!
The user agent used when checking for updates.
Setting this property will persist in the host bundle's user defaults.
*/
-@property BOOL sendsSystemProfile;
+@property (nonatomic) BOOL sendsSystemProfile;
/*!
A property indicating the decryption password used for extracting updates shipped as Apple Disk Images (dmg)
@property (nonatomic, copy) NSString *decryptionPassword;
/*!
- This function ignores normal update schedule, ignores user preferences,
- and interrupts users with an unwanted immediate app update.
-
- WARNING: this function should not be used in regular apps. This function
- is a user-unfriendly hack only for very special cases, like unstable
- rapidly-changing beta builds that would not run correctly if they were
- even one day out of date.
-
- Instead of this function you should set `SUAutomaticallyUpdate` to `YES`,
- which will gracefully install updates when the app quits.
-
- For UI-less/daemon apps that aren't usually quit, instead of this function,
- you can use the delegate method
- SUUpdaterDelegate::updater:willInstallUpdateOnQuit:immediateInstallationInvocation:
- to immediately start installation when an update was found.
-
- A progress dialog is shown but the user will never be prompted to read the
- release notes.
-
- This function will cause update to be downloaded twice if automatic updates are
- enabled.
-
- You may want to respond to the userDidCancelDownload delegate method in case
- the user clicks the "Cancel" button while the update is downloading.
- */
-- (void)installUpdatesIfAvailable;
-
-/*!
- Returns the date of last update check.
+ Returns the date of last update check.
- \returns \c nil if no check has been performed.
+ \returns \c nil if no check has been performed.
*/
-@property (readonly, copy) NSDate *lastUpdateCheckDate;
+@property (nonatomic, readonly, copy) NSDate *lastUpdateCheckDate;
/*!
- Appropriately schedules or cancels the update checking timer according to
- the preferences for time interval and automatic checks.
+ Appropriately schedules or cancels the update checking timer according to
+ the preferences for time interval and automatic checks.
- This call does not change the date of the next check,
- but only the internal NSTimer.
+ This call does not change the date of the next check,
+ but only the internal NSTimer.
*/
- (void)resetUpdateCycle;
/*!
- A property indicating whether or not an update is in progress.
+ A property indicating whether or not an update is in progress.
- Note this property is not indicative of whether or not user initiated updates can be performed.
- Use SUUpdater::validateMenuItem: for that instead.
+ Note this property is not indicative of whether or not user initiated updates can be performed.
+ Use SUUpdater::validateMenuItem: for that instead.
*/
-@property (readonly) BOOL updateInProgress;
+@property (nonatomic, readonly) BOOL updateInProgress;
@end
// SUUpdaterDelegate.h
// Sparkle
//
-// Created by Mayur Pawashe on 12/25/16.
+// Created by Mayur Pawashe on 3/12/16.
// Copyright © 2016 Sparkle Project. All rights reserved.
//
#import <Foundation/Foundation.h>
#endif
-#import "SUExport.h"
+#import <Sparkle/SUExport.h>
@protocol SUVersionComparison, SUVersionDisplay;
@class SUUpdater, SUAppcast, SUAppcastItem;
/*!
Provides methods to control the behavior of an SUUpdater object.
*/
+__deprecated_msg("See SPUUpdaterDelegate instead")
@protocol SUUpdaterDelegate <NSObject>
@optional
*/
- (void)updater:(SUUpdater *)updater willDownloadUpdate:(SUAppcastItem *)item withRequest:(NSMutableURLRequest *)request;
-/*!
- Called immediately after succesfull download of the specified update.
-
- \param updater The SUUpdater instance.
- \param item The appcast item corresponding to the update that has been downloaded.
- */
-- (void)updater:(SUUpdater *)updater didDownloadUpdate:(SUAppcastItem *)item;
-
/*!
Called after the specified update failed to download.
*/
- (void)userDidCancelDownload:(SUUpdater *)updater;
-/*!
- Called immediately before extracting the specified downloaded update.
-
- \param updater The SUUpdater instance.
- \param item The appcast item corresponding to the update that is proposed to be extracted.
- */
-- (void)updater:(SUUpdater *)updater willExtractUpdate:(SUAppcastItem *)item;
-
-/*!
- Called immediately after extracting the specified downloaded update.
-
- \param updater The SUUpdater instance.
- \param item The appcast item corresponding to the update that has been extracted.
- */
-- (void)updater:(SUUpdater *)updater didExtractUpdate:(SUAppcastItem *)item;
-
/*!
Called immediately before installing the specified update.
This is not called if the user didn't relaunch on the previous update,
in that case it will immediately restart.
+ This may also not be called if the application is not going to relaunch after it terminates.
+
\param updater The SUUpdater instance.
\param item The appcast item corresponding to the update that is proposed to be installed.
\param invocation The invocation that must be completed with `[invocation invoke]` before continuing with the relaunch.
This method allows you to provide a custom version comparator.
If you don't implement this method or return \c nil,
- the standard version comparator will be used.
+ the standard version comparator will be used. Note that the
+ standard version comparator may be used during installation for preventing
+ a downgrade, even if you provide a custom comparator here.
\sa SUStandardVersionComparator
/*!
Returns an object that formats version numbers for display to the user.
-
- If you don't implement this method or return \c nil,
- the standard version formatter will be used.
+ If you don't implement this method or return \c nil, the standard version formatter will be used.
\sa SUUpdateAlert
-
\param updater The SUUpdater instance.
*/
-- (nullable id<SUVersionDisplay>)versionDisplayerForUpdater:(SUUpdater *)updater;
+- (nullable id <SUVersionDisplay>)versionDisplayerForUpdater:(SUUpdater *)updater;
/*!
- Returns the path which is used to relaunch the client after the update is installed.
+ Returns the path to the application which is used to relaunch after the update is installed.
+
+ The installer also waits for the termination of the application at this path.
The default is the path of the host bundle.
/*!
Called when an update is scheduled to be silently installed on quit.
+
This is after an update has been automatically downloaded in the background.
(i.e. SUUpdater::automaticallyDownloadsUpdates is YES)
\param updater The SUUpdater instance.
\param item The appcast item corresponding to the update that was proposed to be installed.
+
+ \deprecated This method is no longer invoked. The installer will try to its best ability to install the update.
*/
-- (void)updater:(SUUpdater *)updater didCancelInstallUpdateOnQuit:(SUAppcastItem *)item;
+- (void)updater:(SUUpdater *)updater didCancelInstallUpdateOnQuit:(SUAppcastItem *)item __deprecated;
/*!
Called after an update is aborted due to an error.
#else
#import <Foundation/Foundation.h>
#endif
-#import "SUExport.h"
+
+#import <Sparkle/SUExport.h>
NS_ASSUME_NONNULL_BEGIN
#else
#import <Foundation/Foundation.h>
#endif
-#import "SUExport.h"
+
+#import <Sparkle/SUExport.h>
/*!
Applies special display formatting to version numbers.
--- /dev/null
+//
+// Sparkle.h
+// Sparkle
+//
+// Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07)
+// Copyright 2006 Andy Matuschak. All rights reserved.
+//
+
+#ifndef SPARKLE_H
+#define SPARKLE_H
+
+// This list should include the shared headers. It doesn't matter if some of them aren't shared (unless
+// there are name-space collisions) so we can list all of them to start with:
+
+#import <Sparkle/SUExport.h>
+#import <Sparkle/SUAppcast.h>
+#import <Sparkle/SUAppcastItem.h>
+#import <Sparkle/SUStandardVersionComparator.h>
+#import <Sparkle/SPUUpdater.h>
+#import <Sparkle/SPUUpdaterDelegate.h>
+#import <Sparkle/SPUUpdaterSettings.h>
+#import <Sparkle/SPUStandardUpdaterController.h>
+#import <Sparkle/SUVersionComparisonProtocol.h>
+#import <Sparkle/SUVersionDisplayProtocol.h>
+#import <Sparkle/SUErrors.h>
+#import <Sparkle/SPUUpdatePermissionRequest.h>
+#import <Sparkle/SUUpdatePermissionResponse.h>
+#import <Sparkle/SPUUserDriver.h>
+#import <Sparkle/SPUStandardUserDriver.h>
+#import <Sparkle/SPUStandardUserDriverDelegate.h>
+#import <Sparkle/SPUUserDriverCoreComponent.h>
+#import <Sparkle/SPUDownloadData.h>
+
+#import <Sparkle/SUUpdater.h> // deprecated
+#import <Sparkle/SUUpdaterDelegate.h> // deprecated
+
+
+#endif
html {
- color: #FFFFFFD8;
+ color: white;
+ background: transparent;
}
:link {
color: #419CFF;
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
- <string>18D42</string>
+ <string>18E205e</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
- <string>1.21.3</string>
+ <string>1.20.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
- <string>1.21.3</string>
+ <string>1.20.0</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
- <string>10B61</string>
+ <string>10P107d</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
- <string>18B71</string>
+ <string>18E205d</string>
<key>DTSDKName</key>
<string>macosx10.14</string>
<key>DTXcode</key>
- <string>1010</string>
+ <string>1020</string>
<key>DTXcodeBuild</key>
- <string>10B61</string>
+ <string>10P107d</string>
</dict>
</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>BuildMachineOSBuild</key>
+ <string>18E205e</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleExecutable</key>
+ <string>Updater</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.sparkle-project.Sparkle.Updater</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>Updater</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.20.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleSupportedPlatforms</key>
+ <array>
+ <string>MacOSX</string>
+ </array>
+ <key>CFBundleVersion</key>
+ <string>1.20.0</string>
+ <key>DTCompiler</key>
+ <string>com.apple.compilers.llvm.clang.1_0</string>
+ <key>DTPlatformBuild</key>
+ <string>10P107d</string>
+ <key>DTPlatformVersion</key>
+ <string>GM</string>
+ <key>DTSDKBuild</key>
+ <string>18E205d</string>
+ <key>DTSDKName</key>
+ <string>macosx10.14</string>
+ <key>DTXcode</key>
+ <string>1020</string>
+ <key>DTXcodeBuild</key>
+ <string>10P107d</string>
+ <key>LSMinimumSystemVersion</key>
+ <string>10.9</string>
+ <key>LSUIElement</key>
+ <string>1</string>
+ <key>NSPrincipalClass</key>
+ <string>NSApplication</string>
+</dict>
+</plist>
--- /dev/null
+fr.lproj
\ No newline at end of file
--- /dev/null
+pt_BR.lproj
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>files</key>
+ <dict>
+ <key>Resources/SUStatus.nib</key>
+ <data>
+ WeHAQlGzzecLWofOPo/0rgREQao=
+ </data>
+ <key>Resources/ar.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 9n6+2ab5/d3baNlcFRfSpztHdKc=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ca.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ K1BEF6sG2vXMLgibwfo3j2h588E=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/cs.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ oV92AOAArGmSW7Mp1Cr74C7zx1s=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/da.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 88FAIY52ex+k6CHvZHUHiYpaSdQ=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/de.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ aFIBXoHVaewkHZLyMy8rCTXUNQ0=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/el.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ gQTKA4Zd4FpsXRLWTcEfqV3Czu0=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/en.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ D14kRfcAqRpBq5GMobJjIRUh/yc=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/es.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ saEdp9H51NgvY5tzYYY5QoM5dsg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/fi.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Xfk3iYvY4+ymcoVUpHQATY5FNLg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/fr.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ ySuf1W/oXCB4ZX1wloQDxoAMmAA=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/he.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ ONZyQ7mMihp025wvYCm+YH5p9t8=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/is.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ bKE7f6KUVWbXzh+cBrwa31j6sXU=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/it.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ PGQtWau2xbYKJPKZjSvkwnPSSJU=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ja.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ SkZ6V1m0j1Za3GCmzVfpgP0pIBU=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ko.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 36Fahhtf/RNpPA22ntiODYGqG30=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/nb.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ lxEVDkftYdIz5tpFIlCBRzjq1G8=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/nl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 3esiRzch9B/dcmSDuZOlhGRmvhI=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 5DAYxRDmzfZJHVzkzmq9B33cV+Q=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pt_BR.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 9OEsTkc4OnLubR99mP0Br13Mflo=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pt_PT.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ DXgfdoW9r94wdvH+tYnJNakKzDs=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ro.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Yk1UW9SBQyAtNbFvLmiIjW/UCcc=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ru.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Px2O36VmsQbjS8ywxoJ/Pp+xQiQ=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sk.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 8A/scZSblfhf9/SAyz5Di2EqrqM=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ YRXBwzauFczYTqobmqCxBBPR4DE=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sv.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ K+ak+cmJ5S1D27ODU3IntD0wITI=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/th.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ anxUgZs0IJsgMZlzI1HUeCjvmrc=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/tr.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 4L5cXvWM1KkQdn5c+uYML/PX6xg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/uk.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ uhJ3st+FckuLz8HIH0r/RtUVGsw=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/zh_CN.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ JFvKYN1jjNAURBvctgcHJxsr1iA=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/zh_TW.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ fq2MGchNCsDkfRX6i950z9hnHAM=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ </dict>
+ <key>files2</key>
+ <dict>
+ <key>Resources/SUStatus.nib</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ WeHAQlGzzecLWofOPo/0rgREQao=
+ </data>
+ <key>hash2</key>
+ <data>
+ SuBluccOQqNjKuMoBnL5ccxkxMs3HX6C0Ju2cAu6TKY=
+ </data>
+ </dict>
+ <key>Resources/ar.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 9n6+2ab5/d3baNlcFRfSpztHdKc=
+ </data>
+ <key>hash2</key>
+ <data>
+ kEBNsn9OraKT0YF/n5ZaJC14Y/+GW/HI/CjiahPHgwM=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ca.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ K1BEF6sG2vXMLgibwfo3j2h588E=
+ </data>
+ <key>hash2</key>
+ <data>
+ D01nO0KWUvaVR/PR0E95dLAlJCYEKPRh858t+lcxFto=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/cs.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ oV92AOAArGmSW7Mp1Cr74C7zx1s=
+ </data>
+ <key>hash2</key>
+ <data>
+ 7GfIV0Cn0XzZpKh/k81zfx5tMrwh4BC40CcYDTDzDZ8=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/da.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 88FAIY52ex+k6CHvZHUHiYpaSdQ=
+ </data>
+ <key>hash2</key>
+ <data>
+ YtLfD1azWIUD2eqATgQak+tKys3x9ZFjo91mSYwSY68=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/de.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ aFIBXoHVaewkHZLyMy8rCTXUNQ0=
+ </data>
+ <key>hash2</key>
+ <data>
+ veXcpERRtworZCTZFpq6GTcRafdACMWDh9QC0psa2/0=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/el.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ gQTKA4Zd4FpsXRLWTcEfqV3Czu0=
+ </data>
+ <key>hash2</key>
+ <data>
+ DpBU2fltmtw85+0U85gXwPH8qApgI0zbG6K0qIn2X0c=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/en.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ D14kRfcAqRpBq5GMobJjIRUh/yc=
+ </data>
+ <key>hash2</key>
+ <data>
+ UgBa+U3LY4m8juJ+PqXx4Zq4/EaRW9KMvUIp1GE/AQs=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/es.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ saEdp9H51NgvY5tzYYY5QoM5dsg=
+ </data>
+ <key>hash2</key>
+ <data>
+ Rv71G/XkSv/4JZd+ejfFkpu4HKXFsM0Nxe094rw3mAQ=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/fi.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Xfk3iYvY4+ymcoVUpHQATY5FNLg=
+ </data>
+ <key>hash2</key>
+ <data>
+ DwdjkY2nc5XvSzY7wbwHcwKnnCfJXwDl1bO6PbtoeUU=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/fr.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ ySuf1W/oXCB4ZX1wloQDxoAMmAA=
+ </data>
+ <key>hash2</key>
+ <data>
+ uwpnRFOnusMwYJvTxNLG0RdzAwDoH83iKciaeRTtmMk=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/fr_CA.lproj</key>
+ <dict>
+ <key>symlink</key>
+ <string>fr.lproj</string>
+ </dict>
+ <key>Resources/he.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ ONZyQ7mMihp025wvYCm+YH5p9t8=
+ </data>
+ <key>hash2</key>
+ <data>
+ 35ECtsAW7lQQpZTAtYBIKgel5ItYO6FvWJaSueWWqVU=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/is.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ bKE7f6KUVWbXzh+cBrwa31j6sXU=
+ </data>
+ <key>hash2</key>
+ <data>
+ Dh4VgRSkntzRdCDvUFT0O91wxRUTyfKmsonwoD8JO3s=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/it.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ PGQtWau2xbYKJPKZjSvkwnPSSJU=
+ </data>
+ <key>hash2</key>
+ <data>
+ 6KWPm6/BMUnxP7kax40a/akTj6RVSNWSgXpS2+5bkMg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ja.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ SkZ6V1m0j1Za3GCmzVfpgP0pIBU=
+ </data>
+ <key>hash2</key>
+ <data>
+ WwKlqu3Hr89+HxOExBoaMwcXdNeW7VhIHqnvUraJFv0=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ko.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 36Fahhtf/RNpPA22ntiODYGqG30=
+ </data>
+ <key>hash2</key>
+ <data>
+ oX2Hsbm8fF05oGgMFXazS+rqg3KswApukPT1inQKxs8=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/nb.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ lxEVDkftYdIz5tpFIlCBRzjq1G8=
+ </data>
+ <key>hash2</key>
+ <data>
+ j1Ga6bYhYJ7h65dfZiX0udIIngNspVWPJaqKaEZhdIY=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/nl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 3esiRzch9B/dcmSDuZOlhGRmvhI=
+ </data>
+ <key>hash2</key>
+ <data>
+ Ft3lAx+eG7MsySkCRtYN7wT7zRTPWDsJDJnghgcNWrA=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 5DAYxRDmzfZJHVzkzmq9B33cV+Q=
+ </data>
+ <key>hash2</key>
+ <data>
+ tv/j3ywfuO1E3J5/vmrVFQ3cbZPi3EudMtacnjqVqWA=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pt.lproj</key>
+ <dict>
+ <key>symlink</key>
+ <string>pt_BR.lproj</string>
+ </dict>
+ <key>Resources/pt_BR.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 9OEsTkc4OnLubR99mP0Br13Mflo=
+ </data>
+ <key>hash2</key>
+ <data>
+ p12hYL8AHpuT+aXzheKTHwZEQFpPfc/qCoaYe7NmP6I=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pt_PT.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ DXgfdoW9r94wdvH+tYnJNakKzDs=
+ </data>
+ <key>hash2</key>
+ <data>
+ xjNkmadedPLED0QHUgWiGXlJ/d0rZeHWkUmAyGdURyA=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ro.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Yk1UW9SBQyAtNbFvLmiIjW/UCcc=
+ </data>
+ <key>hash2</key>
+ <data>
+ IffqR5gxQdL9YEeJj/L9jauu1eduqT1taxe3hKDDXOk=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ru.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Px2O36VmsQbjS8ywxoJ/Pp+xQiQ=
+ </data>
+ <key>hash2</key>
+ <data>
+ MBWSZcnNsYWJkCrv3YDWyANbEghjnWl8TFrApZqIh8c=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sk.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 8A/scZSblfhf9/SAyz5Di2EqrqM=
+ </data>
+ <key>hash2</key>
+ <data>
+ hKJVJbokW6LXrUqrf3FyGAxdnXJe+NAM1IzwtfMpPTs=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ YRXBwzauFczYTqobmqCxBBPR4DE=
+ </data>
+ <key>hash2</key>
+ <data>
+ mO9OxrL9L5y2wDXWsMt11pjcxa4wJrXVXM26w/TWqpE=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sv.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ K+ak+cmJ5S1D27ODU3IntD0wITI=
+ </data>
+ <key>hash2</key>
+ <data>
+ OXVaG3Vrb1xKlSXHj2qnMe/+X3r5r+huDymhPpx7j5w=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/th.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ anxUgZs0IJsgMZlzI1HUeCjvmrc=
+ </data>
+ <key>hash2</key>
+ <data>
+ uFBTQa44/YKNE5qHbmLqdlZUuLF0Zfk0LepBeIQ7ZQ8=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/tr.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 4L5cXvWM1KkQdn5c+uYML/PX6xg=
+ </data>
+ <key>hash2</key>
+ <data>
+ rOuDu7og0MYRXCQMAZ48ge5FRTN4+ZBYl9DxJEDnDaY=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/uk.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ uhJ3st+FckuLz8HIH0r/RtUVGsw=
+ </data>
+ <key>hash2</key>
+ <data>
+ AdON9wb2iTlde8P8StWkzdTMy8iL7M6mj94hIj6ixA0=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/zh_CN.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ JFvKYN1jjNAURBvctgcHJxsr1iA=
+ </data>
+ <key>hash2</key>
+ <data>
+ NgmrcL+YBJDI967Qilj/xC5XpMheyS0Jlyg+J8qEhrg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/zh_TW.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ fq2MGchNCsDkfRX6i950z9hnHAM=
+ </data>
+ <key>hash2</key>
+ <data>
+ 4bQfH6cx4JPlejfZbFtgdDFbRS9FENa0UFlKJqZqhtg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ </dict>
+ <key>rules</key>
+ <dict>
+ <key>^Resources/</key>
+ <true/>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^version.plist$</key>
+ <true/>
+ </dict>
+ <key>rules2</key>
+ <dict>
+ <key>.*\.dSYM($|/)</key>
+ <dict>
+ <key>weight</key>
+ <real>11</real>
+ </dict>
+ <key>^(.*/)?\.DS_Store$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>2000</real>
+ </dict>
+ <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^.*</key>
+ <true/>
+ <key>^Info\.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^PkgInfo$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^[^/]+$</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^embedded\.provisionprofile$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^version\.plist$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ </dict>
+</dict>
+</plist>
--- /dev/null
+fr.lproj
\ No newline at end of file
--- /dev/null
+pt_BR.lproj
\ No newline at end of file
--- /dev/null
+#!/usr/bin/env python
+
+import os, sys, subprocess
+
+def log_message(message):
+ sys.stderr.write(message + "\n")
+
+#Surround a token with double quotes if it has a space in it
+def sanitize(argument):
+ return ('"' + argument + '"' if ' ' in argument else argument)
+
+def _codesign_service(identity, path, entitlements_path=None):
+ command = ["codesign", "-o", "runtime", "-fs", identity, path] + ([] if entitlements_path is None else ["--entitlements", entitlements_path])
+ log_message(" ".join(map(sanitize, command)))
+
+ process = subprocess.Popen(command, stdout=subprocess.PIPE)
+ process.communicate()
+ if process.returncode != 0:
+ log_message("Error: Failed to codesign %s" % (path))
+ sys.exit(1)
+
+def codesign_service(service_name, identity, path, entitlements_path=None):
+ #Sign the auxiliary executables (if any)
+ executables_path = os.path.join(path, "Contents/MacOS/")
+ if os.path.exists(executables_path):
+ for executable in os.listdir(executables_path):
+ if executable != service_name:
+ _codesign_service(identity, os.path.join(executables_path, executable), entitlements_path)
+
+ #Sign the service bundle
+ _codesign_service(identity, path, entitlements_path)
+
+if __name__ == "__main__":
+ if len(sys.argv) < 3:
+ log_message("Usage:\n\t%s code-signing-identity xpc-service xpc-service2 ..." % (sys.argv[0]))
+ log_message("Example:\n\t%s \"Developer ID Application\" ./XPCServices/*.xpc" % (sys.argv[0]))
+ sys.exit(1)
+
+ signing_identity = sys.argv[1]
+ executables = sys.argv[2:]
+
+ for executable in executables:
+ parent, child = os.path.split(executable)
+ service_name = os.path.splitext(child)[0]
+ entitlements_path = os.path.join(parent, service_name + ".entitlements")
+ codesign_service(service_name, signing_identity, executable, None if not os.path.exists(entitlements_path) else entitlements_path)
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>BuildMachineOSBuild</key>
+ <string>18E205e</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleExecutable</key>
+ <string>org.sparkle-project.Downloader</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.sparkle-project.Downloader</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>org.sparkle-project.Downloader</string>
+ <key>CFBundlePackageType</key>
+ <string>XPC!</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.20.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleSupportedPlatforms</key>
+ <array>
+ <string>MacOSX</string>
+ </array>
+ <key>CFBundleVersion</key>
+ <string>1.20.0</string>
+ <key>DTCompiler</key>
+ <string>com.apple.compilers.llvm.clang.1_0</string>
+ <key>DTPlatformBuild</key>
+ <string>10B61</string>
+ <key>DTPlatformVersion</key>
+ <string>GM</string>
+ <key>DTSDKBuild</key>
+ <string>18B71</string>
+ <key>DTSDKName</key>
+ <string>macosx10.14</string>
+ <key>DTXcode</key>
+ <string>1010</string>
+ <key>DTXcodeBuild</key>
+ <string>10B61</string>
+ <key>NSAppTransportSecurity</key>
+ <dict>
+ <key>NSAllowsArbitraryLoads</key>
+ <false/>
+ </dict>
+ <key>NSHumanReadableCopyright</key>
+ <string>Copyright © 2016 Sparkle Project. All rights reserved.</string>
+ <key>XPCService</key>
+ <dict>
+ <key>RunLoopType</key>
+ <string>NSRunLoop</string>
+ <key>ServiceType</key>
+ <string>Application</string>
+ </dict>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>files</key>
+ <dict/>
+ <key>files2</key>
+ <dict/>
+ <key>rules</key>
+ <dict>
+ <key>^Resources/</key>
+ <true/>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^version.plist$</key>
+ <true/>
+ </dict>
+ <key>rules2</key>
+ <dict>
+ <key>.*\.dSYM($|/)</key>
+ <dict>
+ <key>weight</key>
+ <real>11</real>
+ </dict>
+ <key>^(.*/)?\.DS_Store$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>2000</real>
+ </dict>
+ <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^.*</key>
+ <true/>
+ <key>^Info\.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^PkgInfo$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^[^/]+$</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^embedded\.provisionprofile$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^version\.plist$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ </dict>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>BuildMachineOSBuild</key>
+ <string>18E205e</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleExecutable</key>
+ <string>org.sparkle-project.InstallerConnection</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.sparkle-project.InstallerConnection</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>org.sparkle-project.InstallerConnection</string>
+ <key>CFBundlePackageType</key>
+ <string>XPC!</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.20.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleSupportedPlatforms</key>
+ <array>
+ <string>MacOSX</string>
+ </array>
+ <key>CFBundleVersion</key>
+ <string>1.20.0</string>
+ <key>DTCompiler</key>
+ <string>com.apple.compilers.llvm.clang.1_0</string>
+ <key>DTPlatformBuild</key>
+ <string>10B61</string>
+ <key>DTPlatformVersion</key>
+ <string>GM</string>
+ <key>DTSDKBuild</key>
+ <string>18B71</string>
+ <key>DTSDKName</key>
+ <string>macosx10.14</string>
+ <key>DTXcode</key>
+ <string>1010</string>
+ <key>DTXcodeBuild</key>
+ <string>10B61</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>Copyright © 2016 Sparkle Project. All rights reserved.</string>
+ <key>XPCService</key>
+ <dict>
+ <key>ServiceType</key>
+ <string>Application</string>
+ </dict>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>files</key>
+ <dict/>
+ <key>files2</key>
+ <dict/>
+ <key>rules</key>
+ <dict>
+ <key>^Resources/</key>
+ <true/>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^version.plist$</key>
+ <true/>
+ </dict>
+ <key>rules2</key>
+ <dict>
+ <key>.*\.dSYM($|/)</key>
+ <dict>
+ <key>weight</key>
+ <real>11</real>
+ </dict>
+ <key>^(.*/)?\.DS_Store$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>2000</real>
+ </dict>
+ <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^.*</key>
+ <true/>
+ <key>^Info\.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^PkgInfo$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^[^/]+$</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^embedded\.provisionprofile$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^version\.plist$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ </dict>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>BuildMachineOSBuild</key>
+ <string>18E205e</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleExecutable</key>
+ <string>org.sparkle-project.InstallerLauncher</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.sparkle-project.InstallerLauncher</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>org.sparkle-project.InstallerLauncher</string>
+ <key>CFBundlePackageType</key>
+ <string>XPC!</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.20.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleSupportedPlatforms</key>
+ <array>
+ <string>MacOSX</string>
+ </array>
+ <key>CFBundleVersion</key>
+ <string>1.20.0</string>
+ <key>DTCompiler</key>
+ <string>com.apple.compilers.llvm.clang.1_0</string>
+ <key>DTPlatformBuild</key>
+ <string>10B61</string>
+ <key>DTPlatformVersion</key>
+ <string>GM</string>
+ <key>DTSDKBuild</key>
+ <string>18B71</string>
+ <key>DTSDKName</key>
+ <string>macosx10.14</string>
+ <key>DTXcode</key>
+ <string>1010</string>
+ <key>DTXcodeBuild</key>
+ <string>10B61</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>Copyright © 2016 Sparkle Project. All rights reserved.</string>
+ <key>XPCService</key>
+ <dict>
+ <key>JoinExistingSession</key>
+ <true/>
+ <key>ServiceType</key>
+ <string>Application</string>
+ </dict>
+</dict>
+</plist>
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
- <string>18D42</string>
+ <string>18E205e</string>
<key>CFBundleDevelopmentRegion</key>
- <string>English</string>
+ <string>en</string>
<key>CFBundleExecutable</key>
- <string>Autoupdate</string>
- <key>CFBundleIconFile</key>
- <string>AppIcon.icns</string>
+ <string>Updater</string>
<key>CFBundleIdentifier</key>
- <string>org.sparkle-project.Sparkle.Autoupdate</string>
+ <string>org.sparkle-project.Sparkle.Updater</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
+ <key>CFBundleName</key>
+ <string>Updater</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
- <string>1.21.3 18-g1ff157710</string>
+ <string>1.20.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleSupportedPlatforms</key>
<string>MacOSX</string>
</array>
<key>CFBundleVersion</key>
- <string>1.21.3</string>
+ <string>1.20.0</string>
<key>DTCompiler</key>
<string>com.apple.compilers.llvm.clang.1_0</string>
<key>DTPlatformBuild</key>
<string>1010</string>
<key>DTXcodeBuild</key>
<string>10B61</string>
- <key>LSBackgroundOnly</key>
- <string>1</string>
<key>LSMinimumSystemVersion</key>
- <string>10.7</string>
+ <string>10.9</string>
<key>LSUIElement</key>
<string>1</string>
- <key>NSMainNibFile</key>
- <string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
--- /dev/null
+APPL????
\ No newline at end of file
--- /dev/null
+fr.lproj
\ No newline at end of file
--- /dev/null
+pt_BR.lproj
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>files</key>
+ <dict>
+ <key>Resources/SUStatus.nib</key>
+ <data>
+ WeHAQlGzzecLWofOPo/0rgREQao=
+ </data>
+ <key>Resources/ar.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 9n6+2ab5/d3baNlcFRfSpztHdKc=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ca.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ K1BEF6sG2vXMLgibwfo3j2h588E=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/cs.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ oV92AOAArGmSW7Mp1Cr74C7zx1s=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/da.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 88FAIY52ex+k6CHvZHUHiYpaSdQ=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/de.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ aFIBXoHVaewkHZLyMy8rCTXUNQ0=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/el.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ gQTKA4Zd4FpsXRLWTcEfqV3Czu0=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/en.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ D14kRfcAqRpBq5GMobJjIRUh/yc=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/es.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ saEdp9H51NgvY5tzYYY5QoM5dsg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/fi.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Xfk3iYvY4+ymcoVUpHQATY5FNLg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/fr.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ ySuf1W/oXCB4ZX1wloQDxoAMmAA=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/he.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ ONZyQ7mMihp025wvYCm+YH5p9t8=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/is.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ bKE7f6KUVWbXzh+cBrwa31j6sXU=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/it.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ PGQtWau2xbYKJPKZjSvkwnPSSJU=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ja.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ SkZ6V1m0j1Za3GCmzVfpgP0pIBU=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ko.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 36Fahhtf/RNpPA22ntiODYGqG30=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/nb.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ lxEVDkftYdIz5tpFIlCBRzjq1G8=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/nl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 3esiRzch9B/dcmSDuZOlhGRmvhI=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 5DAYxRDmzfZJHVzkzmq9B33cV+Q=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pt_BR.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 9OEsTkc4OnLubR99mP0Br13Mflo=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pt_PT.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ DXgfdoW9r94wdvH+tYnJNakKzDs=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ro.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Yk1UW9SBQyAtNbFvLmiIjW/UCcc=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ru.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Px2O36VmsQbjS8ywxoJ/Pp+xQiQ=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sk.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 8A/scZSblfhf9/SAyz5Di2EqrqM=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ YRXBwzauFczYTqobmqCxBBPR4DE=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sv.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ K+ak+cmJ5S1D27ODU3IntD0wITI=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/th.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ anxUgZs0IJsgMZlzI1HUeCjvmrc=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/tr.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 4L5cXvWM1KkQdn5c+uYML/PX6xg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/uk.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ uhJ3st+FckuLz8HIH0r/RtUVGsw=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/zh_CN.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ JFvKYN1jjNAURBvctgcHJxsr1iA=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/zh_TW.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ fq2MGchNCsDkfRX6i950z9hnHAM=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ </dict>
+ <key>files2</key>
+ <dict>
+ <key>Resources/SUStatus.nib</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ WeHAQlGzzecLWofOPo/0rgREQao=
+ </data>
+ <key>hash2</key>
+ <data>
+ SuBluccOQqNjKuMoBnL5ccxkxMs3HX6C0Ju2cAu6TKY=
+ </data>
+ </dict>
+ <key>Resources/ar.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 9n6+2ab5/d3baNlcFRfSpztHdKc=
+ </data>
+ <key>hash2</key>
+ <data>
+ kEBNsn9OraKT0YF/n5ZaJC14Y/+GW/HI/CjiahPHgwM=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ca.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ K1BEF6sG2vXMLgibwfo3j2h588E=
+ </data>
+ <key>hash2</key>
+ <data>
+ D01nO0KWUvaVR/PR0E95dLAlJCYEKPRh858t+lcxFto=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/cs.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ oV92AOAArGmSW7Mp1Cr74C7zx1s=
+ </data>
+ <key>hash2</key>
+ <data>
+ 7GfIV0Cn0XzZpKh/k81zfx5tMrwh4BC40CcYDTDzDZ8=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/da.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 88FAIY52ex+k6CHvZHUHiYpaSdQ=
+ </data>
+ <key>hash2</key>
+ <data>
+ YtLfD1azWIUD2eqATgQak+tKys3x9ZFjo91mSYwSY68=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/de.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ aFIBXoHVaewkHZLyMy8rCTXUNQ0=
+ </data>
+ <key>hash2</key>
+ <data>
+ veXcpERRtworZCTZFpq6GTcRafdACMWDh9QC0psa2/0=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/el.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ gQTKA4Zd4FpsXRLWTcEfqV3Czu0=
+ </data>
+ <key>hash2</key>
+ <data>
+ DpBU2fltmtw85+0U85gXwPH8qApgI0zbG6K0qIn2X0c=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/en.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ D14kRfcAqRpBq5GMobJjIRUh/yc=
+ </data>
+ <key>hash2</key>
+ <data>
+ UgBa+U3LY4m8juJ+PqXx4Zq4/EaRW9KMvUIp1GE/AQs=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/es.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ saEdp9H51NgvY5tzYYY5QoM5dsg=
+ </data>
+ <key>hash2</key>
+ <data>
+ Rv71G/XkSv/4JZd+ejfFkpu4HKXFsM0Nxe094rw3mAQ=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/fi.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Xfk3iYvY4+ymcoVUpHQATY5FNLg=
+ </data>
+ <key>hash2</key>
+ <data>
+ DwdjkY2nc5XvSzY7wbwHcwKnnCfJXwDl1bO6PbtoeUU=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/fr.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ ySuf1W/oXCB4ZX1wloQDxoAMmAA=
+ </data>
+ <key>hash2</key>
+ <data>
+ uwpnRFOnusMwYJvTxNLG0RdzAwDoH83iKciaeRTtmMk=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/fr_CA.lproj</key>
+ <dict>
+ <key>symlink</key>
+ <string>fr.lproj</string>
+ </dict>
+ <key>Resources/he.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ ONZyQ7mMihp025wvYCm+YH5p9t8=
+ </data>
+ <key>hash2</key>
+ <data>
+ 35ECtsAW7lQQpZTAtYBIKgel5ItYO6FvWJaSueWWqVU=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/is.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ bKE7f6KUVWbXzh+cBrwa31j6sXU=
+ </data>
+ <key>hash2</key>
+ <data>
+ Dh4VgRSkntzRdCDvUFT0O91wxRUTyfKmsonwoD8JO3s=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/it.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ PGQtWau2xbYKJPKZjSvkwnPSSJU=
+ </data>
+ <key>hash2</key>
+ <data>
+ 6KWPm6/BMUnxP7kax40a/akTj6RVSNWSgXpS2+5bkMg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ja.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ SkZ6V1m0j1Za3GCmzVfpgP0pIBU=
+ </data>
+ <key>hash2</key>
+ <data>
+ WwKlqu3Hr89+HxOExBoaMwcXdNeW7VhIHqnvUraJFv0=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ko.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 36Fahhtf/RNpPA22ntiODYGqG30=
+ </data>
+ <key>hash2</key>
+ <data>
+ oX2Hsbm8fF05oGgMFXazS+rqg3KswApukPT1inQKxs8=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/nb.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ lxEVDkftYdIz5tpFIlCBRzjq1G8=
+ </data>
+ <key>hash2</key>
+ <data>
+ j1Ga6bYhYJ7h65dfZiX0udIIngNspVWPJaqKaEZhdIY=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/nl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 3esiRzch9B/dcmSDuZOlhGRmvhI=
+ </data>
+ <key>hash2</key>
+ <data>
+ Ft3lAx+eG7MsySkCRtYN7wT7zRTPWDsJDJnghgcNWrA=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 5DAYxRDmzfZJHVzkzmq9B33cV+Q=
+ </data>
+ <key>hash2</key>
+ <data>
+ tv/j3ywfuO1E3J5/vmrVFQ3cbZPi3EudMtacnjqVqWA=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pt.lproj</key>
+ <dict>
+ <key>symlink</key>
+ <string>pt_BR.lproj</string>
+ </dict>
+ <key>Resources/pt_BR.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 9OEsTkc4OnLubR99mP0Br13Mflo=
+ </data>
+ <key>hash2</key>
+ <data>
+ p12hYL8AHpuT+aXzheKTHwZEQFpPfc/qCoaYe7NmP6I=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/pt_PT.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ DXgfdoW9r94wdvH+tYnJNakKzDs=
+ </data>
+ <key>hash2</key>
+ <data>
+ xjNkmadedPLED0QHUgWiGXlJ/d0rZeHWkUmAyGdURyA=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ro.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Yk1UW9SBQyAtNbFvLmiIjW/UCcc=
+ </data>
+ <key>hash2</key>
+ <data>
+ IffqR5gxQdL9YEeJj/L9jauu1eduqT1taxe3hKDDXOk=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/ru.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ Px2O36VmsQbjS8ywxoJ/Pp+xQiQ=
+ </data>
+ <key>hash2</key>
+ <data>
+ MBWSZcnNsYWJkCrv3YDWyANbEghjnWl8TFrApZqIh8c=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sk.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 8A/scZSblfhf9/SAyz5Di2EqrqM=
+ </data>
+ <key>hash2</key>
+ <data>
+ hKJVJbokW6LXrUqrf3FyGAxdnXJe+NAM1IzwtfMpPTs=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sl.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ YRXBwzauFczYTqobmqCxBBPR4DE=
+ </data>
+ <key>hash2</key>
+ <data>
+ mO9OxrL9L5y2wDXWsMt11pjcxa4wJrXVXM26w/TWqpE=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/sv.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ K+ak+cmJ5S1D27ODU3IntD0wITI=
+ </data>
+ <key>hash2</key>
+ <data>
+ OXVaG3Vrb1xKlSXHj2qnMe/+X3r5r+huDymhPpx7j5w=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/th.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ anxUgZs0IJsgMZlzI1HUeCjvmrc=
+ </data>
+ <key>hash2</key>
+ <data>
+ uFBTQa44/YKNE5qHbmLqdlZUuLF0Zfk0LepBeIQ7ZQ8=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/tr.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ 4L5cXvWM1KkQdn5c+uYML/PX6xg=
+ </data>
+ <key>hash2</key>
+ <data>
+ rOuDu7og0MYRXCQMAZ48ge5FRTN4+ZBYl9DxJEDnDaY=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/uk.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ uhJ3st+FckuLz8HIH0r/RtUVGsw=
+ </data>
+ <key>hash2</key>
+ <data>
+ AdON9wb2iTlde8P8StWkzdTMy8iL7M6mj94hIj6ixA0=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/zh_CN.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ JFvKYN1jjNAURBvctgcHJxsr1iA=
+ </data>
+ <key>hash2</key>
+ <data>
+ NgmrcL+YBJDI967Qilj/xC5XpMheyS0Jlyg+J8qEhrg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ <key>Resources/zh_TW.lproj/Sparkle.strings</key>
+ <dict>
+ <key>hash</key>
+ <data>
+ fq2MGchNCsDkfRX6i950z9hnHAM=
+ </data>
+ <key>hash2</key>
+ <data>
+ 4bQfH6cx4JPlejfZbFtgdDFbRS9FENa0UFlKJqZqhtg=
+ </data>
+ <key>optional</key>
+ <true/>
+ </dict>
+ </dict>
+ <key>rules</key>
+ <dict>
+ <key>^Resources/</key>
+ <true/>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^version.plist$</key>
+ <true/>
+ </dict>
+ <key>rules2</key>
+ <dict>
+ <key>.*\.dSYM($|/)</key>
+ <dict>
+ <key>weight</key>
+ <real>11</real>
+ </dict>
+ <key>^(.*/)?\.DS_Store$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>2000</real>
+ </dict>
+ <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^.*</key>
+ <true/>
+ <key>^Info\.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^PkgInfo$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^[^/]+$</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^embedded\.provisionprofile$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^version\.plist$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ </dict>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>files</key>
+ <dict/>
+ <key>files2</key>
+ <dict>
+ <key>MacOS/Autoupdate</key>
+ <dict>
+ <key>cdhash</key>
+ <data>
+ 6r9yO3FL6iqQJgfQRO0aSFSDIas=
+ </data>
+ <key>requirement</key>
+ <string>identifier Autoupdate and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "5X9DE89KYV"</string>
+ </dict>
+ <key>MacOS/Updater.app</key>
+ <dict>
+ <key>cdhash</key>
+ <data>
+ Ze8Wj/J9L0C9wuYWk32SlzQ2NLI=
+ </data>
+ <key>requirement</key>
+ <string>identifier "org.sparkle-project.Sparkle.Updater" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = "5X9DE89KYV"</string>
+ </dict>
+ </dict>
+ <key>rules</key>
+ <dict>
+ <key>^Resources/</key>
+ <true/>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^version.plist$</key>
+ <true/>
+ </dict>
+ <key>rules2</key>
+ <dict>
+ <key>.*\.dSYM($|/)</key>
+ <dict>
+ <key>weight</key>
+ <real>11</real>
+ </dict>
+ <key>^(.*/)?\.DS_Store$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>2000</real>
+ </dict>
+ <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^.*</key>
+ <true/>
+ <key>^Info\.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^PkgInfo$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^[^/]+$</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^embedded\.provisionprofile$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^version\.plist$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ </dict>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>BuildMachineOSBuild</key>
+ <string>18E205e</string>
+ <key>CFBundleDevelopmentRegion</key>
+ <string>en</string>
+ <key>CFBundleExecutable</key>
+ <string>org.sparkle-project.InstallerStatus</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.sparkle-project.InstallerStatus</string>
+ <key>CFBundleInfoDictionaryVersion</key>
+ <string>6.0</string>
+ <key>CFBundleName</key>
+ <string>org.sparkle-project.InstallerStatus</string>
+ <key>CFBundlePackageType</key>
+ <string>XPC!</string>
+ <key>CFBundleShortVersionString</key>
+ <string>1.20.0</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleSupportedPlatforms</key>
+ <array>
+ <string>MacOSX</string>
+ </array>
+ <key>CFBundleVersion</key>
+ <string>1.20.0</string>
+ <key>DTCompiler</key>
+ <string>com.apple.compilers.llvm.clang.1_0</string>
+ <key>DTPlatformBuild</key>
+ <string>10B61</string>
+ <key>DTPlatformVersion</key>
+ <string>GM</string>
+ <key>DTSDKBuild</key>
+ <string>18B71</string>
+ <key>DTSDKName</key>
+ <string>macosx10.14</string>
+ <key>DTXcode</key>
+ <string>1010</string>
+ <key>DTXcodeBuild</key>
+ <string>10B61</string>
+ <key>NSHumanReadableCopyright</key>
+ <string>Copyright © 2016 Sparkle Project. All rights reserved.</string>
+ <key>XPCService</key>
+ <dict>
+ <key>ServiceType</key>
+ <string>Application</string>
+ </dict>
+</dict>
+</plist>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>files</key>
+ <dict/>
+ <key>files2</key>
+ <dict/>
+ <key>rules</key>
+ <dict>
+ <key>^Resources/</key>
+ <true/>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^version.plist$</key>
+ <true/>
+ </dict>
+ <key>rules2</key>
+ <dict>
+ <key>.*\.dSYM($|/)</key>
+ <dict>
+ <key>weight</key>
+ <real>11</real>
+ </dict>
+ <key>^(.*/)?\.DS_Store$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>2000</real>
+ </dict>
+ <key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^.*</key>
+ <true/>
+ <key>^Info\.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^PkgInfo$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^Resources/.*\.lproj/</key>
+ <dict>
+ <key>optional</key>
+ <true/>
+ <key>weight</key>
+ <real>1000</real>
+ </dict>
+ <key>^Resources/.*\.lproj/locversion.plist$</key>
+ <dict>
+ <key>omit</key>
+ <true/>
+ <key>weight</key>
+ <real>1100</real>
+ </dict>
+ <key>^Resources/Base\.lproj/</key>
+ <dict>
+ <key>weight</key>
+ <real>1010</real>
+ </dict>
+ <key>^[^/]+$</key>
+ <dict>
+ <key>nested</key>
+ <true/>
+ <key>weight</key>
+ <real>10</real>
+ </dict>
+ <key>^embedded\.provisionprofile$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ <key>^version\.plist$</key>
+ <dict>
+ <key>weight</key>
+ <real>20</real>
+ </dict>
+ </dict>
+</dict>
+</plist>