Full Code of opendns/dnscrypt-osx-client for AI

master 6c08e50dd2b6 cached
99 files
281.1 KB
85.6k tokens
13 symbols
1 requests
Download .txt
Showing preview only (310K chars total). Download the full file or copy to clipboard to get everything.
Repository: opendns/dnscrypt-osx-client
Branch: master
Commit: 6c08e50dd2b6
Files: 99
Total size: 281.1 KB

Directory structure:
gitextract_t1_psfpw/

├── DNSCrypt-Menubar/
│   ├── COPYING
│   ├── DNSCrypt-Menubar/
│   │   ├── AppDelegate.h
│   │   ├── AppDelegate.m
│   │   ├── DNSCrypt-Menubar-Info.plist
│   │   ├── DNSCrypt-Menubar-Prefix.pch
│   │   ├── en.lproj/
│   │   │   ├── InfoPlist.strings
│   │   │   └── MainMenu.xib
│   │   └── main.m
│   ├── DNSCrypt-Menubar.xcodeproj/
│   │   ├── project.pbxproj
│   │   └── project.xcworkspace/
│   │       └── contents.xcworkspacedata
│   └── dnscrypt.icns
├── DNSCrypt-Meta-Installer/
│   ├── DNSCrypt-Meta-Installer.pkgproj
│   └── install.sh
├── DNSCrypt-OSX-Installer/
│   ├── DNSCrypt-OSX-Installer.pkgproj
│   ├── Scripts/
│   │   ├── dnscrypt-menubar-postinstall.sh
│   │   ├── dnscrypt-menubar-preinstall.sh
│   │   ├── dnscrypt-prefpane-postinstall.sh
│   │   └── dnscrypt-prefpane-preinstall.sh
│   ├── com.github.dnscrypt-osxclient.DNSCryptAfterboot.plist
│   ├── com.github.dnscrypt-osxclient.DNSCryptConsoleChange.plist
│   ├── com.github.dnscrypt-osxclient.DNSCryptControlChange.plist
│   ├── com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist
│   ├── com.github.dnscrypt-osxclient.DNSCryptNetworkChange.plist
│   └── sign.sh
├── DNSCrypt-Preference-Pane/
│   ├── COPYING
│   ├── DNSCrypt/
│   │   ├── CHCSVParser/
│   │   │   ├── CHCSVParser.h
│   │   │   └── CHCSVParser.m
│   │   ├── DNSCrypt-Info.plist
│   │   ├── DNSCrypt-Prefix.pch
│   │   ├── DNSCrypt.h
│   │   ├── DNSCrypt.m
│   │   ├── DNSCrypt.tiff
│   │   ├── en.lproj/
│   │   │   ├── DNSCrypt.xib
│   │   │   └── InfoPlist.strings
│   │   └── extra/
│   │       ├── html/
│   │       │   ├── about.haml
│   │       │   ├── about.html
│   │       │   ├── help.haml
│   │       │   ├── help.html
│   │       │   ├── releasenotes.haml
│   │       │   └── releasenotes.html
│   │       └── usr/
│   │           ├── bin/
│   │           │   └── Uninstall.app/
│   │           │       └── Contents/
│   │           │           ├── Info.plist
│   │           │           ├── MacOS/
│   │           │           │   └── applet
│   │           │           ├── PkgInfo
│   │           │           └── Resources/
│   │           │               ├── Scripts/
│   │           │               │   └── main.scpt
│   │           │               ├── applet.icns
│   │           │               ├── applet.rsrc
│   │           │               └── description.rtfd/
│   │           │                   └── TXT.rtf
│   │           └── scripts/
│   │               ├── afterboot.sh
│   │               ├── check-hijacking.sh
│   │               ├── check-local-dns.sh
│   │               ├── check-network-change.sh
│   │               ├── clear-fw.sh
│   │               ├── common.inc
│   │               ├── create-ticket.sh
│   │               ├── exceptions-add.sh
│   │               ├── exceptions-remove.sh
│   │               ├── get-current-default-domain.sh
│   │               ├── get-current-resolvers.sh
│   │               ├── get-dhcp-resolvers.sh
│   │               ├── get-dnscrypt-resolver-name.sh
│   │               ├── get-dnscrypt-status.sh
│   │               ├── get-fallback-status.sh
│   │               ├── get-query-logging-status.sh
│   │               ├── get-resolvers-description.sh
│   │               ├── get-static-resolvers.sh
│   │               ├── get-tickets-count.sh
│   │               ├── get-upstream-resolvers.sh
│   │               ├── gui-pop-conf-change.sh
│   │               ├── gui-push-conf-change.sh
│   │               ├── handle-console-change.sh
│   │               ├── handle-control-change.sh
│   │               ├── handle-network-change.sh
│   │               ├── set-dns-to-dhcp.sh
│   │               ├── set-dns.sh
│   │               ├── set-dnscrypt-resolver-name.sh
│   │               ├── set-static-resolvers.sh
│   │               ├── start-dnscrypt-proxy.sh
│   │               ├── stop-dnscrypt-proxy.sh
│   │               ├── switch-blacklists-off.sh
│   │               ├── switch-blacklists-on.sh
│   │               ├── switch-fallback-off.sh
│   │               ├── switch-fallback-on.sh
│   │               ├── switch-query-logging-off.sh
│   │               ├── switch-query-logging-on.sh
│   │               ├── switch-to-dhcp-if-required.sh
│   │               ├── switch-to-dhcp.sh
│   │               ├── switch-to-dnscrypt-if-required.sh
│   │               ├── switch-to-dnscrypt.sh
│   │               ├── update-blacklist-domains.sh
│   │               ├── update-blacklist-ips.sh
│   │               └── update-exceptions.sh
│   └── DNSCrypt.xcodeproj/
│       ├── project.pbxproj
│       └── project.xcworkspace/
│           └── contents.xcworkspacedata
├── DNSCrypt-Uninstaller/
│   └── Uninstall.scpt
├── Pages/
│   ├── feedback.haml
│   ├── feedback.php
│   ├── feedback.tpl
│   └── sent.haml
└── README.markdown

================================================
FILE CONTENTS
================================================

================================================
FILE: DNSCrypt-Menubar/COPYING
================================================
/*
 * Copyright (c) 2011-2014 OpenDNS, Inc.
 * Copyright (c) 2014 AlterStep
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */


================================================
FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/AppDelegate.h
================================================

#import <Cocoa/Cocoa.h>

#define kDNSCRYPT_PREFPANE_APP_PATH @"/Library/PreferencePanes/DNSCrypt.prefPane"
#define kDNSCRYPT_USR_BASE_DIR kDNSCRYPT_PREFPANE_APP_PATH @"/Contents/Resources/usr"
#define kDNSCRIPT_SCRIPTS_BASE_DIR kDNSCRYPT_USR_BASE_DIR @"/scripts"
#define kDNSCRYPT_VAR_BASE_DIR @"/Library/Application Support/DNSCrypt"
#define kDNSCRYPT_CONTROL_DIR kDNSCRYPT_VAR_BASE_DIR @"/control"

@interface AppDelegate : NSObject <NSApplicationDelegate> {
    NSWindow *_window;
    NSMenu *_dnscryptMenu;
    NSStatusItem *_statusItem;
    NSMenuItem *_versionMenuItem;
    NSMenuItem *_statusResolversMenuItem;
    NSMenuItem *_dnscryptMenuItem;
}

#define kREFRESH_DELAY 2.0
#define kCHECKBOXES_AFTER_CHANGE_DELAY 8.0
#define kMAX_TRIES_AFTER_CHANGE (30 / kREFRESH_DELAY)

typedef enum {
    kDNS_CONFIGURATION_UNKNOWN, kDNS_CONFIGURATION_VANILLA, kDNS_CONFIGURATION_LOCALHOST
} DNSConfigurationState;

@property (strong) NSStatusItem *statusItem;
@property (assign) NSWindow *window;

@property (strong) IBOutlet NSMenu *dnscryptMenu;
@property (strong) IBOutlet NSMenuItem *versionMenuItem;
@property (strong) IBOutlet NSMenuItem *statusResolversMenuItem;
@property (strong) IBOutlet NSMenuItem *dnscryptMenuItem;

- (IBAction)preferencesMenuItemPushed:(NSMenuItem *)sender;
- (IBAction)dnscryptMenuItemPushed:(NSMenuItem *)sender;

@end


================================================
FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/AppDelegate.m
================================================

#import "AppDelegate.h"

@implementation AppDelegate
@synthesize statusResolversMenuItem = _statusResolversMenuItem;
@synthesize dnscryptMenuItem = _dnscryptMenuItem;
@synthesize window = _window;
@synthesize dnscryptMenu = _dnscryptMenu;
@synthesize statusItem = _statusItem;
@synthesize versionMenuItem = _versionMenuItem;

DNSConfigurationState currentState = kDNS_CONFIGURATION_UNKNOWN;

- (void) setCheckBoxesEnabled: (BOOL) enabled
{
    [_dnscryptMenuItem setEnabled: enabled];
}

- (NSString *) fromCommand: (NSString *) launchPath withArguments: (NSArray *) arguments
{
    NSPipe *pipe = [NSPipe pipe];
    NSTask *task = [[NSTask alloc] init];
    NSData *data;
    NSString *result;
    task.launchPath = launchPath;
    task.arguments = arguments;
    task.standardOutput = pipe;
    [task launch];
    data = [[pipe fileHandleForReading] readDataToEndOfFile];
    [task waitUntilExit];
    [task release];
    result = [[[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding] autorelease];
    if ([result hasSuffix: @"\n"]) {
        result = [result substringToIndex: result.length - 1];
    }
    return result;
}

- (void) initState
{
    NSString *res;

    _dnscryptMenuItem.state = 0;

    res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-dnscrypt-status.sh", nil]];
    if ([res isEqualToString: @"yes"]) {
        [_dnscryptMenuItem setState: 1];
    }
}

- (BOOL) resolversForService: (NSArray *) resolversForService includeResolvers:(NSArray *) resolvers
{
    NSUInteger matches = 0U;
    
    for (NSString *resolverForService in resolversForService) {
        if ([resolvers containsObject: resolverForService]) {
            matches++;
        } else {
            break;
        }
    }
    if (matches >= resolvers.count) {
        return TRUE;
    }
    return FALSE;
}

- (void) updateLedStatus
{
    NSImage *led = nil;
    
    switch (currentState) {
        case kDNS_CONFIGURATION_LOCALHOST:
            led = [NSImage imageNamed: @"icon-dnscrypt-active"];
            break;
        case kDNS_CONFIGURATION_VANILLA:
            led = [NSImage imageNamed: @"icon-dnscrypt-inactive"];
            break;
        default:
            led = [NSImage imageNamed: @"icon-no-network"];
    }
    _statusItem.image = led;
}

- (BOOL) updateStatusWithCurrentConfig
{
    NSString *stateDescription = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./get-current-resolvers.sh | ./get-resolvers-description.sh", nil]];
    if ([stateDescription isEqualToString: @"DNSCrypt"]) {
        currentState = kDNS_CONFIGURATION_LOCALHOST;
    } else if ([stateDescription isEqualToString: @"None"]) {
        currentState = kDNS_CONFIGURATION_UNKNOWN;
    } else if ([stateDescription isEqualToString: @"Updating"]) {
        currentState = kDNS_CONFIGURATION_UNKNOWN;
    } else if (stateDescription.length > 0) {
        currentState = kDNS_CONFIGURATION_VANILLA;
    }
    [self updateLedStatus];
    
    NSString *currentResolvers = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./get-current-resolvers.sh | ./get-upstream-resolvers.sh", nil]];
    _statusResolversMenuItem.title = currentResolvers;
    
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./gui-pop-conf-change.sh menubar", nil]];
    if ([res isEqualToString: @"yes"]) {
        [self initState];
    }
    [self setCheckBoxesEnabled: TRUE];
    
    return TRUE;
}

- (void) periodicallyUpdateStatusWithCurrentConfig {
    [self updateStatusWithCurrentConfig];
    [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(periodicallyUpdateStatusWithCurrentConfig) object: nil];
    [self performSelector: @selector(periodicallyUpdateStatusWithCurrentConfig) withObject:nil afterDelay: 5.0];
}

- (void) waitForUpdate {
    NSString *res;
    static unsigned int tries;
    
    res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-tickets-count.sh", nil]];
    if (res.length <= 0 || [res isEqualToString: @"0"] || tries > kMAX_TRIES_AFTER_CHANGE) {
        tries = 0U;
        [self periodicallyUpdateStatusWithCurrentConfig];
        return;
    }
    tries++;
    [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(waitForUpdate) object: nil];
    [self performSelector: @selector(waitForUpdate) withObject: self afterDelay:kREFRESH_DELAY];
}

- (void) showSpinners
{
    [self setCheckBoxesEnabled: FALSE];

    NSImage *led = [NSImage imageNamed: @"icon-no-network"];
    _statusItem.image = led;
    
    [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./gui-push-conf-change.sh prefpane", nil]];
    
    [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(periodicallyUpdateStatusWithCurrentConfig) object: nil];
    [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(waitForUpdate) object: nil];
    [self performSelector: @selector(waitForUpdate) withObject: self afterDelay:kREFRESH_DELAY];
}

- (void) awakeFromNib
{
    _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [_statusItem retain];
    _statusItem.highlightMode = TRUE;
    _statusItem.toolTip = @"DNSCrypt";
    _statusItem.menu = _dnscryptMenu;
        
    NSString *versionStringFormat = NSLocalizedString(@"Client UI version: %@", @"Current UI version as shown in the menu");
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    _versionMenuItem.title = [NSString stringWithFormat: versionStringFormat, version];
    
    [self initState];
    
    [self periodicallyUpdateStatusWithCurrentConfig];
    [self updateLedStatus];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
}

- (IBAction)preferencesMenuItemPushed:(NSMenuItem *)sender
{
    NSString *userPreferencePanePath = [NSString stringWithFormat: @"%@" kDNSCRYPT_PREFPANE_APP_PATH, NSHomeDirectory()];
    NSArray *preferencePanePaths = [NSArray arrayWithObjects: userPreferencePanePath, kDNSCRYPT_PREFPANE_APP_PATH, nil];
    for (NSString *preferencePanePath in preferencePanePaths) {
        if ([[NSFileManager defaultManager] fileExistsAtPath: preferencePanePath]) {
            [[NSWorkspace sharedWorkspace] openFile: preferencePanePath];
            return;
        }
    }
}

- (BOOL) setDNSCryptOn {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-to-dnscrypt.sh", nil]];
    (void) res;
    return TRUE;
}

- (BOOL) setDNSCryptOff {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-to-dhcp.sh", nil]];
    (void) res;
    return TRUE;
}


- (IBAction)dnscryptMenuItemPushed:(NSMenuItem *)sender
{
    if (sender.state == 0) {
        sender.state = 1;
        [self setDNSCryptOn];
    } else {
        sender.state = 0;
        [self setDNSCryptOff];
    }
}

@end


================================================
FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/DNSCrypt-Menubar-Info.plist
================================================
<?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>CFBundleDevelopmentRegion</key>
	<string>en</string>
	<key>CFBundleExecutable</key>
	<string>${EXECUTABLE_NAME}</string>
	<key>CFBundleIconFile</key>
	<string>dnscrypt.icns</string>
	<key>CFBundleIdentifier</key>
	<string>com.github.dnscrypt-osxclient.${PRODUCT_NAME:rfc1034identifier}</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>DNSCrypt</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0.4</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>1.0.4</string>
	<key>LSApplicationCategoryType</key>
	<string>public.app-category.utilities</string>
	<key>LSMinimumSystemVersion</key>
	<string>${MACOSX_DEPLOYMENT_TARGET}</string>
	<key>LSUIElement</key>
	<true/>
	<key>NSHumanReadableCopyright</key>
	<string>BSD</string>
	<key>NSMainNibFile</key>
	<string>MainMenu</string>
	<key>NSPrincipalClass</key>
	<string>NSApplication</string>
</dict>
</plist>


================================================
FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/DNSCrypt-Menubar-Prefix.pch
================================================
//
// Prefix header for all source files of the 'DNSCrypt-Menubar' target in the 'DNSCrypt-Menubar' project
//

#ifdef __OBJC__
    #import <Cocoa/Cocoa.h>
#endif


================================================
FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/en.lproj/InfoPlist.strings
================================================
/* Localized versions of Info.plist keys */



================================================
FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/en.lproj/MainMenu.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13D45a" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
    <dependencies>
        <deployment defaultVersion="1060" identifier="macosx"/>
        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
    </dependencies>
    <objects>
        <customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
            <connections>
                <outlet property="delegate" destination="494" id="495"/>
            </connections>
        </customObject>
        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
        <customObject id="-3" userLabel="Application"/>
        <customObject id="494" customClass="AppDelegate">
            <connections>
                <outlet property="dnscryptMenu" destination="539" id="543"/>
                <outlet property="dnscryptMenuItem" destination="542" id="578"/>
                <outlet property="statusResolversMenuItem" destination="550" id="552"/>
                <outlet property="versionMenuItem" destination="565" id="568"/>
            </connections>
        </customObject>
        <menu id="539">
            <items>
                <menuItem title="Enable DNSCrypt" keyEquivalent="e" id="542">
                    <connections>
                        <action selector="dnscryptMenuItemPushed:" target="494" id="580"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="576"/>
                <menuItem title="DNSCrypt-OSXClient Preferences" keyEquivalent="," id="570">
                    <connections>
                        <action selector="preferencesMenuItemPushed:" target="494" id="571"/>
                    </connections>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="564"/>
                <menuItem enabled="NO" id="565">
                    <modifierMask key="keyEquivalentModifierMask"/>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="553"/>
                <menuItem title="Current resolvers:" enabled="NO" id="549">
                    <modifierMask key="keyEquivalentModifierMask"/>
                </menuItem>
                <menuItem title="..." enabled="NO" indentationLevel="1" id="550">
                    <modifierMask key="keyEquivalentModifierMask"/>
                </menuItem>
                <menuItem isSeparatorItem="YES" id="554"/>
                <menuItem title="Hide from the menu bar" keyEquivalent="h" id="558">
                    <connections>
                        <action selector="terminate:" target="-1" id="560"/>
                    </connections>
                </menuItem>
            </items>
        </menu>
    </objects>
</document>


================================================
FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/main.m
================================================

#import <Cocoa/Cocoa.h>

int main(int argc, char *argv[])
{
    nice(10);
    return NSApplicationMain(argc, (const char **)argv);
}


================================================
FILE: DNSCrypt-Menubar/DNSCrypt-Menubar.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
	archiveVersion = 1;
	classes = {
	};
	objectVersion = 46;
	objects = {

/* Begin PBXBuildFile section */
		09651148147D832D007FEE31 /* dnscrypt.icns in Resources */ = {isa = PBXBuildFile; fileRef = 09651147147D832D007FEE31 /* dnscrypt.icns */; };
		098E725E1905DF4C00C8CC6E /* icon-dnscrypt-active.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E72581905DF4C00C8CC6E /* icon-dnscrypt-active.png */; };
		098E72601905DF4C00C8CC6E /* icon-dnscrypt-inactive.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E725A1905DF4C00C8CC6E /* icon-dnscrypt-inactive.png */; };
		098E72621905DF4C00C8CC6E /* icon-no-network.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E725C1905DF4C00C8CC6E /* icon-no-network.png */; };
		098E72671905E1A700C8CC6E /* icon-dnscrypt-active@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E72641905E1A700C8CC6E /* icon-dnscrypt-active@2x.png */; };
		098E72681905E1A700C8CC6E /* icon-dnscrypt-inactive@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E72651905E1A700C8CC6E /* icon-dnscrypt-inactive@2x.png */; };
		098E72691905E1A700C8CC6E /* icon-no-network@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 098E72661905E1A700C8CC6E /* icon-no-network@2x.png */; };
		09A13AD2145F3B9000B227A4 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 09A13AD1145F3B9000B227A4 /* Cocoa.framework */; };
		09A13ADC145F3B9000B227A4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 09A13ADA145F3B9000B227A4 /* InfoPlist.strings */; };
		09A13ADE145F3B9000B227A4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 09A13ADD145F3B9000B227A4 /* main.m */; };
		09A13AE5145F3B9000B227A4 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 09A13AE4145F3B9000B227A4 /* AppDelegate.m */; };
		09A13AE8145F3B9000B227A4 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 09A13AE6145F3B9000B227A4 /* MainMenu.xib */; };
/* End PBXBuildFile section */

/* Begin PBXCopyFilesBuildPhase section */
		0970EAA9160A5B0000865D5D /* CopyFiles */ = {
			isa = PBXCopyFilesBuildPhase;
			buildActionMask = 2147483647;
			dstPath = "";
			dstSubfolderSpec = 10;
			files = (
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
		09651147147D832D007FEE31 /* dnscrypt.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = dnscrypt.icns; path = ../dnscrypt.icns; sourceTree = "<group>"; };
		098E72581905DF4C00C8CC6E /* icon-dnscrypt-active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-dnscrypt-active.png"; sourceTree = "<group>"; };
		098E725A1905DF4C00C8CC6E /* icon-dnscrypt-inactive.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-dnscrypt-inactive.png"; sourceTree = "<group>"; };
		098E725C1905DF4C00C8CC6E /* icon-no-network.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-no-network.png"; sourceTree = "<group>"; };
		098E72641905E1A700C8CC6E /* icon-dnscrypt-active@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-dnscrypt-active@2x.png"; sourceTree = "<group>"; };
		098E72651905E1A700C8CC6E /* icon-dnscrypt-inactive@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-dnscrypt-inactive@2x.png"; sourceTree = "<group>"; };
		098E72661905E1A700C8CC6E /* icon-no-network@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon-no-network@2x.png"; sourceTree = "<group>"; };
		09A13ACD145F3B9000B227A4 /* DNSCrypt Menubar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DNSCrypt Menubar.app"; sourceTree = BUILT_PRODUCTS_DIR; };
		09A13AD1145F3B9000B227A4 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
		09A13AD4145F3B9000B227A4 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
		09A13AD5145F3B9000B227A4 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
		09A13AD6145F3B9000B227A4 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
		09A13AD9145F3B9000B227A4 /* DNSCrypt-Menubar-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "DNSCrypt-Menubar-Info.plist"; sourceTree = "<group>"; };
		09A13ADB145F3B9000B227A4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
		09A13ADD145F3B9000B227A4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
		09A13ADF145F3B9000B227A4 /* DNSCrypt-Menubar-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DNSCrypt-Menubar-Prefix.pch"; sourceTree = "<group>"; };
		09A13AE3145F3B9000B227A4 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
		09A13AE4145F3B9000B227A4 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
		09A13AE7145F3B9000B227A4 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
		09A13ACA145F3B9000B227A4 /* Frameworks */ = {
			isa = PBXFrameworksBuildPhase;
			buildActionMask = 2147483647;
			files = (
				09A13AD2145F3B9000B227A4 /* Cocoa.framework in Frameworks */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXFrameworksBuildPhase section */

/* Begin PBXGroup section */
		09A13AC2145F3B9000B227A4 = {
			isa = PBXGroup;
			children = (
				09A13AD7145F3B9000B227A4 /* DNSCrypt-Menubar */,
				09A13AD0145F3B9000B227A4 /* Frameworks */,
				09A13ACE145F3B9000B227A4 /* Products */,
			);
			sourceTree = "<group>";
		};
		09A13ACE145F3B9000B227A4 /* Products */ = {
			isa = PBXGroup;
			children = (
				09A13ACD145F3B9000B227A4 /* DNSCrypt Menubar.app */,
			);
			name = Products;
			sourceTree = "<group>";
		};
		09A13AD0145F3B9000B227A4 /* Frameworks */ = {
			isa = PBXGroup;
			children = (
				09A13AD1145F3B9000B227A4 /* Cocoa.framework */,
				09A13AD3145F3B9000B227A4 /* Other Frameworks */,
			);
			name = Frameworks;
			sourceTree = "<group>";
		};
		09A13AD3145F3B9000B227A4 /* Other Frameworks */ = {
			isa = PBXGroup;
			children = (
				09A13AD4145F3B9000B227A4 /* AppKit.framework */,
				09A13AD5145F3B9000B227A4 /* CoreData.framework */,
				09A13AD6145F3B9000B227A4 /* Foundation.framework */,
			);
			name = "Other Frameworks";
			sourceTree = "<group>";
		};
		09A13AD7145F3B9000B227A4 /* DNSCrypt-Menubar */ = {
			isa = PBXGroup;
			children = (
				09A13AE3145F3B9000B227A4 /* AppDelegate.h */,
				09A13AE4145F3B9000B227A4 /* AppDelegate.m */,
				09A13AE6145F3B9000B227A4 /* MainMenu.xib */,
				09A13AD8145F3B9000B227A4 /* Supporting Files */,
			);
			path = "DNSCrypt-Menubar";
			sourceTree = "<group>";
		};
		09A13AD8145F3B9000B227A4 /* Supporting Files */ = {
			isa = PBXGroup;
			children = (
				09651147147D832D007FEE31 /* dnscrypt.icns */,
				09A13AD9145F3B9000B227A4 /* DNSCrypt-Menubar-Info.plist */,
				09A13ADA145F3B9000B227A4 /* InfoPlist.strings */,
				09A13ADD145F3B9000B227A4 /* main.m */,
				09A13ADF145F3B9000B227A4 /* DNSCrypt-Menubar-Prefix.pch */,
				098E72581905DF4C00C8CC6E /* icon-dnscrypt-active.png */,
				098E725A1905DF4C00C8CC6E /* icon-dnscrypt-inactive.png */,
				098E725C1905DF4C00C8CC6E /* icon-no-network.png */,
				098E72641905E1A700C8CC6E /* icon-dnscrypt-active@2x.png */,
				098E72651905E1A700C8CC6E /* icon-dnscrypt-inactive@2x.png */,
				098E72661905E1A700C8CC6E /* icon-no-network@2x.png */,
			);
			name = "Supporting Files";
			sourceTree = "<group>";
		};
/* End PBXGroup section */

/* Begin PBXNativeTarget section */
		09A13ACC145F3B9000B227A4 /* DNSCrypt-Menubar */ = {
			isa = PBXNativeTarget;
			buildConfigurationList = 09A13AEB145F3B9000B227A4 /* Build configuration list for PBXNativeTarget "DNSCrypt-Menubar" */;
			buildPhases = (
				09A13AC9145F3B9000B227A4 /* Sources */,
				09A13ACA145F3B9000B227A4 /* Frameworks */,
				09A13ACB145F3B9000B227A4 /* Resources */,
				0970EAA9160A5B0000865D5D /* CopyFiles */,
			);
			buildRules = (
			);
			dependencies = (
			);
			name = "DNSCrypt-Menubar";
			productName = "DNSCrypt-Menubar";
			productReference = 09A13ACD145F3B9000B227A4 /* DNSCrypt Menubar.app */;
			productType = "com.apple.product-type.application";
		};
/* End PBXNativeTarget section */

/* Begin PBXProject section */
		09A13AC4145F3B9000B227A4 /* Project object */ = {
			isa = PBXProject;
			attributes = {
				LastUpgradeCheck = 0510;
			};
			buildConfigurationList = 09A13AC7145F3B9000B227A4 /* Build configuration list for PBXProject "DNSCrypt-Menubar" */;
			compatibilityVersion = "Xcode 3.2";
			developmentRegion = English;
			hasScannedForEncodings = 0;
			knownRegions = (
				en,
			);
			mainGroup = 09A13AC2145F3B9000B227A4;
			productRefGroup = 09A13ACE145F3B9000B227A4 /* Products */;
			projectDirPath = "";
			projectRoot = "";
			targets = (
				09A13ACC145F3B9000B227A4 /* DNSCrypt-Menubar */,
			);
		};
/* End PBXProject section */

/* Begin PBXResourcesBuildPhase section */
		09A13ACB145F3B9000B227A4 /* Resources */ = {
			isa = PBXResourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				098E72681905E1A700C8CC6E /* icon-dnscrypt-inactive@2x.png in Resources */,
				09A13ADC145F3B9000B227A4 /* InfoPlist.strings in Resources */,
				098E725E1905DF4C00C8CC6E /* icon-dnscrypt-active.png in Resources */,
				09A13AE8145F3B9000B227A4 /* MainMenu.xib in Resources */,
				098E72691905E1A700C8CC6E /* icon-no-network@2x.png in Resources */,
				098E72601905DF4C00C8CC6E /* icon-dnscrypt-inactive.png in Resources */,
				098E72621905DF4C00C8CC6E /* icon-no-network.png in Resources */,
				098E72671905E1A700C8CC6E /* icon-dnscrypt-active@2x.png in Resources */,
				09651148147D832D007FEE31 /* dnscrypt.icns in Resources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXResourcesBuildPhase section */

/* Begin PBXSourcesBuildPhase section */
		09A13AC9145F3B9000B227A4 /* Sources */ = {
			isa = PBXSourcesBuildPhase;
			buildActionMask = 2147483647;
			files = (
				09A13ADE145F3B9000B227A4 /* main.m in Sources */,
				09A13AE5145F3B9000B227A4 /* AppDelegate.m in Sources */,
			);
			runOnlyForDeploymentPostprocessing = 0;
		};
/* End PBXSourcesBuildPhase section */

/* Begin PBXVariantGroup section */
		09A13ADA145F3B9000B227A4 /* InfoPlist.strings */ = {
			isa = PBXVariantGroup;
			children = (
				09A13ADB145F3B9000B227A4 /* en */,
			);
			name = InfoPlist.strings;
			sourceTree = "<group>";
		};
		09A13AE6145F3B9000B227A4 /* MainMenu.xib */ = {
			isa = PBXVariantGroup;
			children = (
				09A13AE7145F3B9000B227A4 /* en */,
			);
			name = MainMenu.xib;
			sourceTree = "<group>";
		};
/* End PBXVariantGroup section */

/* Begin XCBuildConfiguration section */
		09A13AE9145F3B9000B227A4 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
				CLANG_ENABLE_OBJC_ARC = NO;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COPY_PHASE_STRIP = NO;
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_DYNAMIC_NO_PIC = NO;
				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
				GCC_OPTIMIZATION_LEVEL = 0;
				GCC_PREPROCESSOR_DEFINITIONS = (
					"DEBUG=1",
					"$(inherited)",
				);
				GCC_SYMBOLS_PRIVATE_EXTERN = NO;
				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				MACOSX_DEPLOYMENT_TARGET = 10.6;
				ONLY_ACTIVE_ARCH = YES;
				SDKROOT = macosx;
			};
			name = Debug;
		};
		09A13AEA145F3B9000B227A4 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				ALWAYS_SEARCH_USER_PATHS = NO;
				ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
				CLANG_ENABLE_OBJC_ARC = NO;
				CLANG_WARN_BOOL_CONVERSION = YES;
				CLANG_WARN_CONSTANT_CONVERSION = YES;
				CLANG_WARN_EMPTY_BODY = YES;
				CLANG_WARN_ENUM_CONVERSION = YES;
				CLANG_WARN_INT_CONVERSION = YES;
				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
				COPY_PHASE_STRIP = NO;
				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
				GCC_C_LANGUAGE_STANDARD = gnu99;
				GCC_ENABLE_OBJC_EXCEPTIONS = YES;
				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
				GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
				GCC_WARN_ABOUT_RETURN_TYPE = YES;
				GCC_WARN_UNDECLARED_SELECTOR = YES;
				GCC_WARN_UNINITIALIZED_AUTOS = YES;
				GCC_WARN_UNUSED_FUNCTION = YES;
				GCC_WARN_UNUSED_VARIABLE = YES;
				MACOSX_DEPLOYMENT_TARGET = 10.6;
				SDKROOT = macosx;
			};
			name = Release;
		};
		09A13AEC145F3B9000B227A4 /* Debug */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				COMBINE_HIDPI_IMAGES = YES;
				FRAMEWORK_SEARCH_PATHS = (
					"$(inherited)",
					"\"$(SRCROOT)\"",
					"\"$(SRCROOT)/../../../../../Library/Developer/Xcode/DerivedData/Sparkle-evkudstnytcsfdeunmxihhpyexor/Build/Products/Release\"",
				);
				GCC_PRECOMPILE_PREFIX_HEADER = YES;
				GCC_PREFIX_HEADER = "DNSCrypt-Menubar/DNSCrypt-Menubar-Prefix.pch";
				INFOPLIST_FILE = "DNSCrypt-Menubar/DNSCrypt-Menubar-Info.plist";
				MACOSX_DEPLOYMENT_TARGET = 10.8;
				PRODUCT_NAME = "DNSCrypt Menubar";
				WRAPPER_EXTENSION = app;
			};
			name = Debug;
		};
		09A13AED145F3B9000B227A4 /* Release */ = {
			isa = XCBuildConfiguration;
			buildSettings = {
				COMBINE_HIDPI_IMAGES = YES;
				FRAMEWORK_SEARCH_PATHS = (
					"$(inherited)",
					"\"$(SRCROOT)\"",
					"\"$(SRCROOT)/../../../../../Library/Developer/Xcode/DerivedData/Sparkle-evkudstnytcsfdeunmxihhpyexor/Build/Products/Release\"",
				);
				GCC_PRECOMPILE_PREFIX_HEADER = YES;
				GCC_PREFIX_HEADER = "DNSCrypt-Menubar/DNSCrypt-Menubar-Prefix.pch";
				INFOPLIST_FILE = "DNSCrypt-Menubar/DNSCrypt-Menubar-Info.plist";
				MACOSX_DEPLOYMENT_TARGET = 10.8;
				PRODUCT_NAME = "DNSCrypt Menubar";
				WRAPPER_EXTENSION = app;
			};
			name = Release;
		};
/* End XCBuildConfiguration section */

/* Begin XCConfigurationList section */
		09A13AC7145F3B9000B227A4 /* Build configuration list for PBXProject "DNSCrypt-Menubar" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				09A13AE9145F3B9000B227A4 /* Debug */,
				09A13AEA145F3B9000B227A4 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
		09A13AEB145F3B9000B227A4 /* Build configuration list for PBXNativeTarget "DNSCrypt-Menubar" */ = {
			isa = XCConfigurationList;
			buildConfigurations = (
				09A13AEC145F3B9000B227A4 /* Debug */,
				09A13AED145F3B9000B227A4 /* Release */,
			);
			defaultConfigurationIsVisible = 0;
			defaultConfigurationName = Release;
		};
/* End XCConfigurationList section */
	};
	rootObject = 09A13AC4145F3B9000B227A4 /* Project object */;
}


================================================
FILE: DNSCrypt-Menubar/DNSCrypt-Menubar.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
   version = "1.0">
   <FileRef
      location = "self:DNSCrypt-Menubar.xcodeproj">
   </FileRef>
</Workspace>


================================================
FILE: DNSCrypt-Meta-Installer/DNSCrypt-Meta-Installer.pkgproj
================================================
<?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>PROJECT</key>
	<dict>
		<key>PACKAGE_FILES</key>
		<dict>
			<key>DEFAULT_INSTALL_LOCATION</key>
			<string>/</string>
			<key>HIERARCHY</key>
			<dict>
				<key>CHILDREN</key>
				<array>
					<dict>
						<key>CHILDREN</key>
						<array>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>80</integer>
								<key>PATH</key>
								<string>Utilities</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
						</array>
						<key>GID</key>
						<integer>80</integer>
						<key>PATH</key>
						<string>Applications</string>
						<key>PATH_TYPE</key>
						<integer>0</integer>
						<key>PERMISSIONS</key>
						<integer>509</integer>
						<key>TYPE</key>
						<integer>1</integer>
						<key>UID</key>
						<integer>0</integer>
					</dict>
					<dict>
						<key>CHILDREN</key>
						<array>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>80</integer>
								<key>PATH</key>
								<string>Application Support</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Documentation</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Filesystems</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Frameworks</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Internet Plug-Ins</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>LaunchAgents</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>LaunchDaemons</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>PreferencePanes</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Preferences</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>80</integer>
								<key>PATH</key>
								<string>Printers</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>PrivilegedHelperTools</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>QuickTime</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Screen Savers</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Scripts</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Services</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Widgets</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
						</array>
						<key>GID</key>
						<integer>0</integer>
						<key>PATH</key>
						<string>Library</string>
						<key>PATH_TYPE</key>
						<integer>0</integer>
						<key>PERMISSIONS</key>
						<integer>493</integer>
						<key>TYPE</key>
						<integer>1</integer>
						<key>UID</key>
						<integer>0</integer>
					</dict>
					<dict>
						<key>CHILDREN</key>
						<array>
							<dict>
								<key>CHILDREN</key>
								<array>
									<dict>
										<key>CHILDREN</key>
										<array/>
										<key>GID</key>
										<integer>0</integer>
										<key>PATH</key>
										<string>Extensions</string>
										<key>PATH_TYPE</key>
										<integer>0</integer>
										<key>PERMISSIONS</key>
										<integer>493</integer>
										<key>TYPE</key>
										<integer>1</integer>
										<key>UID</key>
										<integer>0</integer>
									</dict>
								</array>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Library</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>493</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
						</array>
						<key>GID</key>
						<integer>0</integer>
						<key>PATH</key>
						<string>System</string>
						<key>PATH_TYPE</key>
						<integer>0</integer>
						<key>PERMISSIONS</key>
						<integer>493</integer>
						<key>TYPE</key>
						<integer>1</integer>
						<key>UID</key>
						<integer>0</integer>
					</dict>
					<dict>
						<key>CHILDREN</key>
						<array>
							<dict>
								<key>CHILDREN</key>
								<array/>
								<key>GID</key>
								<integer>0</integer>
								<key>PATH</key>
								<string>Shared</string>
								<key>PATH_TYPE</key>
								<integer>0</integer>
								<key>PERMISSIONS</key>
								<integer>1023</integer>
								<key>TYPE</key>
								<integer>1</integer>
								<key>UID</key>
								<integer>0</integer>
							</dict>
						</array>
						<key>GID</key>
						<integer>80</integer>
						<key>PATH</key>
						<string>Users</string>
						<key>PATH_TYPE</key>
						<integer>0</integer>
						<key>PERMISSIONS</key>
						<integer>493</integer>
						<key>TYPE</key>
						<integer>1</integer>
						<key>UID</key>
						<integer>0</integer>
					</dict>
				</array>
				<key>GID</key>
				<integer>0</integer>
				<key>PATH</key>
				<string>/</string>
				<key>PATH_TYPE</key>
				<integer>0</integer>
				<key>PERMISSIONS</key>
				<integer>493</integer>
				<key>TYPE</key>
				<integer>1</integer>
				<key>UID</key>
				<integer>0</integer>
			</dict>
			<key>PAYLOAD_TYPE</key>
			<integer>0</integer>
			<key>VERSION</key>
			<integer>2</integer>
		</dict>
		<key>PACKAGE_SCRIPTS</key>
		<dict>
			<key>PREINSTALL_PATH</key>
			<dict>
				<key>PATH</key>
				<string>install.sh</string>
				<key>PATH_TYPE</key>
				<integer>3</integer>
			</dict>
			<key>RESOURCES</key>
			<array>
				<dict>
					<key>CHILDREN</key>
					<array/>
					<key>GID</key>
					<integer>0</integer>
					<key>PATH</key>
					<string>pkg.tgz</string>
					<key>PATH_TYPE</key>
					<integer>1</integer>
					<key>PERMISSIONS</key>
					<integer>420</integer>
					<key>TYPE</key>
					<integer>3</integer>
					<key>UID</key>
					<integer>0</integer>
				</dict>
			</array>
		</dict>
		<key>PACKAGE_SETTINGS</key>
		<dict>
			<key>AUTHENTICATION</key>
			<false/>
			<key>CONCLUSION_ACTION</key>
			<integer>0</integer>
			<key>IDENTIFIER</key>
			<string>osx.org.pureftpd.pkg.DNSCrypt-Meta-Installer</string>
			<key>OVERWRITE_PERMISSIONS</key>
			<false/>
			<key>VERSION</key>
			<string>0.19</string>
		</dict>
		<key>PROJECT_COMMENTS</key>
		<dict>
			<key>NOTES</key>
			<data>
			PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M
			IDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQv
			c3RyaWN0LmR0ZCI+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1l
			cXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7
			IGNoYXJzZXQ9VVRGLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250
			ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp
			dGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u
			dGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD
			b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjExODcuMzQiPgo8c3R5bGUg
			dHlwZT0idGV4dC9jc3MiPgo8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5
			Pgo8L2JvZHk+CjwvaHRtbD4K
			</data>
		</dict>
		<key>PROJECT_SETTINGS</key>
		<dict>
			<key>BUILD_PATH</key>
			<dict>
				<key>PATH</key>
				<string>build</string>
				<key>PATH_TYPE</key>
				<integer>1</integer>
			</dict>
			<key>EXCLUDED_FILES</key>
			<array>
				<dict>
					<key>PATTERNS_ARRAY</key>
					<array>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>.DS_Store</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
					</array>
					<key>PROTECTED</key>
					<true/>
					<key>PROXY_NAME</key>
					<string>Remove .DS_Store files</string>
					<key>PROXY_TOOLTIP</key>
					<string>Remove ".DS_Store" files created by the Finder.</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>PATTERNS_ARRAY</key>
					<array>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>.pbdevelopment</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
					</array>
					<key>PROTECTED</key>
					<true/>
					<key>PROXY_NAME</key>
					<string>Remove .pbdevelopment files</string>
					<key>PROXY_TOOLTIP</key>
					<string>Remove ".pbdevelopment" files created by ProjectBuilder or Xcode.</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>PATTERNS_ARRAY</key>
					<array>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>CVS</string>
							<key>TYPE</key>
							<integer>1</integer>
						</dict>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>.cvsignore</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>.cvspass</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>.svn</string>
							<key>TYPE</key>
							<integer>1</integer>
						</dict>
					</array>
					<key>PROTECTED</key>
					<true/>
					<key>PROXY_NAME</key>
					<string>Remove SCM metadata</string>
					<key>PROXY_TOOLTIP</key>
					<string>Remove helper files and folders used by the CVS and SVN Source Code Management systems.</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>PATTERNS_ARRAY</key>
					<array>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>classes.nib</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>designable.db</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>info.nib</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
					</array>
					<key>PROTECTED</key>
					<true/>
					<key>PROXY_NAME</key>
					<string>Optimize nib files</string>
					<key>PROXY_TOOLTIP</key>
					<string>Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles.</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>PATTERNS_ARRAY</key>
					<array>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>Resources Disabled</string>
							<key>TYPE</key>
							<integer>1</integer>
						</dict>
					</array>
					<key>PROTECTED</key>
					<true/>
					<key>PROXY_NAME</key>
					<string>Remove Resources Disabled folders</string>
					<key>PROXY_TOOLTIP</key>
					<string>Remove "Resources Disabled" folders.</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>SEPARATOR</key>
					<true/>
				</dict>
			</array>
			<key>NAME</key>
			<string>DNSCrypt</string>
		</dict>
	</dict>
	<key>TYPE</key>
	<integer>1</integer>
	<key>VERSION</key>
	<integer>2</integer>
</dict>
</plist>


================================================
FILE: DNSCrypt-Meta-Installer/install.sh
================================================
#! /bin/sh

env > /tmp/a
tdir=$(mktemp -d /tmp/XXXXXXXXXXXXXXXX)
chmod 755 "$tdir"
tar x -z -C "$tdir" -f pkg.tgz
(sleep 10 ; cd "$tdir" ; exec open -W -b 'com.apple.installer' ./DNSCrypt.mpkg) &


================================================
FILE: DNSCrypt-OSX-Installer/DNSCrypt-OSX-Installer.pkgproj
================================================
<?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>PACKAGES</key>
	<array>
		<dict>
			<key>PACKAGE_FILES</key>
			<dict>
				<key>DEFAULT_INSTALL_LOCATION</key>
				<string>/</string>
				<key>HIERARCHY</key>
				<dict>
					<key>CHILDREN</key>
					<array>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>80</integer>
									<key>PATH</key>
									<string>Utilities</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>80</integer>
							<key>PATH</key>
							<string>Applications</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>509</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>80</integer>
									<key>PATH</key>
									<string>Application Support</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Documentation</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Filesystems</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Frameworks</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Internet Plug-Ins</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>LaunchAgents</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>LaunchDaemons</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>PreferencePanes</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Preferences</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>80</integer>
									<key>PATH</key>
									<string>Printers</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>PrivilegedHelperTools</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>QuickTime</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Screen Savers</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Scripts</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Services</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Widgets</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>0</integer>
							<key>PATH</key>
							<string>Library</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array>
										<dict>
											<key>CHILDREN</key>
											<array/>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>Extensions</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>493</integer>
											<key>TYPE</key>
											<integer>1</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
									</array>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Library</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>0</integer>
							<key>PATH</key>
							<string>System</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Shared</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>1023</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>80</integer>
							<key>PATH</key>
							<string>Users</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array>
										<dict>
											<key>CHILDREN</key>
											<array>
												<dict>
													<key>CHILDREN</key>
													<array/>
													<key>GID</key>
													<integer>0</integer>
													<key>PATH</key>
													<string>/usr/local/bin/hostip</string>
													<key>PATH_TYPE</key>
													<integer>0</integer>
													<key>PERMISSIONS</key>
													<integer>493</integer>
													<key>TYPE</key>
													<integer>3</integer>
													<key>UID</key>
													<integer>0</integer>
												</dict>
											</array>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>bin</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>493</integer>
											<key>TYPE</key>
											<integer>2</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
										<dict>
											<key>CHILDREN</key>
											<array>
												<dict>
													<key>CHILDREN</key>
													<array>
														<dict>
															<key>CHILDREN</key>
															<array/>
															<key>GID</key>
															<integer>0</integer>
															<key>PATH</key>
															<string>/usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_aaaa_blocking.la</string>
															<key>PATH_TYPE</key>
															<integer>0</integer>
															<key>PERMISSIONS</key>
															<integer>493</integer>
															<key>TYPE</key>
															<integer>3</integer>
															<key>UID</key>
															<integer>0</integer>
														</dict>
														<dict>
															<key>CHILDREN</key>
															<array/>
															<key>GID</key>
															<integer>0</integer>
															<key>PATH</key>
															<string>/usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_aaaa_blocking.so</string>
															<key>PATH_TYPE</key>
															<integer>0</integer>
															<key>PERMISSIONS</key>
															<integer>493</integer>
															<key>TYPE</key>
															<integer>3</integer>
															<key>UID</key>
															<integer>0</integer>
														</dict>
														<dict>
															<key>CHILDREN</key>
															<array/>
															<key>GID</key>
															<integer>0</integer>
															<key>PATH</key>
															<string>/usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_blocking.la</string>
															<key>PATH_TYPE</key>
															<integer>0</integer>
															<key>PERMISSIONS</key>
															<integer>493</integer>
															<key>TYPE</key>
															<integer>3</integer>
															<key>UID</key>
															<integer>0</integer>
														</dict>
														<dict>
															<key>CHILDREN</key>
															<array/>
															<key>GID</key>
															<integer>0</integer>
															<key>PATH</key>
															<string>/usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_blocking.so</string>
															<key>PATH_TYPE</key>
															<integer>0</integer>
															<key>PERMISSIONS</key>
															<integer>493</integer>
															<key>TYPE</key>
															<integer>3</integer>
															<key>UID</key>
															<integer>0</integer>
														</dict>
														<dict>
															<key>CHILDREN</key>
															<array/>
															<key>GID</key>
															<integer>0</integer>
															<key>PATH</key>
															<string>/usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_opendns_deviceid.la</string>
															<key>PATH_TYPE</key>
															<integer>0</integer>
															<key>PERMISSIONS</key>
															<integer>493</integer>
															<key>TYPE</key>
															<integer>3</integer>
															<key>UID</key>
															<integer>0</integer>
														</dict>
														<dict>
															<key>CHILDREN</key>
															<array/>
															<key>GID</key>
															<integer>0</integer>
															<key>PATH</key>
															<string>/usr/local/lib/dnscrypt-proxy/libdcplugin_example_ldns_opendns_deviceid.so</string>
															<key>PATH_TYPE</key>
															<integer>0</integer>
															<key>PERMISSIONS</key>
															<integer>493</integer>
															<key>TYPE</key>
															<integer>3</integer>
															<key>UID</key>
															<integer>0</integer>
														</dict>
														<dict>
															<key>CHILDREN</key>
															<array/>
															<key>GID</key>
															<integer>0</integer>
															<key>PATH</key>
															<string>/usr/local/lib/dnscrypt-proxy/libdcplugin_example_logging.la</string>
															<key>PATH_TYPE</key>
															<integer>0</integer>
															<key>PERMISSIONS</key>
															<integer>493</integer>
															<key>TYPE</key>
															<integer>3</integer>
															<key>UID</key>
															<integer>0</integer>
														</dict>
														<dict>
															<key>CHILDREN</key>
															<array/>
															<key>GID</key>
															<integer>0</integer>
															<key>PATH</key>
															<string>/usr/local/lib/dnscrypt-proxy/libdcplugin_example_logging.so</string>
															<key>PATH_TYPE</key>
															<integer>0</integer>
															<key>PERMISSIONS</key>
															<integer>493</integer>
															<key>TYPE</key>
															<integer>3</integer>
															<key>UID</key>
															<integer>0</integer>
														</dict>
													</array>
													<key>GID</key>
													<integer>0</integer>
													<key>PATH</key>
													<string>dnscrypt-proxy</string>
													<key>PATH_TYPE</key>
													<integer>0</integer>
													<key>PERMISSIONS</key>
													<integer>493</integer>
													<key>TYPE</key>
													<integer>2</integer>
													<key>UID</key>
													<integer>0</integer>
												</dict>
											</array>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>lib</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>493</integer>
											<key>TYPE</key>
											<integer>2</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
										<dict>
											<key>CHILDREN</key>
											<array>
												<dict>
													<key>CHILDREN</key>
													<array/>
													<key>GID</key>
													<integer>0</integer>
													<key>PATH</key>
													<string>/usr/local/sbin/dnscrypt-proxy</string>
													<key>PATH_TYPE</key>
													<integer>0</integer>
													<key>PERMISSIONS</key>
													<integer>493</integer>
													<key>TYPE</key>
													<integer>3</integer>
													<key>UID</key>
													<integer>0</integer>
												</dict>
											</array>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>sbin</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>493</integer>
											<key>TYPE</key>
											<integer>2</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
										<dict>
											<key>CHILDREN</key>
											<array>
												<dict>
													<key>CHILDREN</key>
													<array>
														<dict>
															<key>CHILDREN</key>
															<array/>
															<key>GID</key>
															<integer>0</integer>
															<key>PATH</key>
															<string>/usr/local/share/dnscrypt-proxy/dnscrypt-resolvers.csv</string>
															<key>PATH_TYPE</key>
															<integer>0</integer>
															<key>PERMISSIONS</key>
															<integer>420</integer>
															<key>TYPE</key>
															<integer>3</integer>
															<key>UID</key>
															<integer>0</integer>
														</dict>
													</array>
													<key>GID</key>
													<integer>0</integer>
													<key>PATH</key>
													<string>dnscrypt-proxy</string>
													<key>PATH_TYPE</key>
													<integer>0</integer>
													<key>PERMISSIONS</key>
													<integer>493</integer>
													<key>TYPE</key>
													<integer>2</integer>
													<key>UID</key>
													<integer>0</integer>
												</dict>
												<dict>
													<key>CHILDREN</key>
													<array>
														<dict>
															<key>CHILDREN</key>
															<array>
																<dict>
																	<key>CHILDREN</key>
																	<array/>
																	<key>GID</key>
																	<integer>0</integer>
																	<key>PATH</key>
																	<string>/usr/local/share/man/man8/dnscrypt-proxy.8</string>
																	<key>PATH_TYPE</key>
																	<integer>0</integer>
																	<key>PERMISSIONS</key>
																	<integer>420</integer>
																	<key>TYPE</key>
																	<integer>3</integer>
																	<key>UID</key>
																	<integer>0</integer>
																</dict>
																<dict>
																	<key>CHILDREN</key>
																	<array/>
																	<key>GID</key>
																	<integer>0</integer>
																	<key>PATH</key>
																	<string>/usr/local/share/man/man8/hostip.8</string>
																	<key>PATH_TYPE</key>
																	<integer>0</integer>
																	<key>PERMISSIONS</key>
																	<integer>420</integer>
																	<key>TYPE</key>
																	<integer>3</integer>
																	<key>UID</key>
																	<integer>0</integer>
																</dict>
															</array>
															<key>GID</key>
															<integer>0</integer>
															<key>PATH</key>
															<string>man8</string>
															<key>PATH_TYPE</key>
															<integer>0</integer>
															<key>PERMISSIONS</key>
															<integer>493</integer>
															<key>TYPE</key>
															<integer>2</integer>
															<key>UID</key>
															<integer>0</integer>
														</dict>
													</array>
													<key>GID</key>
													<integer>0</integer>
													<key>PATH</key>
													<string>man</string>
													<key>PATH_TYPE</key>
													<integer>0</integer>
													<key>PERMISSIONS</key>
													<integer>493</integer>
													<key>TYPE</key>
													<integer>2</integer>
													<key>UID</key>
													<integer>0</integer>
												</dict>
											</array>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>share</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>493</integer>
											<key>TYPE</key>
											<integer>2</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
									</array>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>local</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>2</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>0</integer>
							<key>PATH</key>
							<string>usr</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>2</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
					</array>
					<key>GID</key>
					<integer>0</integer>
					<key>PATH</key>
					<string>/</string>
					<key>PATH_TYPE</key>
					<integer>0</integer>
					<key>PERMISSIONS</key>
					<integer>493</integer>
					<key>TYPE</key>
					<integer>1</integer>
					<key>UID</key>
					<integer>0</integer>
				</dict>
				<key>PAYLOAD_TYPE</key>
				<integer>0</integer>
				<key>VERSION</key>
				<integer>2</integer>
			</dict>
			<key>PACKAGE_SCRIPTS</key>
			<dict>
				<key>POSTINSTALL_PATH</key>
				<dict/>
				<key>PREINSTALL_PATH</key>
				<dict/>
				<key>RESOURCES</key>
				<array/>
			</dict>
			<key>PACKAGE_SETTINGS</key>
			<dict>
				<key>AUTHENTICATION</key>
				<integer>1</integer>
				<key>CONCLUSION_ACTION</key>
				<integer>0</integer>
				<key>IDENTIFIER</key>
				<string>com.github.dnscrypt-osxclient.dnscryptClient.dnscrypt-proxy</string>
				<key>LOCATION</key>
				<integer>0</integer>
				<key>NAME</key>
				<string>DNSCrypt Proxy</string>
				<key>OVERWRITE_PERMISSIONS</key>
				<false/>
				<key>REFERENCE_PATH</key>
				<string>/</string>
				<key>RELOCATABLE</key>
				<false/>
				<key>USE_HFS+_COMPRESSION</key>
				<true/>
				<key>VERSION</key>
				<string>1.4.1</string>
			</dict>
			<key>UUID</key>
			<string>7F7D70AB-F7A2-4027-8304-3063C7B9532F</string>
		</dict>
		<dict>
			<key>PACKAGE_FILES</key>
			<dict>
				<key>DEFAULT_INSTALL_LOCATION</key>
				<string>/</string>
				<key>HIERARCHY</key>
				<dict>
					<key>CHILDREN</key>
					<array>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>80</integer>
									<key>PATH</key>
									<string>Utilities</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>80</integer>
							<key>PATH</key>
							<string>Applications</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>509</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>80</integer>
									<key>PATH</key>
									<string>Application Support</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Documentation</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Filesystems</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Frameworks</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Internet Plug-Ins</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>LaunchAgents</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array>
										<dict>
											<key>CHILDREN</key>
											<array/>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>/Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptAfterboot.plist</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>420</integer>
											<key>TYPE</key>
											<integer>3</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
										<dict>
											<key>CHILDREN</key>
											<array/>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>/Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptConsoleChange.plist</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>420</integer>
											<key>TYPE</key>
											<integer>3</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
										<dict>
											<key>CHILDREN</key>
											<array/>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>/Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptControlChange.plist</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>420</integer>
											<key>TYPE</key>
											<integer>3</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
										<dict>
											<key>CHILDREN</key>
											<array/>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>/Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptNetworkChange.plist</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>420</integer>
											<key>TYPE</key>
											<integer>3</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
									</array>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>LaunchDaemons</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array>
										<dict>
											<key>CHILDREN</key>
											<array/>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>/Users/j/Library/Developer/Xcode/DerivedData/DNSCrypt-fxkuknmyuyumstcqfthykzrsdius/Build/Products/Release/DNSCrypt.prefPane</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>493</integer>
											<key>TYPE</key>
											<integer>3</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
									</array>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>PreferencePanes</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Preferences</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>80</integer>
									<key>PATH</key>
									<string>Printers</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>PrivilegedHelperTools</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>QuickTime</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Screen Savers</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Scripts</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Services</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Widgets</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>0</integer>
							<key>PATH</key>
							<string>Library</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array>
										<dict>
											<key>CHILDREN</key>
											<array/>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>Extensions</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>493</integer>
											<key>TYPE</key>
											<integer>1</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
									</array>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Library</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>0</integer>
							<key>PATH</key>
							<string>System</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Shared</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>1023</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>80</integer>
							<key>PATH</key>
							<string>Users</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array>
										<dict>
											<key>CHILDREN</key>
											<array>
												<dict>
													<key>CHILDREN</key>
													<array/>
													<key>GID</key>
													<integer>0</integer>
													<key>PATH</key>
													<string>/usr/local/bin/alarmer</string>
													<key>PATH_TYPE</key>
													<integer>0</integer>
													<key>PERMISSIONS</key>
													<integer>493</integer>
													<key>TYPE</key>
													<integer>3</integer>
													<key>UID</key>
													<integer>0</integer>
												</dict>
											</array>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>bin</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>493</integer>
											<key>TYPE</key>
											<integer>2</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
									</array>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>local</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>2</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>0</integer>
							<key>PATH</key>
							<string>usr</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>2</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
					</array>
					<key>GID</key>
					<integer>0</integer>
					<key>PATH</key>
					<string>/</string>
					<key>PATH_TYPE</key>
					<integer>0</integer>
					<key>PERMISSIONS</key>
					<integer>493</integer>
					<key>TYPE</key>
					<integer>1</integer>
					<key>UID</key>
					<integer>0</integer>
				</dict>
				<key>PAYLOAD_TYPE</key>
				<integer>0</integer>
				<key>VERSION</key>
				<integer>2</integer>
			</dict>
			<key>PACKAGE_SCRIPTS</key>
			<dict>
				<key>POSTINSTALL_PATH</key>
				<dict>
					<key>PATH</key>
					<string>/Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/Scripts/dnscrypt-prefpane-postinstall.sh</string>
					<key>PATH_TYPE</key>
					<integer>0</integer>
				</dict>
				<key>PREINSTALL_PATH</key>
				<dict>
					<key>PATH</key>
					<string>/Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/Scripts/dnscrypt-prefpane-preinstall.sh</string>
					<key>PATH_TYPE</key>
					<integer>0</integer>
				</dict>
				<key>RESOURCES</key>
				<array/>
			</dict>
			<key>PACKAGE_SETTINGS</key>
			<dict>
				<key>AUTHENTICATION</key>
				<integer>1</integer>
				<key>CONCLUSION_ACTION</key>
				<integer>2</integer>
				<key>IDENTIFIER</key>
				<string>com.github.dnscrypt-osxclient.dnscryptClient.DNSCrypt</string>
				<key>LOCATION</key>
				<integer>0</integer>
				<key>NAME</key>
				<string>DNSCrypt Preference Pane</string>
				<key>OVERWRITE_PERMISSIONS</key>
				<false/>
				<key>USE_HFS+_COMPRESSION</key>
				<true/>
				<key>VERSION</key>
				<string>1.0.4</string>
			</dict>
			<key>TYPE</key>
			<integer>0</integer>
			<key>UUID</key>
			<string>6FEDF493-DE5C-4438-B4BC-5B5AFCFBB3E6</string>
		</dict>
		<dict>
			<key>PACKAGE_FILES</key>
			<dict>
				<key>DEFAULT_INSTALL_LOCATION</key>
				<string>/</string>
				<key>HIERARCHY</key>
				<dict>
					<key>CHILDREN</key>
					<array>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>80</integer>
									<key>PATH</key>
									<string>/Users/j/Library/Developer/Xcode/DerivedData/DNSCrypt-Menubar-fcseadxtcidaaddjtyicaarzthfd/Build/Products/Release/DNSCrypt Menubar.app</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>3</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>80</integer>
									<key>PATH</key>
									<string>Utilities</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>80</integer>
							<key>PATH</key>
							<string>Applications</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>509</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>80</integer>
									<key>PATH</key>
									<string>Application Support</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Documentation</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Filesystems</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Frameworks</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Internet Plug-Ins</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array>
										<dict>
											<key>CHILDREN</key>
											<array/>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist</string>
											<key>PATH_TYPE</key>
											<integer>1</integer>
											<key>PERMISSIONS</key>
											<integer>420</integer>
											<key>TYPE</key>
											<integer>3</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
									</array>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>LaunchAgents</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>LaunchDaemons</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>PreferencePanes</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Preferences</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>80</integer>
									<key>PATH</key>
									<string>Printers</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>PrivilegedHelperTools</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>QuickTime</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Screen Savers</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Scripts</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Services</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Widgets</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>0</integer>
							<key>PATH</key>
							<string>Library</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array>
										<dict>
											<key>CHILDREN</key>
											<array/>
											<key>GID</key>
											<integer>0</integer>
											<key>PATH</key>
											<string>Extensions</string>
											<key>PATH_TYPE</key>
											<integer>0</integer>
											<key>PERMISSIONS</key>
											<integer>493</integer>
											<key>TYPE</key>
											<integer>1</integer>
											<key>UID</key>
											<integer>0</integer>
										</dict>
									</array>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Library</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>493</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>0</integer>
							<key>PATH</key>
							<string>System</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>CHILDREN</key>
							<array>
								<dict>
									<key>CHILDREN</key>
									<array/>
									<key>GID</key>
									<integer>0</integer>
									<key>PATH</key>
									<string>Shared</string>
									<key>PATH_TYPE</key>
									<integer>0</integer>
									<key>PERMISSIONS</key>
									<integer>1023</integer>
									<key>TYPE</key>
									<integer>1</integer>
									<key>UID</key>
									<integer>0</integer>
								</dict>
							</array>
							<key>GID</key>
							<integer>80</integer>
							<key>PATH</key>
							<string>Users</string>
							<key>PATH_TYPE</key>
							<integer>0</integer>
							<key>PERMISSIONS</key>
							<integer>493</integer>
							<key>TYPE</key>
							<integer>1</integer>
							<key>UID</key>
							<integer>0</integer>
						</dict>
					</array>
					<key>GID</key>
					<integer>0</integer>
					<key>PATH</key>
					<string>/</string>
					<key>PATH_TYPE</key>
					<integer>0</integer>
					<key>PERMISSIONS</key>
					<integer>493</integer>
					<key>TYPE</key>
					<integer>1</integer>
					<key>UID</key>
					<integer>0</integer>
				</dict>
				<key>PAYLOAD_TYPE</key>
				<integer>0</integer>
				<key>VERSION</key>
				<integer>2</integer>
			</dict>
			<key>PACKAGE_SCRIPTS</key>
			<dict>
				<key>POSTINSTALL_PATH</key>
				<dict>
					<key>PATH</key>
					<string>/Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/Scripts/dnscrypt-menubar-postinstall.sh</string>
					<key>PATH_TYPE</key>
					<integer>0</integer>
				</dict>
				<key>PREINSTALL_PATH</key>
				<dict>
					<key>PATH</key>
					<string>/Users/j/OpenDNS/DNSCrypt/OSX/dnscrypt-osx-client/DNSCrypt-OSX-Installer/Scripts/dnscrypt-menubar-preinstall.sh</string>
					<key>PATH_TYPE</key>
					<integer>0</integer>
				</dict>
				<key>RESOURCES</key>
				<array/>
			</dict>
			<key>PACKAGE_SETTINGS</key>
			<dict>
				<key>AUTHENTICATION</key>
				<integer>1</integer>
				<key>CONCLUSION_ACTION</key>
				<integer>2</integer>
				<key>IDENTIFIER</key>
				<string>com.github.dnscrypt-osxclient.dnscryptClient.DNSCrypt-Menubar</string>
				<key>LOCATION</key>
				<integer>0</integer>
				<key>NAME</key>
				<string>DNSCrypt Menu bar</string>
				<key>OVERWRITE_PERMISSIONS</key>
				<false/>
				<key>USE_HFS+_COMPRESSION</key>
				<true/>
				<key>VERSION</key>
				<string>1.0.4</string>
			</dict>
			<key>TYPE</key>
			<integer>0</integer>
			<key>UUID</key>
			<string>E69268A3-3CD1-49FF-8B46-4D45A963F8FA</string>
		</dict>
	</array>
	<key>PROJECT</key>
	<dict>
		<key>PROJECT_COMMENTS</key>
		<dict>
			<key>NOTES</key>
			<data>
			PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1M
			IDQuMDEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQv
			c3RyaWN0LmR0ZCI+CjxodG1sPgo8aGVhZD4KPG1ldGEgaHR0cC1l
			cXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7
			IGNoYXJzZXQ9VVRGLTgiPgo8bWV0YSBodHRwLWVxdWl2PSJDb250
			ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIj4KPHRp
			dGxlPjwvdGl0bGU+CjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29u
			dGVudD0iQ29jb2EgSFRNTCBXcml0ZXIiPgo8bWV0YSBuYW1lPSJD
			b2NvYVZlcnNpb24iIGNvbnRlbnQ9IjEyNjUuMiI+CjxzdHlsZSB0
			eXBlPSJ0ZXh0L2NzcyI+Cjwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+
			CjwvYm9keT4KPC9odG1sPgo=
			</data>
		</dict>
		<key>PROJECT_PRESENTATION</key>
		<dict>
			<key>BACKGROUND</key>
			<dict>
				<key>ALIGNMENT</key>
				<integer>0</integer>
				<key>BACKGROUND_PATH</key>
				<dict>
					<key>PATH</key>
					<string>installed_background.gif</string>
					<key>PATH_TYPE</key>
					<integer>1</integer>
				</dict>
				<key>CUSTOM</key>
				<integer>0</integer>
				<key>SCALING</key>
				<integer>1</integer>
			</dict>
			<key>INSTALLATION TYPE</key>
			<dict>
				<key>HIERARCHIES</key>
				<dict>
					<key>INSTALLER</key>
					<dict>
						<key>LIST</key>
						<array>
							<dict>
								<key>DESCRIPTION</key>
								<array/>
								<key>OPTIONS</key>
								<dict>
									<key>HIDDEN</key>
									<false/>
									<key>STATE</key>
									<integer>1</integer>
								</dict>
								<key>PACKAGE_UUID</key>
								<string>7F7D70AB-F7A2-4027-8304-3063C7B9532F</string>
								<key>REQUIREMENTS</key>
								<array/>
								<key>TITLE</key>
								<array/>
								<key>TOOLTIP</key>
								<array/>
								<key>TYPE</key>
								<integer>0</integer>
								<key>UUID</key>
								<string>FE4B2779-1476-4341-A773-534E27377369</string>
							</dict>
							<dict>
								<key>DESCRIPTION</key>
								<array/>
								<key>OPTIONS</key>
								<dict>
									<key>HIDDEN</key>
									<false/>
									<key>STATE</key>
									<integer>1</integer>
								</dict>
								<key>PACKAGE_UUID</key>
								<string>6FEDF493-DE5C-4438-B4BC-5B5AFCFBB3E6</string>
								<key>TITLE</key>
								<array/>
								<key>TOOLTIP</key>
								<array/>
								<key>TYPE</key>
								<integer>0</integer>
								<key>UUID</key>
								<string>7D8D1323-66FB-4A66-AB2A-CF2276924169</string>
							</dict>
							<dict>
								<key>DESCRIPTION</key>
								<array/>
								<key>OPTIONS</key>
								<dict>
									<key>HIDDEN</key>
									<false/>
									<key>STATE</key>
									<integer>1</integer>
								</dict>
								<key>PACKAGE_UUID</key>
								<string>E69268A3-3CD1-49FF-8B46-4D45A963F8FA</string>
								<key>TITLE</key>
								<array/>
								<key>TOOLTIP</key>
								<array/>
								<key>TYPE</key>
								<integer>0</integer>
								<key>UUID</key>
								<string>979F40E5-BFE3-438D-BAC3-A1D17BEFE932</string>
							</dict>
						</array>
						<key>REMOVED</key>
						<dict/>
					</dict>
				</dict>
				<key>INSTALLATION TYPE</key>
				<integer>0</integer>
				<key>MODE</key>
				<integer>1</integer>
			</dict>
			<key>INSTALLATION_STEPS</key>
			<array>
				<dict>
					<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
					<string>ICPresentationViewIntroductionController</string>
					<key>INSTALLER_PLUGIN</key>
					<string>Introduction</string>
					<key>LIST_TITLE_KEY</key>
					<string>InstallerSectionTitle</string>
				</dict>
				<dict>
					<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
					<string>ICPresentationViewReadMeController</string>
					<key>INSTALLER_PLUGIN</key>
					<string>ReadMe</string>
					<key>LIST_TITLE_KEY</key>
					<string>InstallerSectionTitle</string>
				</dict>
				<dict>
					<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
					<string>ICPresentationViewLicenseController</string>
					<key>INSTALLER_PLUGIN</key>
					<string>License</string>
					<key>LIST_TITLE_KEY</key>
					<string>InstallerSectionTitle</string>
				</dict>
				<dict>
					<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
					<string>ICPresentationViewDestinationSelectController</string>
					<key>INSTALLER_PLUGIN</key>
					<string>TargetSelect</string>
					<key>LIST_TITLE_KEY</key>
					<string>InstallerSectionTitle</string>
				</dict>
				<dict>
					<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
					<string>ICPresentationViewInstallationTypeController</string>
					<key>INSTALLER_PLUGIN</key>
					<string>PackageSelection</string>
					<key>LIST_TITLE_KEY</key>
					<string>InstallerSectionTitle</string>
				</dict>
				<dict>
					<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
					<string>ICPresentationViewInstallationController</string>
					<key>INSTALLER_PLUGIN</key>
					<string>Install</string>
					<key>LIST_TITLE_KEY</key>
					<string>InstallerSectionTitle</string>
				</dict>
				<dict>
					<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
					<string>ICPresentationViewSummaryController</string>
					<key>INSTALLER_PLUGIN</key>
					<string>Summary</string>
					<key>LIST_TITLE_KEY</key>
					<string>InstallerSectionTitle</string>
				</dict>
			</array>
			<key>INTRODUCTION</key>
			<dict>
				<key>LOCALIZATIONS</key>
				<array/>
			</dict>
			<key>LICENSE</key>
			<dict>
				<key>KEYWORDS</key>
				<dict/>
				<key>LOCALIZATIONS</key>
				<array/>
				<key>MODE</key>
				<integer>0</integer>
			</dict>
			<key>README</key>
			<dict>
				<key>LOCALIZATIONS</key>
				<array/>
			</dict>
			<key>SUMMARY</key>
			<dict>
				<key>LOCALIZATIONS</key>
				<array/>
			</dict>
			<key>TITLE</key>
			<dict>
				<key>LOCALIZATIONS</key>
				<array>
					<dict>
						<key>LANGUAGE</key>
						<string>English</string>
						<key>VALUE</key>
						<string>DNSCrypt OSX Client</string>
					</dict>
				</array>
			</dict>
		</dict>
		<key>PROJECT_REQUIREMENTS</key>
		<dict>
			<key>LIST</key>
			<array>
				<dict>
					<key>BEHAVIOR</key>
					<integer>3</integer>
					<key>DICTIONARY</key>
					<dict>
						<key>IC_REQUIREMENT_CPU_ARCHITECTURE_FAMILY</key>
						<integer>2</integer>
						<key>IC_REQUIREMENT_CPU_INTEL_ARCHITECTURE_TYPE</key>
						<integer>0</integer>
						<key>IC_REQUIREMENT_CPU_MINIMUM_CPU_CORES_COUNT</key>
						<integer>1</integer>
						<key>IC_REQUIREMENT_CPU_MINIMUM_FREQUENCY</key>
						<integer>866666</integer>
						<key>IC_REQUIREMENT_CPU_POWERPC_ARCHITECTURE_TYPE</key>
						<integer>0</integer>
					</dict>
					<key>IC_REQUIREMENT_CHECK_TYPE</key>
					<integer>0</integer>
					<key>IDENTIFIER</key>
					<string>fr.whitebox.Packages.requirement.cpu</string>
					<key>MESSAGE</key>
					<array>
						<dict>
							<key>LANGUAGE</key>
							<string>English</string>
							<key>SECONDARY_VALUE</key>
							<string></string>
							<key>VALUE</key>
							<string>The DNSCrypt GUI for Mac currently requires at least an Intel Core CPU.</string>
						</dict>
					</array>
					<key>NAME</key>
					<string>Processor</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>BEHAVIOR</key>
					<integer>3</integer>
					<key>DICTIONARY</key>
					<dict>
						<key>IC_REQUIREMENT_OS_DISK_TYPE</key>
						<integer>0</integer>
						<key>IC_REQUIREMENT_OS_DISTRIBUTION_TYPE</key>
						<integer>1</integer>
						<key>IC_REQUIREMENT_OS_MINIMUM_VERSION</key>
						<integer>100800</integer>
					</dict>
					<key>IC_REQUIREMENT_CHECK_TYPE</key>
					<integer>1</integer>
					<key>IDENTIFIER</key>
					<string>fr.whitebox.Packages.requirement.os</string>
					<key>MESSAGE</key>
					<array>
						<dict>
							<key>LANGUAGE</key>
							<string>English</string>
							<key>VALUE</key>
							<string>This user interface doesn't work with this version of OSX.</string>
						</dict>
					</array>
					<key>NAME</key>
					<string>Operating System</string>
					<key>STATE</key>
					<true/>
				</dict>
			</array>
			<key>POSTINSTALL_PATH</key>
			<dict/>
			<key>PREINSTALL_PATH</key>
			<dict/>
			<key>RESOURCES</key>
			<array/>
			<key>ROOT_VOLUME_ONLY</key>
			<true/>
		</dict>
		<key>PROJECT_SETTINGS</key>
		<dict>
			<key>ADVANCED_OPTIONS</key>
			<dict/>
			<key>BUILD_FORMAT</key>
			<integer>1</integer>
			<key>BUILD_PATH</key>
			<dict>
				<key>PATH</key>
				<string>build</string>
				<key>PATH_TYPE</key>
				<integer>1</integer>
			</dict>
			<key>EXCLUDED_FILES</key>
			<array>
				<dict>
					<key>PATTERNS_ARRAY</key>
					<array>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>.DS_Store</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
					</array>
					<key>PROTECTED</key>
					<true/>
					<key>PROXY_NAME</key>
					<string>Remove .DS_Store files</string>
					<key>PROXY_TOOLTIP</key>
					<string>Remove ".DS_Store" files created by the Finder.</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>PATTERNS_ARRAY</key>
					<array>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>.pbdevelopment</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
					</array>
					<key>PROTECTED</key>
					<true/>
					<key>PROXY_NAME</key>
					<string>Remove .pbdevelopment files</string>
					<key>PROXY_TOOLTIP</key>
					<string>Remove ".pbdevelopment" files created by ProjectBuilder or Xcode.</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>PATTERNS_ARRAY</key>
					<array>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>CVS</string>
							<key>TYPE</key>
							<integer>1</integer>
						</dict>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>.cvsignore</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>.cvspass</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>.svn</string>
							<key>TYPE</key>
							<integer>1</integer>
						</dict>
					</array>
					<key>PROTECTED</key>
					<true/>
					<key>PROXY_NAME</key>
					<string>Remove SCM metadata</string>
					<key>PROXY_TOOLTIP</key>
					<string>Remove helper files and folders used by the CVS and SVN Source Code Management systems.</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>PATTERNS_ARRAY</key>
					<array>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>classes.nib</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>designable.db</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>info.nib</string>
							<key>TYPE</key>
							<integer>0</integer>
						</dict>
					</array>
					<key>PROTECTED</key>
					<true/>
					<key>PROXY_NAME</key>
					<string>Optimize nib files</string>
					<key>PROXY_TOOLTIP</key>
					<string>Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles.</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>PATTERNS_ARRAY</key>
					<array>
						<dict>
							<key>REGULAR_EXPRESSION</key>
							<false/>
							<key>STRING</key>
							<string>Resources Disabled</string>
							<key>TYPE</key>
							<integer>1</integer>
						</dict>
					</array>
					<key>PROTECTED</key>
					<true/>
					<key>PROXY_NAME</key>
					<string>Remove Resources Disabled folders</string>
					<key>PROXY_TOOLTIP</key>
					<string>Remove "Resources Disabled" folders.</string>
					<key>STATE</key>
					<true/>
				</dict>
				<dict>
					<key>SEPARATOR</key>
					<true/>
				</dict>
			</array>
			<key>NAME</key>
			<string>DNSCrypt</string>
		</dict>
	</dict>
	<key>TYPE</key>
	<integer>0</integer>
	<key>VERSION</key>
	<integer>2</integer>
</dict>
</plist>


================================================
FILE: DNSCrypt-OSX-Installer/Scripts/dnscrypt-menubar-postinstall.sh
================================================
#! /bin/sh

exec 2>/dev/null

/bin/launchctl load \
  '/Library/LaunchAgents/com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist'

/bin/launchctl start com.github.dnscrypt-osxclient.DNSCryptMenuBar

exit 0


================================================
FILE: DNSCrypt-OSX-Installer/Scripts/dnscrypt-menubar-preinstall.sh
================================================
#! /bin/sh

exec 2>/dev/null

/bin/launchctl stop com.opendns.osx.RoamingClientMenubar
/bin/launchctl remove com.opendns.osx.RoamingClientMenubar

/bin/launchctl stop com.opendns.osx.RoamingClientConfigUpdater
/bin/launchctl remove com.opendns.osx.RoamingClientConfigUpdater

/bin/rm -f /Library/LaunchDaemons/com.opendns.osx.Roaming*.plist

/bin/launchctl stop com.opendns.osx.DNSCryptMenuBar
/bin/launchctl remove com.opendns.osx.DNSCryptMenuBar

/bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptMenuBar
/bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptMenuBar

killall 'DNSCrypt-Menubar'
killall 'DNSCrypt Menubar'

/bin/rm -f /Library/LaunchDaemons/com.opendns.osx.DNSCryptMenuBar.plist
/bin/rm -f /Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist

exit 0


================================================
FILE: DNSCrypt-OSX-Installer/Scripts/dnscrypt-prefpane-postinstall.sh
================================================
#! /bin/sh

exec 2>/dev/null

/bin/mkdir -p '/Library/Application Support/DNSCrypt/control'
/bin/mkdir -p '/Library/Application Support/DNSCrypt/dnscrypt-proxy'
/bin/mkdir -p '/Library/Application Support/DNSCrypt/probes'
/bin/mkdir -p '/Library/Application Support/DNSCrypt/states'
/bin/mkdir -p '/Library/Application Support/DNSCrypt/tickets'
/bin/chmod 755 '/Library/Application Support/DNSCrypt'
/bin/chmod 755 '/usr/local/bin/hostip'
/bin/chmod 755 '/usr/local/sbin/dnscrypt-proxy'
/bin/chmod -R 755 '/usr/local/lib/dnscrypt-proxy'
/usr/sbin/chown -R 0:0 '/Library/Application Support/DNSCrypt'
/usr/sbin/chown 0:0 '/usr/local/bin/hostip'
/usr/sbin/chown 0:0 '/usr/local/lib/dnscrypt-proxy'
/usr/sbin/chown -R 0:0 '/usr/local/sbin/dnscrypt-proxy'

eval $(/usr/bin/stat -s '/dev/console')
if [ $? != 0 ]; then
  wanted_uid="$st_uid"
  /usr/sbin/chown -R "${wanted_uid}:0" \
    '/Library/Application Support/DNSCrypt/control'
  /usr/sbin/chown -R "${wanted_uid}:0" \
    '/Library/Application Support/DNSCrypt/tickets'
fi

rm -f '/Library/Application Support/DNSCrypt/control/plugin-parental-controls.enabled'
rm -f '/Library/Application Support/DNSCrypt/control/plugin-lockin.enabled'

for service in com.github.dnscrypt-osxclient.DNSCryptAfterboot \
               com.github.dnscrypt-osxclient.DNSCryptConsoleChange \
               com.github.dnscrypt-osxclient.DNSCryptControlChange \
               com.github.dnscrypt-osxclient.DNSCryptNetworkChange; do
  /bin/launchctl load "/Library/LaunchDaemons/${service}.plist"
  /bin/launchctl start "$service"
done

/usr/bin/touch '/Library/Application Support/DNSCrypt/control'

exit 0


================================================
FILE: DNSCrypt-OSX-Installer/Scripts/dnscrypt-prefpane-preinstall.sh
================================================
#! /bin/sh

exec 2>/dev/null

killall 'System Preferences'

/bin/rm -rf '/Library/Application Support/DNSCrypt Updater'

/bin/launchctl stop com.opendns.osx.DNSCryptConfigUpdater
/bin/launchctl remove com.opendns.osx.DNSCryptConfigUpdater
/bin/rm -f '/Library/LaunchDaemons/com.opendns.osx.DNSCryptConfigUpdater.plist'

/bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptConfigUpdater
/bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptConfigUpdater
/bin/rm -f '/Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptConfigUpdater.plist'

/bin/launchctl stop com.opendns.osx.DNSCryptAfterboot
/bin/launchctl remove com.opendns.osx.DNSCryptAfterboot
/bin/launchctl stop com.opendns.osx.DNSCryptConsoleChange
/bin/launchctl remove com.opendns.osx.DNSCryptConsoleChange
/bin/launchctl stop com.opendns.osx.DNSCryptControlChange
/bin/launchctl remove com.opendns.osx.DNSCryptControlChange
/bin/launchctl stop com.opendns.osx.DNSCryptNetworkChange
/bin/launchctl remove com.opendns.osx.DNSCryptNetworkChange

/bin/rm -f /Library/LaunchDaemons/com.opendns.osx.DNSCryptAfterboot.plist
/bin/rm -f /Library/LaunchDaemons/com.opendns.osx.DNSCryptConsoleChange.plist
/bin/rm -f /Library/LaunchDaemons/com.opendns.osx.DNSCryptControlChange.plist
/bin/rm -f /Library/LaunchDaemons/com.opendns.osx.DNSCryptNetworkChange.plist

/bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptAfterboot
/bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptAfterboot
/bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptConsoleChange
/bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptConsoleChange
/bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptControlChange
/bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptControlChange
/bin/launchctl stop com.github.dnscrypt-osxclient.DNSCryptNetworkChange
/bin/launchctl remove com.github.dnscrypt-osxclient.DNSCryptNetworkChange

/bin/rm -f /Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptAfterboot.plist
/bin/rm -f /Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptConsoleChange.plist
/bin/rm -f /Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptControlChange.plist
/bin/rm -f /Library/LaunchDaemons/com.github.dnscrypt-osxclient.DNSCryptNetworkChange.plist

/bin/rm -f /var/run/dnscrypt*.lock

exit 0


================================================
FILE: DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptAfterboot.plist
================================================
<?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>Label</key>
  <string>com.github.dnscrypt-osxclient.DNSCryptAfterboot</string>
  <key>KeepAlive</key>
  <false/>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts/afterboot.sh</string>
  </array>
  <key>ExitTimeOut</key>
  <integer>300</integer>
  <key>ThrottleInterval</key>
  <integer>1</integer>
  <key>Nice</key>
  <integer>1</integer>
  <key>UserName</key>
  <string>root</string>
</dict>
</plist>


================================================
FILE: DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptConsoleChange.plist
================================================
<?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>Label</key>
  <string>com.github.dnscrypt-osxclient.DNSCryptConsoleChange</string>
  <key>KeepAlive</key>
  <false/>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts/handle-console-change.sh</string>
  </array>
  <key>ExitTimeOut</key>
  <integer>30</integer>
  <key>ThrottleInterval</key>
  <integer>0</integer>
  <key>Nice</key>
  <integer>15</integer>
  <key>UserName</key>
  <string>root</string>
  <key>WatchPaths</key>
  <array>
    <string>/dev/console</string>
    <string>/var/run/utmpx</string>
  </array>
</dict>
</plist>


================================================
FILE: DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptControlChange.plist
================================================
<?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>Label</key>
  <string>com.github.dnscrypt-osxclient.DNSCryptControlChange</string>
  <key>KeepAlive</key>
  <false/>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts/handle-control-change.sh</string>
  </array>
  <key>ExitTimeOut</key>
  <integer>300</integer>
  <key>ThrottleInterval</key>
  <integer>0</integer>
  <key>Nice</key>
  <integer>1</integer>
  <key>UserName</key>
  <string>root</string>
  <key>WatchPaths</key>
  <array>
    <string>/Library/Application Support/DNSCrypt/control</string>
  </array>
</dict>
</plist>


================================================
FILE: DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist
================================================
<?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>Label</key>
  <string>com.github.dnscrypt-osxclient.DNSCryptMenuBar</string>
  <key>KeepAlive</key>
  <false/>
  <key>RunAtLoad</key>
  <true/>
  <key>ProgramArguments</key>
  <array>
    <string>/Applications/DNSCrypt Menubar.app/Contents/MacOS/DNSCrypt Menubar</string>
  </array>
  <key>LimitLoadToSessionType</key>
  <string>Aqua</string>
</dict>
</plist>


================================================
FILE: DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptNetworkChange.plist
================================================
<?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>Label</key>
  <string>com.github.dnscrypt-osxclient.DNSCryptNetworkChange</string>
  <key>KeepAlive</key>
  <false/>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts</string>
  <key>ProgramArguments</key>
  <array>
    <string>/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr/scripts/handle-network-change.sh</string>
  </array>
  <key>ExitTimeOut</key>
  <integer>300</integer>
  <key>ThrottleInterval</key>
  <integer>1</integer>
  <key>Nice</key>
  <integer>1</integer>
  <key>UserName</key>
  <string>root</string>
  <key>WatchPaths</key>
  <array>
    <string>/Library/Preferences/SystemConfiguration</string>
  </array>
</dict>
</plist>


================================================
FILE: DNSCrypt-OSX-Installer/sign.sh
================================================
#! /bin/sh

VERSION='1.0.4'

cd build || exit 1
[ -d DNSCrypt.mpkg ] || exit 1

(
cd DNSCrypt.mpkg/Contents/Packages || exit 1

for pkg in *pkg ; do
  rm -fr "x-${pkg}"
  mv "$pkg" "x-${pkg}"
  productsign --sign 'Developer ID Installer' "x-${pkg}" "$pkg"
  rm -fr "x-${pkg}"
done
)
rm -fr DNSCrypt-OSX.mpkg DNSCrypt-unsigned.mpkg
productsign --sign 'Developer ID Application' DNSCrypt.mpkg DNSCrypt-OSX.mpkg
mv DNSCrypt.mpkg DNSCrypt-unsigned.mpkg
mv DNSCrypt-OSX.mpkg DNSCrypt.mpkg
zip -9 -r "dnscrypt-osxclient-${VERSION}.zip" DNSCrypt.mpkg
rm -fr dnscrypt-pkg
rm -f "dnscrypt-osxclient-${VERSION}.dmg"
mkdir dnscrypt-pkg
mv DNSCrypt.mpkg dnscrypt-pkg
hdiutil create "dnscrypt-osxclient-${VERSION}.dmg" -srcfolder dnscrypt-pkg

mv dnscrypt-pkg/DNSCrypt.mpkg .
rm -fr dnscrypt-pkg
rm -fr DNSCrypt-unsigned.mpkg


================================================
FILE: DNSCrypt-Preference-Pane/COPYING
================================================
/*
 * Copyright (c) 2011-2014 OpenDNS, Inc.
 * Copyright (c) 2014 AlterStep
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

The get-dhcp-resolvers.sh and check-network-change.sh scripts use code
snippets from the dnssec-trigger project, by Wouter Wijngaards, NLnet
Labs. (great and similar project, check it out:
http://www.nlnetlabs.nl/projects/dnssec-trigger/)


================================================
FILE: DNSCrypt-Preference-Pane/DNSCrypt/CHCSVParser/CHCSVParser.h
================================================
//
//  CHCSVParser.h
//  CHCSVParser
/**
 Copyright (c) 2012 Dave DeLong
 
 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 <Foundation/Foundation.h>

extern NSString * const CHCSVErrorDomain;

enum {
    CHCSVErrorCodeInvalidFormat = 1,
};

typedef NSInteger CHCSVErrorCode;

@class CHCSVParser;
@protocol CHCSVParserDelegate <NSObject>

@optional
- (void)parserDidBeginDocument:(CHCSVParser *)parser;
- (void)parserDidEndDocument:(CHCSVParser *)parser;

- (void)parser:(CHCSVParser *)parser didBeginLine:(NSUInteger)recordNumber;
- (void)parser:(CHCSVParser *)parser didEndLine:(NSUInteger)recordNumber;

- (void)parser:(CHCSVParser *)parser didReadField:(NSString *)field atIndex:(NSInteger)fieldIndex;
- (void)parser:(CHCSVParser *)parser didReadComment:(NSString *)comment;

- (void)parser:(CHCSVParser *)parser didFailWithError:(NSError *)error;

@end

@interface CHCSVParser : NSObject

@property (assign) id<CHCSVParserDelegate> delegate;
@property (assign) BOOL recognizesBackslashesAsEscapes; // default is NO
@property (assign) BOOL sanitizesFields; // default is NO
@property (assign) BOOL recognizesComments; // default is NO
@property (assign) BOOL stripsLeadingAndTrailingWhitespace; // default is NO

@property (readonly) NSUInteger totalBytesRead;

// designated initializer
- (id)initWithInputStream:(NSInputStream *)stream usedEncoding:(NSStringEncoding *)encoding delimiter:(unichar)delimiter;

- (id)initWithCSVString:(NSString *)csv;
- (id)initWithCSVString:(NSString *)csv delimiter:(unichar)delimiter;

- (id)initWithContentsOfCSVFile:(NSString *)csvFilePath;
- (id)initWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter;

- (void)parse;
- (void)cancelParsing;

@end

@interface CHCSVWriter : NSObject

- (instancetype)initForWritingToCSVFile:(NSString *)path;
- (instancetype)initWithOutputStream:(NSOutputStream *)stream encoding:(NSStringEncoding)encoding delimiter:(unichar)delimiter;

- (void)writeField:(NSString *)field;
- (void)finishLine;

- (void)writeLineOfFields:(id<NSFastEnumeration>)fields;

- (void)writeComment:(NSString *)comment;

- (void)closeStream;

@end

#pragma mark - Convenience Categories

typedef NS_OPTIONS(NSUInteger, CHCSVParserOptions) {
    CHCSVParserOptionsRecognizesBackslashesAsEscapes = 1 << 0,
    CHCSVParserOptionsSanitizesFields = 1 << 1,
    CHCSVParserOptionsRecognizesComments = 1 << 2,
    CHCSVParserOptionsStripsLeadingAndTrailingWhitespace = 1 << 3
};

@interface NSArray (CHCSVAdditions)

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath;
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter;
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options;
+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter;
- (NSString *)CSVString;

@end

@interface NSString (CHCSVAdditions)

- (NSArray *)CSVComponents;
- (NSArray *)CSVComponentsWithDelimiter:(unichar)delimiter;
- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options;
- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter;

@end


================================================
FILE: DNSCrypt-Preference-Pane/DNSCrypt/CHCSVParser/CHCSVParser.m
================================================
//
//  CHCSVParser.m
//  CHCSVParser
/**
 Copyright (c) 2012 Dave DeLong
 
 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 "CHCSVParser.h"

NSString *const CHCSVErrorDomain = @"com.davedelong.csv";

#define CHUNK_SIZE 512
#define DOUBLE_QUOTE '"'
#define COMMA ','
#define OCTOTHORPE '#'
#define BACKSLASH '\\'

#if __has_feature(objc_arc)

#define CHCSV_HAS_ARC 1
#define CHCSV_RETAIN(_o) (_o)
#define CHCSV_RELEASE(_o)
#define CHCSV_AUTORELEASE(_o) (_o)

#else

#define CHCSV_HAS_ARC 0
#define CHCSV_RETAIN(_o) [(_o) retain]
#define CHCSV_RELEASE(_o) [(_o) release]
#define CHCSV_AUTORELEASE(_o) [(_o) autorelease]

#endif

@interface CHCSVParser ()
@property (assign) NSUInteger totalBytesRead;
@end

@implementation CHCSVParser {
    NSInputStream *_stream;
    NSStringEncoding _streamEncoding;
    NSMutableData *_stringBuffer;
    NSMutableString *_string;
    NSCharacterSet *_validFieldCharacters;
    
    NSUInteger _nextIndex;
    
    NSInteger _fieldIndex;
    NSRange _fieldRange;
    NSMutableString *_sanitizedField;
    
    unichar _delimiter;
    
    NSError *_error;
    
    NSUInteger _currentRecord;
    BOOL _cancelled;
}

- (id)initWithCSVString:(NSString *)csv {
    NSStringEncoding encoding = [csv fastestEncoding];
    NSInputStream *stream = [NSInputStream inputStreamWithData:[csv dataUsingEncoding:encoding]];
    return [self initWithInputStream:stream usedEncoding:&encoding delimiter:COMMA];
}

- (id)initWithCSVString:(NSString *)csv delimiter:(unichar)delimiter
{
    NSStringEncoding encoding = [csv fastestEncoding];
    NSInputStream *stream = [NSInputStream inputStreamWithData:[csv dataUsingEncoding:encoding]];
    return [self initWithInputStream:stream usedEncoding:&encoding delimiter:delimiter];
}

- (id)initWithContentsOfCSVFile:(NSString *)csvFilePath {
    NSInputStream *stream = [NSInputStream inputStreamWithFileAtPath:csvFilePath];
    NSStringEncoding encoding = 0;
    return [self initWithInputStream:stream usedEncoding:&encoding delimiter:COMMA];
}

- (id)initWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter
{
    NSInputStream *stream = [NSInputStream inputStreamWithFileAtPath:csvFilePath];
    NSStringEncoding encoding = 0;
    return [self initWithInputStream:stream usedEncoding:&encoding delimiter:delimiter];
}

- (id)initWithInputStream:(NSInputStream *)stream usedEncoding:(NSStringEncoding *)encoding delimiter:(unichar)delimiter {
    NSParameterAssert(stream);
    NSParameterAssert(delimiter);
    NSAssert([[NSCharacterSet newlineCharacterSet] characterIsMember:delimiter] == NO, @"The field delimiter may not be a newline");
    NSAssert(delimiter != DOUBLE_QUOTE, @"The field delimiter may not be a double quote");
    NSAssert(delimiter != OCTOTHORPE, @"The field delimiter may not be an octothorpe");
    
    self = [super init];
    if (self) {
        _stream = CHCSV_RETAIN(stream);
        [_stream open];
        
        _stringBuffer = [[NSMutableData alloc] init];
        _string = [[NSMutableString alloc] init];
        
        _delimiter = delimiter;
        
        _nextIndex = 0;
        _recognizesComments = NO;
        _recognizesBackslashesAsEscapes = NO;
        _sanitizesFields = NO;
        _sanitizedField = [[NSMutableString alloc] init];
        _stripsLeadingAndTrailingWhitespace = NO;
        
        NSMutableCharacterSet *m = [[NSCharacterSet newlineCharacterSet] mutableCopy];
        NSString *invalid = [NSString stringWithFormat:@"%c%C", DOUBLE_QUOTE, _delimiter];
        [m addCharactersInString:invalid];
        _validFieldCharacters = CHCSV_RETAIN([m invertedSet]);
        CHCSV_RELEASE(m);
        
        if (encoding == NULL || *encoding == 0) {
            // we need to determine the encoding
            [self _sniffEncoding];
            if (encoding) {
                *encoding = _streamEncoding;
            }
        } else {
            _streamEncoding = *encoding;
        }
    }
    return self;
}

- (void)dealloc {
    [_stream close];
#if !CHCSV_HAS_ARC
    [_stream release];
    [_stringBuffer release];
    [_string release];
    [_sanitizedField release];
    [_validFieldCharacters release];
    [super dealloc];
#endif
}

#pragma mark -

- (void)_sniffEncoding {
    NSStringEncoding encoding = NSUTF8StringEncoding;
    
    uint8_t bytes[CHUNK_SIZE];
    NSInteger readLength = [_stream read:bytes maxLength:CHUNK_SIZE];
    if (readLength > 0 && readLength <= CHUNK_SIZE) {
        [_stringBuffer appendBytes:bytes length:readLength];
        [self setTotalBytesRead:[self totalBytesRead] + readLength];
        
        NSInteger bomLength = 0;
        
        if (readLength > 3 && bytes[0] == 0x00 && bytes[1] == 0x00 && bytes[2] == 0xFE && bytes[3] == 0xFF) {
            encoding = NSUTF32BigEndianStringEncoding;
            bomLength = 4;
        } else if (readLength > 3 && bytes[0] == 0xFF && bytes[1] == 0xFE && bytes[2] == 0x00 && bytes[3] == 0x00) {
            encoding = NSUTF32LittleEndianStringEncoding;
            bomLength = 4;
        } else if (readLength > 3 && bytes[0] == 0x1B && bytes[1] == 0x24 && bytes[2] == 0x29 && bytes[3] == 0x43) {
            encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISO_2022_KR);
            bomLength = 4;
        } else if (readLength > 1 && bytes[0] == 0xFE && bytes[1] == 0xFF) {
            encoding = NSUTF16BigEndianStringEncoding;
            bomLength = 2;
        } else if (readLength > 1 && bytes[0] == 0xFF && bytes[1] == 0xFE) {
            encoding = NSUTF16LittleEndianStringEncoding;
            bomLength = 2;
        } else if (readLength > 2 && bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) {
            encoding = NSUTF8StringEncoding;
            bomLength = 3;
        } else {
            NSString *bufferAsUTF8 = nil;
            
            for (NSInteger triedLength = 0; triedLength < 4; ++triedLength) {
                bufferAsUTF8 = CHCSV_AUTORELEASE([[NSString alloc] initWithBytes:bytes length:readLength-triedLength encoding:NSUTF8StringEncoding]);
                if (bufferAsUTF8 != nil) {
                    break;
                }
            }
            
            if (bufferAsUTF8 != nil) {
                encoding = NSUTF8StringEncoding;
            } else {
                NSLog(@"unable to determine stream encoding; assuming MacOSRoman");
                encoding = NSMacOSRomanStringEncoding;
            }
        }
        
        if (bomLength > 0) {
            [_stringBuffer replaceBytesInRange:NSMakeRange(0, bomLength) withBytes:NULL length:0];
        }
    }
    _streamEncoding = encoding;
}

- (void)_loadMoreIfNecessary {
    NSUInteger stringLength = [_string length];
    NSUInteger reloadPortion = stringLength / 3;
    if (reloadPortion < 10) { reloadPortion = 10; }
    
    if ([_stream hasBytesAvailable] && _nextIndex+reloadPortion >= stringLength) {
        // read more from the stream
        uint8_t buffer[CHUNK_SIZE];
        NSInteger readBytes = [_stream read:buffer maxLength:CHUNK_SIZE];
        if (readBytes > 0) {
            // append it to the buffer
            [_stringBuffer appendBytes:buffer length:readBytes];
            [self setTotalBytesRead:[self totalBytesRead] + readBytes];
        }
    }
    
    if ([_stringBuffer length] > 0) {
        // try to turn the next portion of the buffer into a string
        NSUInteger readLength = [_stringBuffer length];
        while (readLength > 0) {
            NSString *readString = [[NSString alloc] initWithBytes:[_stringBuffer bytes] length:readLength encoding:_streamEncoding];
            if (readString == nil) {
                readLength--;
            } else {
                [_string appendString:readString];
                CHCSV_RELEASE(readString);
                break;
            }
        };
        
        [_stringBuffer replaceBytesInRange:NSMakeRange(0, readLength) withBytes:NULL length:0];
    }
}

- (void)_advance {
    [self _loadMoreIfNecessary];
    _nextIndex++;
}

- (unichar)_peekCharacter {
    [self _loadMoreIfNecessary];
    if (_nextIndex >= [_string length]) { return '\0'; }
    
    return [_string characterAtIndex:_nextIndex];
}

- (unichar)_peekPeekCharacter {
    [self _loadMoreIfNecessary];
    NSUInteger nextNextIndex = _nextIndex+1;
    if (nextNextIndex >= [_string length]) { return '\0'; }
    
    return [_string characterAtIndex:nextNextIndex];
}

#pragma mark -

- (void)parse {
    [self _beginDocument];
    
    _currentRecord = 0;
    while ([self _parseRecord]) {
        ; // yep;
    }
    
    if (_error != nil) {
        [self _error];
    } else {
        [self _endDocument];
    }
}

- (void)cancelParsing {
    _cancelled = YES;
}

- (BOOL)_parseRecord {
    while ([self _peekCharacter] == OCTOTHORPE && _recognizesComments) {
        [self _parseComment];
    }
    
    [self _beginRecord];
    while (1) {
        if (![self _parseField]) {
            break;
        }
        if (![self _parseDelimiter]) {
            break;
        }
    }    
    BOOL followedByNewline = [self _parseNewline];
    [self _endRecord];
    
    return (followedByNewline && _error == nil);
}

- (BOOL)_parseNewline {
    if (_cancelled) { return NO; }
    
    NSUInteger charCount = 0;
    while ([[NSCharacterSet newlineCharacterSet] characterIsMember:[self _peekCharacter]]) {
        charCount++;
        [self _advance];
    }
    return (charCount > 0);
}

- (BOOL)_parseComment {
    [self _advance]; // consume the octothorpe
    
    NSCharacterSet *newlines = [NSCharacterSet newlineCharacterSet];
    
    [self _beginComment];
    BOOL isBackslashEscaped = NO;
    while (1) {
        if (isBackslashEscaped == NO) {
            unichar next = [self _peekCharacter];
            if (next == BACKSLASH && _recognizesBackslashesAsEscapes) {
                isBackslashEscaped = YES;
                [self _advance];
            } else if ([newlines characterIsMember:next] == NO) {
                [self _advance];
            } else {
                // it's a newline
                break;
            }
        } else {
            isBackslashEscaped = YES;
            [self _advance];
        }
    }
    [self _endComment];
    
    return [self _parseNewline];
}

- (void)_parseFieldWhitespace {
    NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet];
    while ([self _peekCharacter] != '\0' &&
           [whitespace characterIsMember:[self _peekCharacter]] &&
           [self _peekCharacter] != _delimiter) {
        // if we're sanitizing fields, then these characters would be stripped (because they're not appended to _sanitizedField)
        // if we're not sanitizing fields, then they'll be included in the -substringWithRange:
        [self _advance];
    }
}

- (BOOL)_parseField {
    if (_cancelled) { return NO; }
    
    BOOL parsedField = NO;
    [self _beginField];
    if (_stripsLeadingAndTrailingWhitespace) {
        // consume leading whitespace
        [self _parseFieldWhitespace];
    }
    
    if ([self _peekCharacter] == DOUBLE_QUOTE) {
        parsedField = [self _parseEscapedField];
    } else {
        parsedField = [self _parseUnescapedField];
        if (_stripsLeadingAndTrailingWhitespace) {
            NSString *trimmedString = [_sanitizedField stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            [_sanitizedField setString:trimmedString];
        }
    }
    
    if (parsedField) {
        if (_stripsLeadingAndTrailingWhitespace) {
            // consume trailing whitespace
            [self _parseFieldWhitespace];
        }
        [self _endField];
    }
    return parsedField;
}

- (BOOL)_parseEscapedField {
    [self _advance]; // consume the opening double quote
    
    NSCharacterSet *newlines = [NSCharacterSet newlineCharacterSet];
    BOOL isBackslashEscaped = NO;
    while (1) {
        unichar next = [self _peekCharacter];
        if (next == '\0') { break; }
        
        if (isBackslashEscaped == NO) {
            if (next == BACKSLASH && _recognizesBackslashesAsEscapes) {
                isBackslashEscaped = YES;
                [self _advance]; // consume the backslash
            } else if ([_validFieldCharacters characterIsMember:next] ||
                       [newlines characterIsMember:next] ||
                       next == _delimiter) {
                [_sanitizedField appendFormat:@"%C", next];
                [self _advance];
            } else if (next == DOUBLE_QUOTE && [self _peekPeekCharacter] == DOUBLE_QUOTE) {
                [_sanitizedField appendFormat:@"%C", next];
                [self _advance];
                [self _advance];
            } else {
                // not valid, or it's not a doubled double quote
                break;
            }
        } else {
            [_sanitizedField appendFormat:@"%C", next];
            isBackslashEscaped = NO;
            [self _advance];
        }
    }
    
    if ([self _peekCharacter] == DOUBLE_QUOTE) {
        [self _advance];
        return YES;
    }
    
    return NO;
}

- (BOOL)_parseUnescapedField {
    
    BOOL isBackslashEscaped = NO;
    while (1) {
        unichar next = [self _peekCharacter];
        if (next == '\0') { break; }
        
        if (isBackslashEscaped == NO) {
            if (next == BACKSLASH && _recognizesBackslashesAsEscapes) {
                isBackslashEscaped = YES;
                [self _advance];
            } else if ([_validFieldCharacters characterIsMember:next]) {
                [_sanitizedField appendFormat:@"%C", next];
                [self _advance];
            } else {
                break;
            }
        } else {
            isBackslashEscaped = NO;
            [_sanitizedField appendFormat:@"%C", next];
            [self _advance];
        }
    }
    
    return YES;
}

- (BOOL)_parseDelimiter {
    unichar next = [self _peekCharacter];
    if (next == _delimiter) {
        [self _advance];
        return YES;
    }
    if (next != '\0' && [[NSCharacterSet newlineCharacterSet] characterIsMember:next] == NO) {
        NSString *description = [NSString stringWithFormat:@"Unexpected delimiter. Expected '%C' (0x%X), but got '%C' (0x%X)", _delimiter, _delimiter, [self _peekCharacter], [self _peekCharacter]];
        _error = [[NSError alloc] initWithDomain:CHCSVErrorDomain code:CHCSVErrorCodeInvalidFormat userInfo:@{NSLocalizedDescriptionKey : description}];
    }
    return NO;
}

- (void)_beginDocument {
    if ([_delegate respondsToSelector:@selector(parserDidBeginDocument:)]) {
        [_delegate parserDidBeginDocument:self];
    }
}

- (void)_endDocument {
    if ([_delegate respondsToSelector:@selector(parserDidEndDocument:)]) {
        [_delegate parserDidEndDocument:self];
    }
}

- (void)_beginRecord {
    if (_cancelled) { return; }
    
    _fieldIndex = 0;
    _currentRecord++;
    if ([_delegate respondsToSelector:@selector(parser:didBeginLine:)]) {
        [_delegate parser:self didBeginLine:_currentRecord];
    }
}

- (void)_endRecord {
    if (_cancelled) { return; }
    
    if ([_delegate respondsToSelector:@selector(parser:didEndLine:)]) {
        [_delegate parser:self didEndLine:_currentRecord];
    }
}

- (void)_beginField {
    if (_cancelled) { return; }
    
    [_sanitizedField setString:@""];
    _fieldRange.location = _nextIndex;
}

- (void)_endField {
    if (_cancelled) { return; }
    
    _fieldRange.length = (_nextIndex - _fieldRange.location);
    NSString *field = nil;
    
    if (_sanitizesFields) {
        field = CHCSV_AUTORELEASE([_sanitizedField copy]);
    } else {
        field = [_string substringWithRange:_fieldRange];
        if (_stripsLeadingAndTrailingWhitespace) {
            field = [field stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        }
    }
    
    if ([_delegate respondsToSelector:@selector(parser:didReadField:atIndex:)]) {
        [_delegate parser:self didReadField:field atIndex:_fieldIndex];
    }
    
    [_string replaceCharactersInRange:NSMakeRange(0, NSMaxRange(_fieldRange)) withString:@""];
    _nextIndex = 0;
    _fieldIndex++;
}

- (void)_beginComment {
    if (_cancelled) { return; }
    
    _fieldRange.location = _nextIndex;
}

- (void)_endComment {
    if (_cancelled) { return; }
    
    _fieldRange.length = (_nextIndex - _fieldRange.location);
    if ([_delegate respondsToSelector:@selector(parser:didReadComment:)]) {
        NSString *comment = [_string substringWithRange:_fieldRange];
        [_delegate parser:self didReadComment:comment];
    }
    
    [_string replaceCharactersInRange:NSMakeRange(0, NSMaxRange(_fieldRange)) withString:@""];
    _nextIndex = 0;
}

- (void)_error {
    if (_cancelled) { return; }
    
    if ([_delegate respondsToSelector:@selector(parser:didFailWithError:)]) {
        [_delegate parser:self didFailWithError:_error];
    }
}

@end

@implementation CHCSVWriter {
    NSOutputStream *_stream;
    NSStringEncoding _streamEncoding;
    
    NSData *_delimiter;
    NSData *_bom;
    NSCharacterSet *_illegalCharacters;
    
    NSUInteger _currentField;
}

- (instancetype)initForWritingToCSVFile:(NSString *)path {
    NSOutputStream *stream = [NSOutputStream outputStreamToFileAtPath:path append:NO];
    return [self initWithOutputStream:stream encoding:NSUTF8StringEncoding delimiter:COMMA];
}

- (instancetype)initWithOutputStream:(NSOutputStream *)stream encoding:(NSStringEncoding)encoding delimiter:(unichar)delimiter {
    self = [super init];
    if (self) {
        _stream = CHCSV_RETAIN(stream);
        _streamEncoding = encoding;
        
        if ([_stream streamStatus] == NSStreamStatusNotOpen) {
            [_stream open];
        }
        
        NSData *a = [@"a" dataUsingEncoding:_streamEncoding];
        NSData *aa = [@"aa" dataUsingEncoding:_streamEncoding];
        if ([a length] * 2 != [aa length]) {
            NSUInteger characterLength = [aa length] - [a length];
            _bom = CHCSV_RETAIN([a subdataWithRange:NSMakeRange(0, [a length] - characterLength)]);
            [self _writeData:_bom];
        }
        
        NSString *delimiterString = [NSString stringWithFormat:@"%C", delimiter];
        NSData *delimiterData = [delimiterString dataUsingEncoding:_streamEncoding];
        if ([_bom length] > 0) {
            _delimiter = CHCSV_RETAIN([delimiterData subdataWithRange:NSMakeRange([_bom length], [delimiterData length] - [_bom length])]);
        } else {
            _delimiter = CHCSV_RETAIN(delimiterData);
        }
        
        NSMutableCharacterSet *illegalCharacters = [[NSCharacterSet newlineCharacterSet] mutableCopy];
        [illegalCharacters addCharactersInString:delimiterString];
        [illegalCharacters addCharactersInString:@"\""];
        _illegalCharacters = [illegalCharacters copy];
        CHCSV_RELEASE(illegalCharacters);
    }
    return self;
}

- (void)dealloc {
    [self closeStream];
    
#if !CHCSV_HAS_ARC
    [_delimiter release];
    [_bom release];
    [_illegalCharacters release];
    [super dealloc];
#endif
}

- (void)_writeData:(NSData *)data {
    if ([data length] > 0) {
        const void *bytes = [data bytes];
        [_stream write:bytes maxLength:[data length]];
    }
}

- (void)_writeString:(NSString *)string {
    NSData *stringData = [string dataUsingEncoding:_streamEncoding];
    if ([_bom length] > 0) {
        stringData = [stringData subdataWithRange:NSMakeRange([_bom length], [stringData length] - [_bom length])];
    }
    [self _writeData:stringData];
}

- (void)_writeDelimiter {
    [self _writeData:_delimiter];
}

- (void)writeField:(id)field {
    if (_currentField > 0) {
        [self _writeDelimiter];
    }
    NSString *string = field ? [field description] : @"";
    if ([string rangeOfCharacterFromSet:_illegalCharacters].location != NSNotFound) {
        // replace double quotes with double double quotes
        string = [string stringByReplacingOccurrencesOfString:@"\"" withString:@"\"\""];
        // surround in double quotes
        string = [NSString stringWithFormat:@"\"%@\"", string];
    }
    [self _writeString:string];
    _currentField++;
}

- (void)finishLine {
    [self _writeString:@"\n"];
    _currentField = 0;
}

- (void)_finishLineIfNecessary {
    if (_currentField != 0) {
        [self finishLine];
    }
}

- (void)writeLineOfFields:(id<NSFastEnumeration>)fields {
    [self _finishLineIfNecessary];
    
    for (id field in fields) {
        [self writeField:field];
    }
    [self finishLine];
}

- (void)writeComment:(NSString *)comment {
    [self _finishLineIfNecessary];
    
    NSArray *lines = [comment componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];
    for (NSString *line in lines) {
        NSString *commented = [NSString stringWithFormat:@"#%@\n", line];
        [self _writeString:commented];
    }
}

- (void)closeStream {
    [_stream close];
    CHCSV_RELEASE(_stream);
    _stream = nil;
}

@end

#pragma mark - Convenience Categories

@interface _CHCSVAggregator : NSObject <CHCSVParserDelegate>

@property (readonly) NSArray *lines;
@property (readonly) NSError *error;

@end

@implementation _CHCSVAggregator {
    NSMutableArray *_lines;
    NSMutableArray *_currentLine;
}

#if !CHCSV_HAS_ARC
- (void)dealloc {
    [_currentLine release];
    [_lines release];
    [_error release];
    [super dealloc];
}
#endif

- (void)parserDidBeginDocument:(CHCSVParser *)parser {
    _lines = [[NSMutableArray alloc] init];
}

- (void)parser:(CHCSVParser *)parser didBeginLine:(NSUInteger)recordNumber {
    _currentLine = [[NSMutableArray alloc] init];
}

- (void)parser:(CHCSVParser *)parser didEndLine:(NSUInteger)recordNumber {
    [_lines addObject:_currentLine];
    CHCSV_RELEASE(_currentLine);
    _currentLine = nil;
}

- (void)parser:(CHCSVParser *)parser didReadField:(NSString *)field atIndex:(NSInteger)fieldIndex {
    [_currentLine addObject:field];
}

- (void)parser:(CHCSVParser *)parser didFailWithError:(NSError *)error {
    _error = CHCSV_RETAIN(error);
    CHCSV_RELEASE(_lines);
    _lines = nil;
}

@end

@implementation NSArray (CHCSVAdditions)

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath {
    return [self arrayWithContentsOfCSVFile:csvFilePath options:0 delimiter:COMMA];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath delimiter:(unichar)delimiter
{
    return [self arrayWithContentsOfCSVFile:csvFilePath options:0 delimiter:delimiter];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options
{
    return [self arrayWithContentsOfCSVFile:csvFilePath options:options delimiter:COMMA];
}

+ (instancetype)arrayWithContentsOfCSVFile:(NSString *)csvFilePath options:(CHCSVParserOptions)options delimiter:(unichar)delimiter {
    NSParameterAssert(csvFilePath);
    _CHCSVAggregator *aggregator = [[_CHCSVAggregator alloc] init];
    CHCSVParser *parser = [[CHCSVParser alloc] initWithContentsOfCSVFile:csvFilePath delimiter:delimiter];
    [parser setDelegate:aggregator];
    
    [parser setRecognizesBackslashesAsEscapes:!!(options & CHCSVParserOptionsRecognizesBackslashesAsEscapes)];
    [parser setSanitizesFields:!!(options & CHCSVParserOptionsSanitizesFields)];
    [parser setRecognizesComments:!!(options & CHCSVParserOptionsRecognizesComments)];
    [parser setStripsLeadingAndTrailingWhitespace:!!(options & CHCSVParserOptionsStripsLeadingAndTrailingWhitespace)];
    
    [parser parse];
    CHCSV_RELEASE(parser);
    
    NSArray *final = CHCSV_AUTORELEASE(CHCSV_RETAIN([aggregator lines]));
    CHCSV_RELEASE(aggregator);
    
    return final;
}

- (NSString *)CSVString {
    NSOutputStream *output = [NSOutputStream outputStreamToMemory];
    CHCSVWriter *writer = [[CHCSVWriter alloc] initWithOutputStream:output encoding:NSUTF8StringEncoding delimiter:COMMA];
    for (id object in self) {
        if ([object conformsToProtocol:@protocol(NSFastEnumeration)]) {
            [writer writeLineOfFields:object];
        }
    }
    [writer closeStream];
    CHCSV_RELEASE(writer);
    
    NSData *buffer = [output propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
    NSString *string = [[NSString alloc] initWithData:buffer encoding:NSUTF8StringEncoding];
    return CHCSV_AUTORELEASE(string);
}

@end

@implementation NSString (CHCSVAdditions)


- (NSArray *)CSVComponents {
    return [self CSVComponentsWithOptions:0 delimiter:COMMA];
}

- (NSArray *)CSVComponentsWithDelimiter:(unichar)delimiter
{
    return [self CSVComponentsWithOptions:0 delimiter:delimiter];
}

- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options
{
    return [self CSVComponentsWithOptions:options delimiter:COMMA];
}

- (NSArray *)CSVComponentsWithOptions:(CHCSVParserOptions)options delimiter:(unichar)delimiter {
    _CHCSVAggregator *aggregator = [[_CHCSVAggregator alloc] init];
    CHCSVParser *parser = [[CHCSVParser alloc] initWithCSVString:self delimiter:delimiter];
    [parser setDelegate:aggregator];
    
    [parser setRecognizesBackslashesAsEscapes:!!(options & CHCSVParserOptionsRecognizesBackslashesAsEscapes)];
    [parser setSanitizesFields:!!(options & CHCSVParserOptionsSanitizesFields)];
    [parser setRecognizesComments:!!(options & CHCSVParserOptionsRecognizesComments)];
    [parser setStripsLeadingAndTrailingWhitespace:!!(options & CHCSVParserOptionsStripsLeadingAndTrailingWhitespace)];
    
    [parser parse];
    CHCSV_RELEASE(parser);
    
    NSArray *final = CHCSV_AUTORELEASE(CHCSV_RETAIN([aggregator lines]));
    CHCSV_RELEASE(aggregator);
    
    return final;
}

@end


================================================
FILE: DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt-Info.plist
================================================
<?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>CFBundleDevelopmentRegion</key>
	<string>English</string>
	<key>CFBundleExecutable</key>
	<string>${EXECUTABLE_NAME}</string>
	<key>CFBundleIconFile</key>
	<string></string>
	<key>CFBundleIdentifier</key>
	<string>com.github.dnscrypt-osxclient.${PRODUCT_NAME:rfc1034identifier}</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>${PRODUCT_NAME}</string>
	<key>CFBundlePackageType</key>
	<string>BNDL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0.4</string>
	<key>CFBundleSignature</key>
	<string>????</string>
	<key>CFBundleVersion</key>
	<string>1.0.4</string>
	<key>NSHumanReadableCopyright</key>
	<string>BSD</string>
	<key>NSMainNibFile</key>
	<string>DNSCrypt</string>
	<key>NSPrefPaneIconFile</key>
	<string>dnscrypt_256.png</string>
	<key>NSPrefPaneIconLabel</key>
	<string>DNSCrypt</string>
	<key>NSPrincipalClass</key>
	<string>DNSCrypt</string>
</dict>
</plist>


================================================
FILE: DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt-Prefix.pch
================================================
//
// Prefix header for all source files of the 'DNSCrypt' target in the 'DNSCrypt' project
//

#ifdef __OBJC__
    #import <Cocoa/Cocoa.h>
#endif


================================================
FILE: DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt.h
================================================

#import <PreferencePanes/PreferencePanes.h>
#import <WebKit/WebKit.h>
#import "CHCSVParser/CHCSVParser.h"

#define kDNSCRYPT_PACKAGE_VERSION @"1.0.4"

#define kDNSCRYPT_PREFPANE_APP_PATH @"/Library/PreferencePanes/DNSCrypt.prefPane"
#define kDNSCRYPT_USR_BASE_DIR kDNSCRYPT_PREFPANE_APP_PATH @"/Contents/Resources/usr"
#define kDNSCRIPT_BIN_BASE_DIR kDNSCRYPT_USR_BASE_DIR @"/bin"
#define kDNSCRIPT_SCRIPTS_BASE_DIR kDNSCRYPT_USR_BASE_DIR @"/scripts"
#define kDNSCRYPT_VAR_BASE_DIR @"/Library/Application Support/DNSCrypt"
#define kDNSCRYPT_CONTROL_DIR kDNSCRYPT_VAR_BASE_DIR @"/control"

#define kDNSCRYPT_QUERY_LOG_FILE @"/var/log/dnscrypt-query.log"
#define kDNSCRYPT_BLACKLIST_IPS_TMP_FILE kDNSCRYPT_CONTROL_DIR @"/blacklist-ips.tmp"
#define kDNSCRYPT_BLACKLIST_DOMAINS_TMP_FILE kDNSCRYPT_CONTROL_DIR @"/blacklist-domains.tmp"
#define kDNSCRYPT_EXCEPTIONS_TMP_FILE kDNSCRYPT_CONTROL_DIR @"/exceptions.tmp"

#define kBUNDLE_IDENTIFIER @"com.github.dnscrypt-osxclient.DNSCrypt"

#define kRESOLVERS_LIST_FILE @"/usr/local/share/dnscrypt-proxy/dnscrypt-resolvers.csv"

#define kREFRESH_DELAY 2.0
#define kCHECKBOXES_AFTER_CHANGE_DELAY 8.0
#define kMAX_TRIES_AFTER_CHANGE (30 / kREFRESH_DELAY)

typedef enum {
    kDNS_CONFIGURATION_UNKNOWN, kDNS_CONFIGURATION_VANILLA, kDNS_CONFIGURATION_LOCALHOST
} DNSConfigurationState;

@interface DNSCrypt : NSPreferencePane {
    AuthorizationRef auth;
    
    NSTabView *_tabView;
    NSTabViewItem *_aboutTabViewItem;
    NSTabViewItem *_releaseNotesTabViewItem;
    
    NSButton *_dnscryptButton;
    NSButton *_fallbackButton;
    
    NSTextField *_currentResolverTextField;
    NSImageView *_statusImageView;
    NSTextField *_statusText;
    WebView *_releaseNotesWebView;
    WebView *_aboutWebView;
    NSTextFieldCell *_staticResolversTextField;
    NSTextField *_blacklistIPsTextField;
    NSTextField *_blacklistDomainsTextField;
    NSTextField *_exceptionsTextField;
    WebView *_helpWebView;
    NSButton *_viewLogButton;
    NSButton *_queryLoggingButton;
    NSPopUpButton *_resolverNamesButton;
}
@property (nonatomic, strong) IBOutlet NSTabView *tabView;
@property (nonatomic, strong) IBOutlet NSTabViewItem *aboutTabViewItem;
@property (nonatomic, strong) IBOutlet NSTabViewItem *releaseNotesTabViewItem;

@property (nonatomic, strong) IBOutlet NSButton *dnscryptButton;
@property (nonatomic, strong) IBOutlet NSButton *fallbackButton;

@property (nonatomic, strong) IBOutlet NSTextField *currentResolverTextField;
@property (nonatomic, strong) IBOutlet NSImageView *statusImageView;
@property (nonatomic, strong) IBOutlet NSTextField *statusText;
@property (nonatomic, strong) IBOutlet WebView *releaseNotesWebView;
@property (nonatomic, strong) IBOutlet WebView *aboutWebView;
@property (nonatomic, strong) IBOutlet NSTextFieldCell *staticResolversTextField;
@property (nonatomic, strong) IBOutlet NSTextField *blacklistIPsTextField;
@property (nonatomic, strong) IBOutlet NSTextField *blacklistDomainsTextField;
@property (nonatomic, strong) IBOutlet NSTextField *exceptionsTextField;
@property (nonatomic, strong) IBOutlet WebView *helpWebView;
@property (nonatomic, strong) IBOutlet NSButton *viewLogButton;
@property (nonatomic, strong) IBOutlet NSButton *queryLoggingButton;

@property (nonatomic, strong) IBOutlet NSPopUpButton *resolverNamesButton;
@property (nonatomic, strong) IBOutlet NSTextField *locationText;

@property (nonatomic, strong) IBOutlet NSButton *providerLink;

@property (nonatomic, strong) IBOutlet NSTextFieldCell *descriptionText;

- (void) mainViewDidLoad;

- (IBAction)dnscryptButtonPressed:(NSButton *)sender;
- (IBAction)fallbackButtonPressed:(NSButton *)sender;

- (IBAction)providerLinkPushed:(NSButton *)sender;
- (IBAction)uninstallPushed:(NSButton *)sender;
- (IBAction)staticResolversTextFieldChanged:(NSTextField *)sender;
- (IBAction)queryLoggingButtonPressed:(NSButtonCell *)sender;
- (IBAction)viewLogButtonPushed:(NSButton *)sender;
- (IBAction)blacklistIPsUpdated:(NSTextField *)sender;
- (IBAction)blacklistDomainsUpdated:(NSTextField *)sender;
- (IBAction)exceptionsUpdated:(NSTextField *)sender;
- (IBAction)helpButtonPressed:(NSButton *)sender;
- (IBAction)resolversNamesPopupButtonPressed:(NSPopUpButton *)sender;

@end


================================================
FILE: DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt.m
================================================

#import "DNSCrypt.h"

@implementation DNSCrypt
@synthesize tabView = _tabView;
@synthesize aboutTabViewItem = _aboutTabViewItem;
@synthesize releaseNotesTabViewItem = _releaseNotesTabViewItem;
@synthesize releaseNotesWebView = _releaseNotesWebView;
@synthesize aboutWebView = _aboutWebView;
@synthesize staticResolversTextField = _staticResolversTextField;
@synthesize blacklistIPsTextField = _blacklistIPsTextField;
@synthesize blacklistDomainsTextField = _blacklistDomainsTextField;
@synthesize helpWebView = _helpWebView;
@synthesize viewLogButton = _viewLogButton;
@synthesize queryLoggingButton = _queryLoggingButton;
@synthesize exceptionsTextField = _exceptionsTextField;
@synthesize dnscryptButton = _dnscryptButton;
@synthesize fallbackButton = _fallbackButton;
@synthesize statusImageView = _statusImageView;
@synthesize statusText = _statusText;
@synthesize currentResolverTextField = _currentResolverTextField;
@synthesize resolverNamesButton = _resolverNamesButton;

DNSConfigurationState currentState = kDNS_CONFIGURATION_UNKNOWN;
NSArray *resolversList;

- (void) setCheckBoxesEnabled: (BOOL) enabled
{
    [_dnscryptButton setEnabled: enabled];
    [_fallbackButton setEnabled: enabled];
}

- (NSString *) fromCommand: (NSString *) launchPath withArguments: (NSArray *) arguments
{
    NSPipe *pipe = [[NSPipe alloc] init];
    NSTask *task = [[NSTask alloc] init];
    NSData *data;
    NSString *result;
    task.launchPath = launchPath;
    task.arguments = arguments;
    task.standardOutput = pipe;
    [task launch];
    data = [[pipe fileHandleForReading] readDataToEndOfFile];
    [task waitUntilExit];
    result = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
    if ([result hasSuffix: @"\n"]) {
        result = [result substringToIndex: result.length - 1];
    }
    return result;
}

- (void) initState
{
    NSString *res;

    _dnscryptButton.state = 0;
    _fallbackButton.state = 0;
    
    res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-dnscrypt-status.sh", nil]];
    if ([res isEqualToString: @"yes"]) {
        [_dnscryptButton setState: 1];
    }
    res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-fallback-status.sh", nil]];
    if ([res isEqualToString: @"yes"]) {
        [_fallbackButton setState: 1];
    }
    res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-static-resolvers.sh", nil]];
    [_staticResolversTextField setStringValue: res];
    res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-query-logging-status.sh", nil]];
    if ([res isEqualToString: @"yes"]) {
        [_queryLoggingButton setState: 1];
    }
    NSString *fileContent;
    fileContent = [NSString stringWithContentsOfFile: kDNSCRYPT_BLACKLIST_IPS_TMP_FILE encoding:NSUTF8StringEncoding error: nil];
    if (fileContent != nil) {
        [_blacklistIPsTextField setStringValue: fileContent];
    }
    fileContent = [NSString stringWithContentsOfFile: kDNSCRYPT_BLACKLIST_DOMAINS_TMP_FILE encoding:NSUTF8StringEncoding error: nil];
    if (fileContent != nil) {
        [_blacklistDomainsTextField setStringValue: fileContent];
    }
    fileContent = [NSString stringWithContentsOfFile: kDNSCRYPT_EXCEPTIONS_TMP_FILE encoding:NSUTF8StringEncoding error: nil];
    if (fileContent != nil) {
        [_exceptionsTextField setStringValue: fileContent];
    }
    
    [_resolverNamesButton removeAllItems];
    
    resolversList = [NSArray arrayWithContentsOfCSVFile: kRESOLVERS_LIST_FILE options:CHCSVParserOptionsSanitizesFields | CHCSVParserOptionsStripsLeadingAndTrailingWhitespace];
    NSUInteger rows_count = [resolversList count];
    NSUInteger i;
    [_resolverNamesButton addItemWithTitle: NSLocalizedString(@"Please select a resolver", @"A resolver hasn't been selected yet")];
    res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-dnscrypt-resolver-name.sh", nil]];
    for (i = 1U; i < rows_count; i++) {
        NSArray *row = [resolversList objectAtIndex: i];
        NSString *name;
        if (row.count < 4) {
            continue;
        }
        name = [row objectAtIndex: 1];
        [_resolverNamesButton addItemWithTitle: name];
        if ([[row objectAtIndex: 0] isEqualToString: res]) {
            [_resolverNamesButton selectItemAtIndex: i];
            [self updateResolverInfo: row];
        }
    }
}

- (void) updateLedStatus
{
    NSBundle *bundle = [NSBundle bundleWithIdentifier: @"com.github.dnscrypt-osxclient.DNSCrypt"];
    switch (currentState) {
        case kDNS_CONFIGURATION_UNKNOWN:
            _statusText.stringValue = NSLocalizedString(@"Standby", @"Status");
            _statusImageView.image = [[NSImage alloc] initWithContentsOfFile: [bundle pathForImageResource: @"shield_red.png"]];
            break;
        case kDNS_CONFIGURATION_VANILLA:
            _statusText.stringValue = NSLocalizedString(@"Not using DNSCrypt", @"Status");
            _statusImageView.image = [[NSImage alloc] initWithContentsOfFile: [bundle pathForImageResource: @"shield_red.png"]];
            break;
        case kDNS_CONFIGURATION_LOCALHOST:
            _statusText.stringValue = NSLocalizedString(@"Using DNSCrypt", @"Status");
            _statusImageView.image = [[NSImage alloc] initWithContentsOfFile: [bundle pathForImageResource: @"shield_green.png"]];
            break;
        default:
            return;
    }
}

- (BOOL) updateStatusWithCurrentConfig
{
    NSString *stateDescription = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./get-current-resolvers.sh | ./get-resolvers-description.sh", nil]];
    if ([stateDescription isEqualToString: @"DNSCrypt"]) {
        currentState = kDNS_CONFIGURATION_LOCALHOST;
    } else if ([stateDescription isEqualToString: @"None"]) {
        currentState = kDNS_CONFIGURATION_UNKNOWN;
    } else if ([stateDescription isEqualToString: @"Updating"]) {
        currentState = kDNS_CONFIGURATION_UNKNOWN;
    } else if (stateDescription.length > 0) {
        currentState = kDNS_CONFIGURATION_VANILLA;
    }
    [self updateLedStatus];
    
    NSString *currentResolvers = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./get-current-resolvers.sh | ./get-upstream-resolvers.sh", nil]];
    _currentResolverTextField.stringValue = currentResolvers;
    
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./gui-pop-conf-change.sh prefpane", nil]];
    if ([res isEqualToString: @"yes"]) {
        [self initState];
    }
    [self setCheckBoxesEnabled: TRUE];
    
    return TRUE;
}

- (void) periodicallyUpdateStatusWithCurrentConfig {
    [self updateStatusWithCurrentConfig];
    [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(periodicallyUpdateStatusWithCurrentConfig) object: nil];
    [self performSelector: @selector(periodicallyUpdateStatusWithCurrentConfig) withObject:nil afterDelay: kREFRESH_DELAY];
}

- (void) showSpinners {
    NSBundle *bundle = [NSBundle bundleWithIdentifier: kBUNDLE_IDENTIFIER];
    
    [self setCheckBoxesEnabled: FALSE];
    _statusText.stringValue = NSLocalizedString(@"Updating", @"Updating network configuraiton");
    _statusImageView.image = [[NSImage alloc] initWithContentsOfFile: [bundle pathForImageResource: @"ajax-loader.gif"]];
    _currentResolverTextField.stringValue = @"";
    
    [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./gui-push-conf-change.sh menubar", nil]];
    
    [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(periodicallyUpdateStatusWithCurrentConfig) object: nil];
    [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(waitForUpdate) object: nil];
    [self performSelector: @selector(waitForUpdate) withObject: self afterDelay:kREFRESH_DELAY];
}

- (BOOL) setDNSCryptOn {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-to-dnscrypt.sh", nil]];
    (void) res;
    return TRUE;
}

- (BOOL) setDNSCryptOff {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-to-dhcp.sh", nil]];
    (void) res;
    return TRUE;
}

- (BOOL) setFallbackOn {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-fallback-on.sh", nil]];
    (void) res;
    return TRUE;
}

- (BOOL) setFallbackOff {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-fallback-off.sh", nil]];
    (void) res;
    return TRUE;
}

- (IBAction)dnscryptButtonPressed:(NSButton *)sender
{
    if (sender.state != 0) {
        [self setDNSCryptOn];
    } else {
        [self setDNSCryptOff];
    }
}

- (IBAction)fallbackButtonPressed:(NSButton *)sender
{
    if (sender.state != 0) {
        [self setFallbackOn];
    } else {
        [self setFallbackOff];
    }
}

- (void) waitForUpdate {
    NSString *res;
    static unsigned int tries;
    
    res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./get-tickets-count.sh", nil]];
    if (res.length <= 0 || [res isEqualToString: @"0"] || tries > kMAX_TRIES_AFTER_CHANGE) {
        tries = 0U;
        [self periodicallyUpdateStatusWithCurrentConfig];
        return;
    }
    tries++;
    [NSObject cancelPreviousPerformRequestsWithTarget: self selector: @selector(waitForUpdate) object: nil];
    [self performSelector: @selector(waitForUpdate) withObject: self afterDelay:kREFRESH_DELAY];
}

- (void) updateResolverInfo: (NSArray *) row {
    NSString *location = [row objectAtIndex: 3];
    _locationText.stringValue = location;
    NSString *url = [row objectAtIndex: 5];
    if (![url isEqualToString: @""]) {
        _providerLink.title = url;
        _providerLink.hidden = false;
    } else {
        _providerLink.hidden = true;
    }
    NSString *description = [row objectAtIndex: 2];
    _descriptionText.stringValue = description;
}

- (IBAction)resolversNamesPopupButtonPressed:(NSPopUpButton *)sender {
    NSUInteger i = [sender indexOfSelectedItem];
    if (i <= 0U || i >= resolversList.count) {
        return;
    }
    NSArray *row = [resolversList objectAtIndex: i];
    [self updateResolverInfo: row];
    setenv("RESOLVER_NAME", [[row objectAtIndex: 0] UTF8String], 1);
    [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./set-dnscrypt-resolver-name.sh \"$RESOLVER_NAME\"", nil]];
}

- (void) mainViewDidLoad
{
    currentState = kDNS_CONFIGURATION_UNKNOWN;
    
    [self initState];
    [self periodicallyUpdateStatusWithCurrentConfig];

    SInt32 OSXversionMajor, OSXversionMinor;
    if (Gestalt(gestaltSystemVersionMajor, &OSXversionMajor) != noErr || Gestalt(gestaltSystemVersionMinor, &OSXversionMinor) != noErr || OSXversionMajor < 10 || OSXversionMinor < 6) {
        return;
    }
    [_releaseNotesWebView setDrawsBackground:false];
    [_releaseNotesWebView setShouldUpdateWhileOffscreen:true];
    [_releaseNotesWebView setUIDelegate:self];
    
    NSURL *releaseNotesURL;
    NSString *releaseNotesURLPath = [[NSBundle bundleForClass: [self class]] pathForResource: @"releasenotes" ofType: @"html" inDirectory: @"html"];
    if (! releaseNotesURLPath || ! (releaseNotesURL = [NSURL fileURLWithPath:  releaseNotesURLPath])) {
        [_tabView removeTabViewItem:_releaseNotesTabViewItem];
    } else {
        [[_releaseNotesWebView mainFrame] loadRequest:[NSURLRequest requestWithURL: releaseNotesURL]];
    }

    [_aboutWebView setDrawsBackground:false];
    [_aboutWebView setShouldUpdateWhileOffscreen:true];
    [_aboutWebView setUIDelegate:self];
    NSURL *aboutURL;
    NSString *aboutURLPath = [[NSBundle bundleForClass: [self class]] pathForResource: @"about" ofType: @"html" inDirectory: @"html"];
    if (! aboutURLPath || ! (aboutURL = [NSURL fileURLWithPath: aboutURLPath])) {
        [_tabView removeTabViewItem: _aboutTabViewItem];
    } else {
        [[_aboutWebView mainFrame] loadRequest:[NSURLRequest requestWithURL: aboutURL]];
    }
    
    [_helpWebView setDrawsBackground:false];
    [_helpWebView setShouldUpdateWhileOffscreen:false];
    [_helpWebView setUIDelegate:self];
    NSURL *helpURL;
    NSString *helpURLPath = [[NSBundle bundleForClass: [self class]] pathForResource: @"help" ofType: @"html" inDirectory: @"html"];
    if (! helpURLPath || ! (helpURL = [NSURL fileURLWithPath: helpURLPath])) {
        assert(0);
    } else {
        [[_helpWebView mainFrame] loadRequest:[NSURLRequest requestWithURL: helpURL]];
    }
}

- (NSArray *)webView:(WebView *)sender contextMenuItemsForElement:(NSDictionary *)element
    defaultMenuItems:(NSArray *)defaultMenuItems
{
    return nil;
}

- (IBAction)providerLinkPushed:(NSButton *)sender
{
    (void) sender;
    [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString: sender.title]];
}

- (IBAction)uninstallPushed:(NSButton *)sender {
    [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_BIN_BASE_DIR @"' && /usr/bin/open ./Uninstall.app", nil]];
}

- (IBAction)staticResolversTextFieldChanged:(NSTextField *)sender {
    NSString *staticResolvers = sender.stringValue;
    NSCharacterSet *charset = [[NSCharacterSet characterSetWithCharactersInString: @"0123456789abcdefABCDEF:. "] invertedSet];
    staticResolvers = [[staticResolvers componentsSeparatedByCharactersInSet: charset] componentsJoinedByString: @" "];
    sender.stringValue = staticResolvers;
    setenv("STATIC_RESOLVERS", [staticResolvers UTF8String], 1);
    [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && exec ./set-static-resolvers.sh \"$STATIC_RESOLVERS\"", nil]];
}

- (BOOL) setQueryLoggingOn {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-query-logging-on.sh", nil]];
    (void) res;
    return TRUE;
}

- (BOOL) setQueryLoggingOff {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./switch-query-logging-off.sh", nil]];
    (void) res;
    return TRUE;
}

- (IBAction)queryLoggingButtonPressed:(NSButtonCell *)sender {
    if (sender.state != 0) {
        [self setQueryLoggingOn];
    } else {
        [self setQueryLoggingOff];
    }
}

- (IBAction)viewLogButtonPushed:(NSButton *)sender {
    [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"open /Applications/Utilities/Console.app " kDNSCRYPT_QUERY_LOG_FILE " || open " kDNSCRYPT_QUERY_LOG_FILE, nil]];
}

- (BOOL) updateBlacklistIPs {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./update-blacklist-ips.sh", nil]];
    (void) res;
    return TRUE;
}

- (IBAction)blacklistIPsUpdated:(NSTextField *)sender {
    NSString *content = sender.stringValue;
    if ([content writeToFile: kDNSCRYPT_BLACKLIST_IPS_TMP_FILE atomically: YES encoding: NSUTF8StringEncoding error: nil] != YES) {
        return;
    }
    [self updateBlacklistIPs];
}

- (BOOL) updateBlacklistDomains {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./update-blacklist-domains.sh", nil]];
    (void) res;
    return TRUE;
}

- (IBAction)blacklistDomainsUpdated:(NSTextField *)sender {
    NSString *content = sender.stringValue;
    if ([content writeToFile: kDNSCRYPT_BLACKLIST_DOMAINS_TMP_FILE atomically: YES encoding: NSUTF8StringEncoding error: nil] != YES) {
        return;
    }
    [self updateBlacklistDomains];
}

- (BOOL) updateExceptions {
    [self showSpinners];
    NSString *res = [self fromCommand: @"/bin/csh" withArguments: [NSArray arrayWithObjects: @"-c", @"cd '" kDNSCRIPT_SCRIPTS_BASE_DIR @"' && ./create-ticket.sh && ./update-exceptions.sh", nil]];
    (void) res;
    return TRUE;
}

- (IBAction)exceptionsUpdated:(NSTextField *)sender {
    NSString *content = sender.stringValue;
    if ([content writeToFile: kDNSCRYPT_EXCEPTIONS_TMP_FILE atomically: YES encoding: NSUTF8StringEncoding error: nil] != YES) {
        return;
    }
    [self updateExceptions];
}

- (IBAction)helpButtonPressed:(NSButton *)sender {
    if (_helpWebView.isHidden) {
        [_helpWebView.window makeFirstResponder: nil];
        [_helpWebView setHidden: NO];
        [_helpWebView setAlphaValue: 0.0F];
        [_helpWebView.animator setAlphaValue: 1.0F];
        [_helpWebView setDrawsBackground: TRUE];
        [_viewLogButton setHidden: YES];
        [_queryLoggingButton setHidden: YES];
    } else {
        [_helpWebView.window makeFirstResponder: nil];
        [_helpWebView setHidden: YES];
        [_queryLoggingButton setHidden: NO];
    }
}

@end


================================================
FILE: DNSCrypt-Preference-Pane/DNSCrypt/en.lproj/DNSCrypt.xib
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="5056" systemVersion="13D45a" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none">
    <dependencies>
        <deployment version="1070" defaultVersion="1060" identifier="macosx"/>
        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="5056"/>
        <plugIn identifier="com.apple.WebKitIBPlugin" version="5056"/>
    </dependencies>
    <objects>
        <customObject id="-2" userLabel="File's Owner" customClass="DNSCrypt">
            <connections>
                <outlet property="_window" destination="12" id="26"/>
                <outlet property="aboutTabViewItem" destination="356" id="376"/>
                <outlet property="aboutWebView" destination="358" id="359"/>
                <outlet property="blacklistDomainsTextField" destination="404" id="446"/>
                <outlet property="blacklistIPsTextField" destination="402" id="444"/>
                <outlet property="currentResolverTextField" destination="174" id="296"/>
                <outlet property="descriptionText" destination="2aF-7O-SkX" id="nM9-H2-22g"/>
                <outlet property="dnscryptButton" destination="179" id="363"/>
                <outlet property="exceptionsTextField" destination="406" id="452"/>
                <outlet property="fallbackButton" destination="281" id="365"/>
                <outlet property="helpWebView" destination="449" id="450"/>
                <outlet property="locationText" destination="e9H-pq-zb6" id="Elc-qh-Z8b"/>
                <outlet property="providerLink" destination="323" id="Riq-Cc-CLa"/>
                <outlet property="queryLoggingButton" destination="398" id="458"/>
                <outlet property="releaseNotesTabViewItem" destination="349" id="383"/>
                <outlet property="releaseNotesWebView" destination="354" id="355"/>
                <outlet property="resolverNamesButton" destination="yY6-5S-StG" id="GXE-Nb-8GL"/>
                <outlet property="staticResolversTextField" destination="393" id="433"/>
                <outlet property="statusImageView" destination="270" id="303"/>
                <outlet property="statusText" destination="274" id="304"/>
                <outlet property="tabView" destination="99" id="384"/>
                <outlet property="viewLogButton" destination="400" id="457"/>
            </connections>
        </customObject>
        <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
        <customObject id="-3" userLabel="Application"/>
        <window title="&lt;&lt; do not localize >>" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" deferred="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="12" userLabel="PrefPane">
            <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
            <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
            <rect key="contentRect" x="176" y="715" width="589" height="375"/>
            <rect key="screenRect" x="0.0" y="0.0" width="1366" height="746"/>
            <value key="minSize" type="size" width="224.66399999999999" height="10"/>
            <view key="contentView" id="6">
                <rect key="frame" x="0.0" y="0.0" width="589" height="375"/>
                <autoresizingMask key="autoresizingMask"/>
                <subviews>
                    <tabView initialItem="100" id="99">
                        <rect key="frame" x="13" y="10" width="563" height="359"/>
                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                        <font key="font" metaFont="system"/>
                        <tabViewItems>
                            <tabViewItem label="General" identifier="1" id="100">
                                <view key="view" id="103">
                                    <rect key="frame" x="10" y="33" width="543" height="313"/>
                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                    <subviews>
                                        <button toolTip="Use OpenDNS resolvers with the DNSCrypt protocol" id="179">
                                            <rect key="frame" x="15" y="234" width="204" height="22"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <buttonCell key="cell" type="check" title="Enable DNSCrypt" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="180">
                                                <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                                <font key="font" metaFont="systemBold" size="14"/>
                                            </buttonCell>
                                            <accessibility description="Enable DNSCrypt"/>
                                            <connections>
                                                <action selector="dnscryptButtonPressed:" target="-2" id="368"/>
                                            </connections>
                                        </button>
                                        <button id="281">
                                            <rect key="frame" x="15" y="126" width="239" height="54"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <string key="toolTip">Only check this box if you often have to connect to public WiFi hotspots and you don't want to manually disable DNSCrypt in order to pass a captive portal.</string>
                                            <buttonCell key="cell" type="check" title="Automatically disable if blocked" bezelStyle="regularSquare" imagePosition="left" alignment="left" inset="2" id="282">
                                                <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
                                                <font key="font" metaFont="system" size="14"/>
                                            </buttonCell>
                                            <accessibility description="Fallback to insecure DNS"/>
                                            <connections>
                                                <action selector="fallbackButtonPressed:" target="-2" id="372"/>
                                            </connections>
                                        </button>
                                        <textField verticalHuggingPriority="750" id="162">
                                            <rect key="frame" x="14" y="96" width="173" height="19"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Current DNS settings:" id="163">
                                                <font key="font" metaFont="system" size="16"/>
                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                            </textFieldCell>
                                        </textField>
                                        <textField verticalHuggingPriority="750" id="Wkj-kT-maK">
                                            <rect key="frame" x="278" y="208" width="173" height="19"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Location:" id="GO7-P1-scE">
                                                <font key="font" metaFont="system" size="14"/>
                                                <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                            </textFieldCell>
                                        </textField>
                                        <textField verticalHuggingPriority="750" id="174">
                                            <rect key="frame" x="14" y="-3" width="240" height="83"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="..." placeholderString="" id="175">
                                                <font key="font" size="14" name="Monaco"/>
                                                <color key="textColor" white="0.2046370968" alpha="1" colorSpace="calibratedWhite"/>
                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                            </textFieldCell>
                                        </textField>
                                        <textField verticalHuggingPriority="750" id="e9H-pq-zb6">
                                            <rect key="frame" x="345" y="200" width="200" height="27"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" placeholderString="" id="q83-P7-DNW">
                                                <font key="font" size="14" name="Monaco"/>
                                                <color key="textColor" white="0.2046370968" alpha="1" colorSpace="calibratedWhite"/>
                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                            </textFieldCell>
                                        </textField>
                                        <textField verticalHuggingPriority="750" id="rnd-WE-K61">
                                            <rect key="frame" x="278" y="46" width="261" height="150"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" placeholderString="" id="2aF-7O-SkX">
                                                <font key="font" size="14" name="Monaco"/>
                                                <color key="textColor" white="0.2046370968" alpha="1" colorSpace="calibratedWhite"/>
                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                            </textFieldCell>
                                        </textField>
                                        <textField verticalHuggingPriority="750" id="274">
                                            <rect key="frame" x="55" y="283" width="219" height="19"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="left" title="..." placeholderString="" id="275">
                                                <font key="font" size="16" name="Monaco"/>
                                                <color key="textColor" white="0.2046370968" alpha="1" colorSpace="calibratedWhite"/>
                                                <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                            </textFieldCell>
                                        </textField>
                                        <imageView id="270">
                                            <rect key="frame" x="17" y="277" width="32" height="32"/>
                                            <autoresizingMask key="autoresizingMask"/>
                                            <imageCell key="cell" refusesFirstResponder="YES" alignment="left" animates="YES" imageAlignment="topLeft" imageScaling="proportionallyDown" image="ajax-loader" id="271"/>
                                        </imageView>
                                        <box autoresizesSubviews="NO" horizontalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="276">
                                            <rect key="frame" x="270" y="2" width="4" height="300"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
                                            <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                                            <font key="titleFont" metaFont="system"/>
                                        </box>
                                        <button verticalHuggingPriority="750" id="323">
                                            <rect key="frame" x="274" y="10" width="269" height="32"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <buttonCell key="cell" type="push" title="http://www.dnscrypt.org" alternateTitle="Browse the OpenDNS web site" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="324">
                                                <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                                                <font key="font" metaFont="cellTitle"/>
                                            </buttonCell>
                                            <connections>
                                                <action selector="providerLinkPushed:" target="-2" id="HYc-qW-k00"/>
                                            </connections>
                                        </button>
                                        <box autoresizesSubviews="NO" verticalHuggingPriority="750" title="Box" boxType="separator" titlePosition="noTitle" id="345">
                                            <rect key="frame" x="17" y="193" width="240" height="5"/>
                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                                            <color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
                                            <color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                                            <font key="titleFont" metaFont="system"/>
                                        <
Download .txt
gitextract_t1_psfpw/

├── DNSCrypt-Menubar/
│   ├── COPYING
│   ├── DNSCrypt-Menubar/
│   │   ├── AppDelegate.h
│   │   ├── AppDelegate.m
│   │   ├── DNSCrypt-Menubar-Info.plist
│   │   ├── DNSCrypt-Menubar-Prefix.pch
│   │   ├── en.lproj/
│   │   │   ├── InfoPlist.strings
│   │   │   └── MainMenu.xib
│   │   └── main.m
│   ├── DNSCrypt-Menubar.xcodeproj/
│   │   ├── project.pbxproj
│   │   └── project.xcworkspace/
│   │       └── contents.xcworkspacedata
│   └── dnscrypt.icns
├── DNSCrypt-Meta-Installer/
│   ├── DNSCrypt-Meta-Installer.pkgproj
│   └── install.sh
├── DNSCrypt-OSX-Installer/
│   ├── DNSCrypt-OSX-Installer.pkgproj
│   ├── Scripts/
│   │   ├── dnscrypt-menubar-postinstall.sh
│   │   ├── dnscrypt-menubar-preinstall.sh
│   │   ├── dnscrypt-prefpane-postinstall.sh
│   │   └── dnscrypt-prefpane-preinstall.sh
│   ├── com.github.dnscrypt-osxclient.DNSCryptAfterboot.plist
│   ├── com.github.dnscrypt-osxclient.DNSCryptConsoleChange.plist
│   ├── com.github.dnscrypt-osxclient.DNSCryptControlChange.plist
│   ├── com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist
│   ├── com.github.dnscrypt-osxclient.DNSCryptNetworkChange.plist
│   └── sign.sh
├── DNSCrypt-Preference-Pane/
│   ├── COPYING
│   ├── DNSCrypt/
│   │   ├── CHCSVParser/
│   │   │   ├── CHCSVParser.h
│   │   │   └── CHCSVParser.m
│   │   ├── DNSCrypt-Info.plist
│   │   ├── DNSCrypt-Prefix.pch
│   │   ├── DNSCrypt.h
│   │   ├── DNSCrypt.m
│   │   ├── DNSCrypt.tiff
│   │   ├── en.lproj/
│   │   │   ├── DNSCrypt.xib
│   │   │   └── InfoPlist.strings
│   │   └── extra/
│   │       ├── html/
│   │       │   ├── about.haml
│   │       │   ├── about.html
│   │       │   ├── help.haml
│   │       │   ├── help.html
│   │       │   ├── releasenotes.haml
│   │       │   └── releasenotes.html
│   │       └── usr/
│   │           ├── bin/
│   │           │   └── Uninstall.app/
│   │           │       └── Contents/
│   │           │           ├── Info.plist
│   │           │           ├── MacOS/
│   │           │           │   └── applet
│   │           │           ├── PkgInfo
│   │           │           └── Resources/
│   │           │               ├── Scripts/
│   │           │               │   └── main.scpt
│   │           │               ├── applet.icns
│   │           │               ├── applet.rsrc
│   │           │               └── description.rtfd/
│   │           │                   └── TXT.rtf
│   │           └── scripts/
│   │               ├── afterboot.sh
│   │               ├── check-hijacking.sh
│   │               ├── check-local-dns.sh
│   │               ├── check-network-change.sh
│   │               ├── clear-fw.sh
│   │               ├── common.inc
│   │               ├── create-ticket.sh
│   │               ├── exceptions-add.sh
│   │               ├── exceptions-remove.sh
│   │               ├── get-current-default-domain.sh
│   │               ├── get-current-resolvers.sh
│   │               ├── get-dhcp-resolvers.sh
│   │               ├── get-dnscrypt-resolver-name.sh
│   │               ├── get-dnscrypt-status.sh
│   │               ├── get-fallback-status.sh
│   │               ├── get-query-logging-status.sh
│   │               ├── get-resolvers-description.sh
│   │               ├── get-static-resolvers.sh
│   │               ├── get-tickets-count.sh
│   │               ├── get-upstream-resolvers.sh
│   │               ├── gui-pop-conf-change.sh
│   │               ├── gui-push-conf-change.sh
│   │               ├── handle-console-change.sh
│   │               ├── handle-control-change.sh
│   │               ├── handle-network-change.sh
│   │               ├── set-dns-to-dhcp.sh
│   │               ├── set-dns.sh
│   │               ├── set-dnscrypt-resolver-name.sh
│   │               ├── set-static-resolvers.sh
│   │               ├── start-dnscrypt-proxy.sh
│   │               ├── stop-dnscrypt-proxy.sh
│   │               ├── switch-blacklists-off.sh
│   │               ├── switch-blacklists-on.sh
│   │               ├── switch-fallback-off.sh
│   │               ├── switch-fallback-on.sh
│   │               ├── switch-query-logging-off.sh
│   │               ├── switch-query-logging-on.sh
│   │               ├── switch-to-dhcp-if-required.sh
│   │               ├── switch-to-dhcp.sh
│   │               ├── switch-to-dnscrypt-if-required.sh
│   │               ├── switch-to-dnscrypt.sh
│   │               ├── update-blacklist-domains.sh
│   │               ├── update-blacklist-ips.sh
│   │               └── update-exceptions.sh
│   └── DNSCrypt.xcodeproj/
│       ├── project.pbxproj
│       └── project.xcworkspace/
│           └── contents.xcworkspacedata
├── DNSCrypt-Uninstaller/
│   └── Uninstall.scpt
├── Pages/
│   ├── feedback.haml
│   ├── feedback.php
│   ├── feedback.tpl
│   └── sent.haml
└── README.markdown
Download .txt
SYMBOL INDEX (13 symbols across 4 files)

FILE: DNSCrypt-Menubar/DNSCrypt-Menubar/AppDelegate.h
  function interface (line 10) | interface AppDelegate : NSObject <NSApplicationDelegate> {
  type DNSConfigurationState (line 23) | typedef enum {

FILE: DNSCrypt-Preference-Pane/DNSCrypt/CHCSVParser/CHCSVParser.h
  type NSInteger (line 34) | typedef NSInteger CHCSVErrorCode;

FILE: DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt.h
  type DNSConfigurationState (line 28) | typedef enum {
  function interface (line 32) | interface DNSCrypt : NSPreferencePane {

FILE: Pages/feedback.php
  function strip_slashes_from_user_data (line 8) | function strip_slashes_from_user_data(&$array) {
  function disable_magic_quotes (line 18) | function disable_magic_quotes() {
  function render_headers (line 26) | function render_headers() {
  function render_tpl (line 34) | function render_tpl($template, $vars) {
  function redirect_to_sent_page (line 50) | function redirect_to_sent_page($uri) {
  function _send_email (line 56) | function _send_email($name, $email, $feedback) {
  function send_form (line 65) | function send_form($name, $email, $feedback) {
  function process_feedback (line 72) | function process_feedback(&$errors, &$name, &$email, &$feedback) {
Condensed preview — 99 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (335K chars).
[
  {
    "path": "DNSCrypt-Menubar/COPYING",
    "chars": 809,
    "preview": "/*\n * Copyright (c) 2011-2014 OpenDNS, Inc.\n * Copyright (c) 2014 AlterStep\n *\n * Permission to use, copy, modify, and d"
  },
  {
    "path": "DNSCrypt-Menubar/DNSCrypt-Menubar/AppDelegate.h",
    "chars": 1349,
    "preview": "\n#import <Cocoa/Cocoa.h>\n\n#define kDNSCRYPT_PREFPANE_APP_PATH @\"/Library/PreferencePanes/DNSCrypt.prefPane\"\n#define kDNS"
  },
  {
    "path": "DNSCrypt-Menubar/DNSCrypt-Menubar/AppDelegate.m",
    "chars": 7552,
    "preview": "\n#import \"AppDelegate.h\"\n\n@implementation AppDelegate\n@synthesize statusResolversMenuItem = _statusResolversMenuItem;\n@s"
  },
  {
    "path": "DNSCrypt-Menubar/DNSCrypt-Menubar/DNSCrypt-Menubar-Info.plist",
    "chars": 1201,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "DNSCrypt-Menubar/DNSCrypt-Menubar/DNSCrypt-Menubar-Prefix.pch",
    "chars": 163,
    "preview": "//\n// Prefix header for all source files of the 'DNSCrypt-Menubar' target in the 'DNSCrypt-Menubar' project\n//\n\n#ifdef _"
  },
  {
    "path": "DNSCrypt-Menubar/DNSCrypt-Menubar/en.lproj/InfoPlist.strings",
    "chars": 45,
    "preview": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "DNSCrypt-Menubar/DNSCrypt-Menubar/en.lproj/MainMenu.xib",
    "chars": 2916,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3"
  },
  {
    "path": "DNSCrypt-Menubar/DNSCrypt-Menubar/main.m",
    "chars": 134,
    "preview": "\n#import <Cocoa/Cocoa.h>\n\nint main(int argc, char *argv[])\n{\n    nice(10);\n    return NSApplicationMain(argc, (const cha"
  },
  {
    "path": "DNSCrypt-Menubar/DNSCrypt-Menubar.xcodeproj/project.pbxproj",
    "chars": 15999,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "DNSCrypt-Menubar/DNSCrypt-Menubar.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 161,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:DNSCrypt-Menuba"
  },
  {
    "path": "DNSCrypt-Meta-Installer/DNSCrypt-Meta-Installer.pkgproj",
    "chars": 16349,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "DNSCrypt-Meta-Installer/install.sh",
    "chars": 196,
    "preview": "#! /bin/sh\n\nenv > /tmp/a\ntdir=$(mktemp -d /tmp/XXXXXXXXXXXXXXXX)\nchmod 755 \"$tdir\"\ntar x -z -C \"$tdir\" -f pkg.tgz\n(sleep"
  },
  {
    "path": "DNSCrypt-OSX-Installer/DNSCrypt-OSX-Installer.pkgproj",
    "chars": 66558,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "DNSCrypt-OSX-Installer/Scripts/dnscrypt-menubar-postinstall.sh",
    "chars": 206,
    "preview": "#! /bin/sh\n\nexec 2>/dev/null\n\n/bin/launchctl load \\\n  '/Library/LaunchAgents/com.github.dnscrypt-osxclient.DNSCryptMenuB"
  },
  {
    "path": "DNSCrypt-OSX-Installer/Scripts/dnscrypt-menubar-preinstall.sh",
    "chars": 805,
    "preview": "#! /bin/sh\n\nexec 2>/dev/null\n\n/bin/launchctl stop com.opendns.osx.RoamingClientMenubar\n/bin/launchctl remove com.opendns"
  },
  {
    "path": "DNSCrypt-OSX-Installer/Scripts/dnscrypt-prefpane-postinstall.sh",
    "chars": 1640,
    "preview": "#! /bin/sh\n\nexec 2>/dev/null\n\n/bin/mkdir -p '/Library/Application Support/DNSCrypt/control'\n/bin/mkdir -p '/Library/Appl"
  },
  {
    "path": "DNSCrypt-OSX-Installer/Scripts/dnscrypt-prefpane-preinstall.sh",
    "chars": 2320,
    "preview": "#! /bin/sh\n\nexec 2>/dev/null\n\nkillall 'System Preferences'\n\n/bin/rm -rf '/Library/Application Support/DNSCrypt Updater'\n"
  },
  {
    "path": "DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptAfterboot.plist",
    "chars": 809,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-/Apple/DTD PLIST 1.0/EN\" \"http:/www.apple.com/DTDs/Prope"
  },
  {
    "path": "DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptConsoleChange.plist",
    "chars": 940,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-/Apple/DTD PLIST 1.0/EN\" \"http:/www.apple.com/DTDs/Prope"
  },
  {
    "path": "DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptControlChange.plist",
    "chars": 937,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-/Apple/DTD PLIST 1.0/EN\" \"http:/www.apple.com/DTDs/Prope"
  },
  {
    "path": "DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptMenuBar.plist",
    "chars": 538,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "DNSCrypt-OSX-Installer/com.github.dnscrypt-osxclient.DNSCryptNetworkChange.plist",
    "chars": 932,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-/Apple/DTD PLIST 1.0/EN\" \"http:/www.apple.com/DTDs/Prope"
  },
  {
    "path": "DNSCrypt-OSX-Installer/sign.sh",
    "chars": 813,
    "preview": "#! /bin/sh\n\nVERSION='1.0.4'\n\ncd build || exit 1\n[ -d DNSCrypt.mpkg ] || exit 1\n\n(\ncd DNSCrypt.mpkg/Contents/Packages || "
  },
  {
    "path": "DNSCrypt-Preference-Pane/COPYING",
    "chars": 1049,
    "preview": "/*\n * Copyright (c) 2011-2014 OpenDNS, Inc.\n * Copyright (c) 2014 AlterStep\n *\n * Permission to use, copy, modify, and d"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/CHCSVParser/CHCSVParser.h",
    "chars": 4221,
    "preview": "//\n//  CHCSVParser.h\n//  CHCSVParser\n/**\n Copyright (c) 2012 Dave DeLong\n \n Permission is hereby granted, free of charge"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/CHCSVParser/CHCSVParser.m",
    "chars": 26675,
    "preview": "//\n//  CHCSVParser.m\n//  CHCSVParser\n/**\n Copyright (c) 2012 Dave DeLong\n \n Permission is hereby granted, free of charge"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt-Info.plist",
    "chars": 1120,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt-Prefix.pch",
    "chars": 147,
    "preview": "//\n// Prefix header for all source files of the 'DNSCrypt' target in the 'DNSCrypt' project\n//\n\n#ifdef __OBJC__\n    #imp"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt.h",
    "chars": 4235,
    "preview": "\n#import <PreferencePanes/PreferencePanes.h>\n#import <WebKit/WebKit.h>\n#import \"CHCSVParser/CHCSVParser.h\"\n\n#define kDNS"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/DNSCrypt.m",
    "chars": 18173,
    "preview": "\n#import \"DNSCrypt.h\"\n\n@implementation DNSCrypt\n@synthesize tabView = _tabView;\n@synthesize aboutTabViewItem = _aboutTab"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/en.lproj/DNSCrypt.xib",
    "chars": 40368,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.XIB\" version=\"3"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/en.lproj/InfoPlist.strings",
    "chars": 45,
    "preview": "/* Localized versions of Info.plist keys */\n\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/html/about.haml",
    "chars": 2080,
    "preview": "!!! 5\n%html{lang: \"en\"}\n  %head\n    %meta{charset: \"utf-8\"}\n    %title About DNSCrypt-OSXClient\n    %style{type: \"text/c"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/html/about.html",
    "chars": 2282,
    "preview": "<!DOCTYPE html>\n<html lang='en'>\n  <head>\n    <meta charset='utf-8'>\n    <title>About DNSCrypt-OSXClient</title>\n    <st"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/html/help.haml",
    "chars": 4106,
    "preview": "!!! 5\n%html{lang: \"en\"}\n  %head\n    %meta{charset: \"utf-8\"}\n    %title Help (advanced settings)\n    %style{type: \"text/c"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/html/help.html",
    "chars": 4583,
    "preview": "<!DOCTYPE html>\n<html lang='en'>\n  <head>\n    <meta charset='utf-8'>\n    <title>Help (advanced settings)</title>\n    <st"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/html/releasenotes.haml",
    "chars": 2303,
    "preview": "!!! 5\n%html{lang: \"en\"}\n  %head\n    %meta{charset: \"utf-8\"}\n    %title Release notes for DNSCrypt-OSXClient by AlterStep"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/html/releasenotes.html",
    "chars": 2743,
    "preview": "<!DOCTYPE html>\n<html lang='en'>\n  <head>\n    <meta charset='utf-8'>\n    <title>Release notes for DNSCrypt-OSXClient by "
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/bin/Uninstall.app/Contents/Info.plist",
    "chars": 1299,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/bin/Uninstall.app/Contents/PkgInfo",
    "chars": 8,
    "preview": "APPLaplt"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/bin/Uninstall.app/Contents/Resources/description.rtfd/TXT.rtf",
    "chars": 102,
    "preview": "{\\rtf1\\ansi\\ansicpg1252\\cocoartf1265\\cocoasubrtf200\n{\\fonttbl}\n{\\colortbl;\\red255\\green255\\blue255;}\n}"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/afterboot.sh",
    "chars": 131,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nrm -f \"$QUERY_LOG_FILE\"\nrm -f \"$DEBUG_LOG_FILE\"\n\n./clear-fw.sh\n\nexec ./handle-control-change"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/check-hijacking.sh",
    "chars": 708,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\ntry_resolution() {\n  exec alarmer 5 dig +tries=2 +time=3 +short google-public-dns-a.google.c"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/check-local-dns.sh",
    "chars": 209,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\ntry_local_resolution() {\n  exec dig +tries=2 +time=3 +short google-public-dns-a.google.com @"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/check-network-change.sh",
    "chars": 618,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nNETWORK_STATE_FILE=\"${STATES_DIR}/network-state\"\nDHCP_DNS_FILE=\"${STATES_DIR}/dhcp-dns\"\nAIRP"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/clear-fw.sh",
    "chars": 387,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nexec >/dev/null\nexec 2>&1\n\nSOCKETFILTERFW='/usr/libexec/ApplicationFirewall/socketfilterfw'\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/common.inc",
    "chars": 2451,
    "preview": "DNSCRYPT_USR_BASE_DIR='/Library/PreferencePanes/DNSCrypt.prefPane/Contents/Resources/usr'\nDNSCRYPT_VAR_BASE_DIR='/Librar"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/create-ticket.sh",
    "chars": 139,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nticket_file=$(mktemp \"$TICKETS_DIR/ticket-XXXXXXXXXX\")\n[ -e \"$ticket_file\" ] || exit 1\nbasen"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/exceptions-add.sh",
    "chars": 1489,
    "preview": "#! /bin/sh\n\nRESOLVER_DIR='/etc/resolver'\n\n. ./common.inc\n\n[ -r \"$EXCEPTIONS_FILE\" ] &&\n  DOMAINS_EXCEPTIONS=\"$(cat \"$EXC"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/exceptions-remove.sh",
    "chars": 243,
    "preview": "#! /bin/sh\n\nRESOLVER_DIR='/etc/resolver'\n\n. ./common.inc\n\n[ -r \"$EXCEPTIONS_FILE\" ] &&\n  DOMAINS_EXCEPTIONS=\"$(cat \"$EXC"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-current-default-domain.sh",
    "chars": 257,
    "preview": "#! /bin/ksh\n\n. ./common.inc\n\n[ -r /etc/resolv.conf ] || exit 0\ndomain=\"\"\nwhile read line; do\n  case \"$line\" in\n    domai"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-current-resolvers.sh",
    "chars": 453,
    "preview": "#! /bin/ksh\n\n. ./common.inc\n\n[ -r /etc/resolv.conf ] || exit 0\nips_i=\"\"\nwhile read line; do\n  case \"$line\" in\n    namese"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-dhcp-resolvers.sh",
    "chars": 525,
    "preview": "#! /bin/ksh\n\n. ./common.inc\n\nifs=$(ifconfig -a | \\\n  awk '/^[^ \t:]*:/ { sub(/:.*$/,empty); iface=$0 } /status: active/ {"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-dnscrypt-resolver-name.sh",
    "chars": 180,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\n[ -r \"$DNSCRYPT_RESOLVER_NAME_FILE\" ] && \\\n  sed 's/[^a-zA-Z0-9.-]/_/g' < \"$DNSCRYPT_RESOLVE"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-dnscrypt-status.sh",
    "chars": 94,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nif [ -e \"$DNSCRYPT_FILE\" ]; then\n  echo 'yes'\nelse\n  echo 'no'\nfi\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-fallback-status.sh",
    "chars": 94,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nif [ -e \"$FALLBACK_FILE\" ]; then\n  echo 'yes'\nelse\n  echo 'no'\nfi\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-query-logging-status.sh",
    "chars": 99,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nif [ -e \"$QUERY_LOGGING_FILE\" ]; then\n  echo 'yes'\nelse\n  echo 'no'\nfi\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-resolvers-description.sh",
    "chars": 603,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nif [ -e \"${STATES_DIR}/updating\" ]; then\n  echo 'Updating'\n  exit 0\nfi\nname='None'\nlevel=0\nw"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-static-resolvers.sh",
    "chars": 110,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\n[ -r \"$STATIC_RESOLVERS_FILE\" ] && cat \"$STATIC_RESOLVERS_FILE\" && exit 0\nexit 1\n\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-tickets-count.sh",
    "chars": 103,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nexec find \"$TICKETS_DIR\" -type f -name 'ticket-*' | wc -l | sed 's/ *//g'\n\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/get-upstream-resolvers.sh",
    "chars": 536,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\ndnscrypt_proxy_used='no'\nupstream_resolvers=''\nwhile read resolver; do\n  case \"$resolver\" in"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/gui-pop-conf-change.sh",
    "chars": 275,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\n[ $# != 1 ] && exit 1\n\npname=\"$1\"\ncase \"$pname\" in\n  menubar) ;;\n  prefpane) ;;\n  *) exit 1;"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/gui-push-conf-change.sh",
    "chars": 171,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\n[ $# != 1 ] && exit 1\n\npname=\"$1\"\ncase \"$pname\" in\n  menubar) ;;\n  prefpane) ;;\n  *) exit 1;"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/handle-console-change.sh",
    "chars": 643,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\neval $(stat -s '/dev/console') || exit 1\n\nlogger_debug \"OSX console ownership changed\"\n\nwant"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/handle-control-change.sh",
    "chars": 796,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nPROCESSED_TICKETS_FILE=\"${STATES_DIR}/processed-tickets\"\n\nupdate() {\n  lockfile -1 -r 30 \"$H"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/handle-network-change.sh",
    "chars": 478,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\ntickets_count=$(./get-tickets-count.sh)\n[ \"$tickets_count\" != '0' ] && exit 0\n\nif [ x\"$1\" !="
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/set-dns-to-dhcp.sh",
    "chars": 707,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nservers='empty'\n\nlogger_debug \"Changing the DNS configuration to use the default DNS resolve"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/set-dns.sh",
    "chars": 384,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nservers=\"$*\"\n\n[ $# -lt 1 ] && exit 1\n\nlogger_debug \"Setting DNS resolvers to [$servers]\"\n\nex"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/set-dnscrypt-resolver-name.sh",
    "chars": 239,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\n[ $# -lt 1 ] && exit 1\n\nresolver_name=\"$1\"\n\nif [ \"$resolver_name\" = \"\" ]; then\n  rm -f \"$DNS"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/set-static-resolvers.sh",
    "chars": 275,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nargs=\"$*\"\n\n[ $# -lt 1 ] && exit 1\n\nservers=''\nfor server in $args; do\n  servers=\"${servers} "
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/start-dnscrypt-proxy.sh",
    "chars": 4508,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nDNSCRYPT_LIB_BASE_DIR=\"${DNSCRYPT_USR_BASE_DIR}/lib\"\nexport DYLD_LIBRARY_PATH=\"${DNSCRYPT_LI"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/stop-dnscrypt-proxy.sh",
    "chars": 537,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nlogger_debug \"Stopping dnscrypt-proxy\"\n\nif [ -x /usr/bin/pgrep ]; then\n  pgrep -x dnscrypt-p"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-blacklists-off.sh",
    "chars": 56,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nexec rm -f \"$BLOCKING_FILE\"\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-blacklists-on.sh",
    "chars": 419,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nplugin_args=''\n\n[ -s \"$BLACKLIST_IPS_FILE\" ] && \\\n  plugin_args=\"${plugin_args},--ips='${BLA"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-fallback-off.sh",
    "chars": 51,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nrm -f \"$FALLBACK_FILE\"\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-fallback-on.sh",
    "chars": 51,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\ntouch \"$FALLBACK_FILE\"\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-query-logging-off.sh",
    "chars": 57,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nrm -f \"$QUERY_LOGGING_FILE\"\n\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-query-logging-on.sh",
    "chars": 143,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\necho \"libdcplugin_example_logging.la,${QUERY_LOG_FILE}\" > \\\n  \"$QUERY_LOGGING_FILE\"\n\ntouch \""
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-to-dhcp-if-required.sh",
    "chars": 112,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\n[ -e \"$DNSCRYPT_FILE\" ] && exit 0\n\n./exceptions-remove.sh\nexec ./set-dns-to-dhcp.sh\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-to-dhcp.sh",
    "chars": 52,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nrm -f \"$DNSCRYPT_FILE\"\n\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-to-dnscrypt-if-required.sh",
    "chars": 1412,
    "preview": "#! /bin/ksh\n\n. ./common.inc\n\nPAUSE_MAX=10\nPAUSE_INCREMENT=0.1\n\n[ ! -e \"$DNSCRYPT_FILE\" ] && exit 0\n\nlogger_debug \"DNSCry"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/switch-to-dnscrypt.sh",
    "chars": 51,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\ntouch \"$DNSCRYPT_FILE\"\n"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/update-blacklist-domains.sh",
    "chars": 428,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nif [ ! -s \"$BLACKLIST_DOMAINS_TMP_FILE\" ]; then\n  rm -f \"$BLACKLIST_DOMAINS_FILE\" \"$BLACKLIS"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/update-blacklist-ips.sh",
    "chars": 340,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nif [ ! -s \"$BLACKLIST_IPS_TMP_FILE\" ]; then\n  rm -f \"$BLACKLIST_IPS_FILE\" \"$BLACKLIST_IPS_TM"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt/extra/usr/scripts/update-exceptions.sh",
    "chars": 297,
    "preview": "#! /bin/sh\n\n. ./common.inc\n\nif [ ! -s \"$EXCEPTIONS_TMP_FILE\" ]; then\n  rm -f \"$EXCEPTIONS_FILE\" \"$EXCEPTIONS_TMP_FILE\"\n "
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt.xcodeproj/project.pbxproj",
    "chars": 19242,
    "preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 46;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
  },
  {
    "path": "DNSCrypt-Preference-Pane/DNSCrypt.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "chars": 153,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:DNSCrypt.xcodep"
  },
  {
    "path": "Pages/feedback.haml",
    "chars": 1526,
    "preview": "!!! 5\n%html{lang: \"en\"}\n  %head\n    %meta{charset: \"utf-8\"}\n    %title DNSCrypt feedback form\n    %style{type: \"text/css"
  },
  {
    "path": "Pages/feedback.php",
    "chars": 3644,
    "preview": "<?php\n\nerror_reporting(E_ALL);\n\ndefine('FEEDBACK_RECIPIENT', 'DNSCrypt Feedback <dnscrypt@example.com>');\ndefine('FEEDBA"
  },
  {
    "path": "Pages/feedback.tpl",
    "chars": 1637,
    "preview": "<!DOCTYPE html>\n<html lang='en'>\n  <head>\n    <meta charset='utf-8' />\n    <title>DNSCrypt feedback form</title>\n    <st"
  },
  {
    "path": "Pages/sent.haml",
    "chars": 313,
    "preview": "!!! 5\n%html{lang: \"en\"}\n  %head\n    %meta{charset: \"utf-8\"}\n    %meta{\"http-equiv\" => \"refresh\", content: \"5; url=feedba"
  },
  {
    "path": "README.markdown",
    "chars": 519,
    "preview": "OSX client for managing the DNSCrypt Proxy\n==========================================\n\nThe purpose of this application i"
  }
]

// ... and 7 more files (download for full content)

About this extraction

This page contains the full source code of the opendns/dnscrypt-osx-client GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 99 files (281.1 KB), approximately 85.6k tokens, and a symbol index with 13 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!