Rename Xcode project to honeyDue and fix all bundle IDs

- Rename iosApp.xcodeproj → honeyDue.xcodeproj
- Rename Casera schemes → HoneyDue, HoneyDueExtension, HoneyDueUITests
- Split bundle IDs per-config: Debug=com.tt.honeyDue.dev, Release=com.tt.honeyDue
- Split app groups per-config: Debug=group.com.tt.honeyDue.dev, Release=group.com.tt.honeyDue
- Fix com.t-t. typo → com.tt. in test bundle IDs
- Add APP_GROUP_IDENTIFIER build setting with variable substitution in entitlements
- Replace all hardcoded app group strings in Swift with Info.plist runtime reads
- Remove stale PRODUCT_BUNDLE_IDENTIFIER from Config.xcconfig
- Update test plan container references

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-03-07 07:45:12 -06:00
parent 8941d4f458
commit e9f80075c1
21 changed files with 110 additions and 64 deletions

View File

@@ -24,7 +24,7 @@
"SimpleLoginTest\/testCanTypeInLoginFields()"
],
"target" : {
"containerPath" : "container:iosApp.xcodeproj",
"containerPath" : "container:honeyDue.xcodeproj",
"identifier" : "1CBF1BEC2ECD9768001BF56C",
"name" : "HoneyDueUITests"
}

View File

@@ -1,7 +1,6 @@
TEAM_ID=
PRODUCT_NAME=honeyDue
PRODUCT_BUNDLE_IDENTIFIER=com.tt.honeyDue.HoneyDue$(TEAM_ID)
CURRENT_PROJECT_VERSION=1
MARKETING_VERSION=1.0

View File

@@ -147,7 +147,9 @@ struct OpenTaskIntent: AppIntent {
final class WidgetActionManager {
static let shared = WidgetActionManager()
private let appGroupIdentifier = "group.com.tt.honeyDue.HoneyDueDev"
private let appGroupIdentifier: String = {
Bundle.main.infoDictionary?["AppGroupIdentifier"] as? String ?? "group.com.tt.honeyDue.dev"
}()
private let pendingTasksFileName = "widget_pending_tasks.json"
private let tokenKey = "widget_auth_token"
private let dirtyFlagKey = "widget_tasks_dirty"

View File

@@ -1,6 +1,7 @@
{
"images" : [
{
"filename" : "icon.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"

View File

@@ -110,7 +110,9 @@ class CacheManager {
}
}
private static let appGroupIdentifier = "group.com.tt.honeyDue.HoneyDueDev"
private static let appGroupIdentifier: String = {
Bundle.main.infoDictionary?["AppGroupIdentifier"] as? String ?? "group.com.tt.honeyDue.dev"
}()
private static let tasksFileName = "widget_tasks.json"
/// Get the shared App Group container URL

View File

@@ -2,6 +2,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>AppGroupIdentifier</key>
<string>$(APP_GROUP_IDENTIFIER)</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>

View File

@@ -4,7 +4,7 @@
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.tt.honeyDue.HoneyDueDev</string>
<string>$(APP_GROUP_IDENTIFIER)</string>
</array>
</dict>
</plist>

View File

@@ -0,0 +1,37 @@
{
"configurations" : [
{
"id" : "F0DABEBB-1E5F-4A1A-BFDC-5AAA8635B8BA",
"name" : "Test Scheme Action",
"options" : {
}
}
],
"defaultOptions" : {
"performanceAntipatternCheckerEnabled" : true,
"targetForVariableExpansion" : {
"containerPath" : "container:honeyDue.xcodeproj",
"identifier" : "D4ADB376A7A4CFB73469E173",
"name" : "HoneyDue"
}
},
"testTargets" : [
{
"parallelizable" : true,
"target" : {
"containerPath" : "container:honeyDue.xcodeproj",
"identifier" : "1C685CD12EC5539000A9669B",
"name" : "HoneyDueTests"
}
},
{
"target" : {
"containerPath" : "container:honeyDue.xcodeproj",
"identifier" : "1CBF1BEC2ECD9768001BF56C",
"name" : "HoneyDueUITests"
}
}
],
"version" : 1
}

View File

@@ -5,7 +5,7 @@ import XCTest
/// SETUP REQUIREMENTS:
/// This test suite requires the app to be UNINSTALLED before running.
/// Add a Pre-action script to the honeyDueUITests scheme (Edit Scheme Test Pre-actions):
/// /usr/bin/xcrun simctl uninstall booted com.tt.honeyDue.HoneyDueDev
/// /usr/bin/xcrun simctl uninstall booted com.tt.honeyDue.dev
/// exit 0
///
/// There is ONE fresh-install test that runs the complete onboarding flow.

View File

@@ -44,14 +44,14 @@
containerPortal = 6A3E1D84F9F1A2FD92A75A6C /* Project object */;
proxyType = 1;
remoteGlobalIDString = D4ADB376A7A4CFB73469E173;
remoteInfo = iosApp;
remoteInfo = honeyDue;
};
1CBF1BF32ECD9768001BF56C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 6A3E1D84F9F1A2FD92A75A6C /* Project object */;
proxyType = 1;
remoteGlobalIDString = D4ADB376A7A4CFB73469E173;
remoteInfo = iosApp;
remoteInfo = honeyDue;
};
/* End PBXContainerItemProxy section */
@@ -457,7 +457,7 @@
packageProductDependencies = (
1C81F38F2EE69AF1000739EA /* PostHog */,
);
productName = iosApp;
productName = honeyDue;
productReference = 96A3DDC05E14B3F83E56282F /* HoneyDue.app */;
productType = "com.apple.product-type.application";
};
@@ -493,7 +493,7 @@
};
};
};
buildConfigurationList = F25B3A5CCAC6BFCC21CD4636 /* Build configuration list for PBXProject "iosApp" */;
buildConfigurationList = F25B3A5CCAC6BFCC21CD4636 /* Build configuration list for PBXProject "honeyDue" */;
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
@@ -664,6 +664,7 @@
0248CABA5A5197845F2E5C26 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
APP_GROUP_IDENTIFIER = group.com.tt.honeyDue;
ARCHS = arm64;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
@@ -688,7 +689,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueDev;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -718,7 +719,8 @@
);
MARKETING_VERSION = 1.0;
OTHER_SWIFT_FLAGS = "-DWIDGET_EXTENSION";
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueDev.HoneyDueDev;
APP_GROUP_IDENTIFIER = group.com.tt.honeyDue.dev;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.dev.HoneyDueExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -753,7 +755,8 @@
);
MARKETING_VERSION = 1.0;
OTHER_SWIFT_FLAGS = "-DWIDGET_EXTENSION";
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueDev.HoneyDueDev;
APP_GROUP_IDENTIFIER = group.com.tt.honeyDue;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueExtension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -777,7 +780,7 @@
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.t-t.HoneyDueTests";
PRODUCT_BUNDLE_IDENTIFIER = com.tt.HoneyDueTests;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@@ -803,7 +806,7 @@
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.t-t.HoneyDueTests";
PRODUCT_BUNDLE_IDENTIFIER = com.tt.HoneyDueTests;
PRODUCT_NAME = "$(TARGET_NAME)";
STRING_CATALOG_GENERATE_SYMBOLS = NO;
SWIFT_APPROACHABLE_CONCURRENCY = YES;
@@ -836,7 +839,7 @@
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueDev.HoneyDueQLPreview;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.dev.HoneyDueQLPreview;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -867,7 +870,7 @@
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueDev.HoneyDueQLPreview;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueQLPreview;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -898,7 +901,7 @@
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueDev.HoneyDueQLThumbnail;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.dev.HoneyDueQLThumbnail;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -929,7 +932,7 @@
"@executable_path/../../Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueDev.HoneyDueQLThumbnail;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueQLThumbnail;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -952,7 +955,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 26.1;
MACOSX_DEPLOYMENT_TARGET = 26.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.t-t.HoneyDueUITests";
PRODUCT_BUNDLE_IDENTIFIER = com.tt.HoneyDueUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = auto;
STRING_CATALOG_GENERATE_SYMBOLS = NO;
@@ -978,7 +981,7 @@
IPHONEOS_DEPLOYMENT_TARGET = 26.1;
MACOSX_DEPLOYMENT_TARGET = 26.1;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.t-t.HoneyDueUITests";
PRODUCT_BUNDLE_IDENTIFIER = com.tt.HoneyDueUITests;
PRODUCT_NAME = "$(TARGET_NAME)";
SDKROOT = auto;
STRING_CATALOG_GENERATE_SYMBOLS = NO;
@@ -1121,6 +1124,7 @@
E767E942685C7832D51FF978 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
APP_GROUP_IDENTIFIER = group.com.tt.honeyDue.dev;
ARCHS = arm64;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
@@ -1145,7 +1149,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.HoneyDueDev;
PRODUCT_BUNDLE_IDENTIFIER = com.tt.honeyDue.dev;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
@@ -1209,7 +1213,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
F25B3A5CCAC6BFCC21CD4636 /* Build configuration list for PBXProject "iosApp" */ = {
F25B3A5CCAC6BFCC21CD4636 /* Build configuration list for PBXProject "honeyDue" */ = {
isa = XCConfigurationList;
buildConfigurations = (
80B0F01D77D413305F161C14 /* Debug */,

View File

@@ -18,7 +18,7 @@
BlueprintIdentifier = "D4ADB376A7A4CFB73469E173"
BuildableName = "honeyDue.app"
BlueprintName = "HoneyDue"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
@@ -36,7 +36,7 @@
BlueprintIdentifier = "1C685CD12EC5539000A9669B"
BuildableName = "HoneyDueTests.xctest"
BlueprintName = "HoneyDueTests"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
@@ -58,7 +58,7 @@
BlueprintIdentifier = "D4ADB376A7A4CFB73469E173"
BuildableName = "honeyDue.app"
BlueprintName = "HoneyDue"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
@@ -74,7 +74,7 @@
BlueprintIdentifier = "D4ADB376A7A4CFB73469E173"
BuildableName = "honeyDue.app"
BlueprintName = "HoneyDue"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>

View File

@@ -19,7 +19,7 @@
BlueprintIdentifier = "1C07893C2EBC218B00392B46"
BuildableName = "HoneyDueExtension.appex"
BlueprintName = "HoneyDueExtension"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
@@ -33,7 +33,7 @@
BlueprintIdentifier = "D4ADB376A7A4CFB73469E173"
BuildableName = "honeyDue.app"
BlueprintName = "HoneyDue"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
@@ -53,7 +53,7 @@
BlueprintIdentifier = "1CBF1BEC2ECD9768001BF56C"
BuildableName = "HoneyDueUITests.xctest"
BlueprintName = "HoneyDueUITests"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
@@ -77,7 +77,7 @@
BlueprintIdentifier = "D4ADB376A7A4CFB73469E173"
BuildableName = "honeyDue.app"
BlueprintName = "HoneyDue"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<EnvironmentVariables>
@@ -113,7 +113,7 @@
BlueprintIdentifier = "D4ADB376A7A4CFB73469E173"
BuildableName = "honeyDue.app"
BlueprintName = "HoneyDue"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>

View File

@@ -14,7 +14,7 @@
shouldUseLaunchSchemeArgsEnv = "YES">
<TestPlans>
<TestPlanReference
reference = "container:CaseraUITests.xctestplan"
reference = "container:HoneyDueUITests.xctestplan"
default = "YES">
</TestPlanReference>
</TestPlans>
@@ -26,7 +26,7 @@
BlueprintIdentifier = "1CBF1BEC2ECD9768001BF56C"
BuildableName = "HoneyDueUITests.xctest"
BlueprintName = "HoneyDueUITests"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
<SkippedTests>
<Test
@@ -74,7 +74,7 @@
BlueprintIdentifier = "D4ADB376A7A4CFB73469E173"
BuildableName = "honeyDue.app"
BlueprintName = "HoneyDue"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
@@ -90,7 +90,7 @@
BlueprintIdentifier = "D4ADB376A7A4CFB73469E173"
BuildableName = "honeyDue.app"
BlueprintName = "HoneyDue"
ReferencedContainer = "container:iosApp.xcodeproj">
ReferencedContainer = "container:honeyDue.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>

View File

@@ -11,7 +11,8 @@ extension Color {
/// Shared App Group defaults for reading the active theme.
/// Thread-safe: UserDefaults is safe to read from any thread/actor.
private static let _themeDefaults: UserDefaults = {
UserDefaults(suiteName: "group.com.tt.honeyDue.HoneyDueDev") ?? .standard
let groupID = Bundle.main.infoDictionary?["AppGroupIdentifier"] as? String
return groupID.flatMap { UserDefaults(suiteName: $0) } ?? .standard
}()
private static func themed(_ name: String) -> Color {

View File

@@ -60,7 +60,9 @@ enum ThemeID: String, CaseIterable, Codable {
}
// MARK: - Shared App Group UserDefaults
private let appGroupID = "group.com.tt.honeyDue.HoneyDueDev"
private let appGroupID: String = {
Bundle.main.infoDictionary?["AppGroupIdentifier"] as? String ?? "group.com.tt.honeyDue.dev"
}()
private let sharedDefaults: UserDefaults = {
guard let defaults = UserDefaults(suiteName: appGroupID) else {
#if DEBUG

View File

@@ -20,7 +20,9 @@ final class WidgetDataManager {
static let completedColumn = "completed_tasks"
static let cancelledColumn = "cancelled_tasks"
private let appGroupIdentifier = "group.com.tt.honeyDue.HoneyDueDev"
private let appGroupIdentifier: String = {
Bundle.main.infoDictionary?["AppGroupIdentifier"] as? String ?? "group.com.tt.honeyDue.dev"
}()
private let tasksFileName = "widget_tasks.json"
private let actionsFileName = "widget_pending_actions.json"
private let pendingTasksFileName = "widget_pending_tasks.json"

View File

@@ -2,6 +2,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>AppGroupIdentifier</key>
<string>$(APP_GROUP_IDENTIFIER)</string>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>com.tt.honeyDue.refresh</string>

View File

@@ -4257,13 +4257,6 @@
"Caption" : {
"comment" : "A label displayed above the caption of an image in the photo viewer.",
"isCommentAutoGenerated" : true
},
"honeyDue" : {
"comment" : "The name of the app.",
"isCommentAutoGenerated" : true
},
"HONEYDUE PRO" : {
},
"Change" : {
"comment" : "A button that allows the user to change the time in a notification.",
@@ -17416,6 +17409,13 @@
},
"Here are tasks recommended for your area.\nPick the ones you'd like to track!" : {
},
"honeyDue" : {
"comment" : "The name of the app.",
"isCommentAutoGenerated" : true
},
"HONEYDUE PRO" : {
},
"Hour" : {
"comment" : "A picker for selecting an hour.",
@@ -17461,14 +17461,14 @@
"comment" : "A button label that instructs the user to join an existing residence.",
"isCommentAutoGenerated" : true
},
"Join honeyDue" : {
"comment" : "A title for the registration screen.",
"isCommentAutoGenerated" : true
},
"Join Failed" : {
"comment" : "An alert title displayed when joining a residence fails.",
"isCommentAutoGenerated" : true
},
"Join honeyDue" : {
"comment" : "A title for the registration screen.",
"isCommentAutoGenerated" : true
},
"Join Residence" : {
"comment" : "A button label that allows a user to join an existing residence.",
"isCommentAutoGenerated" : true
@@ -17499,11 +17499,11 @@
"Logging in..." : {
},
"Manage at honeydue.app" : {
"Manage at honeyDue.treytartt.com" : {
},
"Manage your subscription at honeydue.app" : {
"comment" : "A text instruction that directs them to manage their subscription on honeydue.app.",
"Manage your subscription at honeyDue.treytartt.com" : {
"comment" : "A description of how to manage a subscription on a third-party platform.",
"isCommentAutoGenerated" : true
},
"Manage your subscription on your Android device" : {
@@ -17513,10 +17513,6 @@
"comment" : "A button label that says \"Mark Task In Progress\".",
"isCommentAutoGenerated" : true
},
"HoneyDue Icon Animations" : {
"comment" : "The title of the playground interface.",
"isCommentAutoGenerated" : true
},
"Need inspiration?" : {
},
@@ -17568,8 +17564,8 @@
"comment" : "A button that dismisses the success dialog.",
"isCommentAutoGenerated" : true
},
"Open honeydue.app" : {
"comment" : "A button label that opens the honeydue.app settings page.",
"Open honeyDue.treytartt.com" : {
"comment" : "A button label that opens the user's subscription management page in a web browser.",
"isCommentAutoGenerated" : true
},
"or" : {
@@ -21659,10 +21655,6 @@
},
"Remove User" : {
},
"Replay" : {
"comment" : "A button that replays the current animation.",
"isCommentAutoGenerated" : true
},
"Reset All Tasks" : {
"comment" : "A button label that resets all tasks.",

View File

@@ -10,7 +10,7 @@
</array>
<key>com.apple.security.application-groups</key>
<array>
<string>group.com.tt.honeyDue.HoneyDueDev</string>
<string>$(APP_GROUP_IDENTIFIER)</string>
</array>
</dict>
</plist>