Extracted MPPlugin constants into separate header

This commit is contained in:
Michael Starke
2017-11-29 14:37:36 +01:00
parent 5db3950424
commit a05a753a13
8 changed files with 34 additions and 18 deletions

View File

@@ -190,6 +190,7 @@
4C89F524182FB4740069C73C /* MPAutotypeCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C89F523182FB4740069C73C /* MPAutotypeCommand.m */; }; 4C89F524182FB4740069C73C /* MPAutotypeCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C89F523182FB4740069C73C /* MPAutotypeCommand.m */; };
4C8B36AB17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8B36AA17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m */; }; 4C8B36AB17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8B36AA17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m */; };
4C8DEAA21C314D2C00D24C32 /* MPTestAutotypeDelay.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */; }; 4C8DEAA21C314D2C00D24C32 /* MPTestAutotypeDelay.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */; };
4C8F0C6E1FCEE9B900BE157F /* MPPluginConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8F0C6D1FCEE9B900BE157F /* MPPluginConstants.m */; };
4C978E0D19AE54AB003067DF /* MPFlagsHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C978E0C19AE54AB003067DF /* MPFlagsHelper.m */; }; 4C978E0D19AE54AB003067DF /* MPFlagsHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C978E0C19AE54AB003067DF /* MPFlagsHelper.m */; };
4CA08DA017A831B200A6544B /* MPAddEntryContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA08D9F17A831B200A6544B /* MPAddEntryContextMenuDelegate.m */; }; 4CA08DA017A831B200A6544B /* MPAddEntryContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA08D9F17A831B200A6544B /* MPAddEntryContextMenuDelegate.m */; };
4CA0B2ED15BCADAC00654E32 /* SettingsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CA0B2EC15BCADAC00654E32 /* SettingsWindow.xib */; }; 4CA0B2ED15BCADAC00654E32 /* SettingsWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CA0B2EC15BCADAC00654E32 /* SettingsWindow.xib */; };
@@ -655,6 +656,8 @@
4C8B36AA17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOutlineContextMenuDelegate.m; sourceTree = "<group>"; }; 4C8B36AA17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOutlineContextMenuDelegate.m; sourceTree = "<group>"; };
4C8C10061FC489D8003DDD5E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/PluginSettings.strings; sourceTree = "<group>"; }; 4C8C10061FC489D8003DDD5E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/PluginSettings.strings; sourceTree = "<group>"; };
4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestAutotypeDelay.m; sourceTree = "<group>"; }; 4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestAutotypeDelay.m; sourceTree = "<group>"; };
4C8F0C6C1FCEE98900BE157F /* MPPluginConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPluginConstants.h; sourceTree = "<group>"; };
4C8F0C6D1FCEE9B900BE157F /* MPPluginConstants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPluginConstants.m; sourceTree = "<group>"; };
4C8FB9FA1FC2D0EF003691AA /* MPPlugin_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPlugin_Private.h; sourceTree = "<group>"; }; 4C8FB9FA1FC2D0EF003691AA /* MPPlugin_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPlugin_Private.h; sourceTree = "<group>"; };
4C93C5701FBDFEF700F36855 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AutotypeCandidateSelectionView.strings; sourceTree = "<group>"; }; 4C93C5701FBDFEF700F36855 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AutotypeCandidateSelectionView.strings; sourceTree = "<group>"; };
4C93C5711FBDFEF900F36855 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; }; 4C93C5711FBDFEF900F36855 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; };
@@ -1568,6 +1571,8 @@
4CD034A51BFE113B003C002C /* MPPlugin.m */, 4CD034A51BFE113B003C002C /* MPPlugin.m */,
4CD034A81BFE113B003C002C /* MPPluginHost.h */, 4CD034A81BFE113B003C002C /* MPPluginHost.h */,
4CD034A91BFE113B003C002C /* MPPluginHost.m */, 4CD034A91BFE113B003C002C /* MPPluginHost.m */,
4C8F0C6C1FCEE98900BE157F /* MPPluginConstants.h */,
4C8F0C6D1FCEE9B900BE157F /* MPPluginConstants.m */,
); );
name = Plugin; name = Plugin;
path = MacPass; path = MacPass;
@@ -1835,6 +1840,7 @@
4C6B7C7D18BE7EB0001D5D77 /* MPDocument+History.m in Sources */, 4C6B7C7D18BE7EB0001D5D77 /* MPDocument+History.m in Sources */,
4CA0B2FC15BCAF8600654E32 /* MPSettingsWindowController.m in Sources */, 4CA0B2FC15BCAF8600654E32 /* MPSettingsWindowController.m in Sources */,
4C4F72D118DF704400E8D378 /* DDHotKeyTextField.m in Sources */, 4C4F72D118DF704400E8D378 /* DDHotKeyTextField.m in Sources */,
4C8F0C6E1FCEE9B900BE157F /* MPPluginConstants.m in Sources */,
4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */, 4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */,
4C82046A1FCDC07800EB24A4 /* MPPickfieldViewController.m in Sources */, 4C82046A1FCDC07800EB24A4 /* MPPickfieldViewController.m in Sources */,
4C2E382316D1421B00037A9D /* MPIconHelper.m in Sources */, 4C2E382316D1421B00037A9D /* MPIconHelper.m in Sources */,

View File

@@ -28,8 +28,6 @@ NS_ASSUME_NONNULL_BEGIN
@class MPAutotypeCommand; @class MPAutotypeCommand;
@class KPKEntry; @class KPKEntry;
FOUNDATION_EXPORT NSString *const kMPPluginFileExtension;
@interface MPPlugin : NSObject @interface MPPlugin : NSObject
@property (copy, readonly) NSString *identifier; @property (copy, readonly) NSString *identifier;
@@ -37,6 +35,8 @@ FOUNDATION_EXPORT NSString *const kMPPluginFileExtension;
@property (copy, readonly) NSString *version; @property (copy, readonly) NSString *version;
@property (nonatomic, strong, readonly) NSBundle *bundle; @property (nonatomic, strong, readonly) NSBundle *bundle;
@property (readonly) NSString *requiredHostVersion; // the host version required for running the plugin in mayor.minor.path format
/** /**
If your plugin needs initalization override this method but you have to call [super initWithPluginHost:] If your plugin needs initalization override this method but you have to call [super initWithPluginHost:]

View File

@@ -24,8 +24,7 @@
#import "MPPlugin_Private.h" #import "MPPlugin_Private.h"
#import "MPPluginHost.h" #import "MPPluginHost.h"
#import "MPSettingsHelper.h" #import "MPSettingsHelper.h"
#import "MPPluginConstants.h"
NSString *const kMPPluginFileExtension = @"mpplugin";
@implementation MPPlugin @implementation MPPlugin

View File

@@ -9,5 +9,11 @@
#ifndef MPPluginConstants_h #ifndef MPPluginConstants_h
#define MPPluginConstants_h #define MPPluginConstants_h
#import <Foundation/Foundation.h>
FOUNDATION_EXPORT NSString *const MPPluginFileExtension;
FOUNDATION_EXPORT NSString *const MPPluginMinimumHostVersionKey;
FOUNDATION_EXPORT NSString *const MPPluginMaxiumHostVersoinKey;
#endif /* MPPluginConstants_h */ #endif /* MPPluginConstants_h */

View File

@@ -6,4 +6,6 @@
// Copyright © 2017 HicknHack Software GmbH. All rights reserved. // Copyright © 2017 HicknHack Software GmbH. All rights reserved.
// //
#import <Foundation/Foundation.h> #import "MPPluginConstants.h"
NSString *const MPPluginFileExtension = @"mpplugin";

View File

@@ -24,6 +24,7 @@
#import "MPPlugin.h" #import "MPPlugin.h"
#import "MPPlugin_Private.h" #import "MPPlugin_Private.h"
#import "MPPluginConstants.h"
#import "NSApplication+MPAdditions.h" #import "NSApplication+MPAdditions.h"
#import "MPSettingsHelper.h" #import "MPSettingsHelper.h"
@@ -236,7 +237,7 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
} }
- (BOOL)_isValidPluginURL:(NSURL *)url { - (BOOL)_isValidPluginURL:(NSURL *)url {
return (NSOrderedSame == [url.pathExtension compare:kMPPluginFileExtension options:NSCaseInsensitiveSearch]); return (NSOrderedSame == [url.pathExtension compare:MPPluginFileExtension options:NSCaseInsensitiveSearch]);
} }
- (BOOL)_isValidPluginClass:(Class)class { - (BOOL)_isValidPluginClass:(Class)class {

View File

@@ -25,6 +25,7 @@
#import "MPPluginHost.h" #import "MPPluginHost.h"
#import "MPPlugin.h" #import "MPPlugin.h"
#import "MPPlugin_Private.h" #import "MPPlugin_Private.h"
#import "MPPluginConstants.h"
#import "MPConstants.h" #import "MPConstants.h"
#import "MPSettingsHelper.h" #import "MPSettingsHelper.h"
@@ -155,7 +156,7 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
if(!pluginURL.isFileURL) { if(!pluginURL.isFileURL) {
return NO; return NO;
} }
if(![pluginURL.lastPathComponent.pathExtension isEqualToString:kMPPluginFileExtension]) { if(![pluginURL.lastPathComponent.pathExtension isEqualToString:MPPluginFileExtension]) {
return NO; return NO;
} }
[tableView setDropRow:-1 dropOperation:NSTableViewDropOn]; [tableView setDropRow:-1 dropOperation:NSTableViewDropOn];
@@ -202,7 +203,7 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
- (void)showAddPluginPanel { - (void)showAddPluginPanel {
NSOpenPanel *openPanel = [NSOpenPanel openPanel]; NSOpenPanel *openPanel = [NSOpenPanel openPanel];
openPanel.allowedFileTypes = @[kMPPluginFileExtension]; openPanel.allowedFileTypes = @[MPPluginFileExtension];
openPanel.allowsMultipleSelection = NO; openPanel.allowsMultipleSelection = NO;
openPanel.canChooseFiles = YES; openPanel.canChooseFiles = YES;
openPanel.canChooseDirectories = NO; openPanel.canChooseDirectories = NO;

View File

@@ -18,11 +18,11 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView id="Hz6-mo-xeY"> <customView id="Hz6-mo-xeY">
<rect key="frame" x="0.0" y="0.0" width="410" height="165"/> <rect key="frame" x="0.0" y="0.0" width="410" height="190"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KQ1-tZ-qja" customClass="HNHUIRoundedSecureTextField"> <textField horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KQ1-tZ-qja" customClass="HNHUIRoundedSecureTextField">
<rect key="frame" x="20" y="49" width="276" height="24"/> <rect key="frame" x="20" y="74" width="276" height="24"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="Wi0-xp-KgI"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="Wi0-xp-KgI">
<font key="font" size="13" name="Menlo-Regular"/> <font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -30,14 +30,14 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hKI-WP-N93"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hKI-WP-N93">
<rect key="frame" x="361" y="48" width="29" height="25"/> <rect key="frame" x="361" y="73" width="29" height="25"/>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="95g-dp-50Q"> <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="95g-dp-50Q">
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/> <behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<scrollView horizontalLineScroll="26" horizontalPageScroll="10" verticalLineScroll="26" verticalPageScroll="10" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="MVS-ug-wys"> <scrollView horizontalLineScroll="26" horizontalPageScroll="10" verticalLineScroll="26" verticalPageScroll="10" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="MVS-ug-wys">
<rect key="frame" x="20" y="81" width="370" height="64"/> <rect key="frame" x="20" y="106" width="370" height="64"/>
<clipView key="contentView" drawsBackground="NO" id="8aa-cB-mUF"> <clipView key="contentView" drawsBackground="NO" id="8aa-cB-mUF">
<rect key="frame" x="1" y="0.0" width="368" height="63"/> <rect key="frame" x="1" y="0.0" width="368" height="63"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -118,7 +118,7 @@
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Y8X-Bm-qLt"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Y8X-Bm-qLt">
<rect key="frame" x="304" y="48" width="49" height="25"/> <rect key="frame" x="304" y="73" width="49" height="25"/>
<buttonCell key="cell" type="roundTextured" title="Reset" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Emo-pg-Mfe"> <buttonCell key="cell" type="roundTextured" title="Reset" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Emo-pg-Mfe">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@@ -128,7 +128,7 @@
</connections> </connections>
</button> </button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="e2q-qh-Zlv"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="e2q-qh-Zlv">
<rect key="frame" x="187" y="20" width="37" height="17"/> <rect key="frame" x="187" y="49" width="37" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Label" id="M3h-q8-FLO"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Label" id="M3h-q8-FLO">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -140,21 +140,22 @@
<constraint firstAttribute="trailing" secondItem="hKI-WP-N93" secondAttribute="trailing" constant="20" symbolic="YES" id="0IY-n6-nZi"/> <constraint firstAttribute="trailing" secondItem="hKI-WP-N93" secondAttribute="trailing" constant="20" symbolic="YES" id="0IY-n6-nZi"/>
<constraint firstItem="hKI-WP-N93" firstAttribute="centerY" secondItem="KQ1-tZ-qja" secondAttribute="centerY" id="1CC-7F-3GU"/> <constraint firstItem="hKI-WP-N93" firstAttribute="centerY" secondItem="KQ1-tZ-qja" secondAttribute="centerY" id="1CC-7F-3GU"/>
<constraint firstItem="KQ1-tZ-qja" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="1D9-Zk-KrZ"/> <constraint firstItem="KQ1-tZ-qja" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="1D9-Zk-KrZ"/>
<constraint firstItem="k8l-uy-C3l" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="e2q-qh-Zlv" secondAttribute="trailing" constant="8" symbolic="YES" id="7VJ-ri-ltE"/>
<constraint firstItem="MVS-ug-wys" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="9cE-TT-pqS"/> <constraint firstItem="MVS-ug-wys" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="9cE-TT-pqS"/>
<constraint firstItem="hKI-WP-N93" firstAttribute="leading" secondItem="Y8X-Bm-qLt" secondAttribute="trailing" constant="8" id="AVv-zt-6sj"/> <constraint firstItem="hKI-WP-N93" firstAttribute="leading" secondItem="Y8X-Bm-qLt" secondAttribute="trailing" constant="8" id="AVv-zt-6sj"/>
<constraint firstAttribute="trailing" secondItem="k8l-uy-C3l" secondAttribute="trailing" constant="20" symbolic="YES" id="Eaa-oF-Lt5"/> <constraint firstAttribute="trailing" secondItem="k8l-uy-C3l" secondAttribute="trailing" constant="20" symbolic="YES" id="Eaa-oF-Lt5"/>
<constraint firstItem="MVS-ug-wys" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="Klq-Q9-Rjp"/> <constraint firstItem="MVS-ug-wys" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="Klq-Q9-Rjp"/>
<constraint firstItem="Y8X-Bm-qLt" firstAttribute="leading" secondItem="KQ1-tZ-qja" secondAttribute="trailing" constant="8" id="Qxu-Wk-ckL"/> <constraint firstItem="Y8X-Bm-qLt" firstAttribute="leading" secondItem="KQ1-tZ-qja" secondAttribute="trailing" constant="8" id="Qxu-Wk-ckL"/>
<constraint firstItem="Y8X-Bm-qLt" firstAttribute="centerY" secondItem="KQ1-tZ-qja" secondAttribute="centerY" id="T81-yL-LEh"/> <constraint firstItem="Y8X-Bm-qLt" firstAttribute="centerY" secondItem="KQ1-tZ-qja" secondAttribute="centerY" id="T81-yL-LEh"/>
<constraint firstItem="e2q-qh-Zlv" firstAttribute="top" secondItem="KQ1-tZ-qja" secondAttribute="bottom" constant="8" symbolic="YES" id="UWG-aW-fsW"/>
<constraint firstAttribute="bottom" secondItem="k8l-uy-C3l" secondAttribute="bottom" constant="20" symbolic="YES" id="UXs-2n-gB5"/> <constraint firstAttribute="bottom" secondItem="k8l-uy-C3l" secondAttribute="bottom" constant="20" symbolic="YES" id="UXs-2n-gB5"/>
<constraint firstItem="k8l-uy-C3l" firstAttribute="top" secondItem="KQ1-tZ-qja" secondAttribute="bottom" constant="8" symbolic="YES" id="kn5-3q-Pae"/> <constraint firstItem="e2q-qh-Zlv" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="WVC-0y-S19"/>
<constraint firstAttribute="bottom" secondItem="e2q-qh-Zlv" secondAttribute="bottom" constant="20" symbolic="YES" id="l3c-Ig-Z3V"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="e2q-qh-Zlv" secondAttribute="trailing" constant="20" symbolic="YES" id="fCf-pK-CXQ"/>
<constraint firstItem="k8l-uy-C3l" firstAttribute="top" secondItem="e2q-qh-Zlv" secondAttribute="bottom" constant="8" id="jwg-Z1-txO"/>
<constraint firstAttribute="trailing" secondItem="MVS-ug-wys" secondAttribute="trailing" constant="20" symbolic="YES" id="mMv-HC-fEv"/> <constraint firstAttribute="trailing" secondItem="MVS-ug-wys" secondAttribute="trailing" constant="20" symbolic="YES" id="mMv-HC-fEv"/>
<constraint firstItem="KQ1-tZ-qja" firstAttribute="top" secondItem="MVS-ug-wys" secondAttribute="bottom" constant="8" symbolic="YES" id="nKb-eh-ba4"/> <constraint firstItem="KQ1-tZ-qja" firstAttribute="top" secondItem="MVS-ug-wys" secondAttribute="bottom" constant="8" symbolic="YES" id="nKb-eh-ba4"/>
<constraint firstItem="e2q-qh-Zlv" firstAttribute="centerX" secondItem="Hz6-mo-xeY" secondAttribute="centerX" id="tE5-PK-tp0"/> <constraint firstItem="e2q-qh-Zlv" firstAttribute="centerX" secondItem="Hz6-mo-xeY" secondAttribute="centerX" id="tE5-PK-tp0"/>
</constraints> </constraints>
<point key="canvasLocation" x="-917" y="-230"/> <point key="canvasLocation" x="-1020" y="-227"/>
</customView> </customView>
</objects> </objects>
<resources> <resources>