ability to auto-update the blocklist automatically weekly (mac)

This commit is contained in:
Mitchell Livingston 2008-09-01 15:46:00 +00:00
parent afd31cd0f2
commit 14760b85f3
11 changed files with 278 additions and 54 deletions

1
NEWS
View File

@ -5,6 +5,7 @@ http://trac.transmissionbt.com/query?group=component&milestone=1.40
- All Platforms
+ Lazy bitfields
- Mac
+ Option to automatically update the blocklist weekly
+ Sparkle updated to 1.5
1.33 (2008/08/30)

View File

@ -84,6 +84,7 @@
A22180980D148A71007D09ED /* GroupsWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = A22180970D148A71007D09ED /* GroupsWindowController.m */; };
A22180B60D148F0F007D09ED /* GroupsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = A22180B50D148F0F007D09ED /* GroupsWindow.xib */; };
A222E9870E6B21D9009FB003 /* BlocklistDownloaderViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = A222E9860E6B21D9009FB003 /* BlocklistDownloaderViewController.m */; };
A222EA7B0E6C32C4009FB003 /* BlocklistScheduler.m in Sources */ = {isa = PBXBuildFile; fileRef = A222EA7A0E6C32C4009FB003 /* BlocklistScheduler.m */; };
A224D2640DAAC55F000954EA /* Peers.png in Resources */ = {isa = PBXBuildFile; fileRef = A224D2630DAAC55F000954EA /* Peers.png */; };
A2265F420B5EF5F40093DDA5 /* FileNameCell.m in Sources */ = {isa = PBXBuildFile; fileRef = A2265F400B5EF5F40093DDA5 /* FileNameCell.m */; };
A226FDAC0D0CDF20005A7F71 /* libnatpmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3C7A118D0D0B2EB800B5701F /* libnatpmp.a */; };
@ -496,6 +497,8 @@
A22180B50D148F0F007D09ED /* GroupsWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = GroupsWindow.xib; path = macosx/GroupsWindow.xib; sourceTree = "<group>"; };
A222E9850E6B21D9009FB003 /* BlocklistDownloaderViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlocklistDownloaderViewController.h; path = macosx/BlocklistDownloaderViewController.h; sourceTree = "<group>"; };
A222E9860E6B21D9009FB003 /* BlocklistDownloaderViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BlocklistDownloaderViewController.m; path = macosx/BlocklistDownloaderViewController.m; sourceTree = "<group>"; };
A222EA790E6C32C4009FB003 /* BlocklistScheduler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = BlocklistScheduler.h; path = macosx/BlocklistScheduler.h; sourceTree = "<group>"; };
A222EA7A0E6C32C4009FB003 /* BlocklistScheduler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = BlocklistScheduler.m; path = macosx/BlocklistScheduler.m; sourceTree = "<group>"; };
A223AA7D0D220CEB00840069 /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/Creator.xib; sourceTree = "<group>"; };
A223AA7E0D220CEB00840069 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = macosx/nl.lproj/InfoPlist.strings; sourceTree = "<group>"; };
A223AA7F0D220CEB00840069 /* nl */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = nl; path = macosx/nl.lproj/InfoWindow.xib; sourceTree = "<group>"; };
@ -967,6 +970,8 @@
A2D307A30D9EC6870051FD27 /* BlocklistDownloader.m */,
A222E9850E6B21D9009FB003 /* BlocklistDownloaderViewController.h */,
A222E9860E6B21D9009FB003 /* BlocklistDownloaderViewController.m */,
A222EA790E6C32C4009FB003 /* BlocklistScheduler.h */,
A222EA7A0E6C32C4009FB003 /* BlocklistScheduler.m */,
A2DF567C0DE323D3000795D5 /* QuickLook.h */,
A2DF57720DE46A6A000795D5 /* QuickLookController.h */,
A2DF57730DE46A6A000795D5 /* QuickLookController.m */,
@ -2008,6 +2013,7 @@
A28F4F770E085BDC003A3882 /* ColorTextField.m in Sources */,
A27F0F330E19AD9800B2DB97 /* TorrentGroup.m in Sources */,
A222E9870E6B21D9009FB003 /* BlocklistDownloaderViewController.m in Sources */,
A222EA7B0E6C32C4009FB003 /* BlocklistScheduler.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@ -24,6 +24,7 @@
#import "BlocklistDownloader.h"
#import "BlocklistDownloaderViewController.h"
#import "BlocklistScheduler.h"
#import "PrefsController.h"
#import "NSApplicationAdditions.h"
@ -88,6 +89,8 @@ BlocklistDownloader * fDownloader = nil;
[fDownload cancel];
[[BlocklistScheduler scheduler] updateSchedule];
fDownloader = nil;
[self release];
}
@ -112,6 +115,8 @@ BlocklistDownloader * fDownloader = nil;
{
[fViewController setFailed: [error localizedDescription]];
[[BlocklistScheduler scheduler] updateSchedule];
fDownloader = nil;
[self release];
}
@ -134,6 +139,8 @@ BlocklistDownloader * fDownloader = nil;
{
fState = BLOCKLIST_DL_START;
[[BlocklistScheduler scheduler] cancelSchedule];
NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: LIST_URL]];
fDownload = [[NSURLDownload alloc] initWithRequest: request delegate: self];
@ -157,7 +164,9 @@ BlocklistDownloader * fDownloader = nil;
[fViewController setFinished];
//update last updated date for schedule
[[NSUserDefaults standardUserDefaults] setObject: [NSDate date] forKey: @"BlocklistLastUpdate"];
[[BlocklistScheduler scheduler] updateSchedule];
[[NSNotificationCenter defaultCenter] postNotificationName: @"BlocklistUpdated" object: nil];

View File

@ -0,0 +1,37 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2008 Transmission authors and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*****************************************************************************/
#import <Cocoa/Cocoa.h>
@interface BlocklistScheduler : NSObject
{
NSTimer * fTimer;
}
+ (BlocklistScheduler *) scheduler;
- (void) updateSchedule;
- (void) cancelSchedule;
@end

View File

@ -0,0 +1,90 @@
/******************************************************************************
* $Id$
*
* Copyright (c) 2008 Transmission authors and contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*****************************************************************************/
#import "BlocklistScheduler.h"
#import "BlocklistDownloader.h"
//one minute delay before running after option is changed
#define SMALL_DELAY 60
//update one week after previous update
#define FULL_WAIT (60 * 60 * 24 * 7)
@interface BlocklistScheduler (Private)
- (void) runUpdater;
@end
@implementation BlocklistScheduler
BlocklistScheduler * fScheduler = nil;
+ (BlocklistScheduler *) scheduler
{
if (!fScheduler)
fScheduler = [[BlocklistScheduler alloc] init];
return fScheduler;
}
- (void) updateSchedule
{
[self cancelSchedule];
if (![[NSUserDefaults standardUserDefaults] boolForKey: @"Blocklist"]
|| ![[NSUserDefaults standardUserDefaults] boolForKey: @"BlocklistAutoUpdate"])
return;
NSDate * lastUpdateDate = [[NSUserDefaults standardUserDefaults] objectForKey: @"BlocklistLastUpdate"];
if (lastUpdateDate)
lastUpdateDate = [lastUpdateDate addTimeInterval: FULL_WAIT];
NSDate * closeDate = [NSDate dateWithTimeIntervalSinceNow: SMALL_DELAY];
NSDate * useDate = lastUpdateDate ? [lastUpdateDate laterDate: closeDate] : closeDate;
fTimer = [[NSTimer alloc] initWithFireDate: useDate interval: 0 target: self selector: @selector(runUpdater)
userInfo: nil repeats: NO];
[[NSRunLoop mainRunLoop] addTimer: fTimer forMode: NSDefaultRunLoopMode];
[[NSRunLoop mainRunLoop] addTimer: fTimer forMode: NSModalPanelRunLoopMode];
[[NSRunLoop mainRunLoop] addTimer: fTimer forMode: NSEventTrackingRunLoopMode];
}
- (void) cancelSchedule
{
[fTimer invalidate];
fTimer = nil;
}
@end
@implementation BlocklistScheduler (Private)
- (void) runUpdater
{
fTimer = nil;
[BlocklistDownloader downloader];
}
@end

View File

@ -488,8 +488,8 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[self updateUI];
fTimer = [NSTimer scheduledTimerWithTimeInterval: UPDATE_UI_SECONDS target: self
selector: @selector(updateUI) userInfo: nil repeats: YES];
[[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSModalPanelRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSEventTrackingRunLoopMode];
[[NSRunLoop mainRunLoop] addTimer: fTimer forMode: NSModalPanelRunLoopMode];
[[NSRunLoop mainRunLoop] addTimer: fTimer forMode: NSEventTrackingRunLoopMode];
[self applyFilter: nil];
@ -2435,9 +2435,9 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
fSpeedLimitTimer = [[NSTimer alloc] initWithFireDate: dateToUse interval: 0 target: self selector: @selector(autoSpeedLimit:)
userInfo: [NSNumber numberWithBool: nextIsLimit] repeats: NO];
[[NSRunLoop currentRunLoop] addTimer: fSpeedLimitTimer forMode: NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer: fSpeedLimitTimer forMode: NSModalPanelRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer: fSpeedLimitTimer forMode: NSEventTrackingRunLoopMode];
[[NSRunLoop mainRunLoop] addTimer: fSpeedLimitTimer forMode: NSDefaultRunLoopMode];
[[NSRunLoop mainRunLoop] addTimer: fSpeedLimitTimer forMode: NSModalPanelRunLoopMode];
[[NSRunLoop mainRunLoop] addTimer: fSpeedLimitTimer forMode: NSEventTrackingRunLoopMode];
[fSpeedLimitTimer release];
}

View File

@ -16,6 +16,8 @@
<integer>51413</integer>
<key>Blocklist</key>
<false/>
<key>BlocklistAutoUpdate</key>
<false/>
<key>CheckDownload</key>
<false/>
<key>CheckQuit</key>

View File

@ -36,6 +36,8 @@ EXTRA_DIST = \
BlocklistDownloader.m \
BlocklistDownloaderViewController.h \
BlocklistDownloaderViewController.m \
BlocklistScheduler.h \
BlocklistScheduler.m \
ButtonToolbarItem.h \
ButtonToolbarItem.m \
ColorTextField.h \

View File

@ -82,6 +82,7 @@
- (void) setBlocklistEnabled: (id) sender;
- (void) updateBlocklist: (id) sender;
- (void) setBlocklistAutoUpdate: (id) sender;
- (void) updateBlocklistFields;
- (void) setBadge: (id) sender;

View File

@ -24,6 +24,7 @@
#import "PrefsController.h"
#import "BlocklistDownloaderViewController.h"
#import "BlocklistScheduler.h"
#import "NSApplicationAdditions.h"
#import "NSStringAdditions.h"
#import "UKKQueue.h"
@ -114,6 +115,9 @@ tr_handle * fHandle;
if ([fDefaults boolForKey: @"AutoImport"] && (autoPath = [fDefaults stringForKey: @"AutoImportDirectory"]))
[[UKKQueue sharedFileWatcher] addPath: [autoPath stringByExpandingTildeInPath]];
//set blocklist scheduler
[[BlocklistScheduler scheduler] updateSchedule];
//set encryption
[self setEncryptionMode: nil];
@ -451,6 +455,8 @@ tr_handle * fHandle;
BOOL enable = [sender state] == NSOnState;
[fDefaults setBool: enable forKey: @"Blocklist"];
tr_blocklistSetEnabled(fHandle, enable);
[[BlocklistScheduler scheduler] updateSchedule];
}
- (void) updateBlocklist: (id) sender
@ -458,6 +464,11 @@ tr_handle * fHandle;
[BlocklistDownloaderViewController downloadWithPrefsController: self];
}
- (void) setBlocklistAutoUpdate: (id) sender
{
[[BlocklistScheduler scheduler] updateSchedule];
}
- (void) updateBlocklistFields
{
BOOL exists = tr_blocklistExists(fHandle);

View File

@ -2123,7 +2123,7 @@ AAABAAAAAQ</bytes>
<object class="NSButton" id="130041388">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{151, 114}, {184, 18}}</string>
<string key="NSFrame">{{151, 134}, {184, 18}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="261591174">
@ -2145,7 +2145,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="531465471">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{54, 135}, {75, 17}}</string>
<string key="NSFrame">{{54, 155}, {75, 17}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="695755489">
@ -2161,7 +2161,7 @@ AAABAAAAAQ</bytes>
<object class="NSButton" id="142580376">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{132, 134}, {165, 18}}</string>
<string key="NSFrame">{{132, 154}, {165, 18}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="478851799">
@ -2183,7 +2183,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="1068385234">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{42, 238}, {87, 17}}</string>
<string key="NSFrame">{{42, 258}, {87, 17}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="759095525">
@ -2199,7 +2199,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="276894958">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{131, 238}, {196, 17}}</string>
<string key="NSFrame">{{131, 258}, {196, 17}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="195557530">
@ -2215,7 +2215,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="391991918">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{332, 236}, {50, 22}}</string>
<string key="NSFrame">{{332, 256}, {50, 22}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="425686317">
@ -2281,7 +2281,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="171936512">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{387, 238}, {39, 17}}</string>
<string key="NSFrame">{{387, 258}, {39, 17}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="120526424">
@ -2297,7 +2297,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="695790301">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{454, 212}, {39, 17}}</string>
<string key="NSFrame">{{454, 232}, {39, 17}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="454043587">
@ -2313,7 +2313,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="439211863">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{399, 210}, {50, 22}}</string>
<string key="NSFrame">{{399, 230}, {50, 22}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="963807331">
@ -2379,7 +2379,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="210126275">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{131, 212}, {263, 17}}</string>
<string key="NSFrame">{{131, 232}, {263, 17}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="250566813">
@ -2395,7 +2395,7 @@ AAABAAAAAQ</bytes>
<object class="NSButton" id="895326079">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{132, 170}, {280, 18}}</string>
<string key="NSFrame">{{132, 190}, {280, 18}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="985508058">
@ -2417,7 +2417,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="593278680">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{131, 192}, {259, 14}}</string>
<string key="NSFrame">{{131, 212}, {259, 14}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="32643885">
@ -2433,7 +2433,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="484538294">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{131, 34}, {362, 14}}</string>
<string key="NSFrame">{{131, 54}, {362, 14}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="520011795">
@ -2452,7 +2452,7 @@ AAABAAAAAQ</bytes>
<object class="NSButton" id="902371491">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{132, 78}, {289, 18}}</string>
<string key="NSFrame">{{132, 98}, {289, 18}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="245208224">
@ -2474,7 +2474,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="844132556">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{68, 79}, {61, 17}}</string>
<string key="NSFrame">{{68, 99}, {61, 17}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="188659193">
@ -2490,7 +2490,7 @@ AAABAAAAAQ</bytes>
<object class="NSTextField" id="326257173">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{212, 56}, {306, 17}}</string>
<string key="NSFrame">{{212, 76}, {306, 17}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="234963311">
@ -2506,7 +2506,7 @@ AAABAAAAAQ</bytes>
<object class="NSButton" id="826556979">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{128, 46}, {85, 32}}</string>
<string key="NSFrame">{{128, 66}, {85, 32}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="650733440">
@ -2546,14 +2546,36 @@ AAABAAAAAQ</bytes>
<int key="NSPeriodicInterval">25</int>
</object>
</object>
<object class="NSButton" id="1064247210">
<reference key="NSNextResponder" ref="538122014"/>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{151, 32}, {203, 18}}</string>
<reference key="NSSuperview" ref="538122014"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="46409197">
<int key="NSCellFlags">67239424</int>
<int key="NSCellFlags2">0</int>
<string key="NSContents">Automatically update weekly</string>
<reference key="NSSupport" ref="86725571"/>
<reference key="NSControlView" ref="1064247210"/>
<int key="NSButtonFlags">1211912703</int>
<int key="NSButtonFlags2">130</int>
<reference key="NSNormalImage" ref="1001726176"/>
<reference key="NSAlternateImage" ref="764913887"/>
<string key="NSAlternateContents"/>
<string key="NSKeyEquivalent"/>
<int key="NSPeriodicDelay">200</int>
<int key="NSPeriodicInterval">25</int>
</object>
</object>
</object>
<string key="NSFrameSize">{535, 278}</string>
<string key="NSFrameSize">{535, 298}</string>
<reference key="NSSuperview"/>
<string key="NSClassName">NSView</string>
<string key="NSExtension">NSResponder</string>
</object>
<object class="NSCustomView" id="204700639">
<reference key="NSNextResponder"/>
<nil key="NSNextResponder"/>
<int key="NSvFlags">256</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
@ -2562,7 +2584,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{497, 12}, {21, 23}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="893670578">
<int key="NSCellFlags">67239424</int>
@ -2586,7 +2607,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{42, 34}, {90, 17}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="514153614">
<int key="NSCellFlags">67239424</int>
@ -2603,7 +2623,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{135, 33}, {357, 18}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="127446013">
<int key="NSCellFlags">67239424</int>
@ -2627,7 +2646,6 @@ AAABAAAAAQ</bytes>
<object class="NSPSMatrix" key="NSDrawMatrix"/>
<string key="NSFrame">{{319, 279}, {16, 16}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<int key="NSpiFlags">28938</int>
<double key="NSMaxValue">1.000000e+02</double>
</object>
@ -2648,7 +2666,6 @@ AAABAAAAAQ</bytes>
</object>
<string key="NSFrame">{{320, 280}, {14, 14}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSImageCell" key="NSCell" id="270102740">
<int key="NSCellFlags">130560</int>
@ -2669,7 +2686,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{134, 279}, {124, 17}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="941628063">
<int key="NSCellFlags">67239424</int>
@ -2686,7 +2702,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{135, 255}, {171, 18}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="633401664">
<int key="NSCellFlags">67239424</int>
@ -2709,7 +2724,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{135, 200}, {271, 18}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="20752657">
<int key="NSCellFlags">67239424</int>
@ -2732,7 +2746,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{263, 277}, {50, 22}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="453443006">
<int key="NSCellFlags">-1804468671</int>
@ -2799,7 +2812,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{205, 145}, {50, 22}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1001442911">
<int key="NSCellFlags">-1804468671</int>
@ -2866,7 +2878,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{134, 239}, {238, 14}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="67017561">
<int key="NSCellFlags">67239424</int>
@ -2883,7 +2894,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{339, 279}, {179, 17}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="931894024">
<int key="NSCellFlags">67239424</int>
@ -2900,7 +2910,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{71, 280}, {61, 17}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="475516915">
<int key="NSCellFlags">67239424</int>
@ -2917,7 +2926,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{88, 201}, {44, 17}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="582281809">
<int key="NSCellFlags">67239424</int>
@ -2934,7 +2942,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{205, 171}, {259, 22}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="1051431853">
<int key="NSCellFlags">-1804468671</int>
@ -2952,7 +2959,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{176, 73}, {68, 17}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="954130018">
<int key="NSCellFlags">67239424</int>
@ -2969,7 +2975,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{173, 99}, {71, 17}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="108838744">
<int key="NSCellFlags">67239424</int>
@ -2986,7 +2991,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{153, 173}, {47, 17}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="677732006">
<int key="NSCellFlags">67239424</int>
@ -3003,7 +3007,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{166, 147}, {34, 17}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="63707525">
<int key="NSCellFlags">67239424</int>
@ -3020,7 +3023,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{266, 147}, {60, 17}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="502542662">
<int key="NSCellFlags">67239424</int>
@ -3037,7 +3039,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{154, 123}, {187, 18}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSButtonCell" key="NSCell" id="296153825">
<int key="NSCellFlags">67239424</int>
@ -3060,7 +3061,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{249, 71}, {184, 22}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSSecureTextFieldCell" key="NSCell" id="669471795">
<int key="NSCellFlags">343014976</int>
@ -3082,7 +3082,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{249, 97}, {184, 22}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSTextFieldCell" key="NSCell" id="731460553">
<int key="NSCellFlags">-1804468671</int>
@ -3100,7 +3099,6 @@ AAABAAAAAQ</bytes>
<int key="NSvFlags">256</int>
<string key="NSFrame">{{328, 141}, {99, 26}}</string>
<reference key="NSSuperview" ref="204700639"/>
<reference key="NSWindow"/>
<bool key="NSEnabled">YES</bool>
<object class="NSPopUpButtonCell" key="NSCell" id="326179066">
<int key="NSCellFlags">-2076049856</int>
@ -3163,8 +3161,6 @@ AAABAAAAAQ</bytes>
</object>
</object>
<string key="NSFrameSize">{535, 319}</string>
<reference key="NSSuperview"/>
<reference key="NSWindow"/>
<string key="NSClassName">NSView</string>
<string key="NSExtension">NSResponder</string>
</object>
@ -3537,6 +3533,7 @@ AAABAAAAAQ</bytes>
</object>
<string key="NSFrame">{{1, 17}, {331, 95}}</string>
<reference key="NSSuperview" ref="122119447"/>
<reference key="NSNextKeyView" ref="173651346"/>
<reference key="NSDocView" ref="173651346"/>
<reference key="NSBGColor" ref="729660797"/>
<int key="NScvFlags">4</int>
@ -3569,6 +3566,7 @@ AAABAAAAAQ</bytes>
</object>
<string key="NSFrame">{{1, 0}, {331, 17}}</string>
<reference key="NSSuperview" ref="122119447"/>
<reference key="NSNextKeyView" ref="520862816"/>
<reference key="NSDocView" ref="520862816"/>
<reference key="NSBGColor" ref="729660797"/>
<int key="NScvFlags">4</int>
@ -3577,6 +3575,7 @@ AAABAAAAAQ</bytes>
</object>
<string key="NSFrame">{{103, 63}, {348, 113}}</string>
<reference key="NSSuperview" ref="810116101"/>
<reference key="NSNextKeyView" ref="206862330"/>
<int key="NSsFlags">18</int>
<reference key="NSVScroller" ref="220703981"/>
<reference key="NSHScroller" ref="383062716"/>
@ -3703,6 +3702,11 @@ AAABAAAAAQ</bytes>
<string key="NSExtension">NSResponder</string>
</object>
<object class="NSUserDefaultsController" id="356871564">
<object class="NSMutableArray" key="NSDeclaredKeys">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>Blocklist</string>
<string>BlocklistAutoUpdate</string>
</object>
<bool key="NSSharedInstance">YES</bool>
</object>
</object>
@ -6528,6 +6532,46 @@ AAABAAAAAQ</bytes>
</object>
<int key="connectionID">1740</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">enabled: values.Blocklist</string>
<reference key="source" ref="1064247210"/>
<reference key="destination" ref="356871564"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="1064247210"/>
<reference key="NSDestination" ref="356871564"/>
<string key="NSLabel">enabled: values.Blocklist</string>
<string key="NSBinding">enabled</string>
<string key="NSKeyPath">values.Blocklist</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">1743</int>
</object>
<object class="IBConnectionRecord">
<object class="IBBindingConnection" key="connection">
<string key="label">value: values.BlocklistAutoUpdate</string>
<reference key="source" ref="1064247210"/>
<reference key="destination" ref="356871564"/>
<object class="NSNibBindingConnector" key="connector">
<reference key="NSSource" ref="1064247210"/>
<reference key="NSDestination" ref="356871564"/>
<string key="NSLabel">value: values.BlocklistAutoUpdate</string>
<string key="NSBinding">value</string>
<string key="NSKeyPath">values.BlocklistAutoUpdate</string>
<int key="NSNibBindingConnectorVersion">2</int>
</object>
</object>
<int key="connectionID">1744</int>
</object>
<object class="IBConnectionRecord">
<object class="IBActionConnection" key="connection">
<string key="label">setBlocklistAutoUpdate:</string>
<reference key="source" ref="511492310"/>
<reference key="destination" ref="1064247210"/>
</object>
<int key="connectionID">1745</int>
</object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@ -7908,6 +7952,7 @@ AAABAAAAAQ</bytes>
<reference ref="826556979"/>
<reference ref="117148406"/>
<reference ref="484538294"/>
<reference ref="1064247210"/>
</object>
<reference key="parent" ref="37013934"/>
<string key="objectName">Peers</string>
@ -8889,6 +8934,20 @@ AAABAAAAAQ</bytes>
<reference key="object" ref="520011795"/>
<reference key="parent" ref="484538294"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1741</int>
<reference key="object" ref="1064247210"/>
<object class="NSMutableArray" key="children">
<bool key="EncodedWithXMLCoder">YES</bool>
<reference ref="46409197"/>
</object>
<reference key="parent" ref="538122014"/>
</object>
<object class="IBObjectRecord">
<int key="objectID">1742</int>
<reference key="object" ref="46409197"/>
<reference key="parent" ref="1064247210"/>
</object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@ -9091,6 +9150,8 @@ AAABAAAAAQ</bytes>
<string>1733.ImportedFromIB2</string>
<string>1738.IBPluginDependency</string>
<string>1738.ImportedFromIB2</string>
<string>1741.IBPluginDependency</string>
<string>1742.IBPluginDependency</string>
<string>190.IBPluginDependency</string>
<string>190.ImportedFromIB2</string>
<string>192.IBPluginDependency</string>
@ -9329,7 +9390,7 @@ AAABAAAAAQ</bytes>
<reference ref="761722050"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<reference ref="761722050"/>
<string>{{38, 470}, {535, 278}}</string>
<string>{{38, 470}, {535, 298}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<reference ref="761722050"/>
<string>{{281, 577}, {539, 315}}</string>
@ -9489,7 +9550,9 @@ AAABAAAAAQ</bytes>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<reference ref="761722050"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<real value="1.000000e+00"/>
<reference ref="761722050"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<reference ref="761722050"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
@ -9567,7 +9630,7 @@ AAABAAAAAQ</bytes>
<reference ref="761722050"/>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<reference ref="761722050"/>
<string>{{55, 399}, {535, 272}}</string>
<string>{{24, 399}, {535, 272}}</string>
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
<reference ref="761722050"/>
<string>{{0, 701}, {539, 272}}</string>
@ -9719,7 +9782,7 @@ AAABAAAAAQ</bytes>
</object>
</object>
<nil key="sourceID"/>
<int key="maxID">1740</int>
<int key="maxID">1745</int>
</object>
<object class="IBClassDescriber" key="IBDocument.Classes">
<object class="NSMutableArray" key="referencedPartialClassDescriptions">
@ -9828,6 +9891,7 @@ AAABAAAAAQ</bytes>
<string>setAutoSize:</string>
<string>setAutoSpeedLimit:</string>
<string>setBadge:</string>
<string>setBlocklistAutoUpdate:</string>
<string>setBlocklistEnabled:</string>
<string>setDownloadLocation:</string>
<string>setEncryptionMode:</string>
@ -9904,6 +9968,7 @@ AAABAAAAAQ</bytes>
<string>id</string>
<string>id</string>
<string>id</string>
<string>id</string>
</object>
</object>
<object class="NSMutableDictionary" key="outlets">