Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save MagerValp/3ca4a77f42b4d8644fb9 to your computer and use it in GitHub Desktop.
Save MagerValp/3ca4a77f42b4d8644fb9 to your computer and use it in GitHub Desktop.
com.apple.pkg.RegionalBoot
NAME
docket
DESCRIPTION
'docket' is a core foundation tool that can add/delete apps or docs in the Dock.app property list file (THIS IS NOT THE SAME AS WHAT IS FOUND IN USERs PREFERENCE apple.com.dock.plist FILE). The added entries can be placed either in the 'apps' or 'docs' section of the dock.
SYNOPSIS
docket add -type app -position 2 -file "/Applications/Mail.app" default.plist
docket add -type app -position -2 -file "/Applications/Dock Extras/Displays.dock/" -tileType dockling default.plist
docket add -type doc -position -1 -file "http://www.apple.com/macosx" -tileType url -label "Apple - Mac OS X" default.plist
docket delete -type app -file "/Applications/Mail.app" default.plist
docket display -type app default.plist
COMMAND ARGUMENT DEFINITIONS
-- add file to the dock section
docket add -type <(app | doc)> -file <pathToFile>
[-position <num>] [-label <str>]
[-tiletype <(url | dockling | file)>] <DockResourcePlist>
-- delete file from the dock section
docket delete -type <(app | doc)> -file <appName> <DockResourcePlist>
-- display the files in the dock section
docket display -type <(app | doc)> <DockResourcePlist>
Verbs:
add add the file to the dock section (delete existing
instance of file in this section).
delete delete first found instance of the file from the
specified dock section.
display display entries of the dock section.
Options:
Required:
-type (app | doc) section of the doc to operate on. 'App' refers to
the application section, 'doc' refers to the document
section.
-file <pathToFile> the fully qualified path of the file to add to
the dock section. These paths should be fully qualified.
If the file is a URL, the URL needs to be fully qualified
as well (e.g., http:////www.apple.com/macosx). A directory
reference is distinguished from a file reference by the
'pathToFile' argument containing a '/' as its last
character.
Optional:
-position <number> the position in the dock section to add the file.
A positive number will place the entry at the left-most
position of the dock section. A negative number will place
the entry at the right-most position of the dock section.
The leftmost position is '1', the right-most position is
'-1'. A position value of '0' will result in placement at
the rightmost. The default is '0'.
-label <str> The label to display to the user. This is of use only
when the tile type is a url.
-tileType (url | dockling | file) Identifies the type of dock tile
added. The default is 'file'.
Argument:
<DockResourcePlist> the property list file to operate upon. (see
note in INIITIALIZATION section for qualifications).
INITIALIZATION
Property list file containing minimally, entries up-to and including the 'persistent-apps' and 'persistent-others' keys. Refer to '/System/Library/CoreServices/Dock.app/Contents/Resources/English.lproj/default.plist' for a sample.
. 40755 0/0
./._private 40755 0/0 0 0
./._usr 40755 0/0 0 0
./private 40755 0/0
./private/var 40755 0/0
./private/var/db 40755 0/0
./private/var/db/._docket 100755 0/0 0 0
./private/var/db/._locsetup.plist 100755 0/0 0 0
./private/var/db/docket 100755 0/0 21136 3011547098
./private/var/db/locsetup.plist 100755 0/0 12066 979095458
./usr 40755 0/0
./usr/sbin 40755 0/0
./usr/sbin/._locsetup 100755 0/0 0 0
./usr/sbin/locsetup 100755 0/0 16698 2339425464
<?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>InstallDate</key>
<date>2014-06-28T08:41:26Z</date>
<key>InstallPrefixPath</key>
<string>/</string>
<key>InstallProcessName</key>
<string>installer</string>
<key>PackageFileName</key>
<string>CPU_RegionalBoot.pkg</string>
<key>PackageIdentifier</key>
<string>com.apple.pkg.RegionalBoot</string>
<key>PackageVersion</key>
<string>0</string>
</dict>
</plist>
#!/usr/bin/perl
use strict;
use File::Path;
use Getopt::Long;
use Time::HiRes;
use File::Glob ':glob';
use Foundation;
use POSIX 'setsid';
use Encode;
use File::Basename;
use File::Find;
my $starttime = Time::HiRes::time();
my $receipts = "/Library/Receipts";
my $cleandir = "/var/tmp/.cleanup";
my $configfile = "/var/db/locsetup.plist";
my $logcookie = "/var/db/.logsetup";
my $dockTool = "/var/db/docket";
my $warrantyCookie = "/var/db/.ShowHardwareWarranty";
my $logflag = ( -e $logcookie );
my ( $country, $language );
my $debug = 0;
my $analyze = 0;
my $tmpentry = 0;
my @cleanupdirs;
my $CPU_ModelProperty;
my $photoBoothPath = "/Applications/Photo Booth.app";
my @nonCameraCPUs = ('MacPro1,1', 'MacPro2,1', 'Macmini1,1', 'Macmini2,1');
my %no_camera = ();
for (@nonCameraCPUs) { $no_camera{$_} = 1 } # creates a test hash for non camera CPUs
my @serverCPUs = ('');
my %server = ();
for (@serverCPUs) { $server{$_} = 1 } # creates a test hash for Server CPUs
mkdir $cleandir unless ( -d $cleandir );
$logflag && open LOGF, '>>/var/tmp/setuploc.log';
logtime("Starting");
GetOptions(
'country=s' => \$country,
'language=s' => \$language,
'debug' => \$debug,
'analyze' => \$analyze,
)
|| die;
chomp ( $CPU_ModelProperty = `sysctl -n hw.model` );
( $country && $language )
|| die "-country and -language are required";
logprint("Country: $country Language: $language CPUModel: $CPU_ModelProperty");
my $configref = readconfig($configfile);
my ( $delpkgs, $cpumove ) = determinedel($configref, $CPU_ModelProperty); #new
my $entityhints = getentityhints($configref);
if ($analyze) {
my @keeppkg = @{ $configref->{Packages} };
my @del = @$delpkgs;
my $move = $$cpumove; #new
foreach my $matchpkg (@del) {
$matchpkg = quotemeta $matchpkg;
@keeppkg = grep !m|$matchpkg|, @keeppkg;
}
#unless ($no_camera{$CPU_ModelProperty}) {
# print "Would have added Photo Booth to the dock. $CPU_ModelProperty\n";
#}
print "Keep:\n";
print( join "\n", @keeppkg );
print "\n\nClean up:\n";
print( join "\n", @del );
print "\n\nMove:\n";
print( join "\n", $move );
cpumovedelete($cpumove);
}
else {
#configureServer() if ($server{$CPU_ModelProperty});
#deleteServer() unless ($server{$CPU_ModelProperty});
rmpkgs($delpkgs);
#addBoothToDock() unless ($no_camera{$CPU_ModelProperty});
cpumovedelete($cpumove);
removeAPCert() if ($country =~ /JP/);
cleanemptydirs();
renameitems($configref);
makealiases($configref);
cleanuptmp();
lsregister();
$debug || cleanself();
}
logtime("Finished");
$logflag && close LOGF;
exit 0;
sub configureServer {
my $src = '/Library/Documentation/CPU_server';
my $dest = '/System/Library/CoreServices/Dock.app/Contents/Resources';
$debug || system('usr/bin/ditto', $src, $dest) || warn "could not ditto $src, $dest";
}
sub deleteServer {
my $serverPath = '/Applications/Server.app';
if ( -e $serverPath ) {
# Move Server.app to cleanup dir.
$debug || moveToTmp( $serverPath ) || warn "could not move $serverPath";
}
}
sub cpumovedelete {
my $src = shift;
my $dest = "/Library/Documentation/";
my @purgeDirs = `cd $dest; ls -l | grep CPU_`;
logtime("Dittoing items");
logprint("Dittoing $$src to /Library/Documentation/");
if ($analyze)
{
print "\n\nDelete CPU:\n";
print "Would have ditto'd $$src up one level\n";
#print "Would have moved $$src to cleanup dir.\n";
foreach my $purgeDir (@purgeDirs){
print "Would have moved $purgeDir to cleanup dir.\n";
}
}
unless ( $analyze )
{
# ditto the CPU specific files up one level.
$debug || system('usr/bin/ditto', $$src, $dest) || warn "could not ditto $$src, $dest";
foreach my $line (@purgeDirs){
$line =~ /\s+(\S+)$/;
my $dir = $1;
my $purge = $dest . $dir;
logtime("Moving $purge to clean up dir.");
$debug || moveToTmp( $purge ); # Move ...CPU_* to cleanup dir.
}
}
logtime("Finished Dittoing items");
}
sub rmpkgs {
my $delpkgs = shift;
# This snippet is left here in case CPUSW/Marketing decides to remove Photo Booth from non-camera CPUs.
# This technique can be used for other OS installed files/apps which have no receipts.
#if ($no_camera{$CPU_ModelProperty}){
# logprint("removing Photo Booth...");
# $debug || moveToTmp($photoBoothPath); || warn "could not move $photoBoothPath";
#}
logprint( "Processing " . ( join " ", @$delpkgs ) );
chdir "/";
foreach my $rmpk (@$delpkgs) {
logtime("Beginning deletion of $rmpk");
my $receipt = catfile( $receipts, $rmpk );
next unless ( -d $receipt );
my $bom = catfile( $receipt, "Contents/Archive.bom" );
next unless ( -f $bom );
my @files = @{ simpletick( "/usr/bin/lsbom", "-f", "-l", "-s", $bom ) };
my @dirs = @{ simpletick( "/usr/bin/lsbom", "-d", "-s", $bom ) };
my @entities;
my @entregex = map { qr/$_/ } @$entityhints;
foreach my $exp (@entregex) {
push( @entities, ( grep ( /$exp/, @dirs ) ) );
}
@entities = sort @entities;
logprint("Found movable entities: ");
logprint( join " ", @entities );
foreach my $foundapp (@entities) {
next unless ( -d $foundapp );
my $apppat = quotemeta($foundapp);
$apppat = qr/$apppat/;
@files = grep !m|$apppat|, @files;
@dirs = grep !m|$apppat|, @dirs;
moveToTmp($foundapp);
}
push( @cleanupdirs, @dirs );
foreach my $rmfile (@files) {
logprint("removing $rmfile");
$debug || unlink $rmfile || warn "could not unlink $rmfile";
}
$debug || File::Path::rmtree($receipt);
logtime("Finished deletion of $rmpk");
}
}
sub readconfig {
my $configfile = shift;
my $configdict = NSDictionary->dictionaryWithContentsOfFile_($configfile);
my $config = Foundation::perlRefFromObjectRef($configdict);
return $config;
}
sub determinedel {
my $configref = shift;
my $modelprop = shift; # new
my $cpu; #new
my $cpuswtomove;
my @allpkgs;
my @addback;
my @exceptions;
my ( %ccaddback, %cpuaddback, %cpumodels, %cpuexceptions, %allcpusw, %ccexceptions, %langaddback, %langexceptions ); # new
@allpkgs = @{ $configref->{Packages} } if ( ref $configref->{Packages} );
%ccaddback = %{ $configref->{CCAddBack} } if ( ref $configref->{CCAddBack} );
%cpuaddback = %{ $configref->{CPUAddBack} } if ( ref $configref->{CPUAddBack} );
%cpumodels = %{ $configref->{ModelProperties} } if ( ref $configref->{ModelProperties} );
%ccexceptions = %{ $configref->{CCExceptions} } if ( ref $configref->{CCExceptions} );
%langaddback = %{ $configref->{LanguageAddBack} } if ( ref $configref->{LanguageAddBack} );
%langexceptions = %{ $configref->{LanguageExceptions} } if ( ref $configref->{LanguageExceptions} );
%cpuexceptions = %{ $configref->{CPUExceptions} } if ( ref $configref->{CPUExceptions} );
%allcpusw = %{ $configref->{CPUSW} } if ( ref $configref->{CPUSW} );
$cpu = $cpumodels{$modelprop} if ( exists $cpumodels{$modelprop} );
$cpuswtomove = $allcpusw{$cpu} if ( exists $allcpusw{$cpu} );
push( @exceptions, @{ $ccexceptions{$country} } ) if ( ref $ccexceptions{$country} );
push( @exceptions, @{ $langexceptions{$language} } ) if ( ref $langexceptions{$language} );
push( @exceptions, @{ $cpuexceptions{$cpu} } ) if ( ref $cpuexceptions{$cpu} );
push( @addback, @{ $ccaddback{$country} } ) if ( ref $ccaddback{$country} );
push( @addback, @{ $langaddback{$language} } ) if ( ref $langaddback{$language} );
push( @addback, @{ $cpuaddback{$cpu} } ) if ( ref $cpuaddback{$cpu} );
@exceptions = map { qr/$_/ } @exceptions;
foreach my $exp (@exceptions) {
@allpkgs = grep ( !/$exp/, @allpkgs );
}
if ($country !~ /FR/) {
push( @addback, "CPU_TousComptesFaits.pkg" ) # Only install this to FR.
}
# Ditto up the Help before rmpkgs for FR so we don't lose it.
if ($country =~ /FR/) {
my $frcpuswtomove = $cpuswtomove . "Help/";
my $frdest = "/Library/Documentation/Help/";
logtime("Dittoing items");
logprint("Dittoing $frcpuswtomove to /Library/Documentation/Help/");
if ($analyze){
print "\n\nDelete CPU:\n";
print "Would have ditto'd $frcpuswtomove up one level $frcpuswtomove\n";
}
unless ( $analyze ) {
# ditto the CPU specific files up one level.
$debug || system('usr/bin/ditto', $frcpuswtomove, $frdest) || warn "could not ditto $frcpuswtomove, $frdest";
}
}
push( @allpkgs, @addback );
return ( \@allpkgs, \$cpuswtomove );
}
sub getentityhints {
my $configref = shift;
my @entityhints;
if ( ref $configref->{EntityHints} ) {
@entityhints = @{ $configref->{EntityHints} };
}
else {
@entityhints = ('\.app$');
}
return \@entityhints;
}
sub getRenamePaths {
my $configref = shift;
my %renamepaths;
if ( ref $configref->{RenamePaths} ) {
%renamepaths = %{ $configref->{RenamePaths} };
}
return \%renamepaths;
}
sub cleanuptmp {
logtime("Beginning deletion of moved files");
chmod 0700, $cleandir;
my $pid = fork;
return undef unless ( defined $pid );
return if $pid;
POSIX::setsid;
$debug || exec( "/usr/bin/nice", "-19", "/bin/rm", "-rf", $cleandir );
}
sub lsregister {
logtime("Updating LaunchServices");
my @lscmd = ( '/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister' );
push ( @lscmd, '-lazy', '5', '-f', '-r', '/Applications' );
my $pid = fork;
return undef unless ( defined $pid );
return if $pid;
POSIX::setsid;
POSIX::setuid( 501 );
exec ( @lscmd );
}
sub cleanself {
logtime("Cleaning up");
unlink $configfile;
unlink $dockTool if ( -e $dockTool );
$logflag && unlink $logcookie;
unlink $warrantyCookie if ( -e $warrantyCookie );
unlink $0 if ( -e $0 );
}
sub cleanemptydirs {
logtime("Cleaning up empty directories");
@cleanupdirs = sort { $b cmp $a } @cleanupdirs;
my $lastdir;
foreach my $rmdir (@cleanupdirs) {
next if ( $lastdir eq $rmdir );
opendir TESTDIR, $rmdir || next;
my $entries = scalar( grep !/^\.\.?$/, readdir TESTDIR );
next if $entries;
logprint("rmdir $rmdir");
$debug || rmdir $rmdir || warn "could not rmdir $rmdir";
$lastdir = $rmdir;
}
logtime("Finished cleaning up empty directories");
}
sub renameitems {
my $config = shift;
logtime("Renaming items");
my %renames = %{ getRenamePaths($config) };
RENAME: foreach my $renamepath ( keys %renames ) {
my @matches = glob($renamepath);
@matches = sort(@matches);
my $src;
foreach my $match (@matches) {
next RENAME if ( $match eq $renames{$renamepath} );
$src = $match;
}
next unless $src;
if ( -e $renames{$renamepath} ) {
moveToTmp( $renames{$renamepath} );
}
logprint("Moving $src to $renames{$renamepath}");
$debug || rename $src, $renames{$renamepath};
}
logtime("Finished Renaming items");
}
sub makealiases {
my $config = shift;
logtime("Creating Aliases");
my %aliases;
my $aliaslog;
if ( ref $config->{Aliases} ) {
%aliases = %{ $config->{Aliases} };
}
foreach my $alias ( keys %aliases ) {
next unless ( -e $alias );
logprint("Creating loclink from $alias to $aliases{$alias}");
unless ( $debug ) {
loclink ( $alias, $aliases{$alias} );
}
}
logtime("Finished Creating Aliases");
}
sub loclink {
my $src = shift;
my $dest = shift;
my $target;
if ( $src =~ m|\/(.*?)\.localized\/?$| ) {
my $stringsKey = basename( $1 );
my $stringsFile = catfile( $src, ".localized", $language . ".strings" );
if ( -e $stringsFile ) {
open STRINGF, "<:encoding(UTF-16)", $stringsFile;
while (<STRINGF>) {
if ( $_ =~ /\"(.*)\"\s+=\s+\"(.*)\"/ ) {
my $key = encode_utf8($1);
$target = encode_utf8($2);
$stringsKey = encode_utf8($stringsKey);
undef $target unless ( $key =~ /$stringsKey/i );
}
}
close STRINGF;
}
else {
$target = $stringsKey;
}
}
else {
$target = $src;
$target =~ s|/$||;
$target = basename ( $target );
}
my $finalDest = catfile( $dest, $target );
logprint("Creating symlink from $src to $finalDest");
symlink( $src, $finalDest );
}
sub moveToTmp {
my $src = shift;
my $dest = catfile( $cleandir, $tmpentry++ );
$debug || mkdir($dest);
logprint("Moving $src to $dest");
$debug || rename $src, $dest;
}
sub catfile {
my $result = join "/", @_;
$result =~ s/\/+/\//g;
return $result;
}
sub simpletick {
my @cmd = @_;
my @results;
my $pid = open OUTPIPE, "-|";
return undef unless ( defined $pid );
if ($pid) {
while (<OUTPIPE>) {
chomp;
push( @results, $_ );
}
close OUTPIPE;
}
else {
exec(@cmd) || warn "Failed to exec $cmd[0]: $!";
exit;
}
return \@results;
}
sub logtime {
return unless ( $logflag || $debug );
my $msg = shift;
my $time = Time::HiRes::time();
my $dat = gmtime($time);
$logflag && print LOGF $dat . " GMT ", ( $time - $starttime ), " seconds elapsed *** $msg\n";
$debug && print $dat . " GMT ", ( $time - $starttime ), " seconds elapsed *** $msg\n";
}
sub logprint {
return unless ( $logflag || $debug );
my $msg = join( ' ', @_ );
$logflag && print LOGF $msg . "\n";
$debug && print $msg . "\n";
}
sub removeAPCert{ # for Japan
# Delete Aiport Cert for JA.
my $filePath = "/Library/Documentation/User Information.localized/";
my $APCert = "AirPort";
my %wanted = ( wanted => sub
{
# Handle APCert as a regex
if ($_ =~ /$APCert/) {
logprint("removing $_");
$debug || unlink $_ || warn "could not unlink $_";
}
}
);
### Find and delete APCert
File::Find::find(\%wanted, $filePath); # Remove APCert.
}
sub addBoothToDock { # for Camera CPUs
# Adds Photo Booth to the Dock.
my $dockPath = "/System/Library/User Template/";
my $dockPlist = "com.apple.dock.plist";
my $userPath = 'glob ("/Users/*/Library/Preferences/")';
my %wanted = ( wanted => sub
{
# Handle booth as a regex
if ($_ =~ /^$dockPlist$/){
logprint("Adding Photo Booth to the Dock!");
my @cmd = ("/var/db/docket", "add", "-type", "app", "-file", "/Applications/Photo Booth.app", "-position", "15");
### push the full plist file path onto the command
push (@cmd, $File::Find::name);
logprint("Adjust Dock command: @cmd");
$debug || {my $stat = simpletick(@cmd)};
}
}
);
### If Photo Booth is present, add it to the Dock.
File::Find::find(\%wanted, $dockPath); # Add Photo Booth to the Dock if present.
## Now copy over the altered plist to the new user prefs once the user is created.
my $counter = 0; # But only wait max of 4 seconds incase of Multi sync.
while ( ! -e eval $userPath )
{
; # Make sure a user has been created, do nothing until.
logprint("Counter => $counter");
$counter += 1;
sleep 1;
return if ($counter >= 4);
}
$userPath = eval $userPath;
my @cmd3 = ("/bin/cp", "/System/Library/User\ Template/English.lproj/Library/Preferences/com.apple.dock.plist", $userPath);
logprint("Copy altered plist command: @cmd3");
print "Copy plist command: @cmd3\n";
my $debug || {my $stat = simpletick(@cmd3)};
$logflag && print LOGF "Added PhotoBooth Dock Icon for camera CPU: $CPU_ModelProperty" . "\n";
}
<?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>Aliases</key>
<dict>
<key>/Library/Documentation/User Information.localized</key>
<string>/</string>
</dict>
<key>CCAddBack</key>
<dict>
<key>FR</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>US</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
</dict>
<key>CCExceptions</key>
<dict>
<key>CA</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>DE</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>FR</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>US</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
</dict>
<key>CPUAddBack</key>
<dict>
<key>EMAC</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
<key>IMAC1</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
<key>IMAC2</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
<key>IMAC3</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
<key>MACBOOK</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
<key>MACBOOK2</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
<key>MACBOOKPRO</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
<key>MACMINI</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
<key>MACPRO</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
<key>MACPRO2</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
</dict>
<key>CPUExceptions</key>
<dict>
<key>EMAC</key>
<array>
<string>CPU_UG_emac.pkg</string>
</array>
<key>IMAC1</key>
<array>
<string>CPU_UG_imac1.pkg</string>
</array>
<key>IMAC2</key>
<array>
<string>CPU_UG_imac2.pkg</string>
</array>
<key>IMAC3</key>
<array>
<string>CPU_UG_imac3.pkg</string>
</array>
<key>MACBOOK</key>
<array>
<string>CPU_UG_macbook.pkg</string>
</array>
<key>MACBOOKAIR41</key>
<array>
<string>CPU_UG_macbookair41.pkg</string>
</array>
<key>MACBOOKAIR42</key>
<array>
<string>CPU_UG_macbookair42.pkg</string>
</array>
<key>MACBOOKPRO</key>
<array>
<string>CPU_UG_macbookpro.pkg</string>
</array>
<key>MACMINI</key>
<array>
<string>CPU_UG_macmini.pkg</string>
</array>
<key>MACMINI51</key>
<array>
<string>CPU_UG_macmini51.pkg</string>
</array>
<key>MACMINI52</key>
<array>
<string>CPU_UG_macmini52.pkg</string>
</array>
<key>MACMINI53</key>
<array>
<string>CPU_UG_macmini53.pkg</string>
</array>
<key>MACPRO</key>
<array>
<string>CPU_UG_macpro.pkg</string>
</array>
<key>MACPRO2</key>
<array>
<string>CPU_UG_macpro2.pkg</string>
</array>
</dict>
<key>CPUSW</key>
<dict>
<key>IMAC</key>
<string>/Library/Documentation/CPU_imac/</string>
<key>IMAC1</key>
<string>/Library/Documentation/CPU_imac1/</string>
<key>IMAC131</key>
<string>/Library/Documentation/CPU_imac131/</string>
<key>IMAC132</key>
<string>/Library/Documentation/CPU_imac132/</string>
<key>IMAC133</key>
<string>/Library/Documentation/CPU_imac133/</string>
<key>IMAC141</key>
<string>/Library/Documentation/CPU_imac141/</string>
<key>IMAC142</key>
<string>/Library/Documentation/CPU_imac142/</string>
<key>IMAC143</key>
<string>/Library/Documentation/CPU_imac143/</string>
<key>IMAC144</key>
<string>/Library/Documentation/CPU_imac144/</string>
<key>IMAC2</key>
<string>/Library/Documentation/CPU_imac2/</string>
<key>IMAC3</key>
<string>/Library/Documentation/CPU_imac3/</string>
<key>MACBOOKAIR41</key>
<string>/Library/Documentation/CPU_macbookair41/</string>
<key>MACBOOKAIR42</key>
<string>/Library/Documentation/CPU_macbookair42/</string>
<key>MACBOOKAIR51</key>
<string>/Library/Documentation/CPU_macbookair51/</string>
<key>MACBOOKAIR52</key>
<string>/Library/Documentation/CPU_macbookair52/</string>
<key>MACBOOKAIR61</key>
<string>/Library/Documentation/CPU_macbookair61/</string>
<key>MACBOOKAIR62</key>
<string>/Library/Documentation/CPU_macbookair62/</string>
<key>MACBOOKPRO</key>
<string>/Library/Documentation/CPU_macbookpro/</string>
<key>MACBOOKPRO1</key>
<string>/Library/Documentation/CPU_macbookpro1/</string>
<key>MACBOOKPRO101</key>
<string>/Library/Documentation/CPU_macbookpro101/</string>
<key>MACBOOKPRO102</key>
<string>/Library/Documentation/CPU_macbookpro102/</string>
<!-- J44 -->
<key>MACBOOKPRO111</key>
<string>/Library/Documentation/CPU_macbookpro111/</string>
<!-- J45 -->
<key>MACBOOKPRO112</key>
<string>/Library/Documentation/CPU_macbookpro112/</string>
<!-- J45g -->
<key>MACBOOKPRO113</key>
<string>/Library/Documentation/CPU_macbookpro113/</string>
<key>MACBOOKPRO2</key>
<string>/Library/Documentation/CPU_macbookpro2/</string>
<key>MACBOOKPRO3</key>
<string>/Library/Documentation/CPU_macbookpro3/</string>
<key>MACBOOKPRO91</key>
<string>/Library/Documentation/CPU_macbookpro91/</string>
<key>MACBOOKPRO92</key>
<string>/Library/Documentation/CPU_macbookpro92/</string>
<key>MACMINI</key>
<string>/Library/Documentation/CPU_macmini/</string>
<key>MACMINI51</key>
<string>/Library/Documentation/CPU_macmini51/</string>
<key>MACMINI52</key>
<string>/Library/Documentation/CPU_macmini52/</string>
<key>MACMINI53</key>
<string>/Library/Documentation/CPU_macmini53/</string>
<key>MACMINI61</key>
<string>/Library/Documentation/CPU_macmini61/</string>
<key>MACMINI62</key>
<string>/Library/Documentation/CPU_macmini62/</string>
<key>MACPRO</key>
<string>/Library/Documentation/CPU_macpro/</string>
<key>MACPRO2</key>
<string>/Library/Documentation/CPU_macpro2/</string>
<!-- J90 -->
<key>MACPRO61</key>
<string>/Library/Documentation/CPU_macpro61/</string>
</dict>
<key>EntityHints</key>
<array>
<string>\.app$</string>
<string>\.pkg$</string>
<string>/Library/Documentation/CPU_[^/]*?$</string>
</array>
<key>LanguageAddBack</key>
<dict>
<key>da</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>de</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>es</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>fi</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>fr</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>it</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>ja</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>ko</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>nb</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>nl</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>pl</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>pt</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>pt_BR</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>pt_PT</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>ru</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>sv</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>zh-Hans</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>zh-Hant</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
</dict>
<key>LanguageExceptions</key>
<dict>
<key>da</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>de</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>en</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>es</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>fi</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>fr</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>it</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>ja</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>ko</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>nb</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>nl</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>pl</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>pt</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>pt_BR</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>pt_PT</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>ru</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>sv</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>zh-Hans</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
<key>zh-Hant</key>
<array>
<string>CPU_PLACEHOLDER.pkg</string>
</array>
</dict>
<key>ModelProperties</key>
<dict>
<key>MacBook7,1</key>
<string>MACBOOK1</string>
<key>MacBook7,2</key>
<string>MACBOOK</string>
<key>MacBookAir1,1</key>
<string>MACBOOK2</string>
<key>MacBookAir2,1</key>
<string>MACBOOK2</string>
<key>MacBookAir4,1</key>
<string>MACBOOKAIR41</string>
<key>MacBookAir4,2</key>
<string>MACBOOKAIR42</string>
<key>MacBookAir5,1</key>
<string>MACBOOKAIR51</string>
<key>MacBookAir5,2</key>
<string>MACBOOKAIR52</string>
<key>MacBookAir6,1</key>
<string>MACBOOKAIR61</string>
<key>MacBookAir6,2</key>
<string>MACBOOKAIR62</string>
<key>MacBookPro1,1</key>
<string>MACBOOKPRO</string>
<key>MacBookPro1,2</key>
<string>MACBOOKPRO</string>
<key>MacBookPro10,1</key>
<string>MACBOOKPRO101</string>
<key>MacBookPro10,2</key>
<string>MACBOOKPRO102</string>
<!-- J44 -->
<key>MacBookPro11,1</key>
<string>MACBOOKPRO111</string>
<!-- J45 -->
<key>MacBookPro11,2</key>
<string>MACBOOKPRO112</string>
<!-- J45g -->
<key>MacBookPro11,3</key>
<string>MACBOOKPRO113</string>
<key>MacBookPro7,1</key>
<string>MACBOOKPRO2</string>
<key>MacBookPro7,2</key>
<string>MACBOOKPRO1</string>
<key>MacBookPro8,1</key>
<string>MACBOOKPRO</string>
<key>MacBookPro8,2</key>
<string>MACBOOKPRO1</string>
<key>MacBookPro8,3</key>
<string>MACBOOKPRO2</string>
<key>MacBookPro9,1</key>
<string>MACBOOKPRO91</string>
<key>MacBookPro9,2</key>
<string>MACBOOKPRO92</string>
<key>MacPro4,1</key>
<string>MACPRO</string>
<key>MacPro5,1</key>
<string>MACPRO</string>
<!-- J90 -->
<key>MacPro6,1</key>
<string>MACPRO61</string>
<key>Macmini5,1</key>
<string>MACMINI51</string>
<key>Macmini5,2</key>
<string>MACMINI52</string>
<key>Macmini5,3</key>
<string>MACMINI53</string>
<key>Macmini6,1</key>
<string>MACMINI61</string>
<key>Macmini6,2</key>
<string>MACMINI62</string>
<key>iMac10,1</key>
<string>IMAC</string>
<key>iMac11,1</key>
<string>IMAC</string>
<key>iMac11,2</key>
<string>IMAC1</string>
<key>iMac11,3</key>
<string>IMAC1</string>
<key>iMac12,1</key>
<string>IMAC</string>
<key>iMac12,2</key>
<string>IMAC</string>
<key>iMac13,1</key>
<string>IMAC131</string>
<key>iMac13,2</key>
<string>IMAC132</string>
<key>iMac13,3</key>
<string>IMAC133</string>
<key>iMac14,1</key>
<string>IMAC141</string>
<key>iMac14,2</key>
<string>IMAC142</string>
<key>iMac14,3</key>
<string>IMAC143</string>
<key>iMac14,4</key>
<string>IMAC144</string>
<key>iMac5,2</key>
<string>IMAC2</string>
<key>iMac6,1</key>
<string>IMAC1</string>
<key>iMac7,1</key>
<string>IMAC3</string>
<key>iMac8,1</key>
<string>IMAC3</string>
<key>iMac9,1</key>
<string>IMAC</string>
</dict>
<key>Packages</key>
<array>
<string>CPU_PLACEHOLDER</string>
</array>
<key>RenamePaths</key>
<dict>
<key>/Applications/Office 2004 for Mac Test Drive*</key>
<string>/Applications/Office 2004 for Mac Test Drive</string>
</dict>
</dict>
</plist>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment