From 7179a2995db2b10c01d5993df56ff124611b652c Mon Sep 17 00:00:00 2001 From: cacaodev Date: Mon, 23 Mar 2015 21:19:08 +0100 Subject: [PATCH 001/169] CPTabViewItem image support --- AppKit/CPTabViewItem.j | 56 +++++++++++++++++++++++++++++++++-- Tools/nib2cib/NSTabViewItem.j | 1 + 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/AppKit/CPTabViewItem.j b/AppKit/CPTabViewItem.j index 671d5bc78..922a1b51f 100644 --- a/AppKit/CPTabViewItem.j +++ b/AppKit/CPTabViewItem.j @@ -61,6 +61,14 @@ CPPressedTab = 2; CPTabView _tabView; unsigned _tabState; // Looks like it is not yet implemented + + CPImage _image @accessors(property=image); + CPViewController _viewController @accessors(getter=viewController); + + BOOL _enabled @accessors(property=enabled); + BOOL _selected @accessors(property=selected); + CGRect _tabRect @accessors(property=frame); + float _width @accessors(property=width); } - (id)init @@ -68,6 +76,19 @@ CPPressedTab = 2; return [self initWithIdentifier:@""]; } +- (void)_init +{ + _tag = 0; + _viewController = nil; + _image = nil; + _tabState = 0; + _tabView = nil; + _enabled = YES; + _selected = NO; + _tabRect = CGRectMakeZero(); + _width = 0; +} + /*! Initializes the tab view item with the specified identifier. @return the initialized CPTabViewItem @@ -76,8 +97,12 @@ CPPressedTab = 2; { self = [super init]; - if (self) - _identifier = anIdentifier; + [self _init]; + + _identifier = anIdentifier; + _label = nil; + _view = nil; + //_auxiliaryView = nil; return self; } @@ -101,6 +126,28 @@ CPPressedTab = 2; return _label; } +// Working With Images +/*! + Sets the CPTabViewItem's image. + @param anImage the image for the item +*/ +- (void)setImage:(CPImage)anImage +{ + if ([anImage isEqual:_image]) + return; + + _image = anImage; + [_tabView tileWithChangedItem:self]; +} + +/*! + Returns the CPTabViewItem's image +*/ +- (CPImage)image +{ + return _image; +} + // Checking the Tab Display State /*! Returns the tab's current state. @@ -190,6 +237,7 @@ CPPressedTab = 2; var CPTabViewItemIdentifierKey = "CPTabViewItemIdentifierKey", CPTabViewItemLabelKey = "CPTabViewItemLabelKey", + CPTabViewItemImageKey = "CPTabViewItemImageKey", CPTabViewItemViewKey = "CPTabViewItemViewKey", CPTabViewItemAuxViewKey = "CPTabViewItemAuxViewKey"; @@ -202,8 +250,11 @@ var CPTabViewItemIdentifierKey = "CPTabViewItemIdentifierKey", if (self) { + [self _init]; + _identifier = [aCoder decodeObjectForKey:CPTabViewItemIdentifierKey]; _label = [aCoder decodeObjectForKey:CPTabViewItemLabelKey]; + _image = [aCoder decodeObjectForKey:CPTabViewItemImageKey]; _view = [aCoder decodeObjectForKey:CPTabViewItemViewKey]; _auxiliaryView = [aCoder decodeObjectForKey:CPTabViewItemAuxViewKey]; @@ -216,6 +267,7 @@ var CPTabViewItemIdentifierKey = "CPTabViewItemIdentifierKey", { [aCoder encodeObject:_identifier forKey:CPTabViewItemIdentifierKey]; [aCoder encodeObject:_label forKey:CPTabViewItemLabelKey]; + [aCoder encodeObject:_image forKey:CPTabViewItemImageKey]; [aCoder encodeObject:_view forKey:CPTabViewItemViewKey]; [aCoder encodeObject:_auxiliaryView forKey:CPTabViewItemAuxViewKey]; diff --git a/Tools/nib2cib/NSTabViewItem.j b/Tools/nib2cib/NSTabViewItem.j index 07a34237c..eec92cb26 100644 --- a/Tools/nib2cib/NSTabViewItem.j +++ b/Tools/nib2cib/NSTabViewItem.j @@ -31,6 +31,7 @@ { _identifier = [aCoder decodeObjectForKey:"NSIdentifier"]; _label = [aCoder decodeObjectForKey:"NSLabel"]; + _image = [aCoder decodeObjectForKey:"NSImage"]; _view = [aCoder decodeObjectForKey:"NSView"]; From 7378d06bfd61368b417446e71f6dfdd3e5362b5a Mon Sep 17 00:00:00 2001 From: cacaodev Date: Tue, 24 Mar 2015 09:33:02 +0100 Subject: [PATCH 002/169] FIXED: CPTabView -insertTabViewItem:atIndex: Before this commit, the tabViewItems and the segments were 2 different collections. Any indexed change in the tabViewItems asked to re-sync the segments making it difficult to maintain any persistent state. Now the tabView items are the segments content. Also fixed the selection update when items are removed. See CPTabViewTest.j and manual test Manual/CPTabViewNib/ --- AppKit/CPSegmentedControl.j | 16 +- AppKit/CPTabView.j | 188 +++++---- AppKit/CPTabViewItem.j | 7 +- Tests/AppKit/CPTabViewTest.j | 44 +++ .../CPTabViewNib/Resources/MainMenu.xib | 373 ++++++++---------- Tools/nib2cib/NSTabView.j | 6 +- 6 files changed, 333 insertions(+), 301 deletions(-) diff --git a/AppKit/CPSegmentedControl.j b/AppKit/CPSegmentedControl.j index 99bafdfce..bc57454d4 100644 --- a/AppKit/CPSegmentedControl.j +++ b/AppKit/CPSegmentedControl.j @@ -115,8 +115,7 @@ CPSegmentSwitchTrackingMomentary = 2; /*! @ignore */ - (void)setSegments:(CPArray)segments { - [_segments removeAllObjects]; - [_themeStates removeAllObjects]; + [self removeSegmentsAtIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, [self segmentCount])]]; [self insertSegments:segments atIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, [segments count])]]; } @@ -135,6 +134,9 @@ CPSegmentSwitchTrackingMomentary = 2; [_segments insertObjects:segments atIndexes:indices]; [_themeStates insertObjects:newStates atIndexes:indices]; + + if (_selectedSegment >= [indices firstIndex]) + _selectedSegment += [indices count]; } /*! @ignore */ @@ -143,6 +145,16 @@ CPSegmentSwitchTrackingMomentary = 2; if ([indices count] == 0) return; + [indices enumerateIndexesUsingBlock:function(idx, stop) + { + [[_segments objectAtIndex:idx] setSelected:NO]; + }]; + + if ([indices containsIndex:_selectedSegment]) + _selectedSegment = -1; + else if ([indices lastIndex] < _selectedSegment) + _selectedSegment -= [indices count]; + [_segments removeObjectsAtIndexes:indices]; [_themeStates removeObjectsAtIndexes:indices]; } diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index ec145d802..cf4a43232 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -66,7 +66,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, CPSegmentedControl _tabs; CPBox _box; - CPNumber _selectedIndex; + CPTabViewItem _selectedTabViewItem; CPTabViewType _type; CPFont _font; @@ -79,9 +79,8 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, { if (self = [super initWithFrame:aFrame]) { - _items = [CPArray array]; - [self _init]; + _selectedTabViewItem = nil; [self setTabViewType:CPTopTabsBezelBorder]; } @@ -90,10 +89,9 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, - (void)_init { - _selectedIndex = CPNotFound; - - _tabs = [[CPSegmentedControl alloc] initWithFrame:CGRectMake(0, 0, 0, 0)]; + _tabs = [[CPSegmentedControl alloc] initWithFrame:CGRectMakeZero()]; [_tabs setHitTests:NO]; + [_tabs setSegments:[CPArray array]]; var height = [_tabs valueForThemeAttribute:@"min-size"].height; [_tabs setFrameSize:CGSizeMake(0, height)]; @@ -105,6 +103,11 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, [self addSubview:_tabs]; } +- (CPArray)items +{ + return [_tabs segments]; +} + // Adding and Removing Tabs /*! Adds a CPTabViewItem to the tab view. @@ -112,7 +115,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (void)addTabViewItem:(CPTabViewItem)aTabViewItem { - [self insertTabViewItem:aTabViewItem atIndex:[_items count]]; + [self insertTabViewItem:aTabViewItem atIndex:[self numberOfTabViewItems]]; } /*! @@ -122,15 +125,18 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (void)insertTabViewItem:(CPTabViewItem)aTabViewItem atIndex:(CPUInteger)anIndex { - [_items insertObject:aTabViewItem atIndex:anIndex]; + [self _insertTabViewItems:[aTabViewItem] atIndexes:[CPIndexSet indexSetWithIndex:anIndex]]; +} - [self _updateItems]; - [self _repositionTabs]; +- (void)_insertTabViewItems:(CPArray)tabViewItems atIndexes:(CPIndexSet)indexes +{ + [_tabs insertSegments:tabViewItems atIndexes:indexes]; + [tabViewItems makeObjectsPerformSelector:@selector(_setTabView:) withObject:self]; - [aTabViewItem _setTabView:self]; + [self tileWithChangedItem:[tabViewItems firstObject]]; + [self _reverseSetContent]; - if (_delegateSelectors & CPTabViewDidChangeNumberOfTabViewItemsSelector) - [_delegate tabViewDidChangeNumberOfTabViewItems:self]; + [self _sendDelegateTabViewDidChangeNumberOfTabViewItems]; } /*! @@ -139,23 +145,38 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (void)removeTabViewItem:(CPTabViewItem)aTabViewItem { - var count = [_items count]; - for (var i = 0; i < count; i++) - { - if ([_items objectAtIndex:i] === aTabViewItem) - { - [_items removeObjectAtIndex:i]; - break; - } - } + var idx = [[self items] indexOfObjectIdenticalTo:aTabViewItem]; - [self _updateItems]; - [self _repositionTabs]; + if (idx == CPNotFound) + return; + [_tabs removeSegmentsAtIndexes:[CPIndexSet indexSetWithIndex:idx]]; [aTabViewItem _setTabView:nil]; - if (_delegateSelectors & CPTabViewDidChangeNumberOfTabViewItemsSelector) - [_delegate tabViewDidChangeNumberOfTabViewItems:self]; + [self tileWithChangedItem:nil]; + [self _didRemoveTabViewItem:aTabViewItem atIndex:idx]; + [self _reverseSetContent]; + + [self _sendDelegateTabViewDidChangeNumberOfTabViewItems]; +} + +- (void)_didRemoveTabViewItem:(CPTabViewItem)aTabViewItem atIndex:(CPInteger)idx +{ + if ([self selectedIndexBinder]) + return; + + if (_selectedTabViewItem == aTabViewItem) + { + var didSelect = NO; + + if (idx > 0) + didSelect = [self selectTabViewItemAtIndex:idx - 1]; + else if ([self numberOfTabViewItems] > 0) + didSelect = [self selectTabViewItemAtIndex:0]; + + if (didSelect == NO) + _selectedTabViewItem == nil; + } } // Accessing Tabs @@ -166,7 +187,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (int)indexOfTabViewItem:(CPTabViewItem)aTabViewItem { - return [_items indexOfObjectIdenticalTo:aTabViewItem]; + return [[self items] indexOfObjectIdenticalTo:aTabViewItem]; } /*! @@ -176,11 +197,10 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (int)indexOfTabViewItemWithIdentifier:(CPString)anIdentifier { - for (var index = [_items count]; index >= 0; index--) - if ([[_items[index] identifier] isEqual:anIdentifier]) - return index; - - return CPNotFound; + return [[self items] indexOfObjectPassingTest:function(item, idx, stop) + { + [[item identifier] isEqual:anIdentifier]; + }]; } /*! @@ -189,7 +209,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (unsigned)numberOfTabViewItems { - return [_items count]; + return [[self items] count]; } /*! @@ -198,7 +218,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (CPTabViewItem)tabViewItemAtIndex:(CPUInteger)anIndex { - return [_items objectAtIndex:anIndex]; + return [[self items] objectAtIndex:anIndex]; } /*! @@ -207,7 +227,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (CPArray)tabViewItems { - return [_items copy]; // Copy? + return [[self items] copy]; // Copy? } // Selecting a Tab @@ -217,7 +237,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (void)selectFirstTabViewItem:(id)aSender { - if ([_items count] === 0) + if ([self numberOfTabViewItems] === 0) return; // throw? [self selectTabViewItemAtIndex:0]; @@ -229,10 +249,10 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (void)selectLastTabViewItem:(id)aSender { - if ([_items count] === 0) + if ([self numberOfTabViewItems] === 0) return; // throw? - [self selectTabViewItemAtIndex:[_items count] - 1]; + [self selectTabViewItemAtIndex:[self numberOfTabViewItems] - 1]; } /*! @@ -241,12 +261,12 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (void)selectNextTabViewItem:(id)aSender { - if (_selectedIndex === CPNotFound) + if (_selectedTabViewItem === nil) return; - var nextIndex = _selectedIndex + 1; + var nextIndex = [self indexOfTabViewItem:_selectedTabViewItem] + 1; - if (nextIndex === [_items count]) + if (nextIndex === [self numberOfTabViewItems]) // does nothing. According to spec at (http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/ApplicationKit/Classes/NSTabView_Class/Reference/Reference.html#//apple_ref/occ/instm/NSTabView/selectNextTabViewItem:) return; @@ -259,10 +279,10 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (void)selectPreviousTabViewItem:(id)aSender { - if (_selectedIndex === CPNotFound) + if (_selectedTabViewItem === nil) return; - var previousIndex = _selectedIndex - 1; + var previousIndex = [self indexOfTabViewItem:_selectedTabViewItem] - 1; if (previousIndex < 0) return; // does nothing. See above. @@ -285,22 +305,32 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (BOOL)selectTabViewItemAtIndex:(CPUInteger)anIndex { - if (anIndex === _selectedIndex) - return; + if (![self _selectTabViewItemAtIndex:anIndex]) + return NO; + //[self _reverseSetSelectedIndex]; + + return YES; +} + +- (BOOL)_selectTabViewItemAtIndex:(CPUInteger)anIndex +{ var aTabViewItem = [self tabViewItemAtIndex:anIndex]; + if (aTabViewItem == _selectedTabViewItem) + return NO; + if ((_delegateSelectors & CPTabViewShouldSelectTabViewItemSelector) && ![_delegate tabView:self shouldSelectTabViewItem:aTabViewItem]) return NO; if (_delegateSelectors & CPTabViewWillSelectTabViewItemSelector) [_delegate tabView:self willSelectTabViewItem:aTabViewItem]; - [_tabs selectSegmentWithTag:anIndex]; - [self _setSelectedIndex:anIndex]; + [_tabs setSelectedSegment:anIndex]; + _selectedTabViewItem = aTabViewItem; - if (_delegateSelectors & CPTabViewDidSelectTabViewItemSelector) - [_delegate tabView:self didSelectTabViewItem:aTabViewItem]; + [self _displayItemView:[aTabViewItem view]]; + [self _sendDelegateDidSelectTabViewItem:aTabViewItem]; return YES; } @@ -311,10 +341,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, */ - (CPTabViewItem)selectedTabViewItem { - if (_selectedIndex != CPNotFound) - return [_items objectAtIndex:_selectedIndex]; - - return nil; + return _selectedTabViewItem; } // Modifying the font @@ -375,6 +402,14 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, [self setNeedsLayout]; } +- (void)tileWithChangedItem:(CPTabViewItem)aTabViewItem +{ + var segment = aTabViewItem ? [self indexOfTabViewItem:aTabViewItem] : 0; + [_tabs tileWithChangedSegment:segment]; + + [self setNeedsLayout]; +} + - (void)layoutSubviews { // Even if CPTabView's autoresizesSubviews is NO, _tabs and _box has to be laid out. @@ -392,7 +427,6 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, [_box setFrame:CGRectMake(0, origin, CGRectGetWidth(aFrame), CGRectGetHeight(aFrame) - segmentedHeight / 2)]; - [self _updateItems]; [self _repositionTabs]; } } @@ -470,30 +504,23 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, [_tabs setCenter:CGPointMake(horizontalCenterOfSelf, verticalCenterOfTabs)]; } -- (void)_setSelectedIndex:(CPNumber)index +- (void)_displayItemView:(CPView)aView { - _selectedIndex = index; - [self _setContentViewFromItem:[_items objectAtIndex:_selectedIndex]]; + [_box setContentView:aView]; } -- (void)_setContentViewFromItem:(CPTabViewItem)anItem +// DELEGATE METHODS + +- (void)_sendDelegateDidSelectTabViewItem:(CPTabViewItem)aTabViewItem { - [_box setContentView:[anItem view]]; + if (_delegateSelectors & CPTabViewDidSelectTabViewItemSelector) + [_delegate tabView:self didSelectTabViewItem:aTabViewItem]; } -- (void)_updateItems +- (void)_sendDelegateTabViewDidChangeNumberOfTabViewItems { - var count = [_items count]; - [_tabs setSegmentCount:count]; - - for (var i = 0; i < count; i++) - { - [_tabs setLabel:[[_items objectAtIndex:i] label] forSegment:i]; - [_tabs setTag:i forSegment:i]; - } - - if (_selectedIndex === CPNotFound) - [self selectFirstTabViewItem:self]; + if (_delegateSelectors & CPTabViewDidChangeNumberOfTabViewItemsSelector) + [_delegate tabViewDidChangeNumberOfTabViewItems:self]; } @end @@ -515,12 +542,12 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", _font = [aCoder decodeObjectForKey:CPTabViewFontKey]; [_tabs setFont:_font]; - _items = [aCoder decodeObjectForKey:CPTabViewItemsKey]; - [_items makeObjectsPerformSelector:@selector(_setTabView:) withObject:self]; + var items = [aCoder decodeObjectForKey:CPTabViewItemsKey] || [CPArray array]; + [self _insertTabViewItems:items atIndexes:[CPIndexSet indexSetWithIndexesInRange:CPMakeRange(0, [items count])]]; [self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]]; - self.selectOnAwake = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey]; + _selectedTabViewItem = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey]; _type = [aCoder decodeIntForKey:CPTabViewTypeKey]; } @@ -531,12 +558,13 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", { // This cannot be run in initWithCoder because it might call selectTabViewItem:, which is // not safe to call before the views of the tab views items are fully decoded. - [self _updateItems]; - if (self.selectOnAwake) + if (_selectedTabViewItem) { - [self selectTabViewItem:self.selectOnAwake]; - delete self.selectOnAwake; + var idx = [self indexOfTabViewItem:_selectedTabViewItem]; + + if (idx !== CPNotFound) + [self selectTabViewItemAtIndex:idx]; } var type = _type; @@ -558,9 +586,7 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", [aCoder encodeObject:_items forKey:CPTabViewItemsKey]; - var selected = [self selectedTabViewItem]; - if (selected) - [aCoder encodeObject:selected forKey:CPTabViewSelectedItemKey]; + [aCoder encodeConditionalObject:_selectedTabViewItem forKey:CPTabViewSelectedItemKey]; [aCoder encodeInt:_type forKey:CPTabViewTypeKey]; [aCoder encodeObject:_font forKey:CPTabViewFontKey]; diff --git a/AppKit/CPTabViewItem.j b/AppKit/CPTabViewItem.j index 922a1b51f..113a539f6 100644 --- a/AppKit/CPTabViewItem.j +++ b/AppKit/CPTabViewItem.j @@ -55,6 +55,7 @@ CPPressedTab = 2; { id _identifier; CPString _label; + CPInteger _tag @accessors(property=tag); CPView _view; CPView _auxiliaryView; @@ -114,8 +115,11 @@ CPPressedTab = 2; */ - (void)setLabel:(CPString)aLabel { + if ([aLabel isEqualToString:_label]) + return; + _label = aLabel; - [_tabView setNeedsLayout]; + [_tabView tileWithChangedItem:self]; } /*! @@ -187,7 +191,6 @@ CPPressedTab = 2; _view = aView; if ([_tabView selectedTabViewItem] == self) - [_tabView _setContentViewFromItem:self]; } /*! diff --git a/Tests/AppKit/CPTabViewTest.j b/Tests/AppKit/CPTabViewTest.j index 6d668742d..ad5b74550 100644 --- a/Tests/AppKit/CPTabViewTest.j +++ b/Tests/AppKit/CPTabViewTest.j @@ -39,6 +39,8 @@ [_tabView addTabViewItem:_tabItem1]; [_tabView addTabViewItem:_tabItem2]; + + [[CPRunLoop currentRunLoop] performSelectors]; } - (void)testCreate @@ -93,4 +95,46 @@ [self assertNull:[_tabItem1 tabView]]; } +- (void)testInsertTabViewItem +{ + [_tabView selectTabViewItem:_tabItem2]; + + [self assert:[_tabView numberOfTabViewItems] equals:2]; + [self assert:[_tabView selectedTabViewItem] equals:_tabItem2]; + + var tabItem3 = [[CPTabViewItem alloc] initWithIdentifier:@"insert"]; + [tabItem3 setLabel:@"insert"]; + [_tabView insertTabViewItem:tabItem3 atIndex:0]; + + [self assert:[_tabView numberOfTabViewItems] equals:3]; + [self assert:[_tabView selectedTabViewItem] equals:_tabItem2]; + [self assert:[_tabView indexOfTabViewItem:tabItem3] equals:0]; +} + +- (void)testRemoveSelectedTabViewItem +{ + [_tabView selectTabViewItem:_tabItem2]; + + [self assert:[_tabView numberOfTabViewItems] equals:2]; + [self assert:[_tabView selectedTabViewItem] equals:_tabItem2]; + + [_tabView removeTabViewItem:_tabItem2]; + + [self assert:[_tabView numberOfTabViewItems] equals:1]; + [self assert:[_tabView selectedTabViewItem] equals:_tabItem1]; +} + +- (void)testRemoveSelectedFirstTabViewItem +{ + [_tabView selectTabViewItem:_tabItem1]; + + [self assert:[_tabView numberOfTabViewItems] equals:2]; + [self assert:[_tabView selectedTabViewItem] equals:_tabItem1]; + + [_tabView removeTabViewItem:_tabItem1]; + + [self assert:[_tabView numberOfTabViewItems] equals:1]; + [self assert:[_tabView selectedTabViewItem] equals:_tabItem2]; +} + @end diff --git a/Tests/Manual/CPTabViewNib/Resources/MainMenu.xib b/Tests/Manual/CPTabViewNib/Resources/MainMenu.xib index 22f32b7e1..8cdb134dd 100644 --- a/Tests/Manual/CPTabViewNib/Resources/MainMenu.xib +++ b/Tests/Manual/CPTabViewNib/Resources/MainMenu.xib @@ -1,39 +1,36 @@ - + 1050 - 11D50 - 2166 - 1138.32 - 568.00 + 14C109 + 6751 + 1344.72 + 757.30 com.apple.InterfaceBuilder.CocoaPlugin - 2166 + 6751 - - YES - NSTabViewItem - NSView - NSWindowTemplate - NSTabView + + NSButton + NSButtonCell + NSCustomObject + NSSlider NSSliderCell + NSTabView + NSTabViewItem NSTextField NSTextFieldCell - NSSlider - NSButtonCell - NSButton - NSCustomObject - - - YES + NSView + NSWindowTemplate + + com.apple.InterfaceBuilder.CocoaPlugin - + PluginDependencyRecalculationVersion - - YES + NSApplication @@ -55,24 +52,20 @@ 274 - - YES + 286 - {{13, 40}, {454, 344}} + {{13, 40.000000383795708}, {454, 344}} - - - YES + 1 256 - - YES + 301 @@ -81,7 +74,7 @@ YES - -2080244224 + -2080374784 0 @@ -99,8 +92,9 @@ NO NO + NO - + {{10, 33}, {434, 298}} @@ -119,7 +113,7 @@ - 256 + 274 {{10, 33}, {434, 298}} @@ -134,8 +128,7 @@ 256 - - YES + 301 @@ -143,11 +136,11 @@ YES - -1804468671 + -1804599231 272630784 - LucidaGrande + YES 13 1044 @@ -172,8 +165,10 @@ + NO + 1 - + {{10, 33}, {434, 298}} @@ -181,26 +176,23 @@ - + 0 YES YES - - YES + - + 283 - {{478, 40}, {454, 344}} + {{478, 40.000000383795708}, {453.99999982220186, 344}} - - YES - + 0 YES @@ -212,11 +204,10 @@ {{594, 14}, {222, 17}} - _NS:3944 YES - 68288064 + 68157504 272630784 A Tab View Item Sould be Selected @@ -230,6 +221,8 @@ + NO + 1 @@ -241,21 +234,22 @@ _NS:687 YES - 67239424 + 67108864 134217728 Replace Current View _NS:687 - -2038284033 + -2038284288 129 200 25 + NO - + {950, 390} @@ -268,10 +262,9 @@ AppController - + - - YES + delegate @@ -328,116 +321,105 @@ 487 - + - - YES + 0 - - YES - + -2 - + File's Owner -1 - + First Responder -3 - + Application 371 - - YES + - - + + 372 - - YES + - + 450 - + 460 - - YES + - + 461 - - YES + - + 462 - - YES + - + 463 - - YES + - + 464 - - YES + - + 452 - - YES + - + @@ -448,10 +430,9 @@ 456 - - YES + - + @@ -462,18 +443,15 @@ 465 - - YES - + 475 - - YES + - + @@ -484,10 +462,9 @@ 479 - - YES + - + @@ -498,10 +475,9 @@ 488 - - YES + - + @@ -509,144 +485,115 @@ - - - - YES - - YES - -1.IBPluginDependency - -2.IBPluginDependency - -3.IBPluginDependency - 371.IBPluginDependency - 371.IBWindowTemplateEditedContentRect - 371.NSWindowTemplate.visibleAtLaunch - 372.IBPluginDependency - 450.IBPluginDependency - 452.IBPluginDependency - 453.IBPluginDependency - 456.IBPluginDependency - 457.IBPluginDependency - 460.IBPluginDependency - 461.IBPluginDependency - 462.IBPluginDependency - 463.IBPluginDependency - 464.IBPluginDependency - 465.IBPluginDependency - 475.IBPluginDependency - 476.IBPluginDependency - 479.IBPluginDependency - 480.IBPluginDependency - 488.IBPluginDependency - 489.IBPluginDependency - - - YES - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{209, 447}, {480, 360}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - YES - - + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{209, 447}, {480, 360}} + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + - - YES - - - + 489 - - YES + AppController NSObject - - changeView: - id - - - changeView: - + + id + id + id + + + changeView: id - - - YES - - YES - nibTabView - nibTabViewEmpty + + insertTabViewItem: + id - - YES - NSTabView - NSTabView + + removeTabViewItem: + id - - - YES - - YES - nibTabView - nibTabViewEmpty + + + NSButton + NSStepper + NSTabView + NSTabView + NSStepper + NSViewController + + + + fromViewController + NSButton - - YES - - nibTabView - NSTabView - - - nibTabViewEmpty - NSTabView - + + insertStepper + NSStepper - + + nibTabView + NSTabView + + + nibTabViewEmpty + NSTabView + + + removeStepper + NSStepper + + + viewController + NSViewController + + IBProjectSource - ./Classes/AppController.h + ../.XcodeSupport/AppController.h - + 0 IBCocoaFramework + NO com.apple.InterfaceBuilder.CocoaPlugin.macosx com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - + YES 3 diff --git a/Tools/nib2cib/NSTabView.j b/Tools/nib2cib/NSTabView.j index 920cee8f9..bac46514c 100644 --- a/Tools/nib2cib/NSTabView.j +++ b/Tools/nib2cib/NSTabView.j @@ -35,9 +35,9 @@ _type = flags & 0x7; - _items = [aCoder decodeObjectForKey:@"NSTabViewItems"]; - _selectedIndex = [_items indexOfObject:[aCoder decodeObjectForKey:@"NSSelectedTabViewItem"]]; - _font = [aCoder decodeObjectForKey:@"NSFont"]; + _items = [aCoder decodeObjectForKey:@"NSTabViewItems"]; + _selectedTabViewItem = [aCoder decodeObjectForKey:@"NSSelectedTabViewItem"]; + _font = [aCoder decodeObjectForKey:@"NSFont"]; //_delegate = [aCoder decodeObjectForKey:@""]; From 865a45044f3976a9dfffc703ae36a215aeba38d6 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Tue, 24 Mar 2015 16:38:45 +0100 Subject: [PATCH 003/169] NEW: bindings support --- AppKit/CPTabView.j | 200 +++- .../Manual/CPTabViewBindings/AppController.j | 77 ++ Tests/Manual/CPTabViewBindings/Info.plist | 14 + Tests/Manual/CPTabViewBindings/Jakefile | 184 +++ .../CPTabViewBindings/Resources/MainMenu.cib | 1 + .../CPTabViewBindings/Resources/MainMenu.xib | 1062 +++++++++++++++++ .../Manual/CPTabViewBindings/index-debug.html | 191 +++ Tests/Manual/CPTabViewBindings/index.html | 161 +++ Tests/Manual/CPTabViewBindings/main.j | 18 + 9 files changed, 1906 insertions(+), 2 deletions(-) create mode 100644 Tests/Manual/CPTabViewBindings/AppController.j create mode 100644 Tests/Manual/CPTabViewBindings/Info.plist create mode 100644 Tests/Manual/CPTabViewBindings/Jakefile create mode 100644 Tests/Manual/CPTabViewBindings/Resources/MainMenu.cib create mode 100644 Tests/Manual/CPTabViewBindings/Resources/MainMenu.xib create mode 100644 Tests/Manual/CPTabViewBindings/index-debug.html create mode 100644 Tests/Manual/CPTabViewBindings/index.html create mode 100644 Tests/Manual/CPTabViewBindings/main.j diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index cf4a43232..fc9aa4654 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -65,6 +65,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, CPSegmentedControl _tabs; CPBox _box; + CPView _placeHolderView; CPTabViewItem _selectedTabViewItem; @@ -101,6 +102,8 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, [self addSubview:_box]; [self addSubview:_tabs]; + + _placeHolderView = nil; } - (CPArray)items @@ -162,7 +165,8 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, - (void)_didRemoveTabViewItem:(CPTabViewItem)aTabViewItem atIndex:(CPInteger)idx { - if ([self selectedIndexBinder]) + // If the selection is managed by bindings, let the binder do that. + if ([self binderForBinding:CPSelectionIndexesBinding] || [self binderForBinding:CPSelectedIndexBinding]) return; if (_selectedTabViewItem == aTabViewItem) @@ -308,11 +312,12 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, if (![self _selectTabViewItemAtIndex:anIndex]) return NO; - //[self _reverseSetSelectedIndex]; + [self _reverseSetSelectedIndex]; return YES; } +// Like selectTabViewItemAtIndex: but without bindings interaction - (BOOL)_selectTabViewItemAtIndex:(CPUInteger)anIndex { var aTabViewItem = [self tabViewItemAtIndex:anIndex]; @@ -525,6 +530,196 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, @end +@implementation CPTabView (BindingSupport) + ++ (Class)_binderClassForBinding:(CPString)aBinding +{ + if (aBinding == CPContentBinding) + return [_CPTabViewContentBinder class]; + else if (aBinding == CPSelectionIndexesBinding || aBinding == CPSelectedIndexBinding) + return [_CPTabViewSelectionBinder class]; + + return [super _binderClassForBinding:aBinding]; +} + ++ (BOOL)isBindingExclusive:(CPString)aBinding +{ + return (aBinding == CPSelectionIndexesBinding || aBinding == CPSelectedIndexBinding); +} + +- (void)_reverseSetContent +{ + var theBinder = [self binderForBinding:CPContentBinding]; + [theBinder reverseSetValueFor:@"items"]; +} + +- (void)_reverseSetSelectedIndex +{ + var theBinder = [self binderForBinding:CPSelectionIndexesBinding]; + + if (theBinder !== nil) + [theBinder reverseSetValueFor:@"selectionIndexes"]; + else + { + theBinder = [self binderForBinding:CPSelectedIndexBinding]; + [theBinder reverseSetValueFor:@"selectedIndex"]; + } +} + +- (CPBinder)binderForBinding:(CPString)aBinding +{ + var cls = [[self class] _binderClassForBinding:aBinding] + return [cls getBinding:aBinding forObject:self]; +} + +- (void)setItems:(CPArray)tabViewItems +{ + if ([tabViewItems isEqualToArray:[_tabs segments]]) + return; + + [[self items] makeObjectsPerformSelector:@selector(_setTabView:) withObject:nil]; + [_tabs setSegments:tabViewItems]; + [tabViewItems makeObjectsPerformSelector:@selector(_setTabView:) withObject:self]; + + [self tileWithChangedItem:nil]; + + // Update the selection because setSegments: did remove all previous segments AND the selection. + [_tabs setSelectedSegment:[self indexOfTabViewItem:_selectedTabViewItem]]; + + // should we send delegate methods in bindings mode ? + //[self _delegateTabViewDidChangeNumberOfTabViewItems:self]; +} + +- (void)_deselectAll +{ + [_tabs setSelectedSegment:-1]; + _selectedTabViewItem = nil; +} + +- (void)_displayPlaceholder:(CPString)aPlaceholder +{ + if (_placeHolderView == nil) + { + _placeHolderView = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + var textField = [[CPTextField alloc] initWithFrame:CGRectMakeZero()]; + [textField setTag:1000]; + [textField setTextColor:[CPColor whiteColor]]; + [textField setFont:[CPFont boldFontWithName:@"Geneva" size:18 italic:YES]]; + [_placeHolderView addSubview:textField]; + } + + var textField = [_placeHolderView viewWithTag:1000]; + [textField setStringValue:aPlaceholder]; + [textField sizeToFit]; + + var boxBounds = [_box bounds], + textFieldBounds = [textField bounds], + origin = CGPointMake(CGRectGetWidth(boxBounds)/2 - CGRectGetWidth(textFieldBounds)/2, CGRectGetHeight(boxBounds)/2 - CGRectGetHeight(textFieldBounds)); + + [textField setFrameOrigin:origin]; + + [self _displayItemView:_placeHolderView]; +} + +@end + +var _CPTabViewContentBinderNull = @"NO CONTENT"; + +@implementation _CPTabViewContentBinder : CPBinder +{ +} + +- (void)_updatePlaceholdersWithOptions:(CPDictionary)options +{ + [super _updatePlaceholdersWithOptions:options]; + [self _setPlaceholder:_CPTabViewContentBinderNull forMarker:CPNullMarker isDefault:YES]; +} + +- (void)setPlaceholderValue:(id)aValue withMarker:(CPString)aMarker forBinding:(CPString)aBinding +{ + [_source setItems:@[]]; + [_source _setPlaceholderView:aValue]; +} + +- (void)setValue:(id)aValue forBinding:(CPString)aBinding +{ + [_source setItems:aValue]; +} + +- (id)valueForBinding:(CPString)aBinding +{ + return [_source items]; +} + +@end + +var _CPTabViewSelectionBinderMultipleValues = @"Multiple Selection", + _CPTabViewSelectionBinderNoSelection = @"No Selection"; + +@implementation _CPTabViewSelectionBinder : CPBinder +{ +} + +- (void)_updatePlaceholdersWithOptions:(CPDictionary)options +{ + [super _updatePlaceholdersWithOptions:options]; + + [self _setPlaceholder:_CPTabViewSelectionBinderMultipleValues forMarker:CPMultipleValuesMarker isDefault:YES]; + [self _setPlaceholder:_CPTabViewSelectionBinderNoSelection forMarker:CPNoSelectionMarker isDefault:YES]; +} + +- (void)setPlaceholderValue:(id)aValue withMarker:(CPString)aMarker forBinding:(CPString)aBinding +{ + if (aMarker == CPNoSelectionMarker || aMarker == CPNullMarker) + [_source _deselectAll]; + + [_source _displayPlaceholder:aValue]; +} + +- (void)setValue:(id)aValue forBinding:(CPString)aBinding +{ + if (aBinding == CPSelectionIndexesBinding) + { + if (aValue == nil || [aValue count] == 0) + { + [_source _deselectAll]; + [_source _displayPlaceholder:_CPTabViewSelectionBinderNoSelection]; + } + else if ([aValue count] > 1) + [_source _displayPlaceholder:_CPTabViewSelectionBinderMultipleValues]; + else if ([aValue firstIndex] < [_source numberOfTabViewItems]) + [_source _selectTabViewItemAtIndex:[aValue firstIndex]]; + } + else if (aBinding == CPSelectedIndexBinding) + { + if (aValue == CPNotFound) + { + [_source _deselectAll]; + [_source _displayPlaceholder:_CPTabViewSelectionBinderNoSelection]; + } + else if (aValue < [_source numberOfTabViewItems]) + [_source _selectTabViewItemAtIndex:aValue]; + } +} + +- (id)valueForBinding:(CPString)aBinding +{ + if (aBinding == CPSelectionIndexesBinding) + { + var result = [CPIndexSet indexSet], + idx = [_source indexOfTabViewItem:[_source selectedTabViewItem]]; + + if (idx !== CPNotFound) + [result addIndex:idx]; + + return result; + } + else if (aBinding == CPSelectedIndexBinding) + return [_source indexOfTabViewItem:[_source selectedTabViewItem]]; +} + +@end + var CPTabViewItemsKey = "CPTabViewItemsKey", CPTabViewSelectedItemKey = "CPTabViewSelectedItemKey", CPTabViewTypeKey = "CPTabViewTypeKey", @@ -548,6 +743,7 @@ var CPTabViewItemsKey = "CPTabViewItemsKey", [self setDelegate:[aCoder decodeObjectForKey:CPTabViewDelegateKey]]; _selectedTabViewItem = [aCoder decodeObjectForKey:CPTabViewSelectedItemKey]; + _type = [aCoder decodeIntForKey:CPTabViewTypeKey]; } diff --git a/Tests/Manual/CPTabViewBindings/AppController.j b/Tests/Manual/CPTabViewBindings/AppController.j new file mode 100644 index 000000000..2a8c8c81e --- /dev/null +++ b/Tests/Manual/CPTabViewBindings/AppController.j @@ -0,0 +1,77 @@ +/* + * AppController.j + * CPTabViewBindings + * + * Created by You on February 25, 2015. + * Copyright 2015, Your Company All rights reserved. + */ + +@import +@import + +CPLogRegister(CPLogConsole); + +var ITEM_NUMBER = 0; + +@implementation ArrayController : CPArrayController + +- (id)newObject +{ + var n = ITEM_NUMBER++; + var item = [[CPTabViewItem alloc] initWithIdentifier:@"Item" + n]; + [item setLabel:@"Item " + n]; + var view = [[CPView alloc] initWithFrame:CGRectMake(0,0,100,100)]; + [view setBackgroundColor:[CPColor randomColor]]; + [item setView:view]; + + return item; +} + +@end + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; + @outlet CPTabView tabView; + @outlet ArrayController arrayController; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + [tabView bind:CPContentBinding toObject:arrayController withKeyPath:@"arrangedObjects" options:nil]; + [tabView bind:CPSelectionIndexesBinding toObject:arrayController withKeyPath:@"selectionIndexes" options:nil]; + [tabView bind:CPSelectedIndexBinding toObject:arrayController withKeyPath:@"selectedIndex" options:nil]; + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:YES]; +} + +- (@action)preserveSelection:(id)sender +{ + [arrayController setPreservesSelection:[sender state]]; +} + +- (@action)avoidsEmpty:(id)sender +{ + [arrayController setAvoidsEmptySelection:[sender state]]; +} + +- (@action)selectsInserted:(id)sender +{ + [arrayController setSelectsInsertedObjects:[sender state]]; +} + +- (@action)usesMultipleValuesMarker:(id)sender +{ + [arrayController setAlwaysUsesMultipleValuesMarker:[sender state]]; +} + +@end diff --git a/Tests/Manual/CPTabViewBindings/Info.plist b/Tests/Manual/CPTabViewBindings/Info.plist new file mode 100644 index 000000000..7cf056cf4 --- /dev/null +++ b/Tests/Manual/CPTabViewBindings/Info.plist @@ -0,0 +1,14 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPTabViewBindings + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2015, Your Company All rights reserved. + + diff --git a/Tests/Manual/CPTabViewBindings/Jakefile b/Tests/Manual/CPTabViewBindings/Jakefile new file mode 100644 index 000000000..aa6cc29d1 --- /dev/null +++ b/Tests/Manual/CPTabViewBindings/Jakefile @@ -0,0 +1,184 @@ +/* + * Jakefile + * CPTabViewBindings + * + * Created by You on February 25, 2015. + * Copyright 2015, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"), + projectName = "CPTabViewBindings"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "CPTabViewBindings.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPTabViewBindings"); + task.setIdentifier("com.yourcompany.CPTabViewBindings"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPTabViewBindings"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +task ("debug", function() +{ + configuration = ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + configuration = ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "CPTabViewBindings.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", projectName, "CPTabViewBindings.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", configuration, projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (configuration === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", configuration, projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tests/Manual/CPTabViewBindings/Resources/MainMenu.cib b/Tests/Manual/CPTabViewBindings/Resources/MainMenu.cib new file mode 100644 index 000000000..e14505c57 --- /dev/null +++ b/Tests/Manual/CPTabViewBindings/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;68E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;69E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;66E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;71E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;68E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;73E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;66E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;33E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;50E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;52E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;75E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;59E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;68E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;76E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;60E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;68E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;62E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;66E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;78E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;66E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;66E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;66E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;81E;E;D;K;10;$classnameS;21;CPCibBindingConnectorK;8;$classesA;S;21;CPCibBindingConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;52E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;50E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;82E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;83E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;84E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;86E;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;46E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;68E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;87E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;88E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;89E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;90E;E;D;K;6;$classD;K;6;CP$UIDd;2;27E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;46E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;68E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;91E;K;31;CPCibBindingConnectorBindingKeyD;K;6;CP$UIDd;2;92E;K;31;CPCibBindingConnectorKeyPathKeyD;K;6;CP$UIDd;2;92E;K;31;CPCibBindingConnectorOptionsKeyD;K;6;CP$UIDd;2;93E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;69E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;94E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;95E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;96E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;97E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;98E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;99E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;100E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;35E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;102E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;102E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;103E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;E;D;K;10;$classnameS;9;CPTabViewK;8;$classesA;S;9;CPTabViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;107E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;108E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;17;CPTabViewItemsKeyD;K;6;CP$UIDd;3;110E;K;24;CPTabViewSelectedItemKeyD;K;6;CP$UIDd;2;39E;K;16;CPTabViewTypeKeyD;K;6;CP$UIDd;3;101E;K;16;CPTabViewFontKeyD;K;6;CP$UIDd;3;112E;K;20;CPTabViewDelegateKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTabViewItemK;8;$classesA;S;13;CPTabViewItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;3;113E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;114E;K;21;CPTabViewItemImageKeyD;K;6;CP$UIDd;1;0E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;40E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;115E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;116E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;117E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;3;118E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;119E;K;21;CPTabViewItemImageKeyD;K;6;CP$UIDd;1;0E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;42E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;115E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;116E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;E;D;K;10;$classnameS;12;CPScrollViewK;8;$classesA;S;12;CPScrollViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;43E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;120E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;121E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;122E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;123E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;23;CPScrollViewContentViewD;K;6;CP$UIDd;3;125E;K;29;CPScrollViewHeaderClipViewKeyD;K;6;CP$UIDd;3;126E;K;21;CPScrollViewVScrollerD;K;6;CP$UIDd;2;57E;K;21;CPScrollViewHScrollerD;K;6;CP$UIDd;2;54E;K;23;CPScrollViewVLineScrollD;K;6;CP$UIDd;3;127E;K;23;CPScrollViewVPageScrollD;K;6;CP$UIDd;3;127E;K;23;CPScrollViewHLineScrollD;K;6;CP$UIDd;3;127E;K;23;CPScrollViewHPageScrollD;K;6;CP$UIDd;3;127E;K;24;CPScrollViewHasVScrollerD;K;6;CP$UIDd;3;128E;K;24;CPScrollViewHasHScrollerD;K;6;CP$UIDd;3;128E;K;29;CPScrollViewAutohidesScrollerD;K;6;CP$UIDd;3;128E;K;25;CPScrollViewCornerViewKeyD;K;6;CP$UIDd;1;0E;K;31;CPScrollViewBottomCornerViewKeyD;K;6;CP$UIDd;3;129E;K;25;CPScrollViewBorderTypeKeyD;K;6;CP$UIDd;3;130E;K;28;CPScrollViewScrollerStyleKeyD;K;6;CP$UIDd;1;0E;K;32;CPScrollViewScrollerKnobStyleKeyD;K;6;CP$UIDd;3;101E;E;D;K;10;$classnameS;11;CPTableViewK;8;$classesA;S;11;CPTableViewS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;45E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;125E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;131E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;131E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;125E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;133E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;134E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;12;$agrid-colorD;K;6;CP$UIDd;3;135E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewDataSourceKeyD;K;6;CP$UIDd;1;0E;K;22;CPTableViewDelegateKeyD;K;6;CP$UIDd;1;0E;K;23;CPTableViewRowHeightKeyD;K;6;CP$UIDd;3;137E;K;30;CPTableViewIntercellSpacingKeyD;K;6;CP$UIDd;3;138E;K;37;CPTableViewSelectionHighlightStyleKeyD;K;6;CP$UIDd;3;101E;K;37;CPTableViewColumnAutoresizingStyleKeyD;K;6;CP$UIDd;3;136E;K;31;CPTableViewMultipleSelectionKeyD;K;6;CP$UIDd;3;128E;K;28;CPTableViewEmptySelectionKeyD;K;6;CP$UIDd;3;128E;K;30;CPTableViewColumnReorderingKeyD;K;6;CP$UIDd;3;128E;K;28;CPTableViewColumnResizingKeyD;K;6;CP$UIDd;3;128E;K;29;CPTableViewColumnSelectionKeyD;K;6;CP$UIDd;3;128E;K;26;CPTableViewTableColumnsKeyD;K;6;CP$UIDd;3;139E;K;23;CPTableViewGridColorKeyD;K;6;CP$UIDd;3;135E;K;27;CPTableViewGridStyleMaskKeyD;K;6;CP$UIDd;3;101E;K;39;CPTableViewUsesAlternatingBackgroundKeyD;K;6;CP$UIDd;3;106E;K;34;CPTableViewAlternatingRowColorsKeyD;K;6;CP$UIDd;1;0E;K;24;CPTableViewCornerViewKeyD;K;6;CP$UIDd;3;141E;K;24;CPTableViewHeaderViewKeyD;K;6;CP$UIDd;2;56E;K;26;CPTableViewAutosaveNameKeyD;K;6;CP$UIDd;1;0E;K;35;CPTableViewArchivedReusableViewsKeyD;K;6;CP$UIDd;3;142E;E;D;K;10;$classnameS;13;CPTableColumnK;8;$classesA;S;13;CPTableColumnS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;47E;K;26;CPTableColumnIdentifierKeyD;K;6;CP$UIDd;3;143E;K;21;CPTableColumnWidthKeyD;K;6;CP$UIDd;3;144E;K;24;CPTableColumnMinWidthKeyD;K;6;CP$UIDd;3;145E;K;24;CPTableColumnMaxWidthKeyD;K;6;CP$UIDd;3;146E;K;26;CPTableColumnHeaderViewKeyD;K;6;CP$UIDd;3;148E;K;24;CPTableColumnDataViewKeyD;K;6;CP$UIDd;3;149E;K;28;CPTableColumnResizingMaskKeyD;K;6;CP$UIDd;3;150E;K;24;CPTableColumnIsHiddenKeyD;K;6;CP$UIDd;3;106E;K;26;CPTableColumnIsEditableKeyD;K;6;CP$UIDd;3;128E;K;28;CPSortDescriptorPrototypeKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;15;CPTableCellViewK;8;$classesA;S;15;CPTableCellViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;49E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;151E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;152E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;153E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;117E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;50E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;154E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;155E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;50E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;156E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;157E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;158E;K;11;$aalignmentD;K;6;CP$UIDd;3;136E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;136E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;128E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;159E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;106E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;106E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;106E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;160E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;136E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;136E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;106E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;106E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;106E;E;D;K;10;$classnameS;10;CPScrollerK;8;$classesA;S;10;CPScrollerS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;44E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;161E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;162E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;44E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;164E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;165E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;166E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;44E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;167E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;106E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;168E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;17;CPTableHeaderViewK;8;$classesA;S;17;CPTableHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;55E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;126E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;169E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;169E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;126E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;170E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;29;CPTableHeaderViewTableViewKeyD;K;6;CP$UIDd;2;46E;E;D;K;6;$classD;K;6;CP$UIDd;2;53E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;44E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;171E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;172E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;44E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;17;CPViewIsHiddenKeyD;K;6;CP$UIDd;3;164E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;165E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;166E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;18;CPControlTargetKeyD;K;6;CP$UIDd;2;44E;K;18;CPControlActionKeyD;K;6;CP$UIDd;3;173E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;1;0E;K;23;CPScrollerIsVerticalKeyD;K;6;CP$UIDd;3;128E;K;24;CPScrollerKnobProportionD;K;6;CP$UIDd;3;174E;K;18;CPScrollerStyleKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;175E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;178E;K;11;$aalignmentD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;179E;K;16;$aimage-positionD;K;6;CP$UIDd;3;168E;K;7;$aimageD;K;6;CP$UIDd;3;181E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;182E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;182E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;106E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;183E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;128E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;168E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;58E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;184E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;176E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;177E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;178E;K;11;$aalignmentD;K;6;CP$UIDd;3;130E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;185E;K;16;$aimage-positionD;K;6;CP$UIDd;3;168E;K;7;$aimageD;K;6;CP$UIDd;3;186E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;182E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;182E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;106E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;183E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;101E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;128E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;168E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;187E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;188E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;189E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;190E;K;11;$aalignmentD;K;6;CP$UIDd;3;136E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;16;$aimage-positionD;K;6;CP$UIDd;3;130E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;168E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;191E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;182E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;106E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;168E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;168E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;128E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;130E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;192E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;188E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;189E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;190E;K;11;$aalignmentD;K;6;CP$UIDd;3;136E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;16;$aimage-positionD;K;6;CP$UIDd;3;130E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;168E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;193E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;182E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;106E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;168E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;168E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;128E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;130E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;194E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;188E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;189E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;190E;K;11;$aalignmentD;K;6;CP$UIDd;3;136E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;16;$aimage-positionD;K;6;CP$UIDd;3;130E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;168E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;195E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;182E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;106E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;168E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;168E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;128E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;130E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;196E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;188E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;189E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;158E;K;11;$aalignmentD;K;6;CP$UIDd;3;136E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;16;$aimage-positionD;K;6;CP$UIDd;3;130E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;101E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;136E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;197E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;182E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;3;106E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;168E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;168E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;128E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;130E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;3;101E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;198E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;67E;K;28;CPObjectControllerContentKeyD;K;6;CP$UIDd;1;0E;K;36;CPObjectControllerObjectClassNameKeyD;K;6;CP$UIDd;3;199E;K;31;CPObjectControllerIsEditableKeyD;K;6;CP$UIDd;3;128E;K;49;CPObjectControllerAutomaticallyPreparesContentKeyD;K;6;CP$UIDd;3;128E;K;37;CPArrayControllerAvoidsEmptySelectionD;K;6;CP$UIDd;3;128E;K;49;CPArrayControllerClearsFilterPredicateOnInsertionD;K;6;CP$UIDd;3;128E;K;41;CPArrayControllerFilterRestrictsInsertionD;K;6;CP$UIDd;3;128E;K;35;CPArrayControllerPreservesSelectionD;K;6;CP$UIDd;3;128E;K;39;CPArrayControllerSelectsInsertedObjectsD;K;6;CP$UIDd;3;128E;K;47;CPArrayControllerAlwaysUsesMultipleValuesMarkerD;K;6;CP$UIDd;3;106E;K;47;CPArrayControllerAutomaticallyRearrangesObjectsD;K;6;CP$UIDd;3;106E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;3;200E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;3;201E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;E;E;S;8;delegateS;15;arrayControllerS;7;tabViewS;9;theWindowS;9;textFieldS;4;add:S;7;remove:S;18;preserveSelection:S;16;selectsInserted:S;12;avoidsEmpty:S;25;usesMultipleValuesMarker:S;24;value: objectValue.labelS;5;valueS;17;objectValue.labelD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;10;CP.objectsD;E;E;S;24;content: arrangedObjectsS;7;contentS;15;arrangedObjectsD;K;6;$classD;K;6;CP$UIDd;2;85E;K;10;CP.objectsD;E;E;S;34;selectionIndexes: selectionIndexesS;16;selectionIndexesD;K;6;$classD;K;6;CP$UIDd;2;85E;K;10;CP.objectsD;E;E;S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 388}, {813, 249}}S;22;{{0, 0}, {1680, 1027}}d;1;7S;6;Windowd;1;0S;20;{{0, 0}, {813, 249}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;E;E;S;6;normalS;6;{1, 1}F;S;23;{{129, 14}, {450, 190}}S;20;{{0, 0}, {450, 190}}d;2;36D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;41E;E;E;D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;202E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;203E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;106E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;106E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;106E;E;S;1;1S;3;TabS;22;{{10, 33}, {430, 144}}S;20;{{0, 0}, {430, 144}}d;2;18S;1;2S;4;ViewS;22;{{20, 20}, {108, 185}}S;20;{{0, 0}, {108, 185}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;126E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;3;141E;D;K;6;CP$UIDd;3;129E;E;E;S;10;scrollviewD;K;10;$classnameS;10;CPClipViewK;8;$classesA;S;10;CPClipViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;44E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;204E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;131E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;205E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;44E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;117E;K;21;CPViewBackgroundColorD;K;6;CP$UIDd;3;133E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;206E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;46E;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;44E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;207E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;208E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;209E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;44E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;127E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;210E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;24;CPScrollViewDocumentViewD;K;6;CP$UIDd;2;56E;E;d;2;10T;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;44E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;211E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;211E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;44E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;E;d;1;2S;20;{{0, 0}, {106, 167}}D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;132E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;212E;E;S;9;tableviewD;K;6;$classD;K;6;CP$UIDd;3;132E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;213E;E;d;1;4d;2;31S;6;{3, 2}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;48E;E;E;D;K;10;$classnameS;13;_CPCornerViewK;8;$classesA;S;13;_CPCornerViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;140E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;44E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;101E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;214E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;215E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;44E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;216E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;20;CPReuseIdentifierKeyD;K;6;CP$UIDd;3;217E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;E;D;K;6;$classD;K;6;CP$UIDd;2;85E;K;10;CP.objectsD;K;32;AutomaticTableColumnIdentifier.0D;K;6;CP$UIDd;3;219E;E;E;S;32;AutomaticTableColumnIdentifier.0d;3;103d;2;40d;4;1000D;K;10;$classnameS;24;_CPTableColumnHeaderViewK;8;$classesA;S;24;_CPTableColumnHeaderViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;147E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;211E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;211E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;220E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;221E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;16;$atext-alignmentD;K;6;CP$UIDd;3;101E;K;6;$afontD;K;6;CP$UIDd;3;222E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;38;_CPTableColumnHeaderViewStringValueKeyD;K;6;CP$UIDd;3;223E;K;32;_CPTableColumnHeaderViewImageKeyD;K;6;CP$UIDd;1;0E;K;31;_CPTableColumnHeaderViewFontKeyD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;211E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;211E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;157E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;225E;K;11;$aalignmentD;K;6;CP$UIDd;3;101E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;136E;K;6;$afontD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;226E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;227E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;101E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;128E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;128E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;106E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;133E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;136E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;101E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;106E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;106E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;106E;E;d;1;3S;19;{{1, 1}, {103, 31}}S;19;{{0, 0}, {103, 31}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;52E;E;E;S;18;{{2, 0}, {99, 17}}S;18;{{0, 0}, {99, 17}}d;2;34S;9;textfieldS;18;controlSizeRegularS;15;Table View CellD;K;6;$classD;K;6;CP$UIDd;3;132E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;228E;E;S;20;{{1, 51}, {223, 15}}S;19;{{0, 0}, {223, 15}}d;1;8d;11;-2147483648S;8;scrollerS;27;controlSizeRegular+disabledS;29;_horizontalScrollerDidScroll:d;1;1S;19;{{0, 0}, {106, 25}}S;14;tableHeaderRowS;22;{{224, 66}, {15, 102}}S;19;{{0, 0}, {15, 102}}S;27;_verticalScrollerDidScroll:f;18;0.8717948717948718S;22;{{106, 208}, {22, 25}}S;18;{{0, 0}, {22, 25}}S;6;buttonS;27;bordered+controlSizeRegularD;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;229E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;230E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;128E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;106E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;106E;E;D;K;10;$classnameS;20;_CPCibCustomResourceK;8;$classesA;S;20;_CPCibCustomResourceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;180E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;231E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;232E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;233E;E;S;0;d;2;14S;21;{{81, 208}, {22, 25}}D;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;202E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;234E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;106E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;106E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;106E;E;D;K;6;$classD;K;6;CP$UIDd;3;180E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;231E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;235E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;236E;E;S;22;{{590, 17}, {214, 21}}S;19;{{0, 0}, {214, 21}}S;9;check-boxS;27;controlSizeRegular+selectedS;19;Preserves SelectionS;22;{{590, 72}, {214, 21}}S;22;Avoids Empty SelectionS;22;{{590, 44}, {214, 21}}S;24;Selects Inserted ObjectsS;23;{{590, 103}, {214, 21}}S;27;Uses Mutliple Values MarkerS;13;AppControllerS;13;CPTabViewItemS;15;ArrayControllerS;17;CPArrayControllerS;29;.Helvetica Neue DeskInterfaced;2;13S;20;{{1, 1}, {106, 167}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;46E;E;E;S;6;_NS:11S;21;{{1, 168}, {106, 17}}S;19;{{0, 0}, {106, 17}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;56E;E;E;S;6;_NS:16S;16;{{0, 0}, {0, 0}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;168E;D;K;6;CP$UIDd;3;168E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;237E;D;K;6;CP$UIDd;3;237E;D;K;6;CP$UIDd;3;237E;D;K;6;CP$UIDd;3;168E;E;E;S;20;{{0, 160}, {14, 25}}S;18;{{0, 0}, {14, 25}}S;10;cornerviewS;6;_NS:19D;K;10;$classnameS;5;CPCibK;8;$classesA;S;5;CPCibS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;218E;K;16;CPCibDataFileKeyD;K;6;CP$UIDd;3;238E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;240E;E;E;S;12;columnHeaderD;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;202E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;241E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;106E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;106E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;106E;E;S;6;LabelsD;K;6;$classD;K;6;CP$UIDd;3;111E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;242E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;243E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;128E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;106E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;128E;E;S;41;controlSizeRegular+editable+tableDataViewS;9;Text Celld;4;3072D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;244E;D;K;6;CP$UIDd;3;244E;D;K;6;CP$UIDd;3;244E;D;K;6;CP$UIDd;3;168E;E;E;S;5;Ariald;1;9S;7;CPImageS;13;CPAddTemplateD;K;6;$classD;K;6;CP$UIDd;2;85E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;246E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;182E;K;9;frameworkD;K;6;CP$UIDd;3;182E;E;E;d;2;16S;16;CPRemoveTemplateD;K;6;$classD;K;6;CP$UIDd;2;85E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;247E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;182E;K;9;frameworkD;K;6;CP$UIDd;3;182E;E;E;f;3;0.8S;8120;MjgwTlBMSVNUOzEuMDtEO0s7NDskdG9wRDtLOzE4O0NQQ2liT2JqZWN0RGF0YUtleUQ7Szs2O0NQJFVJRGQ7MTsyRTtFO0s7ODskb2JqZWN0c0E7Uzs1OyRudWxsRDtLOzEwOyRjbGFzc25hbWVTOzE2O19DUENpYk9iamVjdERhdGFLOzg7JGNsYXNzZXNBO1M7MTY7X0NQQ2liT2JqZWN0RGF0YVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzE7MUU7SzsyODtfQ1BDaWJPYmplY3REYXRhTmFtZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YU5hbWVzVmFsdWVzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzA7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MzI7X0NQQ2liT2JqZWN0RGF0YUNsYXNzZXNWYWx1ZXNLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzszMDtfQ1BDaWJPYmplY3REYXRhQ29ubmVjdGlvbnNLZXlEO0s7NjtDUCRVSURkOzE7NEU7SzsyODtfQ1BDaWJPYmplY3REYXRhRnJhbWV3b3JrS2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MjY7X0NQQ2liT2JqZWN0RGF0YU5leHRPaWRLZXlEO0s7NjtDUCRVSURkOzE7NUU7SzszMDtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c0tleXNLZXlEO0s7NjtDUCRVSURkOzE7NkU7SzszMjtfQ1BDaWJPYmplY3REYXRhT2JqZWN0c1ZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs3RTtLOzI2O19DUENpYk9iamVjdERhdGFPaWRLZXlzS2V5RDtLOzY7Q1AkVUlEZDsxOzhFO0s7Mjg7X0NQQ2liT2JqZWN0RGF0YU9pZFZhbHVlc0tleUQ7Szs2O0NQJFVJRGQ7MTs5RTtLOzI4O19DUENpYk9iamVjdERhdGFGaWxlT3duZXJLZXlEO0s7NjtDUCRVSURkOzI7MTFFO0s7MzM7X0NQQ2liT2JqZWN0RGF0YVZpc2libGVXaW5kb3dzS2V5RDtLOzY7Q1AkVUlEZDsyOzEzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs3O0NQQXJyYXlLOzg7JGNsYXNzZXNBO1M7NztDUEFycmF5Uzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxNUU7RDtLOzY7Q1AkVUlEZDsyOzE3RTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0Q7Szs2O0NQJFVJRGQ7MjsxOUU7RDtLOzY7Q1AkVUlEZDsyOzIxRTtEO0s7NjtDUCRVSURkOzE7MEU7RDtLOzY7Q1AkVUlEZDsyOzIyRTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzExRTtEO0s7NjtDUCRVSURkOzI7MTlFO0Q7Szs2O0NQJFVJRGQ7MjsyMUU7RDtLOzY7Q1AkVUlEZDsyOzExRTtFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MTszRTtLOzEwO0NQLm9iamVjdHNBO0U7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTg7X0NQQ2liQ3VzdG9tT2JqZWN0Szs4OyRjbGFzc2VzQTtTOzE4O19DUENpYkN1c3RvbU9iamVjdFM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MTBFO0s7Mjc7X0NQQ2liQ3VzdG9tT2JqZWN0Q2xhc3NOYW1lRDtLOzY7Q1AkVUlEZDsyOzIzRTtFO0Q7SzsxMDskY2xhc3NuYW1lUzs1O0NQU2V0Szs4OyRjbGFzc2VzQTtTOzU7Q1BTZXRTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzEyRTtLOzE1O0NQU2V0T2JqZWN0c0tleUQ7Szs2O0NQJFVJRGQ7MjsyNEU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MjA7Q1BDaWJPdXRsZXRDb25uZWN0b3JLOzg7JGNsYXNzZXNBO1M7MjA7Q1BDaWJPdXRsZXRDb25uZWN0b3JTOzE0O0NQQ2liQ29ubmVjdG9yUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxNEU7SzsyNDtfQ1BDaWJDb25uZWN0b3JTb3VyY2VLZXlEO0s7NjtDUCRVSURkOzI7MTlFO0s7Mjk7X0NQQ2liQ29ubmVjdG9yRGVzdGluYXRpb25LZXlEO0s7NjtDUCRVSURkOzI7MjFFO0s7MjM7X0NQQ2liQ29ubmVjdG9yTGFiZWxLZXlEO0s7NjtDUCRVSURkOzI7MjVFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzIxO0NQQ2liQmluZGluZ0Nvbm5lY3Rvcks7ODskY2xhc3Nlc0E7UzsyMTtDUENpYkJpbmRpbmdDb25uZWN0b3JTOzE0O0NQQ2liQ29ubmVjdG9yUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxNkU7SzsyNDtfQ1BDaWJDb25uZWN0b3JTb3VyY2VLZXlEO0s7NjtDUCRVSURkOzI7MjFFO0s7Mjk7X0NQQ2liQ29ubmVjdG9yRGVzdGluYXRpb25LZXlEO0s7NjtDUCRVSURkOzI7MTlFO0s7MjM7X0NQQ2liQ29ubmVjdG9yTGFiZWxLZXlEO0s7NjtDUCRVSURkOzI7MjZFO0s7MzE7Q1BDaWJCaW5kaW5nQ29ubmVjdG9yQmluZGluZ0tleUQ7Szs2O0NQJFVJRGQ7MjsyN0U7SzszMTtDUENpYkJpbmRpbmdDb25uZWN0b3JLZXlQYXRoS2V5RDtLOzY7Q1AkVUlEZDsyOzI4RTtLOzMxO0NQQ2liQmluZGluZ0Nvbm5lY3Rvck9wdGlvbnNLZXlEO0s7NjtDUCRVSURkOzI7MzBFO0U7RDtLOzEwOyRjbGFzc25hbWVTOzE1O0NQVGFibGVDZWxsVmlld0s7ODskY2xhc3Nlc0E7UzsxNTtDUFRhYmxlQ2VsbFZpZXdTOzY7Q1BWaWV3UzsxMTtDUFJlc3BvbmRlclM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MThFO0s7MTg7Q1BSZXNwb25kZXJNZW51S2V5RDtLOzY7Q1AkVUlEZDsxOzBFO0s7MTI7Q1BWaWV3VGFnS2V5RDtLOzY7Q1AkVUlEZDsyOzMxRTtLOzE0O0NQVmlld0ZyYW1lS2V5RDtLOzY7Q1AkVUlEZDsyOzMyRTtLOzE1O0NQVmlld0JvdW5kc0tleUQ7Szs2O0NQJFVJRGQ7MjszM0U7SzsxNztDUFZpZXdTdWJ2aWV3c0tleUQ7Szs2O0NQJFVJRGQ7MjszNEU7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzM1RTtLOzE5O0NQVmlld1RoZW1lQ2xhc3NLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxOTtDUFZpZXdUaGVtZVN0YXRlS2V5RDtLOzY7Q1AkVUlEZDsyOzM2RTtLOzIwO0NQUmV1c2VJZGVudGlmaWVyS2V5RDtLOzY7Q1AkVUlEZDsyOzM3RTtLOzE0O0NQVmlld1NjYWxlS2V5RDtLOzY7Q1AkVUlEZDsyOzM4RTtLOzE4O0NQVmlld1NpemVTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7MjszOEU7SzsxNztDUFZpZXdJc1NjYWxlZEtleUQ7Szs2O0NQJFVJRGQ7MjszOUU7RTtEO0s7MTA7JGNsYXNzbmFtZVM7MTE7Q1BUZXh0RmllbGRLOzg7JGNsYXNzZXNBO1M7MTE7Q1BUZXh0RmllbGRTOzk7Q1BDb250cm9sUzs2O0NQVmlld1M7MTE7Q1BSZXNwb25kZXJTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzIwRTtLOzI3O0NQUmVzcG9uZGVyTmV4dFJlc3BvbmRlcktleUQ7Szs2O0NQJFVJRGQ7MjsxOUU7SzsxODtDUFJlc3BvbmRlck1lbnVLZXlEO0s7NjtDUCRVSURkOzE7MEU7SzsxMjtDUFZpZXdUYWdLZXlEO0s7NjtDUCRVSURkOzI7MzFFO0s7MTQ7Q1BWaWV3RnJhbWVLZXlEO0s7NjtDUCRVSURkOzI7NDBFO0s7MTU7Q1BWaWV3Qm91bmRzS2V5RDtLOzY7Q1AkVUlEZDsyOzQxRTtLOzE4O0NQVmlld1N1cGVydmlld0tleUQ7Szs2O0NQJFVJRGQ7MjsxOUU7SzsyMjtDUFZpZXdBdXRvcmVzaXppbmdNYXNrRDtLOzY7Q1AkVUlEZDsyOzQyRTtLOzE5O0NQVmlld1RoZW1lQ2xhc3NLZXlEO0s7NjtDUCRVSURkOzI7NDNFO0s7MTk7Q1BWaWV3VGhlbWVTdGF0ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs0NEU7SzsxMTskYWFsaWdubWVudEQ7Szs2O0NQJFVJRGQ7Mjs0NUU7SzsxNzskYWxpbmUtYnJlYWstbW9kZUQ7Szs2O0NQJFVJRGQ7Mjs0NUU7Szs2OyRhZm9udEQ7Szs2O0NQJFVJRGQ7Mjs0N0U7SzsxNDtDUFZpZXdTY2FsZUtleUQ7Szs2O0NQJFVJRGQ7MjszOEU7SzsxODtDUFZpZXdTaXplU2NhbGVLZXlEO0s7NjtDUCRVSURkOzI7MzhFO0s7MTc7Q1BWaWV3SXNTY2FsZWRLZXlEO0s7NjtDUCRVSURkOzI7MzlFO0s7MzU7Q1BDb250cm9sU2VuZHNBY3Rpb25PbkVuZEVkaXRpbmdLZXlEO0s7NjtDUCRVSURkOzI7NDhFO0s7MTc7Q1BDb250cm9sVmFsdWVLZXlEO0s7NjtDUCRVSURkOzI7NDlFO0s7MjQ7Q1BDb250cm9sU2VuZEFjdGlvbk9uS2V5RDtLOzY7Q1AkVUlEZDsyOzQ1RTtLOzIzO0NQQ29udHJvbENvbnRyb2xTaXplS2V5RDtLOzY7Q1AkVUlEZDsyOzMxRTtLOzI0O0NQVGV4dEZpZWxkSXNFZGl0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7MjszOUU7SzsyNjtDUFRleHRGaWVsZElzU2VsZWN0YWJsZUtleUQ7Szs2O0NQJFVJRGQ7MjszOUU7SzsyOTtDUFRleHRGaWVsZERyYXdzQmFja2dyb3VuZEtleUQ7Szs2O0NQJFVJRGQ7MjszOUU7SzsyOTtDUFRleHRGaWVsZEJhY2tncm91bmRDb2xvcktleUQ7Szs2O0NQJFVJRGQ7Mjs1MUU7SzsyNztDUFRleHRGaWVsZExpbmVCcmVha01vZGVLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MjM7Q1BUZXh0RmllbGRBbGlnbm1lbnRLZXlEO0s7NjtDUCRVSURkOzI7NDVFO0s7MzE7Q1BUZXh0RmllbGRQbGFjZWhvbGRlclN0cmluZ0tleUQ7Szs2O0NQJFVJRGQ7MTswRTtLOzI5O0NQVGV4dEZpZWxkVXNlc1NpbmdsZUxpbmVNb2RlRDtLOzY7Q1AkVUlEZDsyOzM5RTtLOzE2O0NQVGV4dEZpZWxkV3JhcHNEO0s7NjtDUCRVSURkOzI7MzlFO0s7MTg7Q1BUZXh0RmllbGRTY3JvbGxzRDtLOzY7Q1AkVUlEZDsyOzM5RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7MjsxMEU7SzsyNztfQ1BDaWJDdXN0b21PYmplY3RDbGFzc05hbWVEO0s7NjtDUCRVSURkOzI7NTJFO0U7Uzs4O0NQT2JqZWN0RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RTtFO1M7OTt0ZXh0RmllbGRTOzI0O3ZhbHVlOiBvYmplY3RWYWx1ZS5sYWJlbFM7NTt2YWx1ZVM7MTc7b2JqZWN0VmFsdWUubGFiZWxEO0s7MTA7JGNsYXNzbmFtZVM7MTI7Q1BEaWN0aW9uYXJ5Szs4OyRjbGFzc2VzQTtTOzEyO0NQRGljdGlvbmFyeVM7ODtDUE9iamVjdEU7RTtEO0s7NjskY2xhc3NEO0s7NjtDUCRVSURkOzI7MjlFO0s7MTA7Q1Aub2JqZWN0c0Q7RTtFO2Q7MTswUzsxOTt7ezEsIDF9LCB7MTAzLCAzMX19UzsxOTt7ezAsIDB9LCB7MTAzLCAzMX19RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzIxRTtFO0U7ZDsyOzE4Uzs2O25vcm1hbFM7MzI7QXV0b21hdGljVGFibGVDb2x1bW5JZGVudGlmaWVyLjBTOzY7ezEsIDF9RjtTOzE4O3t7MiwgMH0sIHs5OSwgMTd9fVM7MTg7e3swLCAwfSwgezk5LCAxN319ZDsyOzM0Uzs5O3RleHRmaWVsZFM7MTg7Y29udHJvbFNpemVSZWd1bGFyZDsxOzREO0s7MTA7JGNsYXNzbmFtZVM7NjtDUEZvbnRLOzg7JGNsYXNzZXNBO1M7NjtDUEZvbnRTOzg7Q1BPYmplY3RFO0U7RDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsyOzQ2RTtLOzEzO0NQRm9udE5hbWVLZXlEO0s7NjtDUCRVSURkOzI7NTNFO0s7MTM7Q1BGb250U2l6ZUtleUQ7Szs2O0NQJFVJRGQ7Mjs1NEU7SzsxNTtDUEZvbnRJc0JvbGRLZXlEO0s7NjtDUCRVSURkOzI7MzlFO0s7MTc7Q1BGb250SXNJdGFsaWNLZXlEO0s7NjtDUCRVSURkOzI7MzlFO0s7MTc7Q1BGb250SXNTeXN0ZW1LZXlEO0s7NjtDUCRVSURkOzI7MzlFO0U7VDtTOzE1O1RhYmxlIFZpZXcgQ2VsbEQ7SzsxMDskY2xhc3NuYW1lUzs3O0NQQ29sb3JLOzg7JGNsYXNzZXNBO1M7NztDUENvbG9yUzs4O0NQT2JqZWN0RTtFO0Q7Szs2OyRjbGFzc0Q7Szs2O0NQJFVJRGQ7Mjs1MEU7SzsyMDtDUENvbG9yQ29tcG9uZW50c0tleUQ7Szs2O0NQJFVJRGQ7Mjs1NUU7RTtTOzEzO0NQQXBwbGljYXRpb25TOzI5Oy5IZWx2ZXRpY2EgTmV1ZSBEZXNrSW50ZXJmYWNlZDsyOzEzRDtLOzY7JGNsYXNzRDtLOzY7Q1AkVUlEZDsxOzNFO0s7MTA7Q1Aub2JqZWN0c0E7RDtLOzY7Q1AkVUlEZDsyOzU2RTtEO0s7NjtDUCRVSURkOzI7NTZFO0Q7Szs2O0NQJFVJRGQ7Mjs1NkU7RDtLOzY7Q1AkVUlEZDsyOzU3RTtFO0U7ZjsxODswLjY4NjI3NDUwOTgwMzkyMTZkOzE7MUU7Szs5OyRhcmNoaXZlclM7MTU7Q1BLZXllZEFyY2hpdmVySzs4OyR2ZXJzaW9uUzs2OzEwMDAwMEU7D;K;10;$classnameS;19;_CPImageAndTextViewK;8;$classesA;S;19;_CPImageAndTextViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;239E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;148E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;248E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;249E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;148E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;117E;K;17;CPViewHitTestsKeyD;K;6;CP$UIDd;3;106E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;104E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;105E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;105E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;106E;E;d;2;11S;28;_CPFontSystemFacePlaceholderd;2;12f;18;0.6862745098039216D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;245E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;250E;E;D;K;6;$classD;K;6;CP$UIDd;3;245E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;250E;E;S;18;{{5, 0}, {-10, 0}}S;18;{{0, 0}, {-10, 0}}S;22;{"width":0,"height":0}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPTabViewBindings/Resources/MainMenu.xib b/Tests/Manual/CPTabViewBindings/Resources/MainMenu.xib new file mode 100644 index 000000000..77530525b --- /dev/null +++ b/Tests/Manual/CPTabViewBindings/Resources/MainMenu.xib @@ -0,0 +1,1062 @@ + + + + 1050 + 14C109 + 6751 + 1344.72 + 757.30 + + com.apple.InterfaceBuilder.CocoaPlugin + 6751 + + + NSArrayController + NSButton + NSButtonCell + NSCustomObject + NSScrollView + NSScroller + NSTabView + NSTabViewItem + NSTableCellView + NSTableColumn + NSTableHeaderView + NSTableView + NSTextField + NSTextFieldCell + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + 7 + 2 + {{335, 390}, {813, 249}} + 1946157056 + Window + NSWindow + + + + + 256 + + + + 268 + + + + 2322 + + + + 256 + + + + 274 + + + + 266 + {{0, 14}, {103, 17}} + + + + {250, 750} + YES + + 67108928 + 272631808 + Table View Cell + + YES + 13 + 1044 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + NO + 1 + + + {{1, 1}, {103, 31}} + + + + + + {106, 167} + + + + _NS:13 + YES + NO + YES + + + 256 + {106, 17} + + + + _NS:15 + + + + + -2147483392 + {15, 20} + + + + _NS:19 + + + + 103 + 40 + 1000 + + 75497536 + 2048 + Labels + + YES + 11 + 3100 + + + 6 + System + headerColor + + 3 + MQA + + + + 6 + System + headerTextColor + + + + + 337641537 + 2048 + Text Cell + + + + 6 + System + controlBackgroundColor + + + + + 3 + YES + YES + + + + 3 + 2 + + + 6 + System + gridColor + + 3 + MC41AA + + + 31 + -566231040 + + + 4 + -1 + 0 + YES + 0 + 1 + + + {{1, 17}, {106, 167}} + + + + _NS:11 + + + 4 + YES + + + + 2338 + + + + {{1, 0}, {106, 17}} + + + + _NS:16 + + YES + + + + -2147483392 + {{224, 17}, {15, 102}} + + + + _NS:65 + NO + _doScroller: + + + _doScroller: + 0.87179487179487181 + + + + -2147483392 + {{1, 119}, {223, 15}} + + + + _NS:61 + NO + _doScroller: + + 1 + + _doScroller: + + + + {{20, 44}, {108, 185}} + + + + _NS:9 + 133682 + + + + + + QSAAAEEgAABCBAAAQgQAAA + 0.25 + 4 + 1 + + + + 268 + {{129, 45}, {450, 190}} + + + + _NS:9 + + + 1 + + + 274 + {{10, 33}, {430, 144}} + + + + _NS:11 + + Tab + + + + + 2 + + + 256 + {{10, 33}, {430, 144}} + _NS:28 + + View + + + + + + + 0 + YES + YES + + + + + + + 268 + {{100, 13}, {34, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + + + Arial-BoldMT + 9 + 16 + + _NS:9 + + -2033303552 + 1 + + NSImage + NSAddTemplate + + + + 200 + 25 + + NO + + + + 268 + {{75, 13}, {34, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + + + YES + 16 + 1044 + + _NS:9 + + -2033303552 + 1 + + NSImage + NSRemoveTemplate + + + + 200 + 25 + + NO + + + + 268 + {{591, 213}, {204, 18}} + + + + _NS:9 + YES + + -2080374784 + 268435456 + Preserves Selection + + _NS:9 + + 1211912448 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + NO + + + + 268 + {{591, 158}, {204, 18}} + + + + _NS:9 + YES + + -2080374784 + 268435456 + Avoids Empty Selection + + _NS:9 + + 1211912448 + 2 + + + + + 200 + 25 + + NO + + + + 268 + {{591, 186}, {204, 18}} + + + + _NS:9 + YES + + -2080374784 + 268435456 + Selects Inserted Objects + + _NS:9 + + 1211912448 + 2 + + + + + 200 + 25 + + NO + + + + 268 + {{591, 127}, {204, 18}} + + + + _NS:9 + YES + + 67108864 + 268435456 + Uses Mutliple Values Marker + + _NS:9 + + 1211912448 + 2 + + + + + 200 + 25 + + NO + + + {813, 249} + + + + + {{0, 0}, {1680, 1027}} + {10000000000000, 10000000000000} + YES + + + AppController + + + CPTabViewItem + YES + YES + + YES + YES + YES + YES + YES + + + + + + + delegate + + + + 451 + + + + theWindow + + + + 459 + + + + tabView + + + + 494 + + + + arrayController + + + + 498 + + + + preserveSelection: + + + + 513 + + + + avoidsEmpty: + + + + 515 + + + + selectsInserted: + + + + 516 + + + + usesMultipleValuesMarker: + + + + 517 + + + + content: arrangedObjects + + + + + + content: arrangedObjects + content + arrangedObjects + 2 + + + 480 + + + + selectionIndexes: selectionIndexes + + + + + + selectionIndexes: selectionIndexes + selectionIndexes + selectionIndexes + + 2 + + + 484 + + + + textField + + + + 472 + + + + value: objectValue.label + + + + + + value: objectValue.label + value + objectValue.label + 2 + + + 482 + + + + add: + + + + 497 + + + + remove: + + + + 502 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 371 + + + + + + + + 372 + + + + + + + + + + + + + + + 450 + + + + + 460 + + + + + + + + + + + 461 + + + + + + + + 462 + + + + + 463 + + + + + 464 + + + + + 465 + + + + + + + + + 468 + + + + + 469 + + + + + + + + 470 + + + + + + + + 471 + + + + + 477 + + + + + 485 + + + + + + + + + 486 + + + + + + + + 487 + + + + + + + + 488 + + + + + 489 + + + + + 495 + + + + + + + + 496 + + + + + 499 + + + + + + + + 500 + + + + + 503 + + + + + + + + 504 + + + + + 507 + + + + + + + + 508 + + + + + 509 + + + + + + + + 510 + + + + + 511 + + + + + + + + 512 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {407.5, 426.5} + com.apple.InterfaceBuilder.CocoaPlugin + {{303, 221}, {480, 360}} + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + ArrayController + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 517 + + + + + AppController + NSObject + + id + id + id + id + + + + avoidsEmpty: + id + + + preserveSelection: + id + + + selectsInserted: + id + + + usesMultipleValuesMarker: + id + + + + ArrayController + NSTabView + NSWindow + + + + arrayController + ArrayController + + + tabView + NSTabView + + + theWindow + NSWindow + + + + IBProjectSource + ../.XcodeSupport/AppController.h + + + + ArrayController + NSArrayController + + + + + 0 + IBCocoaFramework + NO + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + {11, 11} + {11, 11} + {15, 15} + + + diff --git a/Tests/Manual/CPTabViewBindings/index-debug.html b/Tests/Manual/CPTabViewBindings/index-debug.html new file mode 100644 index 000000000..d167acc92 --- /dev/null +++ b/Tests/Manual/CPTabViewBindings/index-debug.html @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + CPTabViewBindings + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPTabViewBindings/index.html b/Tests/Manual/CPTabViewBindings/index.html new file mode 100644 index 000000000..65e579ad1 --- /dev/null +++ b/Tests/Manual/CPTabViewBindings/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + CPTabViewBindings + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPTabViewBindings/main.j b/Tests/Manual/CPTabViewBindings/main.j new file mode 100644 index 000000000..4cfee11cb --- /dev/null +++ b/Tests/Manual/CPTabViewBindings/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPTabViewBindings + * + * Created by You on February 25, 2015. + * Copyright 2015, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} From 4b38389dc8ae558bfdcaa3a174eafdd20bdb2ceb Mon Sep 17 00:00:00 2001 From: cacaodev Date: Tue, 24 Mar 2015 16:37:24 +0100 Subject: [PATCH 004/169] Update Manual test --- Tests/Manual/CPTabViewNib/AppController.j | 74 +- .../CPTabViewNib/Resources/MainMenu.cib | 2 +- .../CPTabViewNib/Resources/MainMenu.xib | 729 +++++++++++++++--- .../CPTabViewNib/Resources/TabViewItem.cib | 1 + .../CPTabViewNib/Resources/TabViewItem.xib | 31 + 5 files changed, 694 insertions(+), 143 deletions(-) create mode 100644 Tests/Manual/CPTabViewNib/Resources/TabViewItem.cib create mode 100644 Tests/Manual/CPTabViewNib/Resources/TabViewItem.xib diff --git a/Tests/Manual/CPTabViewNib/AppController.j b/Tests/Manual/CPTabViewNib/AppController.j index 1cda4e413..c88a47d07 100644 --- a/Tests/Manual/CPTabViewNib/AppController.j +++ b/Tests/Manual/CPTabViewNib/AppController.j @@ -5,46 +5,88 @@ * Created by Alexander Ljungberg on November 5, 2010. * Copyright 2010, WireLoad, LLC All rights reserved. */ - +@import @import +CPLogRegister(CPLogConsole); + @implementation AppController : CPObject { CPWindow theWindow; //this "outlet" is connected automatically by the Cib @outlet CPTabView nibTabView; @outlet CPTabView nibTabViewEmpty; + @outlet CPViewController viewController; + @outlet CPStepper insertStepper; + @outlet CPStepper removeStepper; + @outlet CPButton fromViewController; +} + +- (IBAction)insertTabViewItem:(id)sender +{ + var idx = [insertStepper intValue], + item; + + if ([fromViewController state]) + item = [CPTabViewItem tabViewItemWithViewController:viewController]; + else + { + item = [[CPTabViewItem alloc] initWithIdentifier:@"Insert" + idx]; + var view = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + [view setBackgroundColor:[CPColor randomColor]]; + [item setView:view]; + [item setLabel:@"Insert" + idx]; + } + + [nibTabView insertTabViewItem:item atIndex:idx]; +} + +- (IBAction)removeTabViewItem:(id)sender +{ + var idx = [removeStepper intValue], + item = [nibTabView tabViewItemAtIndex:idx]; + + [nibTabView removeTabViewItem:item]; } - (IBAction)changeView:(id)sender { - var item = [nibTabView selectedTabViewItem], - view = [[CPView alloc] initWithFrame:CGRectMakeZero()]; - - [view setBackgroundColor:[CPColor redColor]]; + var item = [nibTabView selectedTabViewItem]; + var view = [[CPView alloc] initWithFrame:CGRectMakeZero()]; + [view setBackgroundColor:[CPColor randomColor]]; [item setView:view]; } - (void)awakeFromCib { - var item = [[CPTabViewItem alloc] initWithIdentifier:@"item"], - view = [[CPView alloc] initWithFrame:CGRectMakeZero()]; - - [item setView:view]; - [item setLabel:@"item"]; - - [nibTabViewEmpty addTabViewItem:item]; - [theWindow setFullPlatformWindow:YES]; +/* + var item = [[CPTabViewItem alloc] initWithIdentifier:@"item"]; + [item setLabel:@"item"]; + [nibTabViewEmpty addTabViewItem:item]; +*/ +} + +- (BOOL)tabView:(CPTabView)aTabView shouldSelectTabViewItem:(CPTabViewItem)tabViewItem +{ + var result = ([tabViewItem identifier] != @"unselectable"); + CPLog.debug(_cmd + [tabViewItem label] + " =" + result); + + return result; +} + +- (void)tabView:(CPTabView)tabView willSelectTabViewItem:(CPTabViewItem)tabViewItem +{ + CPLog.debug(_cmd + [tabViewItem label]); } - (void)tabView:(CPTabView)aTabView didSelectTabViewItem:(CPTabViewItem)tabViewItem { - CPLogConsole(_cmd + [tabViewItem label]); + CPLog.debug(_cmd + [tabViewItem label]); } -- (void)tabView:(CPTabView)aTabView shouldSelectTabViewItem:(CPTabViewItem)tabViewItem +- (void)tabViewDidChangeNumberOfTabViewItems:(CPTabView)tabView { - return [tabViewItem identifier] != @"unselectable"; + CPLog.debug(_cmd + [tabView numberOfTabViewItems]); } @end diff --git a/Tests/Manual/CPTabViewNib/Resources/MainMenu.cib b/Tests/Manual/CPTabViewNib/Resources/MainMenu.cib index f275954fa..83fa94ca4 100644 --- a/Tests/Manual/CPTabViewNib/Resources/MainMenu.cib +++ b/Tests/Manual/CPTabViewNib/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;46E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;47E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;45E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;48E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;45E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;34E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;49E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;45E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;29E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;50E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;34E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;45E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;48E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;29E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;45E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;48E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;39E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;42E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;51E;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;33E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;45E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;52E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;46E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;24E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;53E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;54E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;55E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;56E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;57E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;58E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;59E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;27E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;60E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;61E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;61E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;62E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;63E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;64E;E;D;K;10;$classnameS;9;CPTabViewK;8;$classesA;S;9;CPTabViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;27E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;60E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;65E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;66E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;27E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;67E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;64E;K;17;CPTabViewItemsKeyD;K;6;CP$UIDd;2;68E;K;16;CPTabViewTypeKeyD;K;6;CP$UIDd;2;60E;K;16;CPTabViewFontKeyD;K;6;CP$UIDd;2;70E;K;20;CPTabViewDelegateKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;27E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;60E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;71E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;72E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;27E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;73E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;64E;K;6;$afontD;K;6;CP$UIDd;2;70E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;75E;K;11;$aalignmentD;K;6;CP$UIDd;2;76E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;77E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;78E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;79E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;80E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;80E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;82E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;75E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;76E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;27E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;60E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;83E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;84E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;27E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;73E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;85E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;86E;K;6;$afontD;K;6;CP$UIDd;2;87E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;60E;K;11;$aalignmentD;K;6;CP$UIDd;2;75E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;60E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;76E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;2;88E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;2;89E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;80E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;2;90E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;60E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;2;77E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;2;75E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;60E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;28E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;27E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;60E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;91E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;66E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;92E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;27E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;93E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;64E;K;17;CPTabViewItemsKeyD;K;6;CP$UIDd;2;94E;K;24;CPTabViewSelectedItemKeyD;K;6;CP$UIDd;2;43E;K;16;CPTabViewTypeKeyD;K;6;CP$UIDd;2;60E;K;16;CPTabViewFontKeyD;K;6;CP$UIDd;2;70E;K;20;CPTabViewDelegateKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTabViewItemK;8;$classesA;S;13;CPTabViewItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;2;95E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;2;96E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;37E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;60E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;97E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;98E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;99E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;64E;E;D;K;10;$classnameS;8;CPSliderK;8;$classesA;S;8;CPSliderS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;60E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;100E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;101E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;37E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;102E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;103E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;64E;K;6;$afontD;K;6;CP$UIDd;3;104E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;60E;K;11;$aalignmentD;K;6;CP$UIDd;2;60E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;105E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;76E;K;19;CPSliderMinValueKeyD;K;6;CP$UIDd;2;60E;K;19;CPSliderMaxValueKeyD;K;6;CP$UIDd;3;106E;K;23;CPSliderAltIncrValueKeyD;K;6;CP$UIDd;2;60E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;3;107E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;108E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;41E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;60E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;97E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;98E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;64E;E;D;K;6;$classD;K;6;CP$UIDd;2;30E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;41E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;60E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;110E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;111E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;41E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;102E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;74E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;112E;K;6;$afontD;K;6;CP$UIDd;2;70E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;75E;K;11;$aalignmentD;K;6;CP$UIDd;2;76E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;77E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;89E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;79E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;77E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;77E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;77E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;113E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;75E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;76E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;114E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;44E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;26E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;60E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;115E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;98E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;34E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;116E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;64E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;117E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;25E;E;E;S;8;delegateS;10;nibTabViewS;15;nibTabViewEmptyS;20;takeDoubleValueFrom:S;11;changeView:S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;23;{{110, 71}, {950, 390}}S;22;{{0, 0}, {1680, 1028}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {950, 390}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;E;E;d;2;18S;6;normalS;22;{{478, 6}, {454, 344}}S;20;{{0, 0}, {454, 344}}d;2;51D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;69E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;118E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;119E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;77E;E;S;23;{{597, 359}, {216, 17}}S;19;{{0, 0}, {216, 17}}d;2;13S;9;textfieldd;1;2d;1;4T;S;33;A Tab View Item Sould be Selectedd;4;3072F;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;81E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;120E;E;S;23;{{159, 355}, {162, 25}}S;19;{{0, 0}, {162, 25}}S;6;buttonS;8;borderedD;K;6;$classD;K;6;CP$UIDd;2;69E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;118E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;119E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;77E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;77E;E;S;20;Replace Current ViewS;0;d;2;14S;21;{{13, 6}, {454, 344}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;44E;E;E;d;2;54D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;40E;E;E;S;1;1S;3;TabS;22;{{10, 33}, {434, 298}}S;20;{{0, 0}, {434, 298}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;39E;E;E;S;21;{{166, 34}, {92, 21}}S;18;{{0, 0}, {92, 21}}d;2;45S;6;sliderD;K;6;$classD;K;6;CP$UIDd;2;69E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;121E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;122E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;80E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;80E;E;d;2;50d;3;100S;12;unselectableS;14;Not SelectableD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;42E;E;E;S;22;{{165, 26}, {104, 29}}S;19;{{0, 0}, {104, 29}}S;28;bezeled+editable+placeholderD;K;6;$classD;K;6;CP$UIDd;2;81E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;123E;E;S;4;ViewS;22;{{10, 13}, {434, 298}}d;1;8S;13;AppControllerS;28;_CPFontSystemFacePlaceholderd;2;-1D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;124E;D;K;6;CP$UIDd;3;125E;E;E;S;9;Helveticad;2;12D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;3;125E;E;E;f;18;0.6862745098039216d;1;1E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;67E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;50E;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;52E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;54E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;68E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;69E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;65E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;33E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;46E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;71E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;62E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;72E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;64E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;73E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;46E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;74E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;37E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;75E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;60E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;76E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;65E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;67E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;77E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;46E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;65E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;37E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;65E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;70E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;45E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;65E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;78E;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;63E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;56E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;65E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;80E;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;57E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;65E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;81E;E;D;K;6;$classD;K;6;CP$UIDd;2;25E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;60E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;58E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;79E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;68E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;32E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;82E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;83E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;84E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;85E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;86E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;87E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;88E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;35E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;90E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;90E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;91E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;92E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;93E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;E;D;K;10;$classnameS;9;CPTabViewK;8;$classesA;S;9;CPTabViewS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;96E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;98E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;93E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;17;CPTabViewItemsKeyD;K;6;CP$UIDd;2;99E;K;24;CPTabViewSelectedItemKeyD;K;6;CP$UIDd;2;39E;K;16;CPTabViewTypeKeyD;K;6;CP$UIDd;2;89E;K;16;CPTabViewFontKeyD;K;6;CP$UIDd;3;101E;K;20;CPTabViewDelegateKeyD;K;6;CP$UIDd;1;0E;E;D;K;10;$classnameS;13;CPTabViewItemK;8;$classesA;S;13;CPTabViewItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;102E;K;21;CPTabViewItemImageKeyD;K;6;CP$UIDd;1;0E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;40E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;37E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;103E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;105E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;92E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;93E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;40E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;106E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;107E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;40E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;111E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;102E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;95E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;115E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;112E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;111E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;95E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;95E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;116E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;117E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;118E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;111E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;119E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;95E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;115E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;112E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;111E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;95E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;95E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;113E;E;D;K;10;$classnameS;8;CPButtonK;8;$classesA;S;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;120E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;121E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;118E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;122E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;123E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;89E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;89E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;124E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;125E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;95E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;126E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;89E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;113E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;112E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;89E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;36E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;127E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;97E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;128E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;93E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;17;CPTabViewItemsKeyD;K;6;CP$UIDd;3;129E;K;24;CPTabViewSelectedItemKeyD;K;6;CP$UIDd;2;53E;K;16;CPTabViewTypeKeyD;K;6;CP$UIDd;2;89E;K;16;CPTabViewFontKeyD;K;6;CP$UIDd;3;101E;K;20;CPTabViewDelegateKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;3;130E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;131E;K;21;CPTabViewItemImageKeyD;K;6;CP$UIDd;1;0E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;48E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;103E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;132E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;92E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;93E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;48E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;133E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;134E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;48E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;111E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;131E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;95E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;115E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;112E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;111E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;95E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;95E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;3;135E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;136E;K;21;CPTabViewItemImageKeyD;K;6;CP$UIDd;1;0E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;51E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;103E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;137E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;92E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;93E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;51E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;138E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;139E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;51E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;111E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;136E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;95E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;115E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;112E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;111E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;95E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;95E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;38E;K;26;CPTabViewItemIdentifierKeyD;K;6;CP$UIDd;1;0E;K;21;CPTabViewItemLabelKeyD;K;6;CP$UIDd;3;140E;K;21;CPTabViewItemImageKeyD;K;6;CP$UIDd;3;142E;K;20;CPTabViewItemViewKeyD;K;6;CP$UIDd;2;54E;K;23;CPTabViewItemAuxViewKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;34E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;46E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;103E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;104E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;143E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;92E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;93E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;54E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;144E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;145E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;54E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;111E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;140E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;95E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;115E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;112E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;111E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;95E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;95E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;146E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;147E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;122E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;123E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;89E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;89E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;148E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;125E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;95E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;126E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;89E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;113E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;112E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;89E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;149E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;150E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;122E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;123E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;89E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;89E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;151E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;125E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;95E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;126E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;2;89E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;113E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;112E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;89E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;152E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;153E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;154E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;95E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;115E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;112E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;95E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;95E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;113E;E;D;K;10;$classnameS;9;CPStepperK;8;$classesA;S;9;CPStepperS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;155E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;156E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;157E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;89E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;158E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;159E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;160E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;113E;E;D;K;10;$classnameS;10;CPCheckBoxK;8;$classesA;S;10;CPCheckBoxS;8;CPButtonS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;61E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;161E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;162E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;163E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;111E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;89E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;16;$aimage-positionD;K;6;CP$UIDd;3;112E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;89E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;16;CPButtonTitleKeyD;K;6;CP$UIDd;3;164E;K;25;CPButtonAlternateTitleKeyD;K;6;CP$UIDd;3;125E;K;27;CPButtonAllowsMixedStateKeyD;K;6;CP$UIDd;2;95E;K;23;CPButtonHighlightsByKeyD;K;6;CP$UIDd;3;159E;K;23;CPButtonShowsStateByKeyD;K;6;CP$UIDd;3;159E;K;32;CPButtonImageDimsWhenDisabledKeyD;K;6;CP$UIDd;3;113E;K;24;CPButtonImagePositionKeyD;K;6;CP$UIDd;3;112E;K;28;CPButtonKeyEquivalentMaskKeyD;K;6;CP$UIDd;2;89E;K;24;CPButtonPeriodicDelayKeyD;K;6;CP$UIDd;1;0E;K;27;CPButtonPeriodicIntervalKeyD;K;6;CP$UIDd;1;0E;E;D;K;6;$classD;K;6;CP$UIDd;2;41E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;165E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;166E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;109E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;3;112E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;112E;K;6;$afontD;K;6;CP$UIDd;3;101E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;113E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;154E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;111E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;95E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;95E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;115E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;112E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;112E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;95E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;95E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;59E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;35E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;89E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;167E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;156E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;35E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;108E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;157E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;110E;K;11;$aalignmentD;K;6;CP$UIDd;2;89E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;89E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;94E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;94E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;95E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;89E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;158E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;89E;K;18;CPStepperIncrementD;K;6;CP$UIDd;3;159E;K;17;CPStepperMaxValueD;K;6;CP$UIDd;3;160E;K;19;CPStepperAutorepeatD;K;6;CP$UIDd;3;113E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;168E;E;D;K;10;$classnameS;16;CPViewControllerK;8;$classesA;S;16;CPViewControllerS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;66E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;23;CPViewControllerViewKeyD;K;6;CP$UIDd;1;0E;K;24;CPViewControllerTitleKeyD;K;6;CP$UIDd;3;169E;K;26;CPViewControllerCibNameKeyD;K;6;CP$UIDd;3;170E;K;25;CPViewControllerBundleKeyD;K;6;CP$UIDd;1;0E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;33E;E;E;S;8;delegateS;21;initialFirstResponderS;18;fromViewControllerS;13;insertStepperS;10;nibTabViewS;15;nibTabViewEmptyS;13;removeStepperS;14;viewControllerS;11;changeView:S;17;takeIntValueFrom:S;18;insertTabViewItem:S;18;removeTabViewItem:S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;23;{{110, 20}, {950, 440}}S;22;{{0, 0}, {1680, 1027}}d;2;15S;6;Windowd;1;0S;20;{{0, 0}, {950, 440}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;62E;E;E;d;2;18S;6;normalS;6;{1, 1}F;S;23;{{478, 48}, {454, 345}}S;20;{{0, 0}, {454, 345}}d;2;51D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;39E;E;E;D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;100E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;171E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;118E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;95E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;95E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;95E;E;S;6;Item 0S;22;{{10, 33}, {434, 299}}S;20;{{0, 0}, {434, 299}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;42E;E;E;S;22;{{200, 133}, {39, 17}}S;18;{{0, 0}, {39, 17}}d;2;36S;9;textfieldS;18;controlSizeRegulard;1;4d;1;2T;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;114E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;172E;E;S;23;{{596, 409}, {218, 17}}S;19;{{0, 0}, {218, 17}}d;2;13S;33;A Tab View Item Sould be SelectedS;23;{{159, 408}, {162, 25}}S;19;{{0, 0}, {162, 25}}S;6;buttonS;27;bordered+controlSizeRegularS;20;Replace Current ViewS;0;d;2;14S;22;{{13, 48}, {454, 345}}d;2;54D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;50E;E;E;S;1;1S;3;TabD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;49E;E;E;S;22;{{200, 133}, {22, 17}}S;18;{{0, 0}, {22, 17}}S;12;unselectableS;14;Not SelectableD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;52E;E;E;S;22;{{172, 133}, {91, 17}}S;18;{{0, 0}, {91, 17}}S;4;ViewD;K;10;$classnameS;20;_CPCibCustomResourceK;8;$classesA;S;20;_CPCibCustomResourceS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;141E;K;32;_CPCibCustomResourceClassNameKeyD;K;6;CP$UIDd;3;173E;K;35;_CPCibCustomResourceResourceNameKeyD;K;6;CP$UIDd;3;174E;K;33;_CPCibCustomResourcePropertiesKeyD;K;6;CP$UIDd;3;176E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;55E;E;E;S;22;{{200, 133}, {29, 17}}S;18;{{0, 0}, {29, 17}}S;21;{{20, 11}, {182, 25}}S;19;{{0, 0}, {182, 25}}S;25;InsertTabViewItemAtIndex:S;22;{{460, 11}, {192, 25}}S;19;{{0, 0}, {192, 25}}S;25;removeTabViewItemAtIndex:S;21;{{655, 12}, {27, 20}}S;18;{{0, 0}, {27, 20}}S;1;0S;18;{{685, 9}, {0, 0}}S;16;{{0, 0}, {0, 0}}S;7;stepperd;5;65540d;1;1d;3;100S;22;{{285, 13}, {159, 21}}S;19;{{0, 0}, {159, 21}}S;9;check-boxS;20;From View controllerS;21;{{200, 13}, {27, 19}}S;18;{{0, 0}, {27, 19}}S;19;{{226, 10}, {0, 0}}S;13;AppControllerS;15;VIEW CONTROLLERS;11;TabViewItemS;29;.Helvetica Neue DeskInterfaceD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;177E;D;K;6;CP$UIDd;3;159E;E;E;S;7;CPImageS;13;CPAddTemplateD;K;10;$classnameS;12;CPDictionaryK;8;$classesA;S;12;CPDictionaryS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;175E;K;10;CP.objectsD;K;4;sizeD;K;6;CP$UIDd;3;179E;K;16;bundleIdentifierD;K;6;CP$UIDd;3;125E;K;9;frameworkD;K;6;CP$UIDd;3;125E;E;E;f;18;0.6862745098039216D;K;10;$classnameS;21;_CPKeyedArchiverValueK;8;$classesA;S;21;_CPKeyedArchiverValueS;7;CPValueS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;178E;K;15;CPValueValueKeyD;K;6;CP$UIDd;3;180E;E;S;22;{"width":0,"height":0}E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPTabViewNib/Resources/MainMenu.xib b/Tests/Manual/CPTabViewNib/Resources/MainMenu.xib index 8cdb134dd..a7ab1ba3b 100644 --- a/Tests/Manual/CPTabViewNib/Resources/MainMenu.xib +++ b/Tests/Manual/CPTabViewNib/Resources/MainMenu.xib @@ -14,13 +14,14 @@ NSButton NSButtonCell NSCustomObject - NSSlider - NSSliderCell + NSStepper + NSStepperCell NSTabView NSTabViewItem NSTextField NSTextFieldCell NSView + NSViewController NSWindowTemplate @@ -43,7 +44,7 @@ 15 2 - {{110, 567}, {950, 390}} + {{110, 567}, {950, 440}} 1946157056 Window NSWindow @@ -56,7 +57,7 @@ 286 - {{13, 40.000000383795708}, {454, 344}} + {{13, 47}, {454, 345}} @@ -64,101 +65,41 @@ 1 - 256 + 274 - + - 301 - {{164, 243}, {96, 21}} + 268 + {{198, 149}, {26, 17}} + _NS:526 + {251, 750} YES - - -2080374784 - 0 - - - Helvetica - 12 - 16 - - - 100 - 0.0 - 50 - 0.0 - 0 - 1 - NO - NO - - NO - - - {{10, 33}, {434, 298}} - - - Tab - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - - - - - 274 - {{10, 33}, {434, 298}} - - - - - View - - - - - unselectable - - - 256 - - - - 301 - {{169, 246}, {96, 22}} - - YES - - -1804599231 + + 68157504 272630784 - + Tab YES 13 1044 - - YES - + _NS:526 + + 6 System - textBackgroundColor + controlColor 3 - MQA + MC42NjY2NjY2NjY3AA - + 6 System - textColor + labelColor 3 MAA @@ -169,8 +110,85 @@ 1 - {{10, 33}, {434, 298}} - + {{10, 33}, {434, 299}} + + + Tab + + + + + + + 274 + + + + 268 + {{198, 149}, {33, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + View + + _NS:526 + + + + + NO + 1 + + + {{10, 33}, {434, 299}} + + + + + View + + + + NSImage + NSAddTemplate + + + + unselectable + + + 274 + + + + 268 + {{170, 149}, {95, 17}} + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Not Selectable + + _NS:526 + + + + + NO + 1 + + + {{10, 33}, {434, 299}} + Not Selectable @@ -189,14 +207,57 @@ 283 - {{478, 40.000000383795708}, {453.99999982220186, 344}} + {{478, 47}, {454, 345}} - + + + + + 274 + + + + 268 + {{198, 149}, {43, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Item 0 + + _NS:526 + + + + + NO + 1 + + + {{10, 33}, {434, 299}} + + + + + Item 0 + + + + + 0 YES YES + + + @@ -249,19 +310,192 @@ NO + + + 268 + {{198, 408}, {31, 19}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 138413056 + 0 + + _NS:526 + + + + + NO + 1 + + + + 268 + {{223, 405}, {19, 27}} + + + + _NS:1592 + YES + + 786464 + 0 + _NS:1592 + + 100 + 1 + YES + + NO + + + + 268 + {{14, 401}, {194, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + InsertTabViewItemAtIndex: + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{454, 401}, {204, 32}} + + + + _NS:9 + YES + + 67108864 + 134217728 + removeTabViewItemAtIndex: + + _NS:9 + + -2038284288 + 129 + + + 200 + 25 + + NO + + + + 268 + {{653, 408}, {31, 20}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 138413056 + 0 + + _NS:526 + + + + + NO + 1 + + + + 268 + {{682, 406}, {19, 27}} + + + + _NS:1592 + YES + + 786464 + 0 + _NS:1592 + + 100 + 1 + YES + + NO + + + + 268 + {{286, 408}, {149, 18}} + + + + _NS:9 + YES + + 67108864 + 268435456 + From View controller + + _NS:9 + + 1211912448 + 2 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + NO + - {950, 390} + {950, 440} - + - {{0, 0}, {1680, 1028}} + {{0, 0}, {1680, 1027}} {10000000000000, 10000000000000} YES AppController + + TabViewItem + VIEW CONTROLLER + 0 + @@ -273,6 +507,14 @@ 451 + + + initialFirstResponder + + + + 492 + changeView: @@ -298,12 +540,52 @@ 486 - - takeDoubleValueFrom: - - + + viewController + + - 458 + 494 + + + + insertStepper + + + + 513 + + + + insertTabViewItem: + + + + 514 + + + + removeTabViewItem: + + + + 523 + + + + removeStepper + + + + 524 + + + + fromViewController + + + + 527 @@ -321,6 +603,22 @@ 487 + + + takeIntValueFrom: + + + + 512 + + + + takeIntValueFrom: + + + + 522 + @@ -364,6 +662,13 @@ + + + + + + + @@ -402,7 +707,7 @@ 463 - + @@ -410,40 +715,16 @@ 464 - + - - 452 - - - - - - - - 453 - - - - - 456 - - - - - - - - 457 - - - 465 - + + + @@ -483,27 +764,194 @@ 489 + + + + + 490 + + + + + + + + 491 + + + + + + + + 493 + + + + + 495 + + + + + + + + 496 + + + + + 497 + + + + + + + + 498 + + + + + 499 + + + + + + + + 500 + + + + + 502 + + + + + + + + 503 + + + + + 506 + + + + + + + + 507 + + + + + 508 + + + + + + + + 509 + + + + + 510 + + + + + + + + 511 + + + + + 515 + + + + + + + + 516 + + + + + 518 + + + + + + + + 519 + + + + + + + + 520 + + + + + 521 + + + + + 525 + + + + + + + + 526 + + + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + {458, 371} com.apple.InterfaceBuilder.CocoaPlugin {{209, 447}, {480, 360}} + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -512,12 +960,37 @@ com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin - 489 + 527 @@ -597,5 +1070,9 @@ YES 3 + + {11, 11} + {15, 15} + diff --git a/Tests/Manual/CPTabViewNib/Resources/TabViewItem.cib b/Tests/Manual/CPTabViewNib/Resources/TabViewItem.cib new file mode 100644 index 000000000..722b30f60 --- /dev/null +++ b/Tests/Manual/CPTabViewNib/Resources/TabViewItem.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;1;0E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;20E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;21E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;22E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;18E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;23E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;24E;E;D;K;10;$classnameS;18;_CPCibClassSwapperK;8;$classesA;S;18;_CPCibClassSwapperS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;25E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;26E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;26E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;27E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;28E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;29E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;30E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;30E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;31E;K;30;_CPCibClassSwapperClassNameKeyD;K;6;CP$UIDd;2;32E;K;38;_CPCibClassSwapperOriginalClassNameKeyD;K;6;CP$UIDd;2;32E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;19E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;18E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;25E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;33E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;34E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;18E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;35E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;36E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;37E;K;11;$aalignmentD;K;6;CP$UIDd;2;38E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;38E;K;6;$afontD;K;6;CP$UIDd;2;40E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;30E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;30E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;31E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;41E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;42E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;43E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;25E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;31E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;31E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;31E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;45E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;38E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;38E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;31E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;31E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;41E;E;S;16;CPViewControllerD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;S;4;viewS;13;CPApplicationd;1;0S;20;{{0, 0}, {406, 263}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;20E;E;E;d;2;18S;6;normalS;6;{1, 1}F;S;6;CPViewS;22;{{93, 118}, {220, 22}}S;19;{{0, 0}, {220, 22}}d;2;36S;9;textfieldS;26;bezeled+controlSizeRegulard;1;2D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;39E;K;13;CPFontNameKeyD;K;6;CP$UIDd;2;46E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;47E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;31E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;31E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;31E;E;T;S;28;CPViewController TabViewItemd;1;4D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;44E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;48E;E;S;29;.Helvetica Neue DeskInterfaced;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;49E;E;E;d;1;1E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPTabViewNib/Resources/TabViewItem.xib b/Tests/Manual/CPTabViewNib/Resources/TabViewItem.xib new file mode 100644 index 000000000..529e412f1 --- /dev/null +++ b/Tests/Manual/CPTabViewNib/Resources/TabViewItem.xib @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 88f7b30128ab07055e7fffebbabfd9e9de30e145 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Wed, 25 Mar 2015 14:11:44 +0100 Subject: [PATCH 005/169] NEW: +tabViewItemWithViewController: --- AppKit/CPTabViewItem.j | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/AppKit/CPTabViewItem.j b/AppKit/CPTabViewItem.j index 113a539f6..3bec89bd1 100644 --- a/AppKit/CPTabViewItem.j +++ b/AppKit/CPTabViewItem.j @@ -24,6 +24,7 @@ @import "CPView.j" @class CPTabView +@class CPViewControler /* The tab is currently selected. @@ -72,6 +73,17 @@ CPPressedTab = 2; float _width @accessors(property=width); } +/* + +*/ ++ (CPTabViewItem)tabViewItemWithViewController:(CPViewController)aViewController +{ + var item = [[CPTabViewItem alloc] init]; + [item setViewController:aViewController]; + + return item; +} + - (id)init { return [self initWithIdentifier:@""]; @@ -191,6 +203,7 @@ CPPressedTab = 2; _view = aView; if ([_tabView selectedTabViewItem] == self) + [_tabView _displayItemView:_view]; } /*! @@ -198,6 +211,9 @@ CPPressedTab = 2; */ - (CPView)view { + if (!_view && _viewController) + return [_viewController view]; // The view controller loads here. + return _view; } @@ -236,6 +252,27 @@ CPPressedTab = 2; _tabView = aView; } +/*! + Sets the specified view controller for the tab view item. + @param aViewController an instance of CPViewController. +*/ +- (void)setViewController:(CPViewController)aViewController +{ + _viewController = aViewController; + + var identifier = [aViewController cibName], + title = [_viewController title]; + + if (identifier) + _identifier = identifier; + + if (title) + [self setLabel:title]; + + if ([_tabView selectedTabViewItem] == self) + [_tabView _displayItemView:[_viewController view]]; +} + @end var CPTabViewItemIdentifierKey = "CPTabViewItemIdentifierKey", From c171a37f24840b8feab4984025bedbba7ecb8e1a Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 17 Apr 2015 17:16:11 -0700 Subject: [PATCH 006/169] New: first work on localization --- AppKit/Cib/CPCib.j | 1 + AppKit/Cib/_CPLocalizableString.j | 66 +++++++++++++++++++++ Foundation/CPBundle.j | 54 +++++++++++++++++ Objective-J/CFBundle.js | 89 ++++++++++++++++++++++++++--- Tools/nib2cib/NSAppKit.j | 1 + Tools/nib2cib/NSLocalizableString.j | 59 +++++++++++++++++++ 6 files changed, 262 insertions(+), 8 deletions(-) create mode 100644 AppKit/Cib/_CPLocalizableString.j create mode 100644 Tools/nib2cib/NSLocalizableString.j diff --git a/AppKit/Cib/CPCib.j b/AppKit/Cib/CPCib.j index 12c9611af..e693fcb21 100644 --- a/AppKit/Cib/CPCib.j +++ b/AppKit/Cib/CPCib.j @@ -32,6 +32,7 @@ @import "_CPCibObjectData.j" @import "_CPCibProxyObject.j" @import "_CPCibWindowTemplate.j" +@import "_CPLocalizableString.j" CPCibOwner = @"CPCibOwner"; CPCibTopLevelObjects = @"CPCibTopLevelObjects"; diff --git a/AppKit/Cib/_CPLocalizableString.j b/AppKit/Cib/_CPLocalizableString.j new file mode 100644 index 000000000..8ee65a069 --- /dev/null +++ b/AppKit/Cib/_CPLocalizableString.j @@ -0,0 +1,66 @@ +/* + * _CPLocalizableString.j + * AppKit + * + * Created by Alexandre Wilhelm. + * Copyright 2008, 280 North, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@implementation _CPLocalizableString : CPString +{ + CPString _dev @accessors(property=dev); + CPString _key @accessors(property=key); +} + +- (id)init +{ + if (self = [super init]) + { + + } + + return self; +} + +@end + + +var CPLocalizableStringDev = @"CPLocalizableStringDev", + CPLocalizableStringKey = @"CPLocalizableStringKey"; + +@implementation _CPLocalizableString (CPCoding) + +- (id)initWithCoder:(CPCoder)aCoder +{ + [self init]; + + _dev = [aCoder decodeObjectForKey:CPLocalizableStringDev]; + _key = [aCoder decodeObjectForKey:CPLocalizableStringKey]; + + //TODO: here we should not return self but the string from CPLocalizedStringFromTable + return self; +} + +- (void)encodeWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:_dev forKey:CPLocalizableStringDev]; + [aCoder encodeObject:_key forKey:CPLocalizableStringKey]; +} + +@end \ No newline at end of file diff --git a/Foundation/CPBundle.j b/Foundation/CPBundle.j index 817ba6717..25d8be271 100644 --- a/Foundation/CPBundle.j +++ b/Foundation/CPBundle.j @@ -212,4 +212,58 @@ var CPBundlesForURLStrings = { }; return [super description] + "(" + [self bundlePath] + ")"; } + +#pragma mark - +#pragma mark Localization + ++ (CPArray)preferredLocalizationsFromArray:(CPArray)localizationsArray +{ + return CFBundleCopyPreferredLocalizationsFromArray(localizationsArray); +} + ++ (CPArray)preferredLocalizationsFromArray:(CPArray)localizationsArray forPreferences:(CPArray)preferencesArray +{ + return CFBundleCopyLocalizationsForPreferences(localizationsArray, preferencesArray); +} + +- (CPArray)preferredLocalizations +{ + +} + +- (CPString)developmentLocalization +{ + return [self objectForInfoDictionaryKey:@"CFBundleDevelopmentRegion"]; +} + +- (CPArray)localizations +{ + return CFBundleCopyBundleLocalizations(_bundle); +} + +- (CPDictionary)localizedInfoDictionary +{ + +} + +- (CPString)localizedStringForKey:(CPString)aKey value:(CPString)aValue table:(CPString)aTable +{ + return CFBundleCopyLocalizedString(_bundle, aKey, aValue, aTable); +} + @end + +function CPLocalizedString(key, comment) +{ + return CFCopyLocalizedString(key, comment); +} + +function CPLocalizedStringFromTable(key, table, comment) +{ + return CFCopyLocalizedStringFromTableInBundle(key, table, comment); +} + +function CFCopyLocalizedStringFromTableInBundle(key, table, bundle, comment) +{ + return CFCopyLocalizedStringFromTableInBundle(key, table, bundle._bundle, comment); +} \ No newline at end of file diff --git a/Objective-J/CFBundle.js b/Objective-J/CFBundle.js index db3f77190..d2b917386 100644 --- a/Objective-J/CFBundle.js +++ b/Objective-J/CFBundle.js @@ -20,18 +20,19 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -var CFBundleUnloaded = 0, - CFBundleLoading = 1 << 0, - CFBundleLoadingInfoPlist = 1 << 1, - CFBundleLoadingExecutable = 1 << 2, - CFBundleLoadingSpritedImages = 1 << 3, - CFBundleLoaded = 1 << 4; +var CFBundleUnloaded = 0, + CFBundleLoading = 1 << 0, + CFBundleLoadingInfoPlist = 1 << 1, + CFBundleLoadingExecutable = 1 << 2, + CFBundleLoadingSpritedImages = 1 << 3, + CFBundleLoadingLocalizableStrings = 1 << 4, + CFBundleLoaded = 1 << 5; var CFBundlesForURLStrings = { }, CFBundlesForClasses = { }, CFBundlesWithIdentifiers = { }, - CFCacheBuster = new Date().getTime(), - CFTotalBytesLoaded = 0, + CFCacheBuster = new Date().getTime(), + CFTotalBytesLoaded = 0, CPApplicationSizeInBytes = 0; GLOBAL(CFBundle) = function(/*CFURL|String*/ aURL) @@ -58,6 +59,8 @@ GLOBAL(CFBundle) = function(/*CFURL|String*/ aURL) this._infoDictionary = new CFDictionary(); this._eventDispatcher = new EventDispatcher(this); + + this._localizableStrings = []; } DISPLAY_NAME(CFBundle); @@ -354,6 +357,7 @@ function loadExecutableAndResources(/*Bundle*/ aBundle, /*BOOL*/ shouldExecute) loadExecutableForBundle(aBundle, success, failure, progress); loadSpritedImagesForBundle(aBundle, success, failure, progress); + loadLocalizableStringsForBundle(aBundle, success, failure, progress); if (aBundle._loadStatus === CFBundleLoading) return success(); @@ -490,6 +494,14 @@ function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure, progre }, failure, progress); } +function loadLocalizableStringsForBundle(/*Bundle*/, aBundle, success, failure, progress) +{ + aBundle._loadStatus |= CFBundleLoadingLocalizableStrings; + //TODO: Here we need to load the .xstrings + aBundle._loadStatus &= ~CFBundleLoadingLocalizableStrings; +} + + var CFBundleSpriteSupportListeners = [], CFBundleSupportedSpriteType = -1, CFBundleNoSpriteType = 0, @@ -738,3 +750,64 @@ CFBundle.prototype.pathForResource = function(aResource) { return this.resourceURL(aResource).absoluteString(); }; + + +function CFBundleCopyLocalizedString(/*Bundle*/ bundle, key, value, tableName) +{ + return CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, value, null); +} + +function CFBundleCopyLocalizationsForPreferences(locArray, prefArray) +{ + +} + +function CFBundleCopyPreferredLocalizationsFromArray(locArray) +{ + +} + +function CFBundleCopyLocalizationsForURL(url) +{ + +} + +function CFBundleCopyBundleLocalizations(/*Bundle*/ aBundle) +{ + +} + +function CFCopyLocalizedString(key, comment) +{ + return CFCopyLocalizedStringFromTable(key, "Localizable", comment); +} + +function CFCopyLocalizedStringFromTable(key, tableName, comment) +{ + return CFCopyLocalizedStringFromTableInBundle(key, tableName, CFBundleGetMainBundle(), comment); +} + +function CFCopyLocalizedStringFromTableInBundle(key, tableName, bundle, comment) +{ + return CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, null, comment); +} + +function CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, value, comment) +{ + var string; + + if (!tableName) + tableName = "Localizable"; + + var localizableString = bundle._localizableStrings[tableName]; + + //TODO : What about the comment and context ? + string = localizableString[key]; + + return string || value; +} + +function CFBundleGetMainBundle() +{ + return CFBundle.mainBundle(); +} diff --git a/Tools/nib2cib/NSAppKit.j b/Tools/nib2cib/NSAppKit.j index 8dbc498ee..df0f7b625 100644 --- a/Tools/nib2cib/NSAppKit.j +++ b/Tools/nib2cib/NSAppKit.j @@ -46,6 +46,7 @@ @import "NSImageView.j" @import "NSLayoutConstraint.j" @import "NSLevelIndicator.j" +@import "NSLocalizableString.j" @import "NSMatrix.j" @import "NSMenu.j" @import "NSMenuItem.j" diff --git a/Tools/nib2cib/NSLocalizableString.j b/Tools/nib2cib/NSLocalizableString.j new file mode 100644 index 000000000..1a013dfc3 --- /dev/null +++ b/Tools/nib2cib/NSLocalizableString.j @@ -0,0 +1,59 @@ +/* + * NSLocalizableString.j + * AppKit + * + * Created by Alexandre Wilhelm. + * Copyright 2008, 280 North, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@implementation _CPLocalizableString (CPCoding) + +- (id)NS_initWithCoder:(CPCoder)aCoder +{ + self = [self init]; + + if (self) + { + _dev = [aCoder decodeObjectForKey:@"NSDev"]; + _key = [aCoder decodeObjectForKey:@"NSKey"]; + } + + return self; +} + +@end + + +@implementation NSLocalizableString : _CPLocalizableString +{ + +} + +- (id)initWithCoder:(CPCoder)aCoder +{ + return [self NS_initWithCoder:aCoder]; +} + +- (Class)classForKeyedArchiver +{ + return [_CPLocalizableString class]; +} + + +@end \ No newline at end of file From b1b3966d41b26cc2b5560892ea3586490052b6a7 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 17 Apr 2015 20:40:48 -0700 Subject: [PATCH 007/169] Fixed compiling issue in CFBundle.js --- Objective-J/CFBundle.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objective-J/CFBundle.js b/Objective-J/CFBundle.js index d2b917386..b63d3af6e 100644 --- a/Objective-J/CFBundle.js +++ b/Objective-J/CFBundle.js @@ -494,7 +494,7 @@ function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure, progre }, failure, progress); } -function loadLocalizableStringsForBundle(/*Bundle*/, aBundle, success, failure, progress) +function loadLocalizableStringsForBundle(/*Bundle*/ aBundle, success, failure, progress) { aBundle._loadStatus |= CFBundleLoadingLocalizableStrings; //TODO: Here we need to load the .xstrings From cf48cd0ae5dfa93793adaf13750fb5636697d154 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 20 Apr 2015 10:15:05 -0700 Subject: [PATCH 008/169] Fixed: changed copyright of _CPLocalizableString.j --- AppKit/Cib/_CPLocalizableString.j | 2 +- Tools/nib2cib/NSLocalizableString.j | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AppKit/Cib/_CPLocalizableString.j b/AppKit/Cib/_CPLocalizableString.j index 8ee65a069..86e74eb02 100644 --- a/AppKit/Cib/_CPLocalizableString.j +++ b/AppKit/Cib/_CPLocalizableString.j @@ -3,7 +3,7 @@ * AppKit * * Created by Alexandre Wilhelm. - * Copyright 2008, 280 North, Inc. + * Copyright 2015, Cappuccino Project * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public diff --git a/Tools/nib2cib/NSLocalizableString.j b/Tools/nib2cib/NSLocalizableString.j index 1a013dfc3..37087a899 100644 --- a/Tools/nib2cib/NSLocalizableString.j +++ b/Tools/nib2cib/NSLocalizableString.j @@ -3,7 +3,7 @@ * AppKit * * Created by Alexandre Wilhelm. - * Copyright 2008, 280 North, Inc. + * Copyright 2015, Cappuccino Project * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public From 6958da1adb4ad3f1bfa048917990c775dff45dd6 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 20 Apr 2015 18:53:17 -0700 Subject: [PATCH 009/169] Test: added manual test CPLocalizationTest --- .../Manual/CPLocalizationTest/AppController.j | 38 + Tests/Manual/CPLocalizationTest/Info.plist | 18 + Tests/Manual/CPLocalizationTest/Jakefile | 184 ++ .../CPLocalizationTest/Resources/MainMenu.cib | 1 + .../CPLocalizationTest/Resources/MainMenu.xib | 1617 +++++++++++++++++ .../Resources/en.lproj/Localizable.strings | Bin 0 -> 146 bytes .../Resources/en.lproj/Localizable.xstrings | 8 + .../Resources/fr.lproj/Localizable.strings | Bin 0 -> 148 bytes .../Resources/fr.lproj/Localizable.xstrings | 8 + .../CPLocalizationTest/index-debug.html | 191 ++ Tests/Manual/CPLocalizationTest/index.html | 161 ++ Tests/Manual/CPLocalizationTest/main.j | 18 + 12 files changed, 2244 insertions(+) create mode 100644 Tests/Manual/CPLocalizationTest/AppController.j create mode 100644 Tests/Manual/CPLocalizationTest/Info.plist create mode 100644 Tests/Manual/CPLocalizationTest/Jakefile create mode 100644 Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib create mode 100644 Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib create mode 100644 Tests/Manual/CPLocalizationTest/Resources/en.lproj/Localizable.strings create mode 100644 Tests/Manual/CPLocalizationTest/Resources/en.lproj/Localizable.xstrings create mode 100644 Tests/Manual/CPLocalizationTest/Resources/fr.lproj/Localizable.strings create mode 100644 Tests/Manual/CPLocalizationTest/Resources/fr.lproj/Localizable.xstrings create mode 100644 Tests/Manual/CPLocalizationTest/index-debug.html create mode 100644 Tests/Manual/CPLocalizationTest/index.html create mode 100644 Tests/Manual/CPLocalizationTest/main.j diff --git a/Tests/Manual/CPLocalizationTest/AppController.j b/Tests/Manual/CPLocalizationTest/AppController.j new file mode 100644 index 000000000..707068879 --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/AppController.j @@ -0,0 +1,38 @@ +/* + * AppController.j + * CPLocalizationTest + * + * Created by You on April 20, 2015. + * Copyright 2015, Your Company All rights reserved. + */ + +@import +@import + + +@implementation AppController : CPObject +{ + @outlet CPWindow theWindow; +} + +- (void)applicationDidFinishLaunching:(CPNotification)aNotification +{ + // This is called when the application is done loading. +} + +- (void)awakeFromCib +{ + var label = [CPTextField labelWithTitle:CPLocalizedString(@"Label from file", @"")]; + + [label setFrameOrigin:CGPointMake(20, 10)]; + [[theWindow contentView] addSubview:label]; + + // This is called when the cib is done loading. + // You can implement this method on any object instantiated from a Cib. + // It's a useful hook for setting up current UI values, and other things. + + // In this case, we want the window from Cib to become our full browser window + [theWindow setFullPlatformWindow:YES]; +} + +@end diff --git a/Tests/Manual/CPLocalizationTest/Info.plist b/Tests/Manual/CPLocalizationTest/Info.plist new file mode 100644 index 000000000..b21905e32 --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/Info.plist @@ -0,0 +1,18 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + CPLocalizationTest + CPBundleVersion + 1.0 + CPHumanReadableCopyright + Copyright © 2015, Your Company All rights reserved. + CPLocalizableStrings + + Localizable.strings + + + diff --git a/Tests/Manual/CPLocalizationTest/Jakefile b/Tests/Manual/CPLocalizationTest/Jakefile new file mode 100644 index 000000000..991dcebdc --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/Jakefile @@ -0,0 +1,184 @@ +/* + * Jakefile + * CPLocalizationTest + * + * Created by You on April 20, 2015. + * Copyright 2015, Your Company All rights reserved. + */ + +var ENV = require("system").env, + FILE = require("file"), + JAKE = require("jake"), + task = JAKE.task, + FileList = JAKE.FileList, + app = require("cappuccino/jake").app, + configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug", + OS = require("os"), + projectName = "CPLocalizationTest"; + +app (projectName, function(task) +{ + ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks"; + + if (configuration === "Debug") + ENV["OBJJ_INCLUDE_PATHS"] = FILE.join(ENV["OBJJ_INCLUDE_PATHS"], configuration); + + task.setBuildIntermediatesPath(FILE.join("Build", "CPLocalizationTest.build", configuration)); + task.setBuildPath(FILE.join("Build", configuration)); + + task.setProductName("CPLocalizationTest"); + task.setIdentifier("com.yourcompany.CPLocalizationTest"); + task.setVersion("1.0"); + task.setAuthor("Your Company"); + task.setEmail("feedback @nospam@ yourcompany.com"); + task.setSummary("CPLocalizationTest"); + task.setSources(new FileList("**/*.j").exclude(FILE.join("Build", "**")).exclude(FILE.join("Frameworks", "Source", "**"))); + task.setResources(new FileList("Resources/**")); + task.setIndexFilePath("index.html"); + task.setInfoPlistPath("Info.plist"); + + if (configuration === "Debug") + task.setCompilerFlags("-DDEBUG -g"); + else + task.setCompilerFlags("-O"); +}); + +task ("default", [projectName], function() +{ + printResults(configuration); +}); + +task ("build", ["default"], function() +{ + updateApplicationSize(); +}); + +task ("debug", function() +{ + configuration = ENV["CONFIGURATION"] = "Debug"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("release", function() +{ + configuration = ENV["CONFIGURATION"] = "Release"; + JAKE.subjake(["."], "build", ENV); +}); + +task ("run", ["debug"], function() +{ + OS.system(["open", FILE.join("Build", "Debug", projectName, "index.html")]); +}); + +task ("run-release", ["release"], function() +{ + OS.system(["open", FILE.join("Build", "Release", projectName, "index.html")]); +}); + +task ("deploy", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Deployment", projectName)); + OS.system(["press", "-f", FILE.join("Build", "Release", projectName), FILE.join("Build", "Deployment", projectName)]); + printResults("Deployment") +}); + +task ("desktop", ["release"], function() +{ + FILE.mkdirs(FILE.join("Build", "Desktop", projectName)); + require("cappuccino/nativehost").buildNativeHost(FILE.join("Build", "Release", projectName), FILE.join("Build", "Desktop", projectName, "CPLocalizationTest.app")); + printResults("Desktop") +}); + +task ("run-desktop", ["desktop"], function() +{ + OS.system([FILE.join("Build", "Desktop", projectName, "CPLocalizationTest.app", "Contents", "MacOS", "NativeHost"), "-i"]); +}); + +function printResults(configuration) +{ + print("----------------------------"); + print(configuration+" app built at path: "+FILE.join("Build", configuration, projectName)); + print("----------------------------"); +} + +function updateApplicationSize() +{ + print("Calculating application file sizes..."); + + var contents = FILE.read(FILE.join("Build", configuration, projectName, "Info.plist"), { charset:"UTF-8" }), + format = CFPropertyList.sniffedFormatOfString(contents), + plist = CFPropertyList.propertyListFromString(contents), + totalBytes = {executable:0, data:0, mhtml:0}; + + // Get the size of all framework executables and sprite data + var frameworksDir = "Frameworks"; + + if (configuration === "Debug") + frameworksDir = FILE.join(frameworksDir, "Debug"); + + var frameworks = FILE.list(frameworksDir); + + frameworks.forEach(function(framework) + { + if (framework !== "Source") + addBundleFileSizes(FILE.join(frameworksDir, framework), totalBytes); + }); + + // Read in the default theme name, and attempt to get its size + var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2", + themePath = nil; + + if (themeName === "Aristo" || themeName === "Aristo2") + themePath = FILE.join(frameworksDir, "AppKit", "Resources", themeName + ".blend"); + else + themePath = FILE.join("Frameworks", "Resources", themeName + ".blend"); + + if (FILE.isDirectory(themePath)) + addBundleFileSizes(themePath, totalBytes); + + // Add sizes for the app + addBundleFileSizes(FILE.join("Build", configuration, projectName), totalBytes); + + print("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data)); + + var dict = new CFMutableDictionary(); + + dict.setValueForKey("executable", totalBytes.executable); + dict.setValueForKey("data", totalBytes.data); + dict.setValueForKey("mhtml", totalBytes.mhtml); + + plist.setValueForKey("CPApplicationSize", dict); + + FILE.write(FILE.join("Build", configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" }); +} + +function addBundleFileSizes(bundlePath, totalBytes) +{ + var bundleName = FILE.basename(bundlePath), + environment = bundleName === "Foundation" ? "Objj" : "Browser", + bundlePath = FILE.join(bundlePath, environment + ".environment"); + + if (FILE.isDirectory(bundlePath)) + { + var filename = bundleName + ".sj", + filePath = new FILE.Path(FILE.join(bundlePath, filename)); + + if (filePath.exists()) + totalBytes.executable += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "dataURLs.txt")); + + if (filePath.exists()) + totalBytes.data += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLData.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + + filePath = new FILE.Path(FILE.join(bundlePath, "MHTMLPaths.txt")); + + if (filePath.exists()) + totalBytes.mhtml += filePath.size(); + } +} diff --git a/Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib b/Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib new file mode 100644 index 000000000..f2e4d3dbe --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib @@ -0,0 +1 @@ +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;126E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;126E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;126E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;121E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;130E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;58E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;131E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;60E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;133E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;108E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;107E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;141E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;79E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;74E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;59E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;102E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;103E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;164E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;165E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;166E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;167E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;56E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;56E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;167E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;170E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;175E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;176E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;177E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;178E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;179E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;62E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;62E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;179E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;180E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;184E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;185E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;186E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;187E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;69E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;69E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;187E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;189E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;190E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;191E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;72E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;72E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;191E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;192E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;193E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;197E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;199E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;200E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;201E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;203E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;204E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;205E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;207E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;83E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;83E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;207E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;209E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;212E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;213E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;214E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;215E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;216E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;217E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;220E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;223E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;90E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;90E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;223E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;225E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;228E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;229E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;230E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;231E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;96E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;96E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;231E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;233E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;234E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;235E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;100E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;100E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;235E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;236E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;237E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;238E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;105E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;105E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;240E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;243E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;245E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;247E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;248E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;249E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;250E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;111E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;111E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;250E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;251E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;111E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;255E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;256E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;257E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;117E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;117E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;257E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;259E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;260E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;263E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;264E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;265E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;266E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;267E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;215E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;167E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;123E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;269E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;269E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;270E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;271E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;273E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;274E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;275E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;276E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;277E;K;11;$aalignmentD;K;6;CP$UIDd;3;278E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;218E;K;6;$afontD;K;6;CP$UIDd;3;280E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;172E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;281E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;278E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;268E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;174E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;283E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;218E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;278E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;174E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;174E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;284E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;121E;E;E;S;8;delegateS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;10;terminate:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;68E;E;E;S;6;WindowS;14;submenuAction:d;7;1048576S;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;E;E;T;S;0;F;S;18;Bring All to FrontS;4;ZoomS;8;MinimizeS;1;mS;14;NewApplicationS;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;64E;E;E;S;20;About NewApplicationS;19;Quit NewApplicationS;1;qS;12;Preferences…S;1;,S;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;70E;E;E;S;19;NewApplication HelpS;1;?S;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;95E;E;E;S;6;DeleteS;10;Select AllS;1;aS;4;UndoS;1;zS;3;CutS;1;xS;5;PasteS;1;vS;4;CopyS;1;cS;4;RedoS;1;Zd;7;1179648S;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;85E;E;E;S;13;Find Previousd;1;3S;1;GS;17;Jump to SelectionS;1;jS;22;Use Selection for Findd;1;7S;1;eS;9;Find Nextd;1;2S;1;gS;5;Find…d;1;1S;1;fS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;94E;E;E;S;27;Check Spelling While TypingS;14;Check SpellingS;1;;S;14;Show Spelling…S;1;:S;27;Check Grammar With SpellingS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;97E;E;E;S;13;Stop SpeakingS;14;Start SpeakingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;115E;E;E;S;4;SaveS;1;sS;8;Save As…S;1;SS;5;Open…S;1;oS;3;NewS;1;nS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;112E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;15;Revert to SavedS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 127}, {480, 360}}S;21;{{0, 0}, {1440, 877}}d;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;E;E;S;6;normalS;6;{1, 1}S;20;{{20, 51}, {88, 17}}S;18;{{0, 0}, {88, 17}}d;2;36S;9;textfieldS;18;controlSizeRegulard;1;4D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;279E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;285E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;286E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;174E;E;S;14;Label from xibD;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;282E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;287E;E;S;13;AppControllerS;29;.Helvetica Neue DeskInterfaced;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;221E;E;E;f;18;0.6862745098039216E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib b/Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib new file mode 100644 index 000000000..7cc2189bc --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib @@ -0,0 +1,1617 @@ + + + + 1050 + 14E7f + 7531 + 1347.57 + 758.70 + + com.apple.InterfaceBuilder.CocoaPlugin + 7531 + + + NSCustomObject + NSMenu + NSMenuItem + NSTextField + NSTextFieldCell + NSView + NSWindowTemplate + + + com.apple.InterfaceBuilder.CocoaPlugin + + + PluginDependencyRecalculationVersion + + + + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + + + NewApplication + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + + NewApplication + + + + About NewApplication + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Preferences… + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit NewApplication + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 1048576 + 2147483647 + + + submenuAction: + + + File + + + + New + n + 1048576 + 2147483647 + + + + + + Open… + o + 1048576 + 2147483647 + + + + + + Open Recent + + 1048576 + 2147483647 + + + submenuAction: + + + Open Recent + + + + Clear Menu + + 1048576 + 2147483647 + + + + + _NSRecentDocumentsMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + Save + s + 1048576 + 2147483647 + + + + + + Save As… + S + 1179648 + 2147483647 + + + + + + Revert to Saved + + 2147483647 + + + + + + + + + Edit + + 1048576 + 2147483647 + + + submenuAction: + + + Edit + + + + Undo + z + 1048576 + 2147483647 + + + + + + Redo + Z + 1179648 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Cut + x + 1048576 + 2147483647 + + + + + + Copy + c + 1048576 + 2147483647 + + + + + + Paste + v + 1048576 + 2147483647 + + + + + + Delete + + 1048576 + 2147483647 + + + + + + Select All + a + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Find + + 1048576 + 2147483647 + + + submenuAction: + + + Find + + + + Find… + f + 1048576 + 2147483647 + + + 1 + + + + Find Next + g + 1048576 + 2147483647 + + + 2 + + + + Find Previous + G + 1179648 + 2147483647 + + + 3 + + + + Use Selection for Find + e + 1048576 + 2147483647 + + + 7 + + + + Jump to Selection + j + 1048576 + 2147483647 + + + + + + + + + Spelling and Grammar + + 1048576 + 2147483647 + + + submenuAction: + + + Spelling and Grammar + + + + Show Spelling… + : + 1048576 + 2147483647 + + + + + + Check Spelling + ; + 1048576 + 2147483647 + + + + + + Check Spelling While Typing + + 1048576 + 2147483647 + + + + + + Check Grammar With Spelling + + 1048576 + 2147483647 + + + + + + + + + Substitutions + + 1048576 + 2147483647 + + + submenuAction: + + + Substitutions + + + + Smart Copy/Paste + f + 1048576 + 2147483647 + + + 1 + + + + Smart Quotes + g + 1048576 + 2147483647 + + + 2 + + + + Smart Links + G + 1179648 + 2147483647 + + + 3 + + + + + + + Speech + + 1048576 + 2147483647 + + + submenuAction: + + + Speech + + + + Start Speaking + + 1048576 + 2147483647 + + + + + + Stop Speaking + + 1048576 + 2147483647 + + + + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + + View + + + + Show Toolbar + t + 1572864 + 2147483647 + + + + + + Customize Toolbar… + + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + + Window + + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + + Help + + 1048576 + 2147483647 + + + submenuAction: + + + Help + + + + NewApplication Help + ? + 1048576 + 2147483647 + + + + + + + + _NSMainMenu + + + 7 + 2 + {{335, 390}, {480, 360}} + 1946157056 + Window + NSWindow + + + + + 256 + + + + 268 + {{18, 292}, {92, 17}} + + + + _NS:526 + {251, 750} + YES + + 68157504 + 272630784 + Label from xib + + YES + 13 + 1044 + + _NS:526 + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2NjY3AA + + + + 6 + System + labelColor + + 3 + MAA + + + + NO + 1 + + + {480, 360} + + + + + {{0, 0}, {1440, 877}} + {10000000000000, 10000000000000} + YES + + + AppController + + + + + + + terminate: + + + + 449 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + delegate + + + + 451 + + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + clearRecentDocuments: + + + + 127 + + + + performClose: + + + + 193 + + + + toggleContinuousSpellChecking: + + + + 222 + + + + undo: + + + + 223 + + + + copy: + + + + 224 + + + + checkSpelling: + + + + 225 + + + + paste: + + + + 226 + + + + stopSpeaking: + + + + 227 + + + + cut: + + + + 228 + + + + showGuessPanel: + + + + 230 + + + + redo: + + + + 231 + + + + selectAll: + + + + 232 + + + + startSpeaking: + + + + 233 + + + + delete: + + + + 235 + + + + performZoom: + + + + 240 + + + + performFindPanelAction: + + + + 241 + + + + centerSelectionInVisibleArea: + + + + 245 + + + + toggleGrammarChecking: + + + + 347 + + + + toggleSmartInsertDelete: + + + + 355 + + + + toggleAutomaticQuoteSubstitution: + + + + 356 + + + + toggleAutomaticLinkDetection: + + + + 357 + + + + showHelp: + + + + 360 + + + + saveDocument: + + + + 362 + + + + saveDocumentAs: + + + + 363 + + + + revertDocumentToSaved: + + + + 364 + + + + runToolbarCustomizationPalette: + + + + 365 + + + + toggleToolbarShown: + + + + 366 + + + + newDocument: + + + + 373 + + + + openDocument: + + + + 374 + + + + theWindow + + + + 459 + + + + + + 0 + + + + + + -2 + + + File's Owner + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + + + + + + + + + MainMenu + + + 19 + + + + + + + + 56 + + + + + + + + 103 + + + + + + + + 217 + + + + + + + + 83 + + + + + + + + 81 + + + + + + + + + + + + + + + 75 + + + + + 80 + + + + + 72 + + + + + 82 + + + + + 124 + + + + + + + + 73 + + + + + 79 + + + + + 112 + + + + + 125 + + + + + + + + 126 + + + + + 205 + + + + + + + + + + + + + + + + + + + + 202 + + + + + 198 + + + + + 207 + + + + + 214 + + + + + 199 + + + + + 203 + + + + + 197 + + + + + 206 + + + + + 215 + + + + + 218 + + + + + + + + 216 + + + + + + + + 200 + + + + + + + + + + + 219 + + + + + 201 + + + + + 204 + + + + + 220 + + + + + + + + + + + + 213 + + + + + 210 + + + + + 221 + + + + + 208 + + + + + 209 + + + + + 106 + + + + + + + + 111 + + + + + 57 + + + + + + + + + + + + 58 + + + + + 136 + + + + + 129 + + + + + 143 + + + + + 236 + + + + + 24 + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + + + + + + 296 + + + + + + + + + 297 + + + + + 298 + + + + + 211 + + + + + + + + 212 + + + + + + + + + 195 + + + + + 196 + + + + + 346 + + + + + 348 + + + + + + + + 349 + + + + + + + + + + 350 + + + + + 351 + + + + + 354 + + + + + 371 + + + + + + + + 372 + + + + + + + + 450 + + + + + 460 + + + + + + + + 461 + + + + + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{303, 221}, {480, 360}} + + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + + 461 + + + + + AppController + NSObject + + theWindow + NSWindow + + + theWindow + + theWindow + NSWindow + + + + IBProjectSource + ../.XcodeSupport/AppController.h + + + + + 0 + IBCocoaFramework + NO + + com.apple.InterfaceBuilder.CocoaPlugin.macosx + + + + com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 + + + YES + 3 + + {12, 12} + {10, 2} + + + diff --git a/Tests/Manual/CPLocalizationTest/Resources/en.lproj/Localizable.strings b/Tests/Manual/CPLocalizationTest/Resources/en.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..3eb6e562458162be014cce2dd6c5e770e39f3575 GIT binary patch literal 146 zcmezWPoF`HL4m=Sp%O^uF{Cn-1L + + + + Label from file + Label title from en.lproj + + diff --git a/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/Localizable.strings b/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..b145931d89df1115f27a7a1f0ea27fe6b151f3be GIT binary patch literal 148 zcmYj~O%8%U3`XC2PBCFQ3pjxB2D0M + + + + Label from file + Titre du label de fr.lproj + + diff --git a/Tests/Manual/CPLocalizationTest/index-debug.html b/Tests/Manual/CPLocalizationTest/index-debug.html new file mode 100644 index 000000000..13c385d7e --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/index-debug.html @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + CPLocalizationTest + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPLocalizationTest/index.html b/Tests/Manual/CPLocalizationTest/index.html new file mode 100644 index 000000000..e80f2fe83 --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + CPLocalizationTest + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/CPLocalizationTest/main.j b/Tests/Manual/CPLocalizationTest/main.j new file mode 100644 index 000000000..c0df1910e --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPLocalizationTest + * + * Created by You on April 20, 2015. + * Copyright 2015, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} From 2db7ce8da1d95bf80ac2d6198fe09bead7889c91 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Mon, 20 Apr 2015 18:53:51 -0700 Subject: [PATCH 010/169] New: added the methods CPLocalizedString CPLocalizedStringFromTable CPCopyLocalizedStringFromTableInBundle --- Foundation/CPBundle.j | 6 +- Objective-J/CFBundle.js | 119 ++++++++++++++++++++++++++++++++++------ 2 files changed, 108 insertions(+), 17 deletions(-) diff --git a/Foundation/CPBundle.j b/Foundation/CPBundle.j index 25d8be271..bba205ce8 100644 --- a/Foundation/CPBundle.j +++ b/Foundation/CPBundle.j @@ -25,6 +25,9 @@ @import "CPNotificationCenter.j" @import "CPObject.j" +@global CFBundleCopyBundleLocalizations +@global CFBundleCopyLocalizedString + CPBundleDidLoadNotification = @"CPBundleDidLoadNotification"; /*! @@ -94,6 +97,7 @@ var CPBundlesForURLStrings = { }; if (self) { _bundle = new CFBundle(aURL); + CPBundlesForURLStrings[URLString] = self; } @@ -263,7 +267,7 @@ function CPLocalizedStringFromTable(key, table, comment) return CFCopyLocalizedStringFromTableInBundle(key, table, comment); } -function CFCopyLocalizedStringFromTableInBundle(key, table, bundle, comment) +function CPCopyLocalizedStringFromTableInBundle(key, table, bundle, comment) { return CFCopyLocalizedStringFromTableInBundle(key, table, bundle._bundle, comment); } \ No newline at end of file diff --git a/Objective-J/CFBundle.js b/Objective-J/CFBundle.js index b63d3af6e..d8077a131 100644 --- a/Objective-J/CFBundle.js +++ b/Objective-J/CFBundle.js @@ -496,11 +496,98 @@ function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure, progre function loadLocalizableStringsForBundle(/*Bundle*/ aBundle, success, failure, progress) { - aBundle._loadStatus |= CFBundleLoadingLocalizableStrings; - //TODO: Here we need to load the .xstrings - aBundle._loadStatus &= ~CFBundleLoadingLocalizableStrings; + var language = getCurrentLanguage(); + + if (!language) + return; + + var localizableStrings = aBundle.valueForInfoDictionaryKey("CPLocalizableStrings"); + + if (!localizableStrings) + return; + + var self = aBundle, + length = localizableStrings.length, + languagePathURL = new CFURL(language + ".lproj/", self.resourcesDirectoryURL()), + fileSuccessed = 0; + + for (var i = 0; i < length; i++) + { + var localizableString = localizableStrings[i]; + + function onsuccess(/*Event*/ anEvent) + { + var contentFile = anEvent.request.responseText(), + tableName = new CFURL(anEvent.request._URL).lastPathComponent(); + + try + { + loadLocalizableContentForFileInBundle(self, contentFile, tableName); + + if (++fileSuccessed == length) + { + aBundle._loadStatus &= ~CFBundleLoadingLocalizableStrings; + success(); + } + } + catch(e) + { + failure(new Error("Error when parsing the localizable file " + tableName)); + } + } + + aBundle._loadStatus |= CFBundleLoadingLocalizableStrings; + new FileRequest(new CFURL(localizableString, languagePathURL), onsuccess, failure, progress); + } } +function loadLocalizableContentForFileInBundle(bundle, contentFile, tableName) +{ + var values = {}, + lines = contentFile.split("\n"), + currentContext; + + bundle._localizableStrings[tableName] = values; + + for (var i = 0; i < lines.length; i++) + { + var line = lines[i]; + + // Context + if (line[0] == "/") + { + currentContext = line.substring(2, line.length - 2); + continue; + } + + // Key + if (line[0] == "\"") + { + var split = line.split("\"") + + // Here we add twice the translated value, once with the context and once without + // This wiill help in rapidity when asking the value of the key + values[split[1]] = split[3]; + values[split[1] + currentContext] = split[3]; + + continue; + } + } +} + +function getCurrentLanguage() +{ + if (typeof navigator == "undefined") + return null; + + // userLanguage is an IE only property. + var language = (typeof navigator.language !== "undefined") ? navigator.language : navigator.userLanguage; + + if (!language) + return null; + + return language.substring(0, 2); +} var CFBundleSpriteSupportListeners = [], CFBundleSupportedSpriteType = -1, @@ -751,63 +838,63 @@ CFBundle.prototype.pathForResource = function(aResource) return this.resourceURL(aResource).absoluteString(); }; - -function CFBundleCopyLocalizedString(/*Bundle*/ bundle, key, value, tableName) +GLOBAL(CFBundleCopyLocalizedString) = function (/*Bundle*/ bundle, key, value, tableName) { return CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, value, null); } -function CFBundleCopyLocalizationsForPreferences(locArray, prefArray) +GLOBAL(CFBundleCopyLocalizationsForPreferences) = function (locArray, prefArray) { } -function CFBundleCopyPreferredLocalizationsFromArray(locArray) +GLOBAL(CFBundleCopyPreferredLocalizationsFromArray) = function (locArray) { } -function CFBundleCopyLocalizationsForURL(url) +GLOBAL(CFBundleCopyLocalizationsForURL) = function (url) { } -function CFBundleCopyBundleLocalizations(/*Bundle*/ aBundle) +GLOBAL(CFBundleCopyBundleLocalizations) = function (/*Bundle*/ aBundle) { } -function CFCopyLocalizedString(key, comment) +GLOBAL(CFCopyLocalizedString) = function (key, comment) { return CFCopyLocalizedStringFromTable(key, "Localizable", comment); } -function CFCopyLocalizedStringFromTable(key, tableName, comment) +GLOBAL(CFCopyLocalizedStringFromTable) = function (key, tableName, comment) { return CFCopyLocalizedStringFromTableInBundle(key, tableName, CFBundleGetMainBundle(), comment); } -function CFCopyLocalizedStringFromTableInBundle(key, tableName, bundle, comment) +GLOBAL(CFCopyLocalizedStringFromTableInBundle) = function (key, tableName, bundle, comment) { return CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, null, comment); } -function CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, value, comment) +GLOBAL(CFCopyLocalizedStringWithDefaultValue) = function (key, tableName, bundle, value, comment) { var string; if (!tableName) tableName = "Localizable"; + tableName += ".strings"; + var localizableString = bundle._localizableStrings[tableName]; - //TODO : What about the comment and context ? - string = localizableString[key]; + string = localizableString ? localizableString[key + comment] : key; return string || value; } -function CFBundleGetMainBundle() +GLOBAL(CFBundleGetMainBundle) = function () { return CFBundle.mainBundle(); } From ba26a97ddcbc6d0ac08923e34f68dc87191ec15e Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 21 Apr 2015 10:53:36 -0700 Subject: [PATCH 011/169] Test: updated test CPLocalizationTest --- .../Manual/CPLocalizationTest/AppController.j | 19 ++++++++++++++++-- Tests/Manual/CPLocalizationTest/Info.plist | 1 + .../CPLocalizationTest/Resources/MainMenu.cib | 2 +- .../CPLocalizationTest/Resources/MainMenu.xib | 3 +-- .../Resources/en.lproj/Localizable.strings | Bin 146 -> 378 bytes .../en.lproj/SecondLocalizable.strings | 2 ++ 6 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 Tests/Manual/CPLocalizationTest/Resources/en.lproj/SecondLocalizable.strings diff --git a/Tests/Manual/CPLocalizationTest/AppController.j b/Tests/Manual/CPLocalizationTest/AppController.j index 707068879..1d4141578 100644 --- a/Tests/Manual/CPLocalizationTest/AppController.j +++ b/Tests/Manual/CPLocalizationTest/AppController.j @@ -22,11 +22,26 @@ - (void)awakeFromCib { - var label = [CPTextField labelWithTitle:CPLocalizedString(@"Label from file", @"")]; - + var label = [CPTextField labelWithTitle:CPLocalizedString(@"Label from file", @"") + " -> Label title from en.lproj from first context"]; [label setFrameOrigin:CGPointMake(20, 10)]; [[theWindow contentView] addSubview:label]; + var label2 = [CPTextField labelWithTitle:CPLocalizedString(@"Label from file", @"My second context.") + " -> Label title from en.lproj from second context"]; + [label2 setFrameOrigin:CGPointMake(20, 30)]; + [[theWindow contentView] addSubview:label2]; + + var label3 = [CPTextField labelWithTitle:CPLocalizedString(@"Label from file", @"My first context.") + " -> Label title from en.lproj from first context"]; + [label3 setFrameOrigin:CGPointMake(20, 50)]; + [[theWindow contentView] addSubview:label3]; + + var label4 = [CPTextField labelWithTitle:CPLocalizedStringFromTable(@"Label from file", @"SecondLocalizable", @"My first context.") + " -> Label title from first context from en.lproj from SecondLocalizable"]; + [label4 setFrameOrigin:CGPointMake(20, 70)]; + [[theWindow contentView] addSubview:label4]; + + var label5 = [CPTextField labelWithTitle:CPLocalizedString(@"Wrong key", @"") + " -> Wrong key"]; + [label5 setFrameOrigin:CGPointMake(20, 90)]; + [[theWindow contentView] addSubview:label5]; + // This is called when the cib is done loading. // You can implement this method on any object instantiated from a Cib. // It's a useful hook for setting up current UI values, and other things. diff --git a/Tests/Manual/CPLocalizationTest/Info.plist b/Tests/Manual/CPLocalizationTest/Info.plist index b21905e32..d6d2f303d 100644 --- a/Tests/Manual/CPLocalizationTest/Info.plist +++ b/Tests/Manual/CPLocalizationTest/Info.plist @@ -13,6 +13,7 @@ CPLocalizableStrings Localizable.strings + SecondLocalizable.strings diff --git a/Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib b/Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib index f2e4d3dbe..b6485682e 100644 --- a/Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib +++ b/Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;126E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;126E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;126E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;121E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;130E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;58E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;131E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;60E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;133E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;108E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;107E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;141E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;79E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;74E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;59E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;102E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;103E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;164E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;165E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;166E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;167E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;56E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;56E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;167E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;170E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;175E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;176E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;177E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;178E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;179E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;62E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;62E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;179E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;180E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;184E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;185E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;186E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;187E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;69E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;69E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;187E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;189E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;190E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;191E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;72E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;72E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;191E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;192E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;193E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;197E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;199E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;200E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;201E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;203E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;204E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;205E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;207E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;83E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;83E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;207E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;209E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;212E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;213E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;214E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;215E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;216E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;217E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;220E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;223E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;90E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;90E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;223E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;225E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;228E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;229E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;230E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;231E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;96E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;96E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;231E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;233E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;234E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;235E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;100E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;100E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;235E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;236E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;237E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;238E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;105E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;105E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;240E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;243E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;245E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;247E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;248E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;249E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;250E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;111E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;111E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;250E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;251E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;111E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;255E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;256E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;257E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;117E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;117E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;257E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;259E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;260E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;263E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;264E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;265E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;266E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;267E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;215E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;167E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;123E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;269E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;269E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;270E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;271E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;273E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;274E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;275E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;276E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;277E;K;11;$aalignmentD;K;6;CP$UIDd;3;278E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;218E;K;6;$afontD;K;6;CP$UIDd;3;280E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;172E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;281E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;278E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;268E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;174E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;283E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;218E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;278E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;174E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;174E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;284E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;121E;E;E;S;8;delegateS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;10;terminate:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;68E;E;E;S;6;WindowS;14;submenuAction:d;7;1048576S;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;E;E;T;S;0;F;S;18;Bring All to FrontS;4;ZoomS;8;MinimizeS;1;mS;14;NewApplicationS;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;64E;E;E;S;20;About NewApplicationS;19;Quit NewApplicationS;1;qS;12;Preferences…S;1;,S;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;70E;E;E;S;19;NewApplication HelpS;1;?S;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;95E;E;E;S;6;DeleteS;10;Select AllS;1;aS;4;UndoS;1;zS;3;CutS;1;xS;5;PasteS;1;vS;4;CopyS;1;cS;4;RedoS;1;Zd;7;1179648S;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;85E;E;E;S;13;Find Previousd;1;3S;1;GS;17;Jump to SelectionS;1;jS;22;Use Selection for Findd;1;7S;1;eS;9;Find Nextd;1;2S;1;gS;5;Find…d;1;1S;1;fS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;94E;E;E;S;27;Check Spelling While TypingS;14;Check SpellingS;1;;S;14;Show Spelling…S;1;:S;27;Check Grammar With SpellingS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;97E;E;E;S;13;Stop SpeakingS;14;Start SpeakingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;115E;E;E;S;4;SaveS;1;sS;8;Save As…S;1;SS;5;Open…S;1;oS;3;NewS;1;nS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;112E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;15;Revert to SavedS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 127}, {480, 360}}S;21;{{0, 0}, {1440, 877}}d;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;E;E;S;6;normalS;6;{1, 1}S;20;{{20, 51}, {88, 17}}S;18;{{0, 0}, {88, 17}}d;2;36S;9;textfieldS;18;controlSizeRegulard;1;4D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;279E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;285E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;286E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;174E;E;S;14;Label from xibD;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;282E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;287E;E;S;13;AppControllerS;29;.Helvetica Neue DeskInterfaced;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;221E;E;E;f;18;0.6862745098039216E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;126E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;126E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;126E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;121E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;130E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;58E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;131E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;60E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;133E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;108E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;107E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;141E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;79E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;74E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;59E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;102E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;103E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;164E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;165E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;166E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;167E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;56E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;56E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;167E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;170E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;175E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;176E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;177E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;178E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;179E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;62E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;62E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;179E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;180E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;184E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;185E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;186E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;187E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;69E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;69E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;187E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;189E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;190E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;191E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;72E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;72E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;191E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;192E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;193E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;197E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;199E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;200E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;201E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;203E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;204E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;205E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;207E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;83E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;83E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;207E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;209E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;212E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;213E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;214E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;215E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;216E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;217E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;220E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;223E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;90E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;90E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;223E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;225E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;228E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;229E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;230E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;231E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;96E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;96E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;231E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;233E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;234E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;235E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;100E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;100E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;235E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;236E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;237E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;238E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;105E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;105E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;240E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;243E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;245E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;247E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;248E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;249E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;250E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;111E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;111E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;250E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;251E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;111E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;255E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;256E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;257E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;117E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;117E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;257E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;259E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;260E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;263E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;264E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;265E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;266E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;267E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;215E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;167E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;123E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;269E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;269E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;270E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;271E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;273E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;274E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;275E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;276E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;277E;K;11;$aalignmentD;K;6;CP$UIDd;3;278E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;218E;K;6;$afontD;K;6;CP$UIDd;3;280E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;172E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;281E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;278E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;268E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;174E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;283E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;218E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;278E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;174E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;174E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;284E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;121E;E;E;S;8;delegateS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;10;terminate:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;68E;E;E;S;6;WindowS;14;submenuAction:d;7;1048576S;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;E;E;T;S;0;F;S;18;Bring All to FrontS;4;ZoomS;8;MinimizeS;1;mS;14;NewApplicationS;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;64E;E;E;S;20;About NewApplicationS;19;Quit NewApplicationS;1;qS;12;Preferences…S;1;,S;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;70E;E;E;S;19;NewApplication HelpS;1;?S;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;95E;E;E;S;6;DeleteS;10;Select AllS;1;aS;4;UndoS;1;zS;3;CutS;1;xS;5;PasteS;1;vS;4;CopyS;1;cS;4;RedoS;1;Zd;7;1179648S;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;85E;E;E;S;13;Find Previousd;1;3S;1;GS;17;Jump to SelectionS;1;jS;22;Use Selection for Findd;1;7S;1;eS;9;Find Nextd;1;2S;1;gS;5;Find…d;1;1S;1;fS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;94E;E;E;S;27;Check Spelling While TypingS;14;Check SpellingS;1;;S;14;Show Spelling…S;1;:S;27;Check Grammar With SpellingS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;97E;E;E;S;13;Stop SpeakingS;14;Start SpeakingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;115E;E;E;S;4;SaveS;1;sS;8;Save As…S;1;SS;5;Open…S;1;oS;3;NewS;1;nS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;112E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;15;Revert to SavedS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 127}, {480, 360}}S;21;{{0, 0}, {1440, 877}}d;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;E;E;S;6;normalS;6;{1, 1}S;21;{{20, 165}, {88, 17}}S;18;{{0, 0}, {88, 17}}d;2;36S;9;textfieldS;18;controlSizeRegulard;1;4D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;279E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;285E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;286E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;174E;E;S;14;Label from xibD;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;282E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;287E;E;S;13;AppControllerS;29;.Helvetica Neue DeskInterfaced;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;221E;E;E;f;18;0.6862745098039216E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib b/Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib index 7cc2189bc..42e487569 100644 --- a/Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib +++ b/Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib @@ -647,10 +647,9 @@ 268 - {{18, 292}, {92, 17}} + {{18, 178}, {92, 17}} - _NS:526 {251, 750} YES diff --git a/Tests/Manual/CPLocalizationTest/Resources/en.lproj/Localizable.strings b/Tests/Manual/CPLocalizationTest/Resources/en.lproj/Localizable.strings index 3eb6e562458162be014cce2dd6c5e770e39f3575..c5ebdefa535f61b11fbee086e315b96038abb7f6 100644 GIT binary patch literal 378 zcmc(ZI}XAy5JX>{Qy`Zqk^>-a0EZyKNT5Ja;v%^`@We;R1+)}ijmA5(?{=*zS+HSt z?l~|plGH6dXH{f!Ryrj$1%WkN8vX8(7~DI(vYl>FuYCDlvN@TEStfd+(!F@K=a~I{ ZX9+CjD5Uw2k2XJvceebS{TI!f{th|pKkfhk delta 36 ocmeyxG>K98|37^OEd~V!UxrE`na7aIP(D$-oI{Dhnt=-l0l3}=;Q#;t diff --git a/Tests/Manual/CPLocalizationTest/Resources/en.lproj/SecondLocalizable.strings b/Tests/Manual/CPLocalizationTest/Resources/en.lproj/SecondLocalizable.strings new file mode 100644 index 000000000..c70c542d4 --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/Resources/en.lproj/SecondLocalizable.strings @@ -0,0 +1,2 @@ +/* My first context. */ +"Label from file" = "Label title from en.lproj from first context from SecondLocalizable"; From 68374e7c62c33e304d6797966b34e382a8fa023f Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 21 Apr 2015 10:54:09 -0700 Subject: [PATCH 012/169] Fixed: fix minor issue with methods CPLocalizedStringFromTable and comment --- Foundation/CPBundle.j | 2 +- Objective-J/CFBundle.js | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Foundation/CPBundle.j b/Foundation/CPBundle.j index bba205ce8..4cd481506 100644 --- a/Foundation/CPBundle.j +++ b/Foundation/CPBundle.j @@ -264,7 +264,7 @@ function CPLocalizedString(key, comment) function CPLocalizedStringFromTable(key, table, comment) { - return CFCopyLocalizedStringFromTableInBundle(key, table, comment); + return CFCopyLocalizedStringFromTable(key, table, comment); } function CPCopyLocalizedStringFromTableInBundle(key, table, bundle, comment) diff --git a/Objective-J/CFBundle.js b/Objective-J/CFBundle.js index d8077a131..b5a1aad6b 100644 --- a/Objective-J/CFBundle.js +++ b/Objective-J/CFBundle.js @@ -556,7 +556,7 @@ function loadLocalizableContentForFileInBundle(bundle, contentFile, tableName) // Context if (line[0] == "/") { - currentContext = line.substring(2, line.length - 2); + currentContext = line.substring(2, line.length - 2).trim(); continue; } @@ -566,9 +566,17 @@ function loadLocalizableContentForFileInBundle(bundle, contentFile, tableName) var split = line.split("\"") // Here we add twice the translated value, once with the context and once without - // This wiill help in rapidity when asking the value of the key - values[split[1]] = split[3]; - values[split[1] + currentContext] = split[3]; + // This will help in term of rapidity when asking the value of the key + + var key = split[1]; + + if (!(key in values)) + values[key] = split[3]; + + key += currentContext; + + if (!(key in values)) + values[key] = split[3]; continue; } @@ -889,9 +897,9 @@ GLOBAL(CFCopyLocalizedStringWithDefaultValue) = function (key, tableName, bundle var localizableString = bundle._localizableStrings[tableName]; - string = localizableString ? localizableString[key + comment] : key; + string = localizableString ? localizableString[key + comment] : null; - return string || value; + return string || (value || key); } GLOBAL(CFBundleGetMainBundle) = function () From a7d1f180a42e2a9dc6edbf233cc0886f97dfc4f0 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 21 Apr 2015 14:29:21 -0700 Subject: [PATCH 013/169] Test: updated manual test CPLocalizationTest to have base localization in the xib --- .../Resources/{ => Base.lproj}/MainMenu.cib | 2 +- .../Resources/{ => Base.lproj}/MainMenu.xib | 5 +- .../Resources/en.lproj/Localizable.xstrings | 8 - .../Resources/en.lproj/MainMenu.strings | 186 ++++++++++++++++++ .../Resources/fr.lproj/Localizable.xstrings | 8 - .../Resources/fr.lproj/MainMenu.strings | 186 ++++++++++++++++++ 6 files changed, 376 insertions(+), 19 deletions(-) rename Tests/Manual/CPLocalizationTest/Resources/{ => Base.lproj}/MainMenu.cib (97%) rename Tests/Manual/CPLocalizationTest/Resources/{ => Base.lproj}/MainMenu.xib (99%) delete mode 100644 Tests/Manual/CPLocalizationTest/Resources/en.lproj/Localizable.xstrings create mode 100644 Tests/Manual/CPLocalizationTest/Resources/en.lproj/MainMenu.strings delete mode 100644 Tests/Manual/CPLocalizationTest/Resources/fr.lproj/Localizable.xstrings create mode 100644 Tests/Manual/CPLocalizationTest/Resources/fr.lproj/MainMenu.strings diff --git a/Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib b/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.cib similarity index 97% rename from Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib rename to Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.cib index b6485682e..9ef707a2c 100644 --- a/Tests/Manual/CPLocalizationTest/Resources/MainMenu.cib +++ b/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;126E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;126E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;126E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;121E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;130E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;58E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;131E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;60E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;133E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;108E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;107E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;141E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;79E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;74E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;59E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;102E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;103E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;164E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;165E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;166E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;167E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;56E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;56E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;167E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;170E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;175E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;176E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;177E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;178E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;179E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;62E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;62E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;179E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;180E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;184E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;185E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;186E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;187E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;69E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;69E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;187E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;189E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;190E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;191E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;72E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;72E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;191E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;192E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;193E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;197E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;199E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;200E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;201E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;203E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;204E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;205E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;207E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;83E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;83E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;207E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;209E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;212E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;213E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;214E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;215E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;216E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;217E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;220E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;223E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;90E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;90E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;223E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;225E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;228E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;229E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;230E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;231E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;96E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;96E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;231E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;233E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;234E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;235E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;100E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;100E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;235E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;236E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;237E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;238E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;105E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;105E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;240E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;243E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;245E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;247E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;248E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;249E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;250E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;111E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;111E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;250E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;251E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;111E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;255E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;256E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;257E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;117E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;117E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;257E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;259E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;260E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;263E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;264E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;265E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;266E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;267E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;215E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;167E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;123E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;269E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;269E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;270E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;271E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;273E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;274E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;275E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;276E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;277E;K;11;$aalignmentD;K;6;CP$UIDd;3;278E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;218E;K;6;$afontD;K;6;CP$UIDd;3;280E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;172E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;281E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;278E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;268E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;174E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;283E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;218E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;278E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;174E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;174E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;284E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;121E;E;E;S;8;delegateS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;10;terminate:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;68E;E;E;S;6;WindowS;14;submenuAction:d;7;1048576S;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;E;E;T;S;0;F;S;18;Bring All to FrontS;4;ZoomS;8;MinimizeS;1;mS;14;NewApplicationS;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;64E;E;E;S;20;About NewApplicationS;19;Quit NewApplicationS;1;qS;12;Preferences…S;1;,S;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;70E;E;E;S;19;NewApplication HelpS;1;?S;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;95E;E;E;S;6;DeleteS;10;Select AllS;1;aS;4;UndoS;1;zS;3;CutS;1;xS;5;PasteS;1;vS;4;CopyS;1;cS;4;RedoS;1;Zd;7;1179648S;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;85E;E;E;S;13;Find Previousd;1;3S;1;GS;17;Jump to SelectionS;1;jS;22;Use Selection for Findd;1;7S;1;eS;9;Find Nextd;1;2S;1;gS;5;Find…d;1;1S;1;fS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;94E;E;E;S;27;Check Spelling While TypingS;14;Check SpellingS;1;;S;14;Show Spelling…S;1;:S;27;Check Grammar With SpellingS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;97E;E;E;S;13;Stop SpeakingS;14;Start SpeakingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;115E;E;E;S;4;SaveS;1;sS;8;Save As…S;1;SS;5;Open…S;1;oS;3;NewS;1;nS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;112E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;15;Revert to SavedS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 127}, {480, 360}}S;21;{{0, 0}, {1440, 877}}d;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;E;E;S;6;normalS;6;{1, 1}S;21;{{20, 165}, {88, 17}}S;18;{{0, 0}, {88, 17}}d;2;36S;9;textfieldS;18;controlSizeRegulard;1;4D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;279E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;285E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;286E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;174E;E;S;14;Label from xibD;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;282E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;287E;E;S;13;AppControllerS;29;.Helvetica Neue DeskInterfaced;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;221E;E;E;f;18;0.6862745098039216E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;126E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;126E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;126E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;121E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;130E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;58E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;131E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;60E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;133E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;108E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;107E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;141E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;79E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;74E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;59E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;102E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;103E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;164E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;165E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;166E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;167E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;56E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;56E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;167E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;170E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;175E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;176E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;177E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;178E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;179E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;62E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;62E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;179E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;180E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;184E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;185E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;186E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;187E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;69E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;69E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;187E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;189E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;190E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;191E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;72E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;72E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;191E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;192E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;193E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;197E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;199E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;200E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;201E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;203E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;204E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;205E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;207E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;83E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;83E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;207E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;209E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;212E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;213E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;214E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;215E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;216E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;217E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;220E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;223E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;90E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;90E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;223E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;225E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;228E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;229E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;230E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;231E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;96E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;96E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;231E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;233E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;234E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;235E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;100E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;100E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;235E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;236E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;237E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;238E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;105E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;105E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;240E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;243E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;245E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;247E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;248E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;249E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;250E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;111E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;111E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;250E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;251E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;111E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;255E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;256E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;257E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;117E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;117E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;257E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;259E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;260E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;263E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;264E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;265E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;266E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;267E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;215E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;167E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;123E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;269E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;269E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;270E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;271E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;273E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;274E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;275E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;276E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;277E;K;11;$aalignmentD;K;6;CP$UIDd;3;278E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;218E;K;6;$afontD;K;6;CP$UIDd;3;280E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;172E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;281E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;278E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;268E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;174E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;283E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;218E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;278E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;174E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;174E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;284E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;121E;E;E;S;8;delegateS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;10;terminate:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;68E;E;E;S;6;WindowS;14;submenuAction:d;7;1048576S;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;E;E;T;S;0;F;S;18;Bring All to FrontS;4;ZoomS;8;MinimizeS;1;mS;14;NewApplicationS;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;64E;E;E;S;20;About NewApplicationS;19;Quit NewApplicationS;1;qS;12;Preferences…S;1;,S;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;70E;E;E;S;19;NewApplication HelpS;1;?S;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;95E;E;E;S;6;DeleteS;10;Select AllS;1;aS;4;UndoS;1;zS;3;CutS;1;xS;5;PasteS;1;vS;4;CopyS;1;cS;4;RedoS;1;Zd;7;1179648S;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;85E;E;E;S;13;Find Previousd;1;3S;1;GS;17;Jump to SelectionS;1;jS;22;Use Selection for Findd;1;7S;1;eS;9;Find Nextd;1;2S;1;gS;5;Find…d;1;1S;1;fS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;94E;E;E;S;27;Check Spelling While TypingS;14;Check SpellingS;1;;S;14;Show Spelling…S;1;:S;27;Check Grammar With SpellingS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;97E;E;E;S;13;Stop SpeakingS;14;Start SpeakingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;115E;E;E;S;4;SaveS;1;sS;8;Save As…S;1;SS;5;Open…S;1;oS;3;NewS;1;nS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;112E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;15;Revert to SavedS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 127}, {480, 360}}S;21;{{0, 0}, {1440, 877}}d;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;E;E;S;6;normalS;6;{1, 1}S;22;{{20, 165}, {178, 17}}S;19;{{0, 0}, {178, 17}}d;2;36S;9;textfieldS;18;controlSizeRegulard;1;4D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;279E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;285E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;286E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;174E;E;S;29;Label not translated from xibD;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;282E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;287E;E;S;13;AppControllerS;29;.Helvetica Neue DeskInterfaced;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;221E;E;E;f;18;0.6862745098039216E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib b/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.xib similarity index 99% rename from Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib rename to Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.xib index 42e487569..a4b241f1b 100644 --- a/Tests/Manual/CPLocalizationTest/Resources/MainMenu.xib +++ b/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.xib @@ -647,16 +647,17 @@ 268 - {{18, 178}, {92, 17}} + {{18, 178}, {182, 17}} + _NS:526 {251, 750} YES 68157504 272630784 - Label from xib + Label not translated from xib YES 13 diff --git a/Tests/Manual/CPLocalizationTest/Resources/en.lproj/Localizable.xstrings b/Tests/Manual/CPLocalizationTest/Resources/en.lproj/Localizable.xstrings deleted file mode 100644 index 90e0879bb..000000000 --- a/Tests/Manual/CPLocalizationTest/Resources/en.lproj/Localizable.xstrings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Label from file - Label title from en.lproj - - diff --git a/Tests/Manual/CPLocalizationTest/Resources/en.lproj/MainMenu.strings b/Tests/Manual/CPLocalizationTest/Resources/en.lproj/MainMenu.strings new file mode 100644 index 000000000..99058cdd2 --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/Resources/en.lproj/MainMenu.strings @@ -0,0 +1,186 @@ + +/* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "5"; */ +"5.title" = "Bring All to Front"; + +/* Class = "NSMenuItem"; title = "Window"; ObjectID = "19"; */ +"19.title" = "Window"; + +/* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "23"; */ +"23.title" = "Minimize"; + +/* Class = "NSMenu"; title = "Window"; ObjectID = "24"; */ +"24.title" = "Window"; + +/* Class = "NSMenu"; title = "AMainMenu"; ObjectID = "29"; */ +"29.title" = "AMainMenu"; + +/* Class = "NSMenuItem"; title = "NewApplication"; ObjectID = "56"; */ +"56.title" = "NewApplication"; + +/* Class = "NSMenu"; title = "NewApplication"; ObjectID = "57"; */ +"57.title" = "NewApplication"; + +/* Class = "NSMenuItem"; title = "About NewApplication"; ObjectID = "58"; */ +"58.title" = "About NewApplication"; + +/* Class = "NSMenuItem"; title = "Open…"; ObjectID = "72"; */ +"72.title" = "Open…"; + +/* Class = "NSMenuItem"; title = "Close"; ObjectID = "73"; */ +"73.title" = "Close"; + +/* Class = "NSMenuItem"; title = "Save"; ObjectID = "75"; */ +"75.title" = "Save"; + +/* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "80"; */ +"80.title" = "Save As…"; + +/* Class = "NSMenu"; title = "File"; ObjectID = "81"; */ +"81.title" = "File"; + +/* Class = "NSMenuItem"; title = "New"; ObjectID = "82"; */ +"82.title" = "New"; + +/* Class = "NSMenuItem"; title = "File"; ObjectID = "83"; */ +"83.title" = "File"; + +/* Class = "NSMenuItem"; title = "Help"; ObjectID = "103"; */ +"103.title" = "Help"; + +/* Class = "NSMenu"; title = "Help"; ObjectID = "106"; */ +"106.title" = "Help"; + +/* Class = "NSMenuItem"; title = "NewApplication Help"; ObjectID = "111"; */ +"111.title" = "NewApplication Help"; + +/* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "112"; */ +"112.title" = "Revert to Saved"; + +/* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "124"; */ +"124.title" = "Open Recent"; + +/* Class = "NSMenu"; title = "Open Recent"; ObjectID = "125"; */ +"125.title" = "Open Recent"; + +/* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "126"; */ +"126.title" = "Clear Menu"; + +/* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "129"; */ +"129.title" = "Preferences…"; + +/* Class = "NSMenuItem"; title = "Quit NewApplication"; ObjectID = "136"; */ +"136.title" = "Quit NewApplication"; + +/* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "195"; */ +"195.title" = "Stop Speaking"; + +/* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "196"; */ +"196.title" = "Start Speaking"; + +/* Class = "NSMenuItem"; title = "Copy"; ObjectID = "197"; */ +"197.title" = "Copy"; + +/* Class = "NSMenuItem"; title = "Select All"; ObjectID = "198"; */ +"198.title" = "Select All"; + +/* Class = "NSMenuItem"; title = "Cut"; ObjectID = "199"; */ +"199.title" = "Cut"; + +/* Class = "NSMenu"; title = "Spelling and Grammar"; ObjectID = "200"; */ +"200.title" = "Spelling and Grammar"; + +/* Class = "NSMenuItem"; title = "Check Spelling"; ObjectID = "201"; */ +"201.title" = "Check Spelling"; + +/* Class = "NSMenuItem"; title = "Delete"; ObjectID = "202"; */ +"202.title" = "Delete"; + +/* Class = "NSMenuItem"; title = "Paste"; ObjectID = "203"; */ +"203.title" = "Paste"; + +/* Class = "NSMenuItem"; title = "Show Spelling…"; ObjectID = "204"; */ +"204.title" = "Show Spelling…"; + +/* Class = "NSMenu"; title = "Edit"; ObjectID = "205"; */ +"205.title" = "Edit"; + +/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "207"; */ +"207.title" = "Undo"; + +/* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "208"; */ +"208.title" = "Find Next"; + +/* Class = "NSMenuItem"; title = "Find…"; ObjectID = "209"; */ +"209.title" = "Find…"; + +/* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "210"; */ +"210.title" = "Jump to Selection"; + +/* Class = "NSMenuItem"; title = "Speech"; ObjectID = "211"; */ +"211.title" = "Speech"; + +/* Class = "NSMenu"; title = "Speech"; ObjectID = "212"; */ +"212.title" = "Speech"; + +/* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "213"; */ +"213.title" = "Find Previous"; + +/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "215"; */ +"215.title" = "Redo"; + +/* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "216"; */ +"216.title" = "Spelling and Grammar"; + +/* Class = "NSMenuItem"; title = "Edit"; ObjectID = "217"; */ +"217.title" = "Edit"; + +/* Class = "NSMenuItem"; title = "Find"; ObjectID = "218"; */ +"218.title" = "Find"; + +/* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "219"; */ +"219.title" = "Check Spelling While Typing"; + +/* Class = "NSMenu"; title = "Find"; ObjectID = "220"; */ +"220.title" = "Find"; + +/* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "221"; */ +"221.title" = "Use Selection for Find"; + +/* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "239"; */ +"239.title" = "Zoom"; + +/* Class = "NSMenuItem"; title = "View"; ObjectID = "295"; */ +"295.title" = "View"; + +/* Class = "NSMenu"; title = "View"; ObjectID = "296"; */ +"296.title" = "View"; + +/* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "297"; */ +"297.title" = "Show Toolbar"; + +/* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "298"; */ +"298.title" = "Customize Toolbar…"; + +/* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "346"; */ +"346.title" = "Check Grammar With Spelling"; + +/* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "348"; */ +"348.title" = "Substitutions"; + +/* Class = "NSMenu"; title = "Substitutions"; ObjectID = "349"; */ +"349.title" = "Substitutions"; + +/* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "350"; */ +"350.title" = "Smart Copy/Paste"; + +/* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "351"; */ +"351.title" = "Smart Quotes"; + +/* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "354"; */ +"354.title" = "Smart Links"; + +/* Class = "NSWindow"; title = "Window"; ObjectID = "371"; */ +"371.title" = "Window"; + +/* Class = "NSTextFieldCell"; title = "Label not translated from xib"; ObjectID = "461"; */ +"461.title" = "Label translated from xib in english"; diff --git a/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/Localizable.xstrings b/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/Localizable.xstrings deleted file mode 100644 index fab50f5e9..000000000 --- a/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/Localizable.xstrings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - Label from file - Titre du label de fr.lproj - - diff --git a/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/MainMenu.strings b/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/MainMenu.strings new file mode 100644 index 000000000..7092b23f4 --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/MainMenu.strings @@ -0,0 +1,186 @@ + +/* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "5"; */ +"5.title" = "Bring All to Front"; + +/* Class = "NSMenuItem"; title = "Window"; ObjectID = "19"; */ +"19.title" = "Window"; + +/* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "23"; */ +"23.title" = "Minimize"; + +/* Class = "NSMenu"; title = "Window"; ObjectID = "24"; */ +"24.title" = "Window"; + +/* Class = "NSMenu"; title = "AMainMenu"; ObjectID = "29"; */ +"29.title" = "AMainMenu"; + +/* Class = "NSMenuItem"; title = "NewApplication"; ObjectID = "56"; */ +"56.title" = "NewApplication"; + +/* Class = "NSMenu"; title = "NewApplication"; ObjectID = "57"; */ +"57.title" = "NewApplication"; + +/* Class = "NSMenuItem"; title = "About NewApplication"; ObjectID = "58"; */ +"58.title" = "About NewApplication"; + +/* Class = "NSMenuItem"; title = "Open…"; ObjectID = "72"; */ +"72.title" = "Open…"; + +/* Class = "NSMenuItem"; title = "Close"; ObjectID = "73"; */ +"73.title" = "Close"; + +/* Class = "NSMenuItem"; title = "Save"; ObjectID = "75"; */ +"75.title" = "Save"; + +/* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "80"; */ +"80.title" = "Save As…"; + +/* Class = "NSMenu"; title = "File"; ObjectID = "81"; */ +"81.title" = "File"; + +/* Class = "NSMenuItem"; title = "New"; ObjectID = "82"; */ +"82.title" = "New"; + +/* Class = "NSMenuItem"; title = "File"; ObjectID = "83"; */ +"83.title" = "File"; + +/* Class = "NSMenuItem"; title = "Help"; ObjectID = "103"; */ +"103.title" = "Help"; + +/* Class = "NSMenu"; title = "Help"; ObjectID = "106"; */ +"106.title" = "Help"; + +/* Class = "NSMenuItem"; title = "NewApplication Help"; ObjectID = "111"; */ +"111.title" = "NewApplication Help"; + +/* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "112"; */ +"112.title" = "Revert to Saved"; + +/* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "124"; */ +"124.title" = "Open Recent"; + +/* Class = "NSMenu"; title = "Open Recent"; ObjectID = "125"; */ +"125.title" = "Open Recent"; + +/* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "126"; */ +"126.title" = "Clear Menu"; + +/* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "129"; */ +"129.title" = "Preferences…"; + +/* Class = "NSMenuItem"; title = "Quit NewApplication"; ObjectID = "136"; */ +"136.title" = "Quit NewApplication"; + +/* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "195"; */ +"195.title" = "Stop Speaking"; + +/* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "196"; */ +"196.title" = "Start Speaking"; + +/* Class = "NSMenuItem"; title = "Copy"; ObjectID = "197"; */ +"197.title" = "Copy"; + +/* Class = "NSMenuItem"; title = "Select All"; ObjectID = "198"; */ +"198.title" = "Select All"; + +/* Class = "NSMenuItem"; title = "Cut"; ObjectID = "199"; */ +"199.title" = "Cut"; + +/* Class = "NSMenu"; title = "Spelling and Grammar"; ObjectID = "200"; */ +"200.title" = "Spelling and Grammar"; + +/* Class = "NSMenuItem"; title = "Check Spelling"; ObjectID = "201"; */ +"201.title" = "Check Spelling"; + +/* Class = "NSMenuItem"; title = "Delete"; ObjectID = "202"; */ +"202.title" = "Delete"; + +/* Class = "NSMenuItem"; title = "Paste"; ObjectID = "203"; */ +"203.title" = "Paste"; + +/* Class = "NSMenuItem"; title = "Show Spelling…"; ObjectID = "204"; */ +"204.title" = "Show Spelling…"; + +/* Class = "NSMenu"; title = "Edit"; ObjectID = "205"; */ +"205.title" = "Edit"; + +/* Class = "NSMenuItem"; title = "Undo"; ObjectID = "207"; */ +"207.title" = "Undo"; + +/* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "208"; */ +"208.title" = "Find Next"; + +/* Class = "NSMenuItem"; title = "Find…"; ObjectID = "209"; */ +"209.title" = "Find…"; + +/* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "210"; */ +"210.title" = "Jump to Selection"; + +/* Class = "NSMenuItem"; title = "Speech"; ObjectID = "211"; */ +"211.title" = "Speech"; + +/* Class = "NSMenu"; title = "Speech"; ObjectID = "212"; */ +"212.title" = "Speech"; + +/* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "213"; */ +"213.title" = "Find Previous"; + +/* Class = "NSMenuItem"; title = "Redo"; ObjectID = "215"; */ +"215.title" = "Redo"; + +/* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "216"; */ +"216.title" = "Spelling and Grammar"; + +/* Class = "NSMenuItem"; title = "Edit"; ObjectID = "217"; */ +"217.title" = "Edit"; + +/* Class = "NSMenuItem"; title = "Find"; ObjectID = "218"; */ +"218.title" = "Find"; + +/* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "219"; */ +"219.title" = "Check Spelling While Typing"; + +/* Class = "NSMenu"; title = "Find"; ObjectID = "220"; */ +"220.title" = "Find"; + +/* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "221"; */ +"221.title" = "Use Selection for Find"; + +/* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "239"; */ +"239.title" = "Zoom"; + +/* Class = "NSMenuItem"; title = "View"; ObjectID = "295"; */ +"295.title" = "View"; + +/* Class = "NSMenu"; title = "View"; ObjectID = "296"; */ +"296.title" = "View"; + +/* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "297"; */ +"297.title" = "Show Toolbar"; + +/* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "298"; */ +"298.title" = "Customize Toolbar…"; + +/* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "346"; */ +"346.title" = "Check Grammar With Spelling"; + +/* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "348"; */ +"348.title" = "Substitutions"; + +/* Class = "NSMenu"; title = "Substitutions"; ObjectID = "349"; */ +"349.title" = "Substitutions"; + +/* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "350"; */ +"350.title" = "Smart Copy/Paste"; + +/* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "351"; */ +"351.title" = "Smart Quotes"; + +/* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "354"; */ +"354.title" = "Smart Links"; + +/* Class = "NSWindow"; title = "Window"; ObjectID = "371"; */ +"371.title" = "Window"; + +/* Class = "NSTextFieldCell"; title = "Label not translated from xib"; ObjectID = "461"; */ +"461.title" = "Label traduit du xib en francais"; From 3b20021981614c06f5422c0f4a4988720c8315c3 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 21 Apr 2015 18:24:50 -0700 Subject: [PATCH 014/169] Test: updated test CPLocalizationTest --- Tests/Manual/CPLocalizationTest/Info.plist | 7 +- .../Resources/Base.lproj/MainMenu.cib | 2 +- .../Resources/Base.lproj/MainMenu.xib | 1659 +---------------- .../Resources/fr.lproj/Localizable.strings | Bin 148 -> 374 bytes .../Resources/fr.lproj/MainMenu.strings | 2 +- .../fr.lproj/SecondLocalizable.strings | 2 + 6 files changed, 52 insertions(+), 1620 deletions(-) create mode 100644 Tests/Manual/CPLocalizationTest/Resources/fr.lproj/SecondLocalizable.strings diff --git a/Tests/Manual/CPLocalizationTest/Info.plist b/Tests/Manual/CPLocalizationTest/Info.plist index d6d2f303d..5b71bb727 100644 --- a/Tests/Manual/CPLocalizationTest/Info.plist +++ b/Tests/Manual/CPLocalizationTest/Info.plist @@ -10,10 +10,15 @@ 1.0 CPHumanReadableCopyright Copyright © 2015, Your Company All rights reserved. - CPLocalizableStrings + CPBundleLocalizableStrings Localizable.strings SecondLocalizable.strings + MainMenu.strings + CPBundleTypeOfLocalization + CPBundleBaseLocalizationType + CPBundleDefaultLanguage + en diff --git a/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.cib b/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.cib index 9ef707a2c..2a05f4f95 100644 --- a/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.cib +++ b/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.cib @@ -1 +1 @@ -280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;D;K;6;CP$UIDd;2;18E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;20E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;22E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;24E;D;K;6;CP$UIDd;2;25E;D;K;6;CP$UIDd;2;26E;D;K;6;CP$UIDd;2;27E;D;K;6;CP$UIDd;2;28E;D;K;6;CP$UIDd;2;29E;D;K;6;CP$UIDd;2;30E;D;K;6;CP$UIDd;2;31E;D;K;6;CP$UIDd;2;32E;D;K;6;CP$UIDd;2;33E;D;K;6;CP$UIDd;2;34E;D;K;6;CP$UIDd;2;35E;D;K;6;CP$UIDd;2;36E;D;K;6;CP$UIDd;2;37E;D;K;6;CP$UIDd;2;38E;D;K;6;CP$UIDd;2;39E;D;K;6;CP$UIDd;2;40E;D;K;6;CP$UIDd;2;41E;D;K;6;CP$UIDd;2;42E;D;K;6;CP$UIDd;2;43E;D;K;6;CP$UIDd;2;44E;D;K;6;CP$UIDd;2;45E;D;K;6;CP$UIDd;2;46E;D;K;6;CP$UIDd;2;47E;D;K;6;CP$UIDd;2;48E;D;K;6;CP$UIDd;2;49E;D;K;6;CP$UIDd;2;50E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;51E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;70E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;85E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;94E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;97E;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;112E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;115E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;3;126E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;56E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;62E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;68E;D;K;6;CP$UIDd;2;69E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;83E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;90E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;95E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;96E;D;K;6;CP$UIDd;2;72E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;3;100E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;111E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;3;105E;D;K;6;CP$UIDd;2;53E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;3;117E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;3;121E;D;K;6;CP$UIDd;3;123E;D;K;6;CP$UIDd;3;125E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;3;128E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;126E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;129E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;126E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;3;121E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;130E;E;D;K;10;$classnameS;21;CPCibControlConnectorK;8;$classesA;S;21;CPCibControlConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;58E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;131E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;60E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;132E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;63E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;11E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;133E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;108E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;134E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;113E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;135E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;106E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;136E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;107E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;137E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;109E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;138E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;70E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;139E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;115E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;140E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;112E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;141E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;64E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;51E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;142E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;97E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;143E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;98E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;144E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;79E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;145E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;74E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;146E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;77E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;147E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;92E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;148E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;73E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;149E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;78E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;150E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;93E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;151E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;75E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;152E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;88E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;153E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;85E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;154E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;81E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;155E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;91E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;156E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;59E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;157E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;118E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;158E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;119E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;159E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;94E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;160E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;101E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;161E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;102E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;162E;E;D;K;6;$classD;K;6;CP$UIDd;2;17E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;3;103E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;1;0E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;3;163E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;127E;E;D;K;10;$classnameS;6;CPMenuK;8;$classesA;S;6;CPMenuS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;164E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;165E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;166E;E;D;K;10;$classnameS;10;CPMenuItemK;8;$classesA;S;10;CPMenuItemS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;167E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;56E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;56E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;167E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;170E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;171E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;175E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;176E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;177E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;56E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;178E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;179E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;62E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;62E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;179E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;180E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;181E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;182E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;183E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;184E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;185E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;186E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;62E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;187E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;69E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;69E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;187E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;188E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;189E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;69E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;190E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;191E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;72E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;72E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;191E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;192E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;193E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;194E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;195E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;196E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;197E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;198E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;199E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;200E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;201E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;202E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;203E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;204E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;205E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;207E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;83E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;83E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;207E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;208E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;209E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;212E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;213E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;214E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;215E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;216E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;217E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;220E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;83E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;223E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;90E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;90E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;223E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;224E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;225E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;226E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;227E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;228E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;229E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;230E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;90E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;231E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;2;96E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;2;96E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;231E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;232E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;233E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;234E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;96E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;235E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;100E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;100E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;72E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;235E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;236E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;237E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;221E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;222E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;238E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;218E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;219E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;239E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;16;CPMenuItemTagKeyD;K;6;CP$UIDd;3;210E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;100E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;211E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;240E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;105E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;105E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;240E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;241E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;242E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;243E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;244E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;245E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;206E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;246E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;247E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;248E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;249E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;250E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;111E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;111E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;250E;K;13;CPMenuNameKeyD;K;6;CP$UIDd;3;251E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;252E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;253E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;111E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;254E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;255E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;24;CPMenuItemIsSeparatorKeyD;K;6;CP$UIDd;3;172E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;173E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;22;CPMenuItemIsEnabledKeyD;K;6;CP$UIDd;3;174E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;256E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;105E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;257E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;3;117E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;3;168E;K;20;CPMenuItemSubmenuKeyD;K;6;CP$UIDd;3;117E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;2;53E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;6;$classD;K;6;CP$UIDd;2;52E;K;14;CPMenuTitleKeyD;K;6;CP$UIDd;3;257E;K;14;CPMenuItemsKeyD;K;6;CP$UIDd;3;258E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;259E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;26;CPMenuItemKeyEquivalentKeyD;K;6;CP$UIDd;3;260E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;261E;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;18;CPMenuItemTitleKeyD;K;6;CP$UIDd;3;262E;K;19;CPMenuItemTargetKeyD;K;6;CP$UIDd;1;0E;K;19;CPMenuItemActionKeyD;K;6;CP$UIDd;1;0E;K;17;CPMenuItemMenuKeyD;K;6;CP$UIDd;3;117E;K;38;CPMenuItemKeyEquivalentModifierMaskKeyD;K;6;CP$UIDd;3;169E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;120E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;3;263E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;3;264E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;3;265E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;3;266E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;3;267E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;3;215E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;3;167E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;3;123E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;122E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;269E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;269E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;3;270E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;271E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;124E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;3;123E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;3;268E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;3;273E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;3;274E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;3;123E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;3;275E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;3;276E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;3;277E;K;11;$aalignmentD;K;6;CP$UIDd;3;278E;K;17;$aline-break-modeD;K;6;CP$UIDd;3;218E;K;6;$afontD;K;6;CP$UIDd;3;280E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;3;272E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;3;272E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;3;174E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;3;172E;K;17;CPControlValueKeyD;K;6;CP$UIDd;3;281E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;3;278E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;3;268E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;3;174E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;3;174E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;3;283E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;3;218E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;3;278E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;3;174E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;3;174E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;3;172E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;3;284E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;121E;E;E;S;8;delegateS;9;theWindowS;15;arrangeInFront:S;19;performMiniaturize:S;29;orderFrontStandardAboutPanel:S;13;openDocument:S;13;performClose:S;13;saveDocument:S;15;saveDocumentAs:S;12;newDocument:S;9;showHelp:S;22;revertDocumentToSaved:S;21;clearRecentDocuments:S;10;terminate:S;13;stopSpeaking:S;14;startSpeaking:S;5;copy:S;10;selectAll:S;4;cut:S;14;checkSpelling:S;7;delete:S;6;paste:S;15;showGuessPanel:S;5;undo:S;23;performFindPanelAction:S;29;centerSelectionInVisibleArea:S;5;redo:S;30;toggleContinuousSpellChecking:S;12;performZoom:S;19;toggleToolbarShown:S;31;runToolbarCustomizationPalette:S;22;toggleGrammarChecking:S;24;toggleSmartInsertDelete:S;33;toggleAutomaticQuoteSubstitution:S;29;toggleAutomaticLinkDetection:S;9;AMainMenuS;11;_CPMainMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;61E;D;K;6;CP$UIDd;3;104E;D;K;6;CP$UIDd;2;71E;D;K;6;CP$UIDd;3;116E;D;K;6;CP$UIDd;2;55E;D;K;6;CP$UIDd;2;68E;E;E;S;6;WindowS;14;submenuAction:d;7;1048576S;14;_CPWindowsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;60E;D;K;6;CP$UIDd;2;59E;D;K;6;CP$UIDd;2;57E;D;K;6;CP$UIDd;2;58E;E;E;T;S;0;F;S;18;Bring All to FrontS;4;ZoomS;8;MinimizeS;1;mS;14;NewApplicationS;18;_CPApplicationMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;63E;D;K;6;CP$UIDd;2;67E;D;K;6;CP$UIDd;2;65E;D;K;6;CP$UIDd;2;66E;D;K;6;CP$UIDd;2;64E;E;E;S;20;About NewApplicationS;19;Quit NewApplicationS;1;qS;12;Preferences…S;1;,S;4;HelpD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;70E;E;E;S;19;NewApplication HelpS;1;?S;4;EditD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;75E;D;K;6;CP$UIDd;2;81E;D;K;6;CP$UIDd;2;80E;D;K;6;CP$UIDd;2;77E;D;K;6;CP$UIDd;2;79E;D;K;6;CP$UIDd;2;78E;D;K;6;CP$UIDd;2;73E;D;K;6;CP$UIDd;2;74E;D;K;6;CP$UIDd;2;76E;D;K;6;CP$UIDd;2;82E;D;K;6;CP$UIDd;2;89E;D;K;6;CP$UIDd;2;99E;D;K;6;CP$UIDd;2;95E;E;E;S;6;DeleteS;10;Select AllS;1;aS;4;UndoS;1;zS;3;CutS;1;xS;5;PasteS;1;vS;4;CopyS;1;cS;4;RedoS;1;Zd;7;1179648S;4;FindD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;88E;D;K;6;CP$UIDd;2;87E;D;K;6;CP$UIDd;2;84E;D;K;6;CP$UIDd;2;86E;D;K;6;CP$UIDd;2;85E;E;E;S;13;Find Previousd;1;3S;1;GS;17;Jump to SelectionS;1;jS;22;Use Selection for Findd;1;7S;1;eS;9;Find Nextd;1;2S;1;gS;5;Find…d;1;1S;1;fS;20;Spelling and GrammarD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;93E;D;K;6;CP$UIDd;2;92E;D;K;6;CP$UIDd;2;91E;D;K;6;CP$UIDd;2;94E;E;E;S;27;Check Spelling While TypingS;14;Check SpellingS;1;;S;14;Show Spelling…S;1;:S;27;Check Grammar With SpellingS;6;SpeechD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;98E;D;K;6;CP$UIDd;2;97E;E;E;S;13;Stop SpeakingS;14;Start SpeakingS;13;SubstitutionsD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;101E;D;K;6;CP$UIDd;3;102E;D;K;6;CP$UIDd;3;103E;E;E;S;16;Smart Copy/PasteS;12;Smart QuotesS;11;Smart LinksS;4;FileD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;109E;D;K;6;CP$UIDd;3;108E;D;K;6;CP$UIDd;3;110E;D;K;6;CP$UIDd;3;114E;D;K;6;CP$UIDd;3;113E;D;K;6;CP$UIDd;3;106E;D;K;6;CP$UIDd;3;107E;D;K;6;CP$UIDd;3;115E;E;E;S;4;SaveS;1;sS;8;Save As…S;1;SS;5;Open…S;1;oS;3;NewS;1;nS;11;Open RecentS;22;_CPRecentDocumentsMenuD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;112E;E;E;S;10;Clear MenuS;5;CloseS;1;wS;15;Revert to SavedS;4;ViewD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;118E;D;K;6;CP$UIDd;3;119E;E;E;S;12;Show ToolbarS;1;td;7;1572864S;18;Customize Toolbar…S;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1946157056S;24;{{335, 127}, {480, 360}}S;21;{{0, 0}, {1440, 877}}d;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;125E;E;E;S;6;normalS;6;{1, 1}S;22;{{20, 165}, {178, 17}}S;19;{{0, 0}, {178, 17}}d;2;36S;9;textfieldS;18;controlSizeRegulard;1;4D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;279E;K;13;CPFontNameKeyD;K;6;CP$UIDd;3;285E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;3;286E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;3;174E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;3;174E;E;S;29;Label not translated from xibD;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;3;282E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;3;287E;E;S;13;AppControllerS;29;.Helvetica Neue DeskInterfaced;2;13D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;288E;D;K;6;CP$UIDd;3;221E;E;E;f;18;0.6862745098039216E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file +280NPLIST;1.0;D;K;4;$topD;K;18;CPCibObjectDataKeyD;K;6;CP$UIDd;1;2E;E;K;8;$objectsA;S;5;$nullD;K;10;$classnameS;16;_CPCibObjectDataK;8;$classesA;S;16;_CPCibObjectDataS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;1E;K;28;_CPCibObjectDataNamesKeysKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataNamesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataClassesKeysKeyD;K;6;CP$UIDd;1;0E;K;32;_CPCibObjectDataClassesValuesKeyD;K;6;CP$UIDd;1;0E;K;30;_CPCibObjectDataConnectionsKeyD;K;6;CP$UIDd;1;4E;K;28;_CPCibObjectDataFrameworkKeyD;K;6;CP$UIDd;1;0E;K;26;_CPCibObjectDataNextOidKeyD;K;6;CP$UIDd;1;5E;K;30;_CPCibObjectDataObjectsKeysKeyD;K;6;CP$UIDd;1;6E;K;32;_CPCibObjectDataObjectsValuesKeyD;K;6;CP$UIDd;1;7E;K;26;_CPCibObjectDataOidKeysKeyD;K;6;CP$UIDd;1;8E;K;28;_CPCibObjectDataOidValuesKeyD;K;6;CP$UIDd;1;9E;K;28;_CPCibObjectDataFileOwnerKeyD;K;6;CP$UIDd;2;11E;K;33;_CPCibObjectDataVisibleWindowsKeyD;K;6;CP$UIDd;2;13E;E;D;K;10;$classnameS;7;CPArrayK;8;$classesA;S;7;CPArrayS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;15E;D;K;6;CP$UIDd;2;16E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;17E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;1;0E;D;K;6;CP$UIDd;2;24E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;11E;D;K;6;CP$UIDd;2;19E;D;K;6;CP$UIDd;2;21E;D;K;6;CP$UIDd;2;23E;D;K;6;CP$UIDd;2;11E;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;E;E;D;K;10;$classnameS;18;_CPCibCustomObjectK;8;$classesA;S;18;_CPCibCustomObjectS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;25E;E;D;K;10;$classnameS;5;CPSetK;8;$classesA;S;5;CPSetS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;12E;K;15;CPSetObjectsKeyD;K;6;CP$UIDd;2;26E;E;D;K;10;$classnameS;20;CPCibOutletConnectorK;8;$classesA;S;20;CPCibOutletConnectorS;14;CPCibConnectorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;11E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;24E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;27E;E;D;K;6;$classD;K;6;CP$UIDd;2;14E;K;24;_CPCibConnectorSourceKeyD;K;6;CP$UIDd;2;24E;K;29;_CPCibConnectorDestinationKeyD;K;6;CP$UIDd;2;19E;K;23;_CPCibConnectorLabelKeyD;K;6;CP$UIDd;2;28E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;25E;E;D;K;10;$classnameS;20;_CPCibWindowTemplateK;8;$classesA;S;20;_CPCibWindowTemplateS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;18E;K;30;_CPCibWindowTemplateMaxSizeKeyD;K;6;CP$UIDd;2;29E;K;32;_CPCibWindowTemplateViewClassKeyD;K;6;CP$UIDd;1;0E;K;34;_CPCibWindowTemplateWindowClassKeyD;K;6;CP$UIDd;2;30E;K;30;_CPCibWindowTemplateWTFlagsKeyD;K;6;CP$UIDd;2;31E;K;33;_CPCibWindowTemplateWindowRectKeyD;K;6;CP$UIDd;2;32E;K;33;_CPCibWindowTemplateScreenRectKeyD;K;6;CP$UIDd;2;33E;K;30;_CPCibWindowTempatStyleMaskKeyD;K;6;CP$UIDd;2;34E;K;34;_CPCibWindowTemplateWindowTitleKeyD;K;6;CP$UIDd;2;36E;K;33;_CPCibWindowTemplateWindowViewKeyD;K;6;CP$UIDd;2;21E;E;D;K;10;$classnameS;6;CPViewK;8;$classesA;S;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;20E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;38E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;38E;K;17;CPViewSubviewsKeyD;K;6;CP$UIDd;2;39E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;1;0E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;40E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;41E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;41E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;42E;E;D;K;10;$classnameS;11;CPTextFieldK;8;$classesA;S;11;CPTextFieldS;9;CPControlS;6;CPViewS;11;CPResponderS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;22E;K;27;CPResponderNextResponderKeyD;K;6;CP$UIDd;2;21E;K;18;CPResponderMenuKeyD;K;6;CP$UIDd;1;0E;K;12;CPViewTagKeyD;K;6;CP$UIDd;2;37E;K;14;CPViewFrameKeyD;K;6;CP$UIDd;2;43E;K;15;CPViewBoundsKeyD;K;6;CP$UIDd;2;44E;K;18;CPViewSuperviewKeyD;K;6;CP$UIDd;2;21E;K;22;CPViewAutoresizingMaskD;K;6;CP$UIDd;2;45E;K;19;CPViewThemeClassKeyD;K;6;CP$UIDd;2;46E;K;19;CPViewThemeStateKeyD;K;6;CP$UIDd;2;47E;K;11;$aalignmentD;K;6;CP$UIDd;2;48E;K;17;$aline-break-modeD;K;6;CP$UIDd;2;49E;K;6;$afontD;K;6;CP$UIDd;2;51E;K;14;CPViewScaleKeyD;K;6;CP$UIDd;2;41E;K;18;CPViewSizeScaleKeyD;K;6;CP$UIDd;2;41E;K;17;CPViewIsScaledKeyD;K;6;CP$UIDd;2;42E;K;35;CPControlSendsActionOnEndEditingKeyD;K;6;CP$UIDd;2;52E;K;17;CPControlValueKeyD;K;6;CP$UIDd;2;53E;K;24;CPControlSendActionOnKeyD;K;6;CP$UIDd;2;48E;K;23;CPControlControlSizeKeyD;K;6;CP$UIDd;2;37E;K;24;CPTextFieldIsEditableKeyD;K;6;CP$UIDd;2;42E;K;26;CPTextFieldIsSelectableKeyD;K;6;CP$UIDd;2;42E;K;29;CPTextFieldDrawsBackgroundKeyD;K;6;CP$UIDd;2;42E;K;29;CPTextFieldBackgroundColorKeyD;K;6;CP$UIDd;2;55E;K;27;CPTextFieldLineBreakModeKeyD;K;6;CP$UIDd;2;49E;K;23;CPTextFieldAlignmentKeyD;K;6;CP$UIDd;2;48E;K;31;CPTextFieldPlaceholderStringKeyD;K;6;CP$UIDd;1;0E;K;29;CPTextFieldUsesSingleLineModeD;K;6;CP$UIDd;2;42E;K;16;CPTextFieldWrapsD;K;6;CP$UIDd;2;42E;K;18;CPTextFieldScrollsD;K;6;CP$UIDd;2;52E;E;D;K;6;$classD;K;6;CP$UIDd;2;10E;K;27;_CPCibCustomObjectClassNameD;K;6;CP$UIDd;2;56E;E;S;13;CPApplicationD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;19E;E;E;S;8;delegateS;9;theWindowS;32;{10000000000000, 10000000000000}S;8;CPWindowd;10;1879048192S;24;{{335, 127}, {480, 360}}S;21;{{0, 0}, {1440, 877}}d;1;7D;K;10;$classnameS;20;_CPLocalizableStringK;8;$classesA;S;20;_CPLocalizableStringS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;22;CPLocalizableStringDevD;K;6;CP$UIDd;2;57E;K;22;CPLocalizableStringKeyD;K;6;CP$UIDd;2;58E;K;24;CPLocalizableStringValueD;K;6;CP$UIDd;2;57E;E;d;1;0S;20;{{0, 0}, {480, 360}}D;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;23E;E;E;S;6;normalS;6;{1, 1}F;S;22;{{20, 166}, {364, 17}}S;19;{{0, 0}, {364, 17}}d;2;36S;9;textfieldS;18;controlSizeRegulard;1;4d;1;2D;K;10;$classnameS;6;CPFontK;8;$classesA;S;6;CPFontS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;50E;K;13;CPFontNameKeyD;K;6;CP$UIDd;2;59E;K;13;CPFontSizeKeyD;K;6;CP$UIDd;2;60E;K;15;CPFontIsBoldKeyD;K;6;CP$UIDd;2;42E;K;17;CPFontIsItalicKeyD;K;6;CP$UIDd;2;42E;K;17;CPFontIsSystemKeyD;K;6;CP$UIDd;2;42E;E;T;D;K;6;$classD;K;6;CP$UIDd;2;35E;K;22;CPLocalizableStringDevD;K;6;CP$UIDd;2;61E;K;22;CPLocalizableStringKeyD;K;6;CP$UIDd;2;62E;K;24;CPLocalizableStringValueD;K;6;CP$UIDd;2;61E;E;D;K;10;$classnameS;7;CPColorK;8;$classesA;S;7;CPColorS;8;CPObjectE;E;D;K;6;$classD;K;6;CP$UIDd;2;54E;K;20;CPColorComponentsKeyD;K;6;CP$UIDd;2;63E;E;S;13;AppControllerS;6;WindowS;9;371.titleS;29;.Helvetica Neue DeskInterfaced;2;13S;29;Label not translated from xibS;9;461.titleD;K;6;$classD;K;6;CP$UIDd;1;3E;K;10;CP.objectsA;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;64E;D;K;6;CP$UIDd;2;65E;E;E;f;18;0.6862745098039216d;1;1E;K;9;$archiverS;15;CPKeyedArchiverK;8;$versionS;6;100000E; \ No newline at end of file diff --git a/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.xib b/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.xib index a4b241f1b..574a3dbb2 100644 --- a/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.xib +++ b/Tests/Manual/CPLocalizationTest/Resources/Base.lproj/MainMenu.xib @@ -1,1617 +1,42 @@ - - - - 1050 - 14E7f - 7531 - 1347.57 - 758.70 - - com.apple.InterfaceBuilder.CocoaPlugin - 7531 - - - NSCustomObject - NSMenu - NSMenuItem - NSTextField - NSTextFieldCell - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - NSApplication - - - FirstResponder - - - NSApplication - - - AMainMenu - - - - NewApplication - - 1048576 - 2147483647 - - NSImage - NSMenuCheckmark - - - NSImage - NSMenuMixedState - - submenuAction: - - - NewApplication - - - - About NewApplication - - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Preferences… - , - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Quit NewApplication - q - 1048576 - 2147483647 - - - - - _NSAppleMenu - - - - - File - - 1048576 - 2147483647 - - - submenuAction: - - - File - - - - New - n - 1048576 - 2147483647 - - - - - - Open… - o - 1048576 - 2147483647 - - - - - - Open Recent - - 1048576 - 2147483647 - - - submenuAction: - - - Open Recent - - - - Clear Menu - - 1048576 - 2147483647 - - - - - _NSRecentDocumentsMenu - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Close - w - 1048576 - 2147483647 - - - - - - Save - s - 1048576 - 2147483647 - - - - - - Save As… - S - 1179648 - 2147483647 - - - - - - Revert to Saved - - 2147483647 - - - - - - - - - Edit - - 1048576 - 2147483647 - - - submenuAction: - - - Edit - - - - Undo - z - 1048576 - 2147483647 - - - - - - Redo - Z - 1179648 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Cut - x - 1048576 - 2147483647 - - - - - - Copy - c - 1048576 - 2147483647 - - - - - - Paste - v - 1048576 - 2147483647 - - - - - - Delete - - 1048576 - 2147483647 - - - - - - Select All - a - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Find - - 1048576 - 2147483647 - - - submenuAction: - - - Find - - - - Find… - f - 1048576 - 2147483647 - - - 1 - - - - Find Next - g - 1048576 - 2147483647 - - - 2 - - - - Find Previous - G - 1179648 - 2147483647 - - - 3 - - - - Use Selection for Find - e - 1048576 - 2147483647 - - - 7 - - - - Jump to Selection - j - 1048576 - 2147483647 - - - - - - - - - Spelling and Grammar - - 1048576 - 2147483647 - - - submenuAction: - - - Spelling and Grammar - - - - Show Spelling… - : - 1048576 - 2147483647 - - - - - - Check Spelling - ; - 1048576 - 2147483647 - - - - - - Check Spelling While Typing - - 1048576 - 2147483647 - - - - - - Check Grammar With Spelling - - 1048576 - 2147483647 - - - - - - - - - Substitutions - - 1048576 - 2147483647 - - - submenuAction: - - - Substitutions - - - - Smart Copy/Paste - f - 1048576 - 2147483647 - - - 1 - - - - Smart Quotes - g - 1048576 - 2147483647 - - - 2 - - - - Smart Links - G - 1179648 - 2147483647 - - - 3 - - - - - - - Speech - - 1048576 - 2147483647 - - - submenuAction: - - - Speech - - - - Start Speaking - - 1048576 - 2147483647 - - - - - - Stop Speaking - - 1048576 - 2147483647 - - - - - - - - - - - - View - - 1048576 - 2147483647 - - - submenuAction: - - - View - - - - Show Toolbar - t - 1572864 - 2147483647 - - - - - - Customize Toolbar… - - 1048576 - 2147483647 - - - - - - - - - Window - - 1048576 - 2147483647 - - - submenuAction: - - - Window - - - - Minimize - m - 1048576 - 2147483647 - - - - - - Zoom - - 1048576 - 2147483647 - - - - - - YES - YES - - - 1048576 - 2147483647 - - - - - - Bring All to Front - - 1048576 - 2147483647 - - - - - _NSWindowsMenu - - - - - Help - - 1048576 - 2147483647 - - - submenuAction: - - - Help - - - - NewApplication Help - ? - 1048576 - 2147483647 - - - - - - - - _NSMainMenu - - - 7 - 2 - {{335, 390}, {480, 360}} - 1946157056 - Window - NSWindow - - - - - 256 - - - - 268 - {{18, 178}, {182, 17}} - - - - _NS:526 - {251, 750} - YES - - 68157504 - 272630784 - Label not translated from xib - - YES - 13 - 1044 - - _NS:526 - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - labelColor - - 3 - MAA - - - - NO - 1 - - - {480, 360} - - - - - {{0, 0}, {1440, 877}} - {10000000000000, 10000000000000} - YES - - - AppController - - - - - - - terminate: - - - - 449 - - - - orderFrontStandardAboutPanel: - - - - 142 - - - - delegate - - - - 451 - - - - performMiniaturize: - - - - 37 - - - - arrangeInFront: - - - - 39 - - - - clearRecentDocuments: - - - - 127 - - - - performClose: - - - - 193 - - - - toggleContinuousSpellChecking: - - - - 222 - - - - undo: - - - - 223 - - - - copy: - - - - 224 - - - - checkSpelling: - - - - 225 - - - - paste: - - - - 226 - - - - stopSpeaking: - - - - 227 - - - - cut: - - - - 228 - - - - showGuessPanel: - - - - 230 - - - - redo: - - - - 231 - - - - selectAll: - - - - 232 - - - - startSpeaking: - - - - 233 - - - - delete: - - - - 235 - - - - performZoom: - - - - 240 - - - - performFindPanelAction: - - - - 241 - - - - centerSelectionInVisibleArea: - - - - 245 - - - - toggleGrammarChecking: - - - - 347 - - - - toggleSmartInsertDelete: - - - - 355 - - - - toggleAutomaticQuoteSubstitution: - - - - 356 - - - - toggleAutomaticLinkDetection: - - - - 357 - - - - showHelp: - - - - 360 - - - - saveDocument: - - - - 362 - - - - saveDocumentAs: - - - - 363 - - - - revertDocumentToSaved: - - - - 364 - - - - runToolbarCustomizationPalette: - - - - 365 - - - - toggleToolbarShown: - - - - 366 - - - - newDocument: - - - - 373 - - - - openDocument: - - - - 374 - - - - theWindow - - - - 459 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 29 - - - - - - - - - - - MainMenu - - - 19 - - - - - - - - 56 - - - - - - - - 103 - - - - - - - - 217 - - - - - - - - 83 - - - - - - - - 81 - - - - - - - - - - - - - - - 75 - - - - - 80 - - - - - 72 - - - - - 82 - - - - - 124 - - - - - - - - 73 - - - - - 79 - - - - - 112 - - - - - 125 - - - - - - - - 126 - - - - - 205 - - - - - - - - - - - - - - - - - - - - 202 - - - - - 198 - - - - - 207 - - - - - 214 - - - - - 199 - - - - - 203 - - - - - 197 - - - - - 206 - - - - - 215 - - - - - 218 - - - - - - - - 216 - - - - - - - - 200 - - - - - - - - - - - 219 - - - - - 201 - - - - - 204 - - - - - 220 - - - - - - - - - - - - 213 - - - - - 210 - - - - - 221 - - - - - 208 - - - - - 209 - - - - - 106 - - - - - - - - 111 - - - - - 57 - - - - - - - - - - - - 58 - - - - - 136 - - - - - 129 - - - - - 143 - - - - - 236 - - - - - 24 - - - - - - - - - - - 92 - - - - - 5 - - - - - 239 - - - - - 23 - - - - - 295 - - - - - - - - 296 - - - - - - - - - 297 - - - - - 298 - - - - - 211 - - - - - - - - 212 - - - - - - - - - 195 - - - - - 196 - - - - - 346 - - - - - 348 - - - - - - - - 349 - - - - - - - - - - 350 - - - - - 351 - - - - - 354 - - - - - 371 - - - - - - - - 372 - - - - - - - - 450 - - - - - 460 - - - - - - - - 461 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{303, 221}, {480, 360}} - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 461 - - - - - AppController - NSObject - - theWindow - NSWindow - - - theWindow - - theWindow - NSWindow - - - - IBProjectSource - ../.XcodeSupport/AppController.h - - - - - 0 - IBCocoaFramework - NO - - com.apple.InterfaceBuilder.CocoaPlugin.macosx - - - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - {12, 12} - {10, 2} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/Localizable.strings b/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/Localizable.strings index b145931d89df1115f27a7a1f0ea27fe6b151f3be..f200b3f07bb968561264f84b1c1ffda01963a9b9 100644 GIT binary patch literal 374 zcmchRK@NgI6hq&dQy7*k<^*-(Z delta 68 zcmeyyG=)+4|37^OEd~V!UxrE`na7aIP(D%IRXT(rlc9v62*_1nNMR@ik~s{C3`szK R&SXPINe(3jYX&YL1OPUx4aWcg diff --git a/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/MainMenu.strings b/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/MainMenu.strings index 7092b23f4..8ae402c02 100644 --- a/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/MainMenu.strings +++ b/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/MainMenu.strings @@ -183,4 +183,4 @@ "371.title" = "Window"; /* Class = "NSTextFieldCell"; title = "Label not translated from xib"; ObjectID = "461"; */ -"461.title" = "Label traduit du xib en francais"; +"461.title" = "Label traduit du xib en français"; \ No newline at end of file diff --git a/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/SecondLocalizable.strings b/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/SecondLocalizable.strings new file mode 100644 index 000000000..6de1256c8 --- /dev/null +++ b/Tests/Manual/CPLocalizationTest/Resources/fr.lproj/SecondLocalizable.strings @@ -0,0 +1,2 @@ +/* My first context. */ +"Label from file" = "Label traduit de en.lproj du premier context de SecondLocalizable"; From e5b122ee61518e07ac945bcc175529392e0c285f Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 21 Apr 2015 18:25:58 -0700 Subject: [PATCH 015/169] New: added methods pathForResource:ofType, pathForResource:ofType:inDirectory: pathForResource:oftype:inDirectory:forLocalizations: --- Foundation/CPBundle.j | 40 +++++++++++++++------------------------- 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/Foundation/CPBundle.j b/Foundation/CPBundle.j index 4cd481506..ba3effe43 100644 --- a/Foundation/CPBundle.j +++ b/Foundation/CPBundle.j @@ -158,6 +158,21 @@ var CPBundlesForURLStrings = { }; return _bundle.pathForResource(aFilename); } +- (CPString)pathForResource:(CPString)aFilename ofType:(CPString)extension +{ + return _bundle.pathForResource(aFilename, extension); +} + +- (CPString)pathForResource:(CPString)aFilename ofType:(CPString)extension inDirectory:(CPString)subpath +{ + return _bundle.pathForResource(aFilename, extension, subpath); +} + +- (CPString)pathForResource:(CPString)aFilename ofType:(CPString)extension inDirectory:(CPString)subpath forLocalization:(CPString)localizationName +{ + return _bundle.pathForResource(aFilename, extension, subpath, localizationName); +} + - (CPDictionary)infoDictionary { return _bundle.infoDictionary(); @@ -220,36 +235,11 @@ var CPBundlesForURLStrings = { }; #pragma mark - #pragma mark Localization -+ (CPArray)preferredLocalizationsFromArray:(CPArray)localizationsArray -{ - return CFBundleCopyPreferredLocalizationsFromArray(localizationsArray); -} - -+ (CPArray)preferredLocalizationsFromArray:(CPArray)localizationsArray forPreferences:(CPArray)preferencesArray -{ - return CFBundleCopyLocalizationsForPreferences(localizationsArray, preferencesArray); -} - -- (CPArray)preferredLocalizations -{ - -} - -- (CPString)developmentLocalization -{ - return [self objectForInfoDictionaryKey:@"CFBundleDevelopmentRegion"]; -} - - (CPArray)localizations { return CFBundleCopyBundleLocalizations(_bundle); } -- (CPDictionary)localizedInfoDictionary -{ - -} - - (CPString)localizedStringForKey:(CPString)aKey value:(CPString)aValue table:(CPString)aTable { return CFBundleCopyLocalizedString(_bundle, aKey, aValue, aTable); From c5b250236fa662e3da04e442f4414f95d64d9308 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 21 Apr 2015 18:26:28 -0700 Subject: [PATCH 016/169] New: support of base localization and nib localization --- AppKit/Cib/CPCib.j | 40 +++++++------------ AppKit/Cib/CPCibLoading.j | 30 +++++++++----- AppKit/Cib/_CPCibKeyedUnarchiver.j | 30 ++++++-------- AppKit/Cib/_CPLocalizableString.j | 28 ++++++------- Objective-J/CFBundle.js | 61 +++++++++++++++++------------ Tools/nib2cib/NSLocalizableString.j | 1 + 6 files changed, 93 insertions(+), 97 deletions(-) diff --git a/AppKit/Cib/CPCib.j b/AppKit/Cib/CPCib.j index e693fcb21..f3620bb74 100644 --- a/AppKit/Cib/CPCib.j +++ b/AppKit/Cib/CPCib.j @@ -47,10 +47,11 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; @implementation CPCib : CPObject { - CPData _data; - CPBundle _bundle; - BOOL _awakenCustomResources; + BOOL _awakenCustomResources @accessors(property=_awakenCustomResources); + CPBundle _bundle; + CPData _data; + CPString _cibName; id _loadDelegate; } @@ -60,6 +61,8 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; if (self) { + _cibName = [aURL lastPathComponent]; + _data = [CPURLConnection sendSynchronousRequest:[CPURLRequest requestWithURL:aURL] returningResponse:nil]; if (!_data) @@ -77,6 +80,8 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; if (self) { + _cibName = [aURL lastPathComponent]; + [CPURLConnection connectionWithRequest:[CPURLRequest requestWithURL:aURL] delegate:self]; _awakenCustomResources = YES; @@ -89,16 +94,7 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; - (id)initWithCibNamed:(CPString)aName bundle:(CPBundle)aBundle { - if (![aName hasSuffix:@".cib"]) - aName = [aName stringByAppendingString:@".cib"]; - - // If aBundle is nil, use mainBundle, but ONLY for searching for the nib, not for resources later. - self = [self initWithContentsOfURL:[aBundle || [CPBundle mainBundle] pathForResource:aName]]; - - if (self) - _bundle = aBundle; - - return self; + return [self initWithCibNamed:aName bundle:aBundle loadDelegate:nil]; } - (id)initWithCibNamed:(CPString)aName bundle:(CPBundle)aBundle loadDelegate:(id)aLoadDelegate @@ -106,8 +102,10 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; if (![aName hasSuffix:@".cib"]) aName = [aName stringByAppendingString:@".cib"]; + var bundle = aBundle || [CPBundle mainBundle]; + // If aBundle is nil, use mainBundle, but ONLY for searching for the nib, not for resources later. - self = [self initWithContentsOfURL:[aBundle || [CPBundle mainBundle] pathForResource:aName] loadDelegate:aLoadDelegate]; + self = [self initWithContentsOfURL:[bundle _cibPathForResource:aName] loadDelegate:aLoadDelegate]; if (self) _bundle = aBundle; @@ -115,16 +113,6 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; return self; } -- (void)_setAwakenCustomResources:(BOOL)shouldAwakenCustomResources -{ - _awakenCustomResources = shouldAwakenCustomResources; -} - -- (BOOL)_awakenCustomResources -{ - return _awakenCustomResources; -} - - (BOOL)instantiateCibWithExternalNameTable:(CPDictionary)anExternalNameTable { var bundle = _bundle, @@ -133,7 +121,7 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; if (!bundle && owner) bundle = [CPBundle bundleForClass:[owner class]]; - var unarchiver = [[_CPCibKeyedUnarchiver alloc] initForReadingWithData:_data bundle:bundle awakenCustomResources:_awakenCustomResources], + var unarchiver = [[_CPCibKeyedUnarchiver alloc] initForReadingWithData:_data bundle:bundle awakenCustomResources:_awakenCustomResources cibName:_cibName], replacementClasses = [anExternalNameTable objectForKey:CPCibReplacementClasses]; if (replacementClasses) @@ -227,4 +215,4 @@ var CPCibDataFileKey = @"CPCibDataFileKey", [aCoder encodeObject:[_data base64] forKey:CPCibDataFileKey]; } -@end +@end \ No newline at end of file diff --git a/AppKit/Cib/CPCibLoading.j b/AppKit/Cib/CPCibLoading.j index 91ae95ed3..fa5bd6956 100644 --- a/AppKit/Cib/CPCibLoading.j +++ b/AppKit/Cib/CPCibLoading.j @@ -26,7 +26,11 @@ @import "CPCib.j" -var CPCibOwner = @"CPCibOwner"; +var CPCibOwner = @"CPCibOwner", + CPBundleDefaultLanguage = @"CPBundleDefaultLanguage", + CPBundleTypeOfLocalization = @"CPBundleTypeOfLocalization", + CPBundleBaseLocalizationType = @"CPBundleBaseLocalizationType", + CPBundleInterfaceBuilderLocalizationType = @"CPBundleInterfaceBuilderLocalizationType"; @implementation CPObject (CPCibLoading) @@ -45,14 +49,7 @@ var CPCibOwner = @"CPCibOwner"; + (CPCib)loadCibNamed:(CPString)aName owner:(id)anOwner { - if (![aName hasSuffix:@".cib"]) - aName = [aName stringByAppendingString:@".cib"]; - - // Path is based solely on anOwner: - var bundle = anOwner ? [CPBundle bundleForClass:[anOwner class]] : [CPBundle mainBundle], - path = [bundle pathForResource:aName]; - - return [self loadCibFile:path externalNameTable:@{ CPCibOwner: anOwner }]; + return [self loadCibNamed:aName owner:anOwner loadDelegate:nil]; } - (CPCib)loadCibFile:(CPString)aFileName externalNameTable:(CPDictionary)aNameTable @@ -76,7 +73,7 @@ var CPCibOwner = @"CPCibOwner"; // Path is based solely on anOwner: var bundle = anOwner ? [CPBundle bundleForClass:[anOwner class]] : [CPBundle mainBundle], - path = [bundle pathForResource:aName]; + path = [bundle _cibPathForResource:aName]; return [self loadCibFile:path externalNameTable:@{ CPCibOwner: anOwner } loadDelegate:aDelegate]; } @@ -91,6 +88,19 @@ var CPCibOwner = @"CPCibOwner"; externalNameTable:aNameTable]]); } +- (CPString)_cibPathForResource:(CPString)aName +{ + var defaultBundleLanguage = [self objectForInfoDictionaryKey:CPBundleDefaultLanguage], + typeOfLocalization = [self objectForInfoDictionaryKey:CPBundleTypeOfLocalization]; + + if (defaultBundleLanguage && (!typeOfLocalization || typeOfLocalization == CPBundleBaseLocalizationType)) + aName = @"Base.lproj/" + aName; + else if (defaultBundleLanguage && typeOfLocalization == CPBundleInterfaceBuilderLocalizationType) + aName = _bundle.loadedLanguage() + ".lproj/" + aName; + + return [self pathForResource:aName]; +} + @end @implementation _CPCibLoadDelegate : CPObject diff --git a/AppKit/Cib/_CPCibKeyedUnarchiver.j b/AppKit/Cib/_CPCibKeyedUnarchiver.j index bdb88d1a0..e68c63ce2 100644 --- a/AppKit/Cib/_CPCibKeyedUnarchiver.j +++ b/AppKit/Cib/_CPCibKeyedUnarchiver.j @@ -21,16 +21,22 @@ */ @import - +@import @implementation _CPCibKeyedUnarchiver : CPKeyedUnarchiver { - CPBundle _bundle; - BOOL _awakenCustomResources; - CPDictionary _externalObjectsForProxyIdentifiers; + BOOL _awakenCustomResources @accessors(getter=awakenCustomResources); + CPBundle _bundle @accessors(getter=bundle); + CPDictionary _externalObjectsForProxyIdentifiers @accessors(setter=setExternalObjectsForProxyIdentifiers:); + CPString _cibName @accessors(getter=cibName); } - (id)initForReadingWithData:(CPData)data bundle:(CPBundle)aBundle awakenCustomResources:(BOOL)shouldAwakenCustomResources +{ + return [self initForReadingWithData:data bundle:aBundle awakenCustomResources:shouldAwakenCustomResources cibName:@""]; +} + +- (id)initForReadingWithData:(CPData)data bundle:(CPBundle)aBundle awakenCustomResources:(BOOL)shouldAwakenCustomResources cibName:(CPString)aCibName { self = [super initForReadingWithData:data]; @@ -38,6 +44,7 @@ { _bundle = aBundle; _awakenCustomResources = shouldAwakenCustomResources; + _cibName = aCibName; [self setDelegate:self]; } @@ -45,21 +52,6 @@ return self; } -- (CPBundle)bundle -{ - return _bundle; -} - -- (BOOL)awakenCustomResources -{ - return _awakenCustomResources; -} - -- (void)setExternalObjectsForProxyIdentifiers:(CPDictionary)externalObjectsForProxyIdentifiers -{ - _externalObjectsForProxyIdentifiers = externalObjectsForProxyIdentifiers; -} - - (id)externalObjectForProxyIdentifier:(CPString)anIdentifier { return [_externalObjectsForProxyIdentifiers objectForKey:anIdentifier]; diff --git a/AppKit/Cib/_CPLocalizableString.j b/AppKit/Cib/_CPLocalizableString.j index 86e74eb02..dca7608bb 100644 --- a/AppKit/Cib/_CPLocalizableString.j +++ b/AppKit/Cib/_CPLocalizableString.j @@ -21,28 +21,21 @@ */ @import +@import -@implementation _CPLocalizableString : CPString +@implementation _CPLocalizableString : CPObject { - CPString _dev @accessors(property=dev); - CPString _key @accessors(property=key); -} - -- (id)init -{ - if (self = [super init]) - { - - } - - return self; + CPString _dev @accessors(property=dev); + CPString _key @accessors(property=key); + CPString _value @accessors(property=value); } @end var CPLocalizableStringDev = @"CPLocalizableStringDev", - CPLocalizableStringKey = @"CPLocalizableStringKey"; + CPLocalizableStringKey = @"CPLocalizableStringKey", + CPLocalizableStringValue = @"CPLocalizableStringValue"; @implementation _CPLocalizableString (CPCoding) @@ -52,15 +45,18 @@ var CPLocalizableStringDev = @"CPLocalizableStringDev", _dev = [aCoder decodeObjectForKey:CPLocalizableStringDev]; _key = [aCoder decodeObjectForKey:CPLocalizableStringKey]; + _value = [aCoder decodeObjectForKey:CPLocalizableStringValue]; - //TODO: here we should not return self but the string from CPLocalizedStringFromTable - return self; + var tableName = [[aCoder cibName] stringByTrimmingCharactersInSet:[CPCharacterSet characterSetWithCharactersInString:@".cib"]]; + + return [[aCoder bundle] localizedStringForKey:_key value:_value table:tableName]; } - (void)encodeWithCoder:(CPCoder)aCoder { [aCoder encodeObject:_dev forKey:CPLocalizableStringDev]; [aCoder encodeObject:_key forKey:CPLocalizableStringKey]; + [aCoder encodeObject:_value forKey:CPLocalizableStringValue]; } @end \ No newline at end of file diff --git a/Objective-J/CFBundle.js b/Objective-J/CFBundle.js index b5a1aad6b..995b60904 100644 --- a/Objective-J/CFBundle.js +++ b/Objective-J/CFBundle.js @@ -35,6 +35,9 @@ var CFBundlesForURLStrings = { }, CFTotalBytesLoaded = 0, CPApplicationSizeInBytes = 0; +var CPBundleDefaultBrowserLanguage = "CPBundleDefaultBrowserLanguage", + CPBundleDefaultLanguage = "CPBundleDefaultLanguage"; + GLOBAL(CFBundle) = function(/*CFURL|String*/ aURL) { aURL = makeAbsoluteURL(aURL).asDirectoryPathURL(); @@ -61,6 +64,7 @@ GLOBAL(CFBundle) = function(/*CFURL|String*/ aURL) this._eventDispatcher = new EventDispatcher(this); this._localizableStrings = []; + this._loadedLanguage = NULL; } DISPLAY_NAME(CFBundle); @@ -148,11 +152,14 @@ CFBundle.prototype.resourcesDirectoryURL = function() DISPLAY_NAME(CFBundle.prototype.resourcesDirectoryURL); -CFBundle.prototype.resourceURL = function(/*String*/ aResourceName, /*String*/ aType, /*String*/ aSubDirectory) +CFBundle.prototype.resourceURL = function(/*String*/ aResourceName, /*String*/ aType, /*String*/ aSubDirectory, /*String*/ localizationName) { if (aType) aResourceName = aResourceName + "." + aType; + if (localizationName) + aResourceName = localizationName + aResourceName; + if (aSubDirectory) aResourceName = aSubDirectory + "/" + aResourceName; @@ -197,6 +204,11 @@ CFBundle.prototype.infoDictionary = function() DISPLAY_NAME(CFBundle.prototype.infoDictionary); +CFBundle.prototype.loadedLanguage = function() +{ + return this._loadedLanguage; +}; + CFBundle.prototype.valueForInfoDictionaryKey = function(/*String*/ aKey) { return this._infoDictionary.valueForKey(aKey); @@ -321,6 +333,7 @@ CFBundle.prototype.load = function(/*BOOL*/ shouldExecute) if (self === CFBundle.mainBundle() && self.valueForInfoDictionaryKey("CPApplicationSize")) CPApplicationSizeInBytes = self.valueForInfoDictionaryKey("CPApplicationSize").valueForKey("executable") || 0; + loadLanguageForBundle(self); loadExecutableAndResources(self, shouldExecute); } @@ -496,12 +509,12 @@ function loadSpritedImagesForBundle(/*Bundle*/ aBundle, success, failure, progre function loadLocalizableStringsForBundle(/*Bundle*/ aBundle, success, failure, progress) { - var language = getCurrentLanguage(); + var language = aBundle._loadedLanguage; if (!language) return; - var localizableStrings = aBundle.valueForInfoDictionaryKey("CPLocalizableStrings"); + var localizableStrings = aBundle.valueForInfoDictionaryKey("CPBundleLocalizableStrings"); if (!localizableStrings) return; @@ -583,18 +596,29 @@ function loadLocalizableContentForFileInBundle(bundle, contentFile, tableName) } } -function getCurrentLanguage() +function loadLanguageForBundle(aBundle) { + if (aBundle._loadedLanguage) + return; + + var defaultLanguage = aBundle.valueForInfoDictionaryKey(CPBundleDefaultLanguage); + + if (defaultLanguage != CPBundleDefaultBrowserLanguage && defaultLanguage) + { + aBundle._loadedLanguage = defaultLanguage; + return; + } + if (typeof navigator == "undefined") - return null; + return; // userLanguage is an IE only property. var language = (typeof navigator.language !== "undefined") ? navigator.language : navigator.userLanguage; if (!language) - return null; + return; - return language.substring(0, 2); + aBundle._loadedLanguage = language.substring(0, 2); } var CFBundleSpriteSupportListeners = [], @@ -841,34 +865,19 @@ CFBundle.prototype.path = function() return this.bundlePath.apply(this, arguments); }; -CFBundle.prototype.pathForResource = function(aResource) +CFBundle.prototype.pathForResource = function(aResource, aType, aSubDirectory, localizationName) { - return this.resourceURL(aResource).absoluteString(); + return this.resourceURL(aResource, aType, aSubDirectory, localizationName).absoluteString(); }; GLOBAL(CFBundleCopyLocalizedString) = function (/*Bundle*/ bundle, key, value, tableName) { - return CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, value, null); -} - -GLOBAL(CFBundleCopyLocalizationsForPreferences) = function (locArray, prefArray) -{ - -} - -GLOBAL(CFBundleCopyPreferredLocalizationsFromArray) = function (locArray) -{ - -} - -GLOBAL(CFBundleCopyLocalizationsForURL) = function (url) -{ - + return CFCopyLocalizedStringWithDefaultValue(key, tableName, bundle, value, ""); } GLOBAL(CFBundleCopyBundleLocalizations) = function (/*Bundle*/ aBundle) { - + return [this._loadedLanguage]; } GLOBAL(CFCopyLocalizedString) = function (key, comment) diff --git a/Tools/nib2cib/NSLocalizableString.j b/Tools/nib2cib/NSLocalizableString.j index 37087a899..2b2149f0a 100644 --- a/Tools/nib2cib/NSLocalizableString.j +++ b/Tools/nib2cib/NSLocalizableString.j @@ -32,6 +32,7 @@ { _dev = [aCoder decodeObjectForKey:@"NSDev"]; _key = [aCoder decodeObjectForKey:@"NSKey"]; + _value = [aCoder decodeObjectForKey:@"NS.string"]; } return self; From eb4780a952fbed9871f8789a95f1c8c5a80746fe Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 22 Apr 2015 15:11:19 -0700 Subject: [PATCH 017/169] New: added protocol CPBundleDelegate --- Foundation/CPBundle.j | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/Foundation/CPBundle.j b/Foundation/CPBundle.j index ba3effe43..069e0e6eb 100644 --- a/Foundation/CPBundle.j +++ b/Foundation/CPBundle.j @@ -30,6 +30,13 @@ CPBundleDidLoadNotification = @"CPBundleDidLoadNotification"; +@protocol CPBundleDelegate + +@required +- (void)bundleDidFinishLoading:(CPBundle)aBundle; + +@end + /*! @class CPBundle @ingroup foundation @@ -40,8 +47,8 @@ var CPBundlesForURLStrings = { }; @implementation CPBundle : CPObject { - CFBundle _bundle; - id _delegate; + CFBundle _bundle; + id _delegate; } + (CPBundle)bundleWithURL:(CPURL)aURL @@ -183,7 +190,7 @@ var CPBundlesForURLStrings = { }; return _bundle.valueForInfoDictionaryKey(aKey); } -- (void)loadWithDelegate:(id)aDelegate +- (void)loadWithDelegate:(id )aDelegate { _delegate = aDelegate; From 66b1d297ba5f122aea4c03b2aadf41f2f36eee33 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 22 Apr 2015 15:11:47 -0700 Subject: [PATCH 018/169] Test: added unit test CPBundleTest --- Tests/Foundation/BundleTest/Info.plist | 16 +++++ .../Resources/fr.lproj/Localizable.strings | 5 ++ Tests/Foundation/CPBundleTest.j | 69 +++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 Tests/Foundation/BundleTest/Info.plist create mode 100644 Tests/Foundation/BundleTest/Resources/fr.lproj/Localizable.strings create mode 100644 Tests/Foundation/CPBundleTest.j diff --git a/Tests/Foundation/BundleTest/Info.plist b/Tests/Foundation/BundleTest/Info.plist new file mode 100644 index 000000000..6a2f0fe2d --- /dev/null +++ b/Tests/Foundation/BundleTest/Info.plist @@ -0,0 +1,16 @@ + + + + + Main cib file base name + MainMenu.cib + CPBundleName + BundleTest + CPBundleLocalizableStrings + + Localizable.strings + + CPBundleDefaultLanguage + fr + + diff --git a/Tests/Foundation/BundleTest/Resources/fr.lproj/Localizable.strings b/Tests/Foundation/BundleTest/Resources/fr.lproj/Localizable.strings new file mode 100644 index 000000000..1c16f3ac7 --- /dev/null +++ b/Tests/Foundation/BundleTest/Resources/fr.lproj/Localizable.strings @@ -0,0 +1,5 @@ +/* My first context. */ +"Label from file" = "Label traduit de fr.lproj du premier context"; + +/* My second context. */ +"Label from file" = "Label traduit de fr.lproj du second context"; \ No newline at end of file diff --git a/Tests/Foundation/CPBundleTest.j b/Tests/Foundation/CPBundleTest.j new file mode 100644 index 000000000..f301175fc --- /dev/null +++ b/Tests/Foundation/CPBundleTest.j @@ -0,0 +1,69 @@ +@import + +@implementation CPBundleTest : OJTestCase +{ + +} + ++ (void)setUp +{ + +} + ++ (void)tearDown +{ + +} + +- (void)setUp +{ + +} + +- (void)tearDown +{ + +} + +- (void)testCreationMainBundle +{ + var bundle = [CPBundle mainBundle]; +} + +- (void)testLoadingBundle +{ + var bundle = [CPBundle bundleWithPath:@"Tests/Foundation/BundleTest"]; + [bundle loadWithDelegate:self]; + + [self assert:[bundle objectForInfoDictionaryKey:"CPBundleDefaultLanguage"] equals:"fr"]; + [self assert:[bundle objectForInfoDictionaryKey:"CPBundleLocalizableStrings"] equals:["Localizable.strings"]]; +} + +- (void)testLocalization +{ + var bundle = [CPBundle bundleWithPath:@"Tests/Foundation/BundleTest"]; + [bundle loadWithDelegate:self]; + + [self assert:[bundle localizedStringForKey:"Label from file" value:"" table:"Localizable"] equals:"Label traduit de fr.lproj du premier context"]; + [self assert:[bundle localizedStringForKey:"Wrong key" value:"Default value" table:"Localizable"] equals:"Default value"]; + [self assert:[bundle localizedStringForKey:"Wrong key" value:"" table:"Localizable"] equals:"Wrong key"]; + + [self assert:CPCopyLocalizedStringFromTableInBundle("Label from file", "Localizable", bundle, "My first context.") equals:"Label traduit de fr.lproj du premier context"]; + [self assert:CPCopyLocalizedStringFromTableInBundle("Label from file", "", bundle, "My first context.") equals:"Label traduit de fr.lproj du premier context"]; + [self assert:CPCopyLocalizedStringFromTableInBundle("Label from file", "Localizable", bundle, "") equals:"Label traduit de fr.lproj du premier context"]; + [self assert:CPCopyLocalizedStringFromTableInBundle("Wrong key", "Localizable", bundle, "") equals:"Wrong key"]; + [self assert:CPCopyLocalizedStringFromTableInBundle("Wrong key", "coucou", bundle, "") equals:"Wrong key"]; + + [self assert:CPCopyLocalizedStringFromTableInBundle("Label from file", "Localizable", bundle, "My second context.") equals:"Label traduit de fr.lproj du second context"]; +} + +@end + +@implementation CPBundleTest (CPBundleTestBundleDelegate) + +- (void)bundleDidFinishLoading:(CPBundle)aBundle +{ + +} + +@end \ No newline at end of file From 5f7922d7fdcf530862a1247cadcbc5e9c020e9cb Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 22 Apr 2015 16:21:24 -0700 Subject: [PATCH 019/169] Fixed: crash in CPCib.j due to previous refactoring refs #c5b250236fa662e3da04e442f4414f95d64d9308 --- AppKit/Cib/CPCib.j | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/AppKit/Cib/CPCib.j b/AppKit/Cib/CPCib.j index f3620bb74..64ec7d981 100644 --- a/AppKit/Cib/CPCib.j +++ b/AppKit/Cib/CPCib.j @@ -94,7 +94,18 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; - (id)initWithCibNamed:(CPString)aName bundle:(CPBundle)aBundle { - return [self initWithCibNamed:aName bundle:aBundle loadDelegate:nil]; + if (![aName hasSuffix:@".cib"]) + aName = [aName stringByAppendingString:@".cib"]; + + // If aBundle is nil, use mainBundle, but ONLY for searching for the nib, not for resources later. + var bundle = aBundle || [CPBundle mainBundle]; + + self = [self initWithContentsOfURL:[bundle _cibPathForResource:aName]]; + + if (self) + _bundle = aBundle; + + return self; } - (id)initWithCibNamed:(CPString)aName bundle:(CPBundle)aBundle loadDelegate:(id)aLoadDelegate @@ -102,9 +113,9 @@ var CPCibObjectDataKey = @"CPCibObjectDataKey"; if (![aName hasSuffix:@".cib"]) aName = [aName stringByAppendingString:@".cib"]; + // If aBundle is nil, use mainBundle, but ONLY for searching for the nib, not for resources later. var bundle = aBundle || [CPBundle mainBundle]; - // If aBundle is nil, use mainBundle, but ONLY for searching for the nib, not for resources later. self = [self initWithContentsOfURL:[bundle _cibPathForResource:aName] loadDelegate:aLoadDelegate]; if (self) From db9e649f6ee50a177e95e2bd7e5f9db9b9037ab4 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Thu, 7 May 2015 22:35:02 +0200 Subject: [PATCH 020/169] FIXED: missing return stmt in -indexOfTabViewItemWithIdenfier; Refactored delegate notifications. CPTabViewItem style. Tests: All delegate methods are tested in CPTabViewNib manual test. --- AppKit/CPTabView.j | 23 ++++++++++++++++++----- AppKit/CPTabViewItem.j | 26 +++++++++++++------------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/AppKit/CPTabView.j b/AppKit/CPTabView.j index fc9aa4654..6de27c05a 100644 --- a/AppKit/CPTabView.j +++ b/AppKit/CPTabView.j @@ -203,7 +203,7 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, { return [[self items] indexOfObjectPassingTest:function(item, idx, stop) { - [[item identifier] isEqual:anIdentifier]; + return [[item identifier] isEqual:anIdentifier]; }]; } @@ -325,16 +325,15 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, if (aTabViewItem == _selectedTabViewItem) return NO; - if ((_delegateSelectors & CPTabViewShouldSelectTabViewItemSelector) && ![_delegate tabView:self shouldSelectTabViewItem:aTabViewItem]) + if (![self _sendDelegateShouldSelectTabViewItem:aTabViewItem]) return NO; - if (_delegateSelectors & CPTabViewWillSelectTabViewItemSelector) - [_delegate tabView:self willSelectTabViewItem:aTabViewItem]; + [self _sendDelegateWillSelectTabViewItem:aTabViewItem]; [_tabs setSelectedSegment:anIndex]; _selectedTabViewItem = aTabViewItem; - [self _displayItemView:[aTabViewItem view]]; + [self _sendDelegateDidSelectTabViewItem:aTabViewItem]; return YES; @@ -516,6 +515,20 @@ var CPTabViewDidSelectTabViewItemSelector = 1 << 1, // DELEGATE METHODS +- (BOOL)_sendDelegateShouldSelectTabViewItem:(CPTabViewItem)aTabViewItem +{ + if (_delegateSelectors & CPTabViewShouldSelectTabViewItemSelector) + return [_delegate tabView:self shouldSelectTabViewItem:aTabViewItem]; + + return YES; +} + +- (void)_sendDelegateWillSelectTabViewItem:(CPTabViewItem)aTabViewItem +{ + if (_delegateSelectors & CPTabViewWillSelectTabViewItemSelector) + [_delegate tabView:self willSelectTabViewItem:aTabViewItem]; +} + - (void)_sendDelegateDidSelectTabViewItem:(CPTabViewItem)aTabViewItem { if (_delegateSelectors & CPTabViewDidSelectTabViewItemSelector) diff --git a/AppKit/CPTabViewItem.j b/AppKit/CPTabViewItem.j index 3bec89bd1..78795d666 100644 --- a/AppKit/CPTabViewItem.j +++ b/AppKit/CPTabViewItem.j @@ -24,7 +24,7 @@ @import "CPView.j" @class CPTabView -@class CPViewControler +@class CPViewController /* The tab is currently selected. @@ -54,23 +54,23 @@ CPPressedTab = 2; */ @implementation CPTabViewItem : CPObject { - id _identifier; - CPString _label; - CPInteger _tag @accessors(property=tag); + id _identifier; + CPString _label; + CPInteger _tag @accessors(property=tag); - CPView _view; - CPView _auxiliaryView; + CPView _view; + CPView _auxiliaryView; - CPTabView _tabView; - unsigned _tabState; // Looks like it is not yet implemented + CPTabView _tabView; + unsigned _tabState; // Looks like it is not yet implemented - CPImage _image @accessors(property=image); + CPImage _image @accessors(property=image); CPViewController _viewController @accessors(getter=viewController); - BOOL _enabled @accessors(property=enabled); - BOOL _selected @accessors(property=selected); - CGRect _tabRect @accessors(property=frame); - float _width @accessors(property=width); + BOOL _enabled @accessors(property=enabled); + BOOL _selected @accessors(property=selected); + CGRect _tabRect @accessors(property=frame); + float _width @accessors(property=width); } /* From 205c1ac3b6133f7623d789fab52d7bd38a31e2dc Mon Sep 17 00:00:00 2001 From: Roland Schwingel Date: Mon, 10 Aug 2015 17:08:28 +0200 Subject: [PATCH 021/169] Fix startup on IE10 --- Objective-J/CFHTTPRequest.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) mode change 100644 => 100755 Objective-J/CFHTTPRequest.js diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js old mode 100644 new mode 100755 index 0d34667f2..000a0d92f --- a/Objective-J/CFHTTPRequest.js +++ b/Objective-J/CFHTTPRequest.js @@ -104,7 +104,7 @@ GLOBAL(CFHTTPRequest) = function() this._nativeRequest = new NativeRequest(); // by default, all requests will assume that credentials should not be sent. - this._nativeRequest.withCredentials = false; + this._withCredentials = false; var self = this; this._stateChangeHandler = function() @@ -221,13 +221,18 @@ CFHTTPRequest.prototype.overrideMimeType = function(/*String*/ aMimeType) CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*Boolean*/ isAsynchronous, /*String*/ aUser, /*String*/ aPassword) { + var retval; + this._isOpen = true; this._URL = aURL; this._async = isAsynchronous; this._method = aMethod; this._user = aUser; this._password = aPassword; - return this._nativeRequest.open(aMethod, aURL, isAsynchronous, aUser, aPassword); + retval = this._nativeRequest.open(aMethod, aURL, isAsynchronous, aUser, aPassword); + this._nativeRequest.withCredentials = this._withCredentials; + + return retval; }; CFHTTPRequest.prototype.send = function(/*Object*/ aBody) @@ -279,12 +284,14 @@ CFHTTPRequest.prototype.removeEventListener = function(/*String*/ anEventName, / CFHTTPRequest.prototype.setWithCredentials = function(/*Boolean*/ willSendWithCredentials) { - this._nativeRequest.withCredentials = willSendWithCredentials; + this._withCredentials = willSendWithCredentials + if (this._isOpen) + this._nativeRequest.withCredentials = willSendWithCredentials; }; CFHTTPRequest.prototype.withCredentials = function() { - return this._nativeRequest.withCredentials; + return this._withCredentials; }; function determineAndDispatchHTTPRequestEvents(/*CFHTTPRequest*/ aRequest) From 73e13fee37d290b3d9a55f4b4376815b62c7ad9d Mon Sep 17 00:00:00 2001 From: Roland Schwingel Date: Tue, 11 Aug 2015 09:03:21 +0200 Subject: [PATCH 022/169] Fix for startup on IE10. Reformatted patch --- Objective-J/CFHTTPRequest.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js index 000a0d92f..b5c48e537 100755 --- a/Objective-J/CFHTTPRequest.js +++ b/Objective-J/CFHTTPRequest.js @@ -221,7 +221,7 @@ CFHTTPRequest.prototype.overrideMimeType = function(/*String*/ aMimeType) CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*Boolean*/ isAsynchronous, /*String*/ aUser, /*String*/ aPassword) { - var retval; + var retval; this._isOpen = true; this._URL = aURL; @@ -284,9 +284,9 @@ CFHTTPRequest.prototype.removeEventListener = function(/*String*/ anEventName, / CFHTTPRequest.prototype.setWithCredentials = function(/*Boolean*/ willSendWithCredentials) { - this._withCredentials = willSendWithCredentials - if (this._isOpen) - this._nativeRequest.withCredentials = willSendWithCredentials; + this._withCredentials = willSendWithCredentials + if (this._isOpen) + this._nativeRequest.withCredentials = willSendWithCredentials; }; CFHTTPRequest.prototype.withCredentials = function() From 2ab918625966ddf3bc390a327ddc6c47e042b9f6 Mon Sep 17 00:00:00 2001 From: Roland Schwingel Date: Thu, 20 Aug 2015 14:52:19 +0200 Subject: [PATCH 023/169] Fix Chrome warning when using synchronous XHR requests --- Objective-J/CFHTTPRequest.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js index 47ac34910..c98eedaca 100755 --- a/Objective-J/CFHTTPRequest.js +++ b/Objective-J/CFHTTPRequest.js @@ -246,7 +246,8 @@ CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*B this._user = aUser; this._password = aPassword; retval = this._nativeRequest.open(aMethod, aURL, isAsynchronous, aUser, aPassword); - this._nativeRequest.withCredentials = this._withCredentials; + if (this._async) + this._nativeRequest.withCredentials = this._withCredentials; return retval; }; @@ -304,7 +305,7 @@ CFHTTPRequest.prototype.removeEventListener = function(/*String*/ anEventName, / CFHTTPRequest.prototype.setWithCredentials = function(/*Boolean*/ willSendWithCredentials) { this._withCredentials = willSendWithCredentials - if (this._isOpen) + if (this._isOpen && this._async) this._nativeRequest.withCredentials = willSendWithCredentials; }; From 1eb12d4fa001d30980462cca69f8f9a84d256bfa Mon Sep 17 00:00:00 2001 From: Roland Schwingel Date: Thu, 20 Aug 2015 14:57:28 +0200 Subject: [PATCH 024/169] Damned... corrected formatting --- Objective-J/CFHTTPRequest.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js index c98eedaca..4a77cc796 100755 --- a/Objective-J/CFHTTPRequest.js +++ b/Objective-J/CFHTTPRequest.js @@ -246,8 +246,8 @@ CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*B this._user = aUser; this._password = aPassword; retval = this._nativeRequest.open(aMethod, aURL, isAsynchronous, aUser, aPassword); - if (this._async) - this._nativeRequest.withCredentials = this._withCredentials; + if (this._async) + this._nativeRequest.withCredentials = this._withCredentials; return retval; }; From 525747dc53d6b9636306d40595ba5a0f1cc80ae4 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 21 Aug 2015 15:54:00 -0700 Subject: [PATCH 025/169] New: possibility to create a theme for every object of the Appkit The purpose of this feature is to create theme for every object of the AppKit. Previously, we could not theme object like CPColor, however CPColor could be very interesting to theme, value like alternateSelectedControlColor were hard coded in the framework. With this PR, we can now theme a CPColor and take some values from the current theme of the application. Then, this PR offers the possibility to refactor the themeDescriptors, some classes contains theme attributes for other class (CPTabView and CPTabViewItem for instance). How doe it work ? A new category _CPObject+Theme.j has been added to the AppKit. This category contains every theme methods needed to theme an object (previously this category was in CPView). We add utils method like _encodeThemeObjectsWithCoder: and _decodeThemeObjectsWithCoder: in this category to be able to code and decode easily a coder for every object (this is generic). This PR did not refactor the themeDescriptors, it only add this new mechanism for the methods alternateSelectedControlColor and secondarySelectedControlColor of CPColor. We will need to refactor that gradually --- AppKit/AppKit.j | 1 + AppKit/CPColor.j | 59 +++- AppKit/CPTheme.j | 21 +- AppKit/CPView.j | 315 ++---------------- AppKit/Themes/Aristo/ThemeDescriptors.j | 13 + AppKit/Themes/Aristo2/ThemeDescriptors.j | 18 +- AppKit/Themes/BlendKit/BKThemeDescriptor.j | 10 + AppKit/Themes/CommonJS/blendtask.j | 11 + AppKit/_CPObject+Theme.j | 355 +++++++++++++++++++++ 9 files changed, 506 insertions(+), 297 deletions(-) create mode 100644 AppKit/_CPObject+Theme.j diff --git a/AppKit/AppKit.j b/AppKit/AppKit.j index 43427701a..f9b0e4d72 100644 --- a/AppKit/AppKit.j +++ b/AppKit/AppKit.j @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +@import "_CPObject+Theme.j" @import "_CPToolTip.j" @import "CALayer.j" @import "CGGeometry.j" diff --git a/AppKit/CPColor.j b/AppKit/CPColor.j index 5d27584d9..ac9a52d1c 100644 --- a/AppKit/CPColor.j +++ b/AppKit/CPColor.j @@ -25,6 +25,7 @@ @import "CGColor.j" +@import "_CPObject+Theme.j" @import "CPCompatibility.j" @import "CPImage.j" @@ -65,7 +66,8 @@ var cachedBlackColor, cachedOrangeColor, cachedPurpleColor, cachedShadowColor, - cachedClearColor; + cachedClearColor, + cachedThemeColor; /// @endcond @@ -86,6 +88,27 @@ var cachedBlackColor, CPString _cssString; } + +#pragma mark - +#pragma mark Theming + ++ (CPString)defaultThemeClass +{ + return "color"; +} + ++ (CPDictionary)themeAttributes +{ + return @{ + @"alternate-selected-control-color": [CPNull null], + @"secondary-selected-control-color" : [CPNull null] + }; +} + + +#pragma mark - +#pragma mark Static methods + /*! Creates a color in the RGB colorspace, with an alpha value. Each component should be between the range of 0.0 to 1.0. For @@ -436,14 +459,22 @@ var cachedBlackColor, return cachedClearColor; } ++ (CPColor)_cachedThemeColor +{ + if (!cachedThemeColor) + cachedThemeColor = [self colorWithCalibratedWhite:0.0 alpha:0.0]; + + return cachedThemeColor; +} + + (CPColor)alternateSelectedControlColor { - return [[CPColor alloc] _initWithRGBA:[0.22, 0.46, 0.84, 1.0]]; + return [[self _cachedThemeColor] valueForThemeAttribute:@"alternate-selected-control-color"]; } + (CPColor)secondarySelectedControlColor { - return [[CPColor alloc] _initWithRGBA:[0.83, 0.83, 0.83, 1.0]]; + return [[self _cachedThemeColor] valueForThemeAttribute:@"secondary-selected-control-color"]; } /*! @@ -489,6 +520,10 @@ var cachedBlackColor, // use it (issue #1413.) [self _initCSSStringFromComponents]; + _theme = [CPTheme defaultTheme]; + _themeState = CPThemeStateNormal; + [self _loadThemeAttributes]; + return self; } @@ -502,6 +537,10 @@ var cachedBlackColor, _components = components; [self _initCSSStringFromComponents]; + + _theme = [CPTheme defaultTheme]; + _themeState = CPThemeStateNormal; + [self _loadThemeAttributes]; } return self; @@ -528,6 +567,10 @@ var cachedBlackColor, _patternImage = anImage; _cssString = "url(\"" + [_patternImage filename] + "\")"; _components = [0.0, 0.0, 0.0, 1.0]; + + _theme = [CPTheme defaultTheme]; + _themeState = CPThemeStateNormal; + [self _loadThemeAttributes]; } return self; @@ -835,9 +878,13 @@ var CPColorComponentsKey = @"CPColorComponentsKey", - (id)initWithCoder:(CPCoder)aCoder { if ([aCoder containsValueForKey:CPColorPatternImageKey]) - return [self _initWithPatternImage:[aCoder decodeObjectForKey:CPColorPatternImageKey]]; + self = [self _initWithPatternImage:[aCoder decodeObjectForKey:CPColorPatternImageKey]]; + else + self = [self _initWithRGBA:[aCoder decodeObjectForKey:CPColorComponentsKey]]; - return [self _initWithRGBA:[aCoder decodeObjectForKey:CPColorComponentsKey]]; + [self _decodeThemeObjectsWithCoder:aCoder]; + + return self; } /*! @@ -850,6 +897,8 @@ var CPColorComponentsKey = @"CPColorComponentsKey", [aCoder encodeObject:_patternImage forKey:CPColorPatternImageKey]; else [aCoder encodeObject:_components forKey:CPColorComponentsKey]; + + [self _encodeThemeObjectsWithCoder:aCoder]; } @end diff --git a/AppKit/CPTheme.j b/AppKit/CPTheme.j index 426c462ca..749b8fa4a 100644 --- a/AppKit/CPTheme.j +++ b/AppKit/CPTheme.j @@ -142,20 +142,19 @@ var CPThemesByName = { }, if (!className) { - if ([aClass isKindOfClass:[CPView class]]) + if ([aClass respondsToSelector:@selector(defaultThemeClass)]) { - if ([aClass respondsToSelector:@selector(defaultThemeClass)]) - className = [aClass defaultThemeClass]; - else if ([aClass respondsToSelector:@selector(themeClass)]) - { - CPLog.warn(@"%@ themeClass is deprecated in favor of defaultThemeClass", CPStringFromClass(aClass)); - className = [aClass themeClass]; - } - else - return nil; + className = [aClass defaultThemeClass]; + } + else if ([aClass respondsToSelector:@selector(themeClass)]) + { + CPLog.warn(@"%@ themeClass is deprecated in favor of defaultThemeClass", CPStringFromClass(aClass)); + className = [aClass themeClass]; } else - [CPException raise:CPInvalidArgumentException reason:@"aClass must be a class object or a string."]; + { + return nil; + } } return [_attributes objectForKey:className]; diff --git a/AppKit/CPView.j b/AppKit/CPView.j index d40d1ad6f..7424844e2 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -24,6 +24,7 @@ @import @import +@import "_CPObject+Theme.j" @import "CGAffineTransform.j" @import "CGGeometry.j" @import "CPAppearance.j" @@ -113,8 +114,7 @@ CPViewMaxYMargin = 32; CPViewBoundsDidChangeNotification = @"CPViewBoundsDidChangeNotification"; CPViewFrameDidChangeNotification = @"CPViewFrameDidChangeNotification"; -var CachedNotificationCenter = nil, - CachedThemeAttributes = nil; +var CachedNotificationCenter = nil; #if PLATFORM(DOM) var DOMElementPrototype = nil, @@ -218,12 +218,6 @@ var CPViewHighDPIDrawingEnabled = YES; BOOL _needsLayout; JSObject _ephemeralSubviews; - // Theming Support - CPTheme _theme; - CPString _themeClass; - JSObject _themeAttributes; - unsigned _themeState; - JSObject _ephemeralSubviewsForNames; CPSet _ephereralSubviews; @@ -3101,33 +3095,19 @@ setBoundsOrigin: @end + @implementation CPView (Theming) -#pragma mark Theme States -- (unsigned)themeState -{ - return _themeState; -} - -- (BOOL)hasThemeState:(ThemeState)aState -{ - if (aState.isa && [aState isKindOfClass:CPArray]) - return _themeState.hasThemeState.apply(_themeState, aState); - - return _themeState.hasThemeState(aState); -} +#pragma mark Override - (BOOL)setThemeState:(ThemeState)aState { - if (aState && aState.isa && [aState isKindOfClass:CPArray]) - aState = CPThemeState.apply(null, aState); + var shouldLayout = [super setThemeState:aState]; - if (_themeState.hasThemeState(aState)) + if (!shouldLayout) return NO; - _themeState = CPThemeState(_themeState, aState); - - [self setNeedsLayout]; + [self setNeedsLayout:YES]; [self setNeedsDisplay:YES]; return YES; @@ -3135,26 +3115,35 @@ setBoundsOrigin: - (BOOL)unsetThemeState:(ThemeState)aState { - if (aState && aState.isa && [aState isKindOfClass:CPArray]) - aState = CPThemeState.apply(null, aState); + var shouldLayout = [super unsetThemeState:aState]; - var oldThemeState = _themeState; - _themeState = _themeState.without(aState); - - if (oldThemeState === _themeState) + if (!shouldLayout) return NO; - [self setNeedsLayout]; + [self setNeedsLayout:YES]; [self setNeedsDisplay:YES]; return YES; } +- (void)setThemeClass:(CPString)theClass +{ + [super setThemeClass:theClass]; + + [self setNeedsLayout]; + [self setNeedsDisplay:YES]; +} + + +#pragma mark First responder + - (BOOL)becomeFirstResponder { var r = [super becomeFirstResponder]; + if (r) [self _notifyViewDidBecomeFirstResponder]; + return r; } @@ -3163,6 +3152,7 @@ setBoundsOrigin: [self setThemeState:CPThemeStateFirstResponder]; var count = [_subviews count]; + while (count--) [_subviews[count] _notifyViewDidBecomeFirstResponder]; } @@ -3170,8 +3160,10 @@ setBoundsOrigin: - (BOOL)resignFirstResponder { var r = [super resignFirstResponder]; + if (r) [self _notifyViewDidResignFirstResponder]; + return r; } @@ -3180,6 +3172,7 @@ setBoundsOrigin: [self unsetThemeState:CPThemeStateFirstResponder]; var count = [_subviews count]; + while (count--) [_subviews[count] _notifyViewDidResignFirstResponder]; } @@ -3189,6 +3182,7 @@ setBoundsOrigin: [self setThemeState:CPThemeStateKeyWindow]; var count = [_subviews count]; + while (count--) [_subviews[count] _notifyWindowDidBecomeKey]; } @@ -3198,172 +3192,35 @@ setBoundsOrigin: [self unsetThemeState:CPThemeStateKeyWindow]; var count = [_subviews count]; + while (count--) [_subviews[count] _notifyWindowDidResignKey]; } #pragma mark Theme Attributes -+ (CPString)defaultThemeClass -{ - return nil; -} - -- (CPString)themeClass -{ - if (_themeClass) - return _themeClass; - - return [[self class] defaultThemeClass]; -} - -- (void)setThemeClass:(CPString)theClass -{ - _themeClass = theClass; - - [self _loadThemeAttributes]; - - [self setNeedsLayout]; - [self setNeedsDisplay:YES]; -} - -+ (CPDictionary)themeAttributes -{ - return nil; -} - -+ (CPArray)_themeAttributes -{ - if (!CachedThemeAttributes) - CachedThemeAttributes = {}; - - var theClass = [self class], - CPViewClass = [CPView class], - attributes = [], - nullValue = [CPNull null]; - - for (; theClass && theClass !== CPViewClass; theClass = [theClass superclass]) - { - var cachedAttributes = CachedThemeAttributes[class_getName(theClass)]; - - if (cachedAttributes) - { - attributes = attributes.length ? attributes.concat(cachedAttributes) : attributes; - CachedThemeAttributes[[self className]] = attributes; - - break; - } - - var attributeDictionary = [theClass themeAttributes]; - - if (!attributeDictionary) - continue; - - var attributeKeys = [attributeDictionary allKeys], - attributeCount = attributeKeys.length; - - while (attributeCount--) - { - var attributeName = attributeKeys[attributeCount], - attributeValue = [attributeDictionary objectForKey:attributeName]; - - attributes.push(attributeValue === nullValue ? nil : attributeValue); - attributes.push(attributeName); - } - } - - return attributes; -} - -- (void)_loadThemeAttributes -{ - var theClass = [self class], - attributes = [theClass _themeAttributes], - count = attributes.length; - - if (!count) - return; - - var theme = [self theme], - themeClass = [self themeClass]; - - _themeAttributes = {}; - - while (count--) - { - var attributeName = attributes[count--], - attribute = [[_CPThemeAttribute alloc] initWithName:attributeName defaultValue:attributes[count]]; - - [attribute setParentAttribute:[theme attributeWithName:attributeName forClass:themeClass]]; - - _themeAttributes[attributeName] = attribute; - } -} - -- (void)setTheme:(CPTheme)aTheme -{ - if (_theme === aTheme) - return; - - _theme = aTheme; - - [self viewDidChangeTheme]; -} - - (void)_setThemeIncludingDescendants:(CPTheme)aTheme { [self setTheme:aTheme]; [[self subviews] makeObjectsPerformSelector:@selector(_setThemeIncludingDescendants:) withObject:aTheme]; } -- (CPTheme)theme -{ - return _theme; -} - -- (void)viewDidChangeTheme +- (void)objectDidChangeTheme { if (!_themeAttributes) return; - var theme = [self theme], - themeClass = [self themeClass]; - - for (var attributeName in _themeAttributes) - if (_themeAttributes.hasOwnProperty(attributeName)) - [_themeAttributes[attributeName] setParentAttribute:[theme attributeWithName:attributeName forClass:themeClass]]; + [super objectDidChangeTheme]; [self setNeedsLayout]; [self setNeedsDisplay:YES]; } -- (CPDictionary)_themeAttributeDictionary -{ - var dictionary = @{}; - - if (_themeAttributes) - { - var theme = [self theme]; - - for (var attributeName in _themeAttributes) - if (_themeAttributes.hasOwnProperty(attributeName)) - [dictionary setObject:_themeAttributes[attributeName] forKey:attributeName]; - } - - return dictionary; -} - - (void)setValue:(id)aValue forThemeAttribute:(CPString)aName inState:(ThemeState)aState { - if (aState.isa && [aState isKindOfClass:CPArray]) - aState = CPThemeState.apply(null, aState); - - if (!_themeAttributes || !_themeAttributes[aName]) - [CPException raise:CPInvalidArgumentException reason:[self className] + " does not contain theme attribute '" + aName + "'"]; - var currentValue = [self currentValueForThemeAttribute:aName]; - [_themeAttributes[aName] setValue:aValue forState:aState]; + [super setValue:aValue forThemeAttribute:aName inState:aState]; if ([self currentValueForThemeAttribute:aName] === currentValue) return; @@ -3374,12 +3231,9 @@ setBoundsOrigin: - (void)setValue:(id)aValue forThemeAttribute:(CPString)aName { - if (!_themeAttributes || !_themeAttributes[aName]) - [CPException raise:CPInvalidArgumentException reason:[self className] + " does not contain theme attribute '" + aName + "'"]; - var currentValue = [self currentValueForThemeAttribute:aName]; - [_themeAttributes[aName] setValue:aValue]; + [super setValue:aValue forThemeAttribute:aName ]; if ([self currentValueForThemeAttribute:aName] === currentValue) return; @@ -3388,82 +3242,6 @@ setBoundsOrigin: [self setNeedsLayout]; } -- (id)valueForThemeAttribute:(CPString)aName inState:(ThemeState)aState -{ - if (aState.isa && [aState isKindOfClass:CPArray]) - aState = CPThemeState.apply(null, aState); - - if (!_themeAttributes || !_themeAttributes[aName]) - [CPException raise:CPInvalidArgumentException reason:[self className] + " does not contain theme attribute '" + aName + "'"]; - - return [_themeAttributes[aName] valueForState:aState]; -} - -- (id)valueForThemeAttribute:(CPString)aName -{ - if (!_themeAttributes || !_themeAttributes[aName]) - [CPException raise:CPInvalidArgumentException reason:[self className] + " does not contain theme attribute '" + aName + "'"]; - - return [_themeAttributes[aName] value]; -} - -- (id)currentValueForThemeAttribute:(CPString)aName -{ - if (!_themeAttributes || !_themeAttributes[aName]) - [CPException raise:CPInvalidArgumentException reason:[self className] + " does not contain theme attribute '" + aName + "'"]; - - return [_themeAttributes[aName] valueForState:_themeState]; -} - -- (BOOL)hasThemeAttribute:(CPString)aName -{ - return (_themeAttributes && _themeAttributes[aName] !== undefined); -} - -/*! - Registers theme values encoded in an array at runtime. The format of the data in the array - is the same as that used by ThemeDescriptors.j, with the exception that you need to use - CPColorWithImages() in place of PatternColor(). For more information see the comments - at the top of ThemeDescriptors.j. - - @param themeValues array of theme values -*/ -- (void)registerThemeValues:(CPArray)themeValues -{ - for (var i = 0; i < themeValues.length; ++i) - { - var attributeValueState = themeValues[i], - attribute = attributeValueState[0], - value = attributeValueState[1], - state = attributeValueState[2]; - - if (state) - [self setValue:value forThemeAttribute:attribute inState:state]; - else - [self setValue:value forThemeAttribute:attribute]; - } -} - -/*! - Registers theme values encoded in an array at runtime. The format of the data in the array - is the same as that used by ThemeDescriptors.j, with the exception that you need to use - CPColorWithImages() in place of PatternColor(). The values in \c inheritedValues are - registered first, then those in \c themeValues override/augment the inherited values. - For more information see the comments at the top of ThemeDescriptors.j. - - @param themeValues array of base theme values - @param inheritedValues array of overridden/additional theme values -*/ -- (void)registerThemeValues:(CPArray)themeValues inherit:(CPArray)inheritedValues -{ - // Register inherited values first, then override those with the subtheme values. - if (inheritedValues) - [self registerThemeValues:inheritedValues]; - - if (themeValues) - [self registerThemeValues:themeValues]; -} - - (CPView)createEphemeralSubviewNamed:(CPString)aViewName { return nil; @@ -3613,8 +3391,6 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", CPViewSubviewsKey = @"CPViewSubviewsKey", CPViewSuperviewKey = @"CPViewSuperviewKey", CPViewTagKey = @"CPViewTagKey", - CPViewThemeClassKey = @"CPViewThemeClassKey", - CPViewThemeStateKey = @"CPViewThemeStateKey", CPViewWindowKey = @"CPViewWindowKey", CPViewNextKeyViewKey = @"CPViewNextKeyViewKey", CPViewPreviousKeyViewKey = @"CPViewPreviousKeyViewKey", @@ -3719,23 +3495,7 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", [self setBackgroundColor:[aCoder decodeObjectForKey:CPViewBackgroundColorKey]]; [self _setupViewFlags]; - - _theme = [CPTheme defaultTheme]; - _themeClass = [aCoder decodeObjectForKey:CPViewThemeClassKey]; - _themeState = CPThemeState([aCoder decodeObjectForKey:CPViewThemeStateKey]); - _themeAttributes = {}; - - var theClass = [self class], - themeClass = [self themeClass], - attributes = [theClass _themeAttributes], - count = attributes.length; - - while (count--) - { - var attributeName = attributes[count--]; - - _themeAttributes[attributeName] = CPThemeAttributeDecode(aCoder, attributeName, attributes[count], _theme, themeClass); - } + [self _decodeThemeObjectsWithCoder:aCoder]; [self setAppearance:[aCoder decodeObjectForKey:CPViewAppearanceKey]]; @@ -3814,12 +3574,7 @@ var CPViewAutoresizingMaskKey = @"CPViewAutoresizingMask", if (previousKeyView !== nil && ![previousKeyView isEqual:self]) [aCoder encodeConditionalObject:previousKeyView forKey:CPViewPreviousKeyViewKey]; - [aCoder encodeObject:[self themeClass] forKey:CPViewThemeClassKey]; - [aCoder encodeObject:String(_themeState) forKey:CPViewThemeStateKey]; - - for (var attributeName in _themeAttributes) - if (_themeAttributes.hasOwnProperty(attributeName)) - CPThemeAttributeEncode(aCoder, _themeAttributes[attributeName]); + [self _encodeThemeObjectsWithCoder:aCoder]; if (_identifier) [aCoder encodeObject:_identifier forKey:CPReuseIdentifierKey]; diff --git a/AppKit/Themes/Aristo/ThemeDescriptors.j b/AppKit/Themes/Aristo/ThemeDescriptors.j index be6830a4c..31bd445ac 100755 --- a/AppKit/Themes/Aristo/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo/ThemeDescriptors.j @@ -384,6 +384,19 @@ var themedButtonValues = nil, "themedTokenFieldTokenCloseButton"]; } ++ (CPColor)themedColor +{ + var color = [CPColor blackColor], + themedColorValues = + [ + [@"alternate-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.22, 0.46, 0.84, 1.0]]], + [@"secondary-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.83, 0.83, 0.83, 1.0]]] + ]; + + [self registerThemeValues:themedColorValues forObject:color]; + + return color; +} + (CPButton)makeButton { diff --git a/AppKit/Themes/Aristo2/ThemeDescriptors.j b/AppKit/Themes/Aristo2/ThemeDescriptors.j index 140ebe208..aed9a6362 100644 --- a/AppKit/Themes/Aristo2/ThemeDescriptors.j +++ b/AppKit/Themes/Aristo2/ThemeDescriptors.j @@ -28,6 +28,7 @@ @import @import @import +@import @import @import @import @@ -96,7 +97,22 @@ var themedButtonValues = nil, "themedRuleEditor", "themedTableDataView", "themedCornerview", - "themedTokenFieldTokenCloseButton"]; + "themedTokenFieldTokenCloseButton", + "themedColor"]; +} + ++ (CPColor)themedColor +{ + var color = [CPColor redColor], + themedColorValues = + [ + [@"alternate-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.22, 0.46, 0.84, 1.0]]], + [@"secondary-selected-control-color", [[CPColor alloc] _initWithRGBA:[0.83, 0.83, 0.83, 1.0]]] + ]; + + [self registerThemeValues:themedColorValues forObject:color]; + + return color; } + (CPButton)makeButton diff --git a/AppKit/Themes/BlendKit/BKThemeDescriptor.j b/AppKit/Themes/BlendKit/BKThemeDescriptor.j index 522050def..801c6e6ae 100644 --- a/AppKit/Themes/BlendKit/BKThemeDescriptor.j +++ b/AppKit/Themes/BlendKit/BKThemeDescriptor.j @@ -217,6 +217,11 @@ var ItemSizes = { }, return [[self themeName] compare:[aThemeDescriptor themeName]]; } ++ (void)registerThemeValues:(CPArray)themeValues forObject:(id)anObject +{ + [self registerThemeValues:themeValues forView:anObject]; +} + + (void)registerThemeValues:(CPArray)themeValues forView:(CPView)aView { for (var i = 0; i < themeValues.length; ++i) @@ -233,6 +238,11 @@ var ItemSizes = { }, } } ++ (void)registerThemeValues:(CPArray)themeValues forObject:(id)anObject inherit:(CPArray)inheritedValues +{ + [self registerThemeValues:themeValues forView:anObject inherit:inheritedValues]; +} + + (void)registerThemeValues:(CPArray)themeValues forView:(CPView)aView inherit:(CPArray)inheritedValues { // Register inherited values first, then override those with the subtheme values. diff --git a/AppKit/Themes/CommonJS/blendtask.j b/AppKit/Themes/CommonJS/blendtask.j index e167e4f45..a3d8a9fe0 100644 --- a/AppKit/Themes/CommonJS/blendtask.j +++ b/AppKit/Themes/CommonJS/blendtask.j @@ -172,6 +172,17 @@ function themeFromCibData(data) { var object = topLevelObjects[count]; + if ([object._themedObject isKindOfClass:CPColor]) + { + TERM.stream.print(object._themedObject); + + for (var attributeName in object._themedObject._themeAttributes) + { + TERM.stream.print(attributeName); + TERM.stream.print([object._themedObject._themeAttributes[attributeName] value]); + } + } + templates = templates.concat([object blendThemeObjectTemplates]); if ([object isKindOfClass:[BKThemeTemplate class]]) diff --git a/AppKit/_CPObject+Theme.j b/AppKit/_CPObject+Theme.j new file mode 100644 index 000000000..dbccc9eb3 --- /dev/null +++ b/AppKit/_CPObject+Theme.j @@ -0,0 +1,355 @@ +/* + * AppKit.j + * AppKit + * + * Created by Alexandre Wilhelm. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import + +@import "CPTheme.j" + +var CachedThemeAttributes = nil; + +var CPViewThemeClassKey = @"CPViewThemeClassKey", + CPViewThemeStateKey = @"CPViewThemeStateKey"; + +@implementation CPObject (ObjectTheming) +{ + // Theming Support + CPTheme _theme; + CPString _themeClass; + JSObject _themeAttributes; + unsigned _themeState; +} + + +#pragma mark - +#pragma mark Theme State + +- (unsigned)themeState +{ + return _themeState; +} + +- (BOOL)hasThemeState:(ThemeState)aState +{ + if (aState.isa && [aState isKindOfClass:CPArray]) + return _themeState.hasThemeState.apply(_themeState, aState); + + return _themeState.hasThemeState(aState); +} + +- (BOOL)setThemeState:(ThemeState)aState +{ + if (aState && aState.isa && [aState isKindOfClass:CPArray]) + aState = CPThemeState.apply(null, aState); + + if (_themeState.hasThemeState(aState)) + return NO; + + _themeState = CPThemeState(_themeState, aState); + + return YES; +} + +- (BOOL)unsetThemeState:(ThemeState)aState +{ + if (aState && aState.isa && [aState isKindOfClass:CPArray]) + aState = CPThemeState.apply(null, aState); + + var oldThemeState = _themeState; + _themeState = _themeState.without(aState); + + if (oldThemeState === _themeState) + return NO; + + return YES; +} + +#pragma mark Theme Attributes + ++ (CPString)defaultThemeClass +{ + return nil; +} + ++ (CPDictionary)themeAttributes +{ + return nil; +} + +- (CPString)themeClass +{ + if (_themeClass) + return _themeClass; + + return [[self class] defaultThemeClass]; +} + +- (void)setThemeClass:(CPString)theClass +{ + _themeClass = theClass; + + [self _loadThemeAttributes]; +} + ++ (CPArray)_themeAttributes +{ + if (!CachedThemeAttributes) + CachedThemeAttributes = {}; + + var theClass = [self class], + CPObjectClass = [CPObject class], + attributes = [], + nullValue = [CPNull null]; + + for (; theClass && theClass !== CPObjectClass; theClass = [theClass superclass]) + { + var cachedAttributes = CachedThemeAttributes[class_getName(theClass)]; + + if (cachedAttributes) + { + attributes = attributes.length ? attributes.concat(cachedAttributes) : attributes; + CachedThemeAttributes[[self className]] = attributes; + + break; + } + + var attributeDictionary = [theClass themeAttributes]; + + if (!attributeDictionary) + continue; + + var attributeKeys = [attributeDictionary allKeys], + attributeCount = attributeKeys.length; + + while (attributeCount--) + { + var attributeName = attributeKeys[attributeCount], + attributeValue = [attributeDictionary objectForKey:attributeName]; + + attributes.push(attributeValue === nullValue ? nil : attributeValue); + attributes.push(attributeName); + } + } + + return attributes; +} + +- (void)_loadThemeAttributes +{ + var theClass = [self class], + attributes = [theClass _themeAttributes], + count = attributes.length; + + if (!count) + return; + + var theme = [self theme], + themeClass = [self themeClass]; + + _themeAttributes = {}; + + while (count--) + { + var attributeName = attributes[count--], + attribute = [[_CPThemeAttribute alloc] initWithName:attributeName defaultValue:attributes[count]]; + + [attribute setParentAttribute:[theme attributeWithName:attributeName forClass:themeClass]]; + + _themeAttributes[attributeName] = attribute; + } +} + +- (CPTheme)theme +{ + return _theme; +} + +- (void)setTheme:(CPTheme)aTheme +{ + if (_theme === aTheme) + return; + + _theme = aTheme; + + [self objectDidChangeTheme]; +} + +- (void)objectDidChangeTheme +{ + if (!_themeAttributes) + return; + + var theme = [self theme], + themeClass = [self themeClass]; + + for (var attributeName in _themeAttributes) + { + if (_themeAttributes.hasOwnProperty(attributeName)) + [_themeAttributes[attributeName] setParentAttribute:[theme attributeWithName:attributeName forClass:themeClass]]; + } + +} + +- (CPDictionary)_themeAttributeDictionary +{ + var dictionary = @{}; + + if (_themeAttributes) + { + var theme = [self theme]; + + for (var attributeName in _themeAttributes) + { + if (_themeAttributes.hasOwnProperty(attributeName)) + [dictionary setObject:_themeAttributes[attributeName] forKey:attributeName]; + } + } + + return dictionary; +} + +- (void)setValue:(id)aValue forThemeAttribute:(CPString)aName inState:(ThemeState)aState +{ + if (aState.isa && [aState isKindOfClass:CPArray]) + aState = CPThemeState.apply(null, aState); + + if (!_themeAttributes || !_themeAttributes[aName]) + [CPException raise:CPInvalidArgumentException reason:[self className] + " does not contain theme attribute '" + aName + "'"]; + + [_themeAttributes[aName] setValue:aValue forState:aState]; +} + +- (void)setValue:(id)aValue forThemeAttribute:(CPString)aName +{ + if (!_themeAttributes || !_themeAttributes[aName]) + [CPException raise:CPInvalidArgumentException reason:[self className] + " does not contain theme attribute '" + aName + "'"]; + + [_themeAttributes[aName] setValue:aValue]; +} + +- (id)valueForThemeAttribute:(CPString)aName inState:(ThemeState)aState +{ + if (aState.isa && [aState isKindOfClass:CPArray]) + aState = CPThemeState.apply(null, aState); + + if (!_themeAttributes || !_themeAttributes[aName]) + [CPException raise:CPInvalidArgumentException reason:[self className] + " does not contain theme attribute '" + aName + "'"]; + + return [_themeAttributes[aName] valueForState:aState]; +} + +- (id)valueForThemeAttribute:(CPString)aName +{ + if (!_themeAttributes || !_themeAttributes[aName]) + [CPException raise:CPInvalidArgumentException reason:[self className] + " does not contain theme attribute '" + aName + "'"]; + + return [_themeAttributes[aName] value]; +} + +- (id)currentValueForThemeAttribute:(CPString)aName +{ + if (!_themeAttributes || !_themeAttributes[aName]) + [CPException raise:CPInvalidArgumentException reason:[self className] + " does not contain theme attribute '" + aName + "'"]; + + return [_themeAttributes[aName] valueForState:_themeState]; +} + +- (BOOL)hasThemeAttribute:(CPString)aName +{ + return (_themeAttributes && _themeAttributes[aName] !== undefined); +} + +/*! + Registers theme values encoded in an array at runtime. The format of the data in the array + is the same as that used by ThemeDescriptors.j, with the exception that you need to use + CPColorWithImages() in place of PatternColor(). For more information see the comments + at the top of ThemeDescriptors.j. + + @param themeValues array of theme values +*/ +- (void)registerThemeValues:(CPArray)themeValues +{ + for (var i = 0; i < themeValues.length; ++i) + { + var attributeValueState = themeValues[i], + attribute = attributeValueState[0], + value = attributeValueState[1], + state = attributeValueState[2]; + + if (state) + [self setValue:value forThemeAttribute:attribute inState:state]; + else + [self setValue:value forThemeAttribute:attribute]; + } +} + +/*! + Registers theme values encoded in an array at runtime. The format of the data in the array + is the same as that used by ThemeDescriptors.j, with the exception that you need to use + CPColorWithImages() in place of PatternColor(). The values in \c inheritedValues are + registered first, then those in \c themeValues override/augment the inherited values. + For more information see the comments at the top of ThemeDescriptors.j. + + @param themeValues array of base theme values + @param inheritedValues array of overridden/additional theme values +*/ +- (void)registerThemeValues:(CPArray)themeValues inherit:(CPArray)inheritedValues +{ + // Register inherited values first, then override those with the subtheme values. + if (inheritedValues) + [self registerThemeValues:inheritedValues]; + + if (themeValues) + [self registerThemeValues:themeValues]; +} + +- (void)_encodeThemeObjectsWithCoder:(CPCoder)aCoder +{ + [aCoder encodeObject:[self themeClass] forKey:CPViewThemeClassKey]; + [aCoder encodeObject:String(_themeState) forKey:CPViewThemeStateKey]; + + for (var attributeName in _themeAttributes) + { + if (_themeAttributes.hasOwnProperty(attributeName)) + CPThemeAttributeEncode(aCoder, _themeAttributes[attributeName]); + } +} + +- (void)_decodeThemeObjectsWithCoder:(CPCoder)aCoder +{ + _theme = [CPTheme defaultTheme]; + _themeClass = [aCoder decodeObjectForKey:CPViewThemeClassKey]; + _themeState = CPThemeState([aCoder decodeObjectForKey:CPViewThemeStateKey]); + _themeAttributes = {}; + + var theClass = [self class], + themeClass = [self themeClass], + attributes = [theClass _themeAttributes], + count = attributes.length; + + while (count--) + { + var attributeName = attributes[count--]; + + _themeAttributes[attributeName] = CPThemeAttributeDecode(aCoder, attributeName, attributes[count], _theme, themeClass); + } +} + +@end \ No newline at end of file From 464040895c638cb1bc26e4b398917527e7c93ccc Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 21 Aug 2015 16:06:25 -0700 Subject: [PATCH 026/169] Fixed: remove log... --- AppKit/Themes/CommonJS/blendtask.j | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/AppKit/Themes/CommonJS/blendtask.j b/AppKit/Themes/CommonJS/blendtask.j index a3d8a9fe0..e167e4f45 100644 --- a/AppKit/Themes/CommonJS/blendtask.j +++ b/AppKit/Themes/CommonJS/blendtask.j @@ -172,17 +172,6 @@ function themeFromCibData(data) { var object = topLevelObjects[count]; - if ([object._themedObject isKindOfClass:CPColor]) - { - TERM.stream.print(object._themedObject); - - for (var attributeName in object._themedObject._themeAttributes) - { - TERM.stream.print(attributeName); - TERM.stream.print([object._themedObject._themeAttributes[attributeName] value]); - } - } - templates = templates.concat([object blendThemeObjectTemplates]); if ([object isKindOfClass:[BKThemeTemplate class]]) From 55181cec8ce36201bd7373bdb6e80b5007701cdc Mon Sep 17 00:00:00 2001 From: Roland Schwingel Date: Thu, 17 Sep 2015 14:45:35 +0200 Subject: [PATCH 027/169] Set timeout in XHR requests AFTER they are opened to get them to work with IE --- Objective-J/CFHTTPRequest.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js index 4a77cc796..dbf3ac704 100755 --- a/Objective-J/CFHTTPRequest.js +++ b/Objective-J/CFHTTPRequest.js @@ -105,6 +105,7 @@ GLOBAL(CFHTTPRequest) = function() // by default, all requests will assume that credentials should not be sent. this._withCredentials = false; + this._timeout = 60000; var self = this; this._stateChangeHandler = function() @@ -217,12 +218,14 @@ CFHTTPRequest.prototype.getResponseHeader = function(/*String*/ aHeader) CFHTTPRequest.prototype.setTimeout = function(/*int*/ aTimeout) { - this._nativeRequest.timeout = aTimeout; + this._timeout = aTimeout; + if (this._isOpen) + this._nativeRequest.timeout = aTimeout; }; CFHTTPRequest.prototype.getTimeout = function(/*int*/ aTimeout) { - return this._nativeRequest.timeout; + return this._timeout; }; CFHTTPRequest.prototype.getAllResponseHeaders = function() @@ -248,6 +251,7 @@ CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*B retval = this._nativeRequest.open(aMethod, aURL, isAsynchronous, aUser, aPassword); if (this._async) this._nativeRequest.withCredentials = this._withCredentials; + this._nativeRequest.timeout = this._timeout; return retval; }; From dd4de9822fe51e88a801e5755b433094a835204d Mon Sep 17 00:00:00 2001 From: Roland Schwingel Date: Wed, 23 Sep 2015 19:16:20 +0200 Subject: [PATCH 028/169] Adjustment for (a)sync request with timeout to work on IE and other browsers --- Objective-J/CFHTTPRequest.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js index dbf3ac704..4e54b064d 100755 --- a/Objective-J/CFHTTPRequest.js +++ b/Objective-J/CFHTTPRequest.js @@ -248,10 +248,13 @@ CFHTTPRequest.prototype.open = function(/*String*/ aMethod, /*String*/ aURL, /*B this._method = aMethod; this._user = aUser; this._password = aPassword; + retval = this._nativeRequest.open(aMethod, aURL, isAsynchronous, aUser, aPassword); if (this._async) + { this._nativeRequest.withCredentials = this._withCredentials; - this._nativeRequest.timeout = this._timeout; + this._nativeRequest.timeout = this._timeout; + } return retval; }; From c8d768c59aa9b7e1fc000c5c2e84168208106a58 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Tue, 29 Sep 2015 12:54:32 -0700 Subject: [PATCH 029/169] New: added protocol CPTheme --- AppKit/_CPObject+Theme.j | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/AppKit/_CPObject+Theme.j b/AppKit/_CPObject+Theme.j index dbccc9eb3..59c548f2b 100644 --- a/AppKit/_CPObject+Theme.j +++ b/AppKit/_CPObject+Theme.j @@ -28,7 +28,33 @@ var CachedThemeAttributes = nil; var CPViewThemeClassKey = @"CPViewThemeClassKey", CPViewThemeStateKey = @"CPViewThemeStateKey"; -@implementation CPObject (ObjectTheming) +@protocol CPTheme + +- (CPString)themeClass; +- (void)setThemeClass:(CPString)theClass; + +- (CPTheme)theme; +- (void)setTheme:(CPTheme)aTheme; + +- (unsigned)themeState; +- (BOOL)hasThemeState:(ThemeState)aState; +- (BOOL)setThemeState:(ThemeState)aState; +- (BOOL)unsetThemeState:(ThemeState)aState; +- (BOOL)hasThemeAttribute:(CPString)aName; + +- (void)objectDidChangeTheme; + +- (void)setValue:(id)aValue forThemeAttribute:(CPString)aName inState:(ThemeState)aState; +- (void)setValue:(id)aValue forThemeAttribute:(CPString)aName; +- (id)valueForThemeAttribute:(CPString)aName inState:(ThemeState)aState; +- (id)valueForThemeAttribute:(CPString)aName; +- (id)currentValueForThemeAttribute:(CPString)aName; +- (void)registerThemeValues:(CPArray)themeValues; +- (void)registerThemeValues:(CPArray)themeValues inherit:(CPArray)inheritedValues; + +@end + +@implementation CPObject (ObjectTheming) { // Theming Support CPTheme _theme; From 3a7384ec2617ff1e6a84f0c3943ba69153634b62 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Wed, 30 Sep 2015 16:59:04 +0200 Subject: [PATCH 030/169] =?UTF-8?q?Fixed:=20CPDictionary=20initWithObjects?= =?UTF-8?q?AndKeys=20was=20not=20compliant=20with=20Cocoa=20or=20the=20ini?= =?UTF-8?q?t=20method=20=E2=80=99initWithObjects:forKeys:=E2=80=99=20when?= =?UTF-8?q?=20duplicated=20keys=20was=20passed=20to=20the=20method.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Test cases are also added --- Foundation/CPDictionary.j | 12 +++++------- Tests/Foundation/CPDictionaryTest.j | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Foundation/CPDictionary.j b/Foundation/CPDictionary.j index d06c4b9fa..55cb778c3 100755 --- a/Foundation/CPDictionary.j +++ b/Foundation/CPDictionary.j @@ -273,18 +273,16 @@ var CPDictionaryMaxDescriptionRecursion = 10; if (self) { // The arguments array contains self and _cmd, so the first object is at position 2. - var index = 2; - - for (; index < argCount; index += 2) + while (argCount-- > 2) { - var value = arguments[index], - key = arguments[index + 1]; + var key = arguments[argCount--], + value = arguments[argCount] if (value === nil) - [CPException raise:CPInvalidArgumentException reason:@"Attempt to insert nil object from objects[" + ((index / 2) - 1) + @"]"]; + [CPException raise:CPInvalidArgumentException reason:@"Attempt to insert nil object from objects[" + ((argCount / 2) - 1) + @"]"]; if (key === nil) - [CPException raise:CPInvalidArgumentException reason:@"Attempt to insert nil key from keys[" + ((index / 2) - 1) + @"]"]; + [CPException raise:CPInvalidArgumentException reason:@"Attempt to insert nil key from keys[" + ((argCount / 2) - 1) + @"]"]; [self setObject:value forKey:key]; } diff --git a/Tests/Foundation/CPDictionaryTest.j b/Tests/Foundation/CPDictionaryTest.j index 5cdd75983..2cbcd64b7 100644 --- a/Tests/Foundation/CPDictionaryTest.j +++ b/Tests/Foundation/CPDictionaryTest.j @@ -49,6 +49,15 @@ [self assert:[dict_cm count] equals:2]; } +- (void)testInitWithObjectsDuplicatedKeys +{ + var dict = [[CPDictionary alloc] initWithObjects:[@"1", @"2", @"Extra1"] forKeys:[@"key1", @"key2", @"key1"]]; + // The first value for "key1" should be inte the dictionary to be compliant with Cocoa + [self assert:[dict objectForKey:@"key1"] equals:@"1"]; + [self assert:[dict objectForKey:@"key2"] equals:@"2"]; + [self assert:[dict count] equals:2]; +} + - (void)testDictionaryWithObject { var dict = [CPDictionary dictionaryWithObject:@"1" forKey:@"key1"]; @@ -427,6 +436,17 @@ [self assert:@"Value3" equals:[dict objectForKey:@"Key3"]]; } +- (void)testInitWithObjectsAndKeysDuplicatedKeys +{ + var dict = [[CPDictionary alloc] initWithObjectsAndKeys:@"Value1", @"Key1", @"Value3", @"Key3", @"ExtraValue1", @"Key1"]; + + // The first value for "key1" should be inte the dictionary to be compliant with Cocoa + [self assert:2 equals:[dict count]]; + [self assert:@"Value1" equals:[dict objectForKey:@"Key1"]]; + [self assert:nil equals:[dict objectForKey:@"Key2"]]; // No key/value pair + [self assert:@"Value3" equals:[dict objectForKey:@"Key3"]]; +} + - (void)testInitWithObjectsAndKeysAndNilValueShouldThrowException { [self assertThrows:function () { From 5d415e66796fffab506778abdea765c20642fd04 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Wed, 30 Sep 2015 16:59:16 +0200 Subject: [PATCH 031/169] Fixed: Speed improvement --- Foundation/CPDictionary.j | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Foundation/CPDictionary.j b/Foundation/CPDictionary.j index 55cb778c3..f8c4fa6ac 100755 --- a/Foundation/CPDictionary.j +++ b/Foundation/CPDictionary.j @@ -222,13 +222,13 @@ var CPDictionaryMaxDescriptionRecursion = 10; { self = [super init]; - if ([objects count] != [keyArray count]) + var i = [keyArray count]; + + if ([objects count] != i) [CPException raise:CPInvalidArgumentException reason:[CPString stringWithFormat:@"Counts are different.(%d != %d)", [objects count], [keyArray count]]]; if (self) { - var i = [keyArray count]; - while (i--) { var value = objects[i], From 5871c4f092fa1202070c7391a59d66be1a436f4c Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Wed, 30 Sep 2015 17:03:36 +0200 Subject: [PATCH 032/169] Fixed: Fixed test cases where CPTimeZone does not handle daylight saving time. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For example the method ’initWithName:’ will return different abbreviation depending on the order CPDictionary returns keys from the method ’keyEnumerator’. As this is undefined the answer can vary. Test cases now handle all cases. --- Tests/Foundation/CPDateFormatterTest.j | 8 ++- Tests/Foundation/CPTimeZoneTest.j | 82 ++++++++++++++++++++------ 2 files changed, 71 insertions(+), 19 deletions(-) diff --git a/Tests/Foundation/CPDateFormatterTest.j b/Tests/Foundation/CPDateFormatterTest.j index 154b7fe24..ecca23bb8 100644 --- a/Tests/Foundation/CPDateFormatterTest.j +++ b/Tests/Foundation/CPDateFormatterTest.j @@ -1140,7 +1140,13 @@ { [_dateFormatter setDateFormat:@"hh v"]; var result = [_dateFormatter dateFromString:@"02 PT"]; - [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 10:00:00 +0000"]]; + // As the CPTimeZone does not care about daylight saving time. The 'PT' time zone can result in 'PST' or 'PDT'. + // The assert below can be any of the two version depending which time zone abbreviation CPDictionary 'keyEnumerator' + // will return first. This behaviour is undefined. + if ([[_dateFormatter timeZone] abbreviation] === @"PDT") + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 09:00:00 +0000"]]; + else + [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 10:00:00 +0000"]]; [_dateFormatter setDateFormat:@"hh vvvv"]; var result = [_dateFormatter dateFromString:@"8 GMT-08:35"]; diff --git a/Tests/Foundation/CPTimeZoneTest.j b/Tests/Foundation/CPTimeZoneTest.j index f23210fc1..50dc8a2a2 100644 --- a/Tests/Foundation/CPTimeZoneTest.j +++ b/Tests/Foundation/CPTimeZoneTest.j @@ -65,10 +65,19 @@ - (void)testTimeZoneWithName { var timeZone = [CPTimeZone timeZoneWithName:@"America/Los_Angeles"]; - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PDT"]; - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + + // The current implementation can return daylight saving time or standard time depending on the current implmentation on CPDictionary + if ([timeZone abbreviation] === @"PDT") { + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PDT"]; + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + } else { + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PST"]; + [self assert:[timeZone secondsFromGMT] equals:(-480 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PST) offset -28800"]; + } [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; @@ -99,11 +108,20 @@ - (void)testTimeZoneWithNameWithData { var timeZone = [CPTimeZone timeZoneWithName:@"America/Los_Angeles" data:_data]; - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PDT"]; - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + + // The current implementation can return daylight saving time or standard time depending on the current implmentation on CPDictionary + if ([timeZone abbreviation] === @"PDT") { + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PDT"]; + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + } else { + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PST"]; + [self assert:[timeZone secondsFromGMT] equals:(-480 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PST) offset -28800"]; + } [self assert:[timeZone data] equals:_data]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; @@ -155,10 +173,19 @@ - (void)testInitTimeZoneWithName { var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PDT"]; - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + + // The current implementation can return daylight saving time or standard time depending on the current implmentation on CPDictionary + if ([timeZone abbreviation] === @"PDT") { + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PDT"]; + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + } else { + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PST"]; + [self assert:[timeZone secondsFromGMT] equals:(-480 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PST) offset -28800"]; + } [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; @@ -189,11 +216,20 @@ - (void)testInitTimeZoneWithNameWithData { var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles" data:_data]; - [self assert:[timeZone name] equals:@"America/Los_Angeles"]; - [self assert:[timeZone abbreviation] equals:@"PDT"]; - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + + // The current implementation can return daylight saving time or standard time depending on the current implmentation on CPDictionary + if ([timeZone abbreviation] === @"PDT") { + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PDT"]; + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + } else { + [self assert:[timeZone name] equals:@"America/Los_Angeles"]; + [self assert:[timeZone abbreviation] equals:@"PST"]; + [self assert:[timeZone secondsFromGMT] equals:(-480 * 60)]; + [self assert:[timeZone description] equals:@"America/Los_Angeles (PST) offset -28800"]; + } [self assert:[timeZone data] equals:_data]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; [self assert:[timeZone localizedName:CPTimeZoneNameStyleStandard locale:_locale] equals:@"Pacific Standard Time"]; [self assert:[timeZone localizedName:CPTimeZoneNameStyleShortStandard locale:_locale] equals:@"PST"]; [self assert:[timeZone localizedName:CPTimeZoneNameStyleDaylightSaving locale:_locale] equals:@"Pacific Daylight Time"]; @@ -258,14 +294,24 @@ { var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; - [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + // The current implementation can return daylight saving time or standard time depending on the current implmentation on CPDictionary + if ([timeZone abbreviation] === @"PDT") { + [self assert:[timeZone secondsFromGMT] equals:(-420 * 60)]; + } else { + [self assert:[timeZone secondsFromGMT] equals:(-480 * 60)]; + } } - (void)testDescription { var timeZone = [[CPTimeZone alloc] initWithName:@"America/Los_Angeles"]; - [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + // The current implementation can return daylight saving time or standard time depending on the current implmentation on CPDictionary + if ([timeZone abbreviation] === @"PDT") { + [self assert:[timeZone description] equals:@"America/Los_Angeles (PDT) offset -25200"]; + } else { + [self assert:[timeZone description] equals:@"America/Los_Angeles (PST) offset -28800"]; + } } - (void)testLocalizedName From 1b0d053ab928a4f5ce4180294fca71b6c77f8624 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Wed, 30 Sep 2015 18:15:32 +0200 Subject: [PATCH 033/169] Fixed: Check the abbreviation from the correct place in the test --- Tests/Foundation/CPDateFormatterTest.j | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/Foundation/CPDateFormatterTest.j b/Tests/Foundation/CPDateFormatterTest.j index ecca23bb8..49e7e2b3f 100644 --- a/Tests/Foundation/CPDateFormatterTest.j +++ b/Tests/Foundation/CPDateFormatterTest.j @@ -1143,7 +1143,7 @@ // As the CPTimeZone does not care about daylight saving time. The 'PT' time zone can result in 'PST' or 'PDT'. // The assert below can be any of the two version depending which time zone abbreviation CPDictionary 'keyEnumerator' // will return first. This behaviour is undefined. - if ([[_dateFormatter timeZone] abbreviation] === @"PDT") + if ([[CPTimeZone _timeZoneFromString:@"PT" style:CPTimeZoneNameStyleShortGeneric locale:[_dateFormatter locale]] abbreviation] === @"PDT") [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 09:00:00 +0000"]]; else [self assert:result equals:[[CPDate alloc] initWithString:@"2000-01-01 10:00:00 +0000"]]; From 8ab9e6bac769354b29c9b51148e24a3592909c88 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Thu, 1 Oct 2015 12:36:57 +0200 Subject: [PATCH 034/169] NEW +sendAsynchronousRequest:queue:completionHandler: If queue is nil, run handler immediately. NEW: CPURLConnection -operation method, CPError CPURLErrorDomain constant. CPURLConnection -operation gives access to the operation generated by the new CPURLConnection creator. This allows to create dependencies between operations and setup priorities early. When the connection fails with a status code 404 or is cancelled, the operation is also cancelled and the next operation in the queue is started. --- Foundation/CPURLConnection.j | 165 +++++++++++++++++++++++++++++------ 1 file changed, 138 insertions(+), 27 deletions(-) diff --git a/Foundation/CPURLConnection.j b/Foundation/CPURLConnection.j index cd195b04a..d1b9a6838 100644 --- a/Foundation/CPURLConnection.j +++ b/Foundation/CPURLConnection.j @@ -25,6 +25,8 @@ @import "CPRunLoop.j" @import "CPURLRequest.j" @import "CPURLResponse.j" +@import "CPOperationQueue.j" +@import "CPOperation.j" @protocol CPURLConnectionDelegate @@ -93,6 +95,9 @@ var CPURLConnectionDelegate = nil; BOOL _isLocalFileConnection; HTTPRequest _HTTPRequest; + + CPOperationQueue _operationQueue; + CPOperation _connectionOperation @accessors(readonly, getter=operation); } + (void)setClassDelegate:(id )delegate @@ -137,6 +142,18 @@ var CPURLConnectionDelegate = nil; return nil; } +/* + Loads the data for a URL request and executes a function on an operation queue when the request completes or fails. + @param aRequest contains the URL to obtain data from. + @param aQueue The operation queue to which the function is dispatched when the request completes or failed. + @param aHandler The function to execute. + @discussion If the request completes successfully, the data parameter of the function contains the resource data, and the error parameter is nil. If the request fails, the data parameter is nil and the error parameter contain information about the failure. +*/ ++ (CPURLConnection)sendAsynchronousRequest:(CPURLRequest)aRequest queue:(CPOperationQueue)aQueue completionHandler:(Function)aHandler +{ + return [[self alloc] _initWithRequest:aRequest queue:aQueue completionHandler:aHandler]; +} + /* Creates a url connection with a delegate to monitor the request progress. @param aRequest contains the URL to obtain data from @@ -161,26 +178,51 @@ var CPURLConnectionDelegate = nil; if (self) { - _request = aRequest; - _originalRequest = [aRequest copy]; _delegate = aDelegate; - _isCanceled = NO; + _operationQueue = nil; + _connectionOperation = nil; - var URL = [_request URL], - scheme = [URL scheme]; + [self _initWithRequest:aRequest]; + } - // Browsers use "file:", Titanium uses "app:" - _isLocalFileConnection = scheme === "file" || - ((scheme === "http" || scheme === "https") && - window.location && - (window.location.protocol === "file:" || window.location.protocol === "app:")); + if (shouldStartImmediately) + [self start]; - _HTTPRequest = new CFHTTPRequest(); - _HTTPRequest.setTimeout([aRequest timeoutInterval] * 1000); - _HTTPRequest.setWithCredentials([aRequest withCredentials]); + return self; +} - if (shouldStartImmediately) - [self start]; +- (void)_initWithRequest:(CPURLRequest)aRequest +{ + _request = aRequest; + _originalRequest = [aRequest copy]; + _isCanceled = NO; + + var URL = [_request URL], + scheme = [URL scheme]; + + // Browsers use "file:", Titanium uses "app:" + _isLocalFileConnection = scheme === "file" || + ((scheme === "http" || scheme === "https") && + window.location && + (window.location.protocol === "file:" || window.location.protocol === "app:")); + + _HTTPRequest = new CFHTTPRequest(); + _HTTPRequest.setTimeout([aRequest timeoutInterval] * 1000); + _HTTPRequest.setWithCredentials([aRequest withCredentials]); +} + +- (id)_initWithRequest:(CPURLRequest)aRequest queue:(CPOperationQueue)aQueue completionHandler:(Function)aHandler +{ + self = [super init]; + + if (self) + { + _delegate = nil; + _operationQueue = aQueue; + _connectionOperation = [[_AsynchronousConnectionOperation alloc] initWithFunction:aHandler]; + + [self _initWithRequest:aRequest]; + [self start]; } return self; @@ -244,6 +286,9 @@ var CPURLConnectionDelegate = nil; try { _HTTPRequest.abort(); + + if (_connectionOperation) + [_connectionOperation cancel]; } // We expect an exception in some browsers like FireFox. catch (anException) @@ -267,7 +312,6 @@ var CPURLConnectionDelegate = nil; [self _sendDelegateDidFailWithError:exception]; } - /* @ignore */ - (void)_readyStateDidChange { @@ -280,23 +324,27 @@ var CPURLConnectionDelegate = nil; [CPURLConnectionDelegate connectionDidReceiveAuthenticationChallenge:self]; else { - if ([_delegate respondsToSelector:@selector(connection:didReceiveResponse:)]) + var response; + + if (_isLocalFileConnection) + response = [[CPURLResponse alloc] initWithURL:URL]; + else { - if (_isLocalFileConnection) - [_delegate connection:self didReceiveResponse:[[CPURLResponse alloc] initWithURL:URL]]; - else - { - var response = [[CPHTTPURLResponse alloc] initWithURL:URL]; - [response _setStatusCode:statusCode]; - [response _setAllResponseHeaders:_HTTPRequest.getAllResponseHeaders()]; - [_delegate connection:self didReceiveResponse:response]; - } + response = [[CPHTTPURLResponse alloc] initWithURL:URL]; + [response _setStatusCode:statusCode]; + [response _setAllResponseHeaders:_HTTPRequest.getAllResponseHeaders()]; } + if ([_delegate respondsToSelector:@selector(connection:didReceiveResponse:)]) + [_delegate connection:self didReceiveResponse:response]; + if (!_isCanceled) { - if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)]) + if (_connectionOperation !== nil) + [self _connectionOperationDidReceiveResponse:response data:_HTTPRequest.responseText() error:nil]; + else if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)]) [_delegate connection:self didReceiveData:_HTTPRequest.responseText()]; + if ([_delegate respondsToSelector:@selector(connectionDidFinishLoading:)]) [_delegate connectionDidFinishLoading:self]; } @@ -312,6 +360,69 @@ var CPURLConnectionDelegate = nil; return _HTTPRequest; } +- (void)_connectionOperationDidReceiveResponse:(CPURLResponse)aResponse data:(CPData)aData error:(CPError)anError +{ + [_connectionOperation _setResponse:aResponse data:aData error:anError]; + + if (_operationQueue) + [_operationQueue addOperation:_connectionOperation]; + else + { + // Do we need to send CPOperation KVO notifications ? + [_connectionOperation main]; + } +} + +@end + +/* @ignore */ +@implementation _AsynchronousConnectionOperation : CPOperation +{ + BOOL _didReceiveResponse; + + CPURLResponse _response; + CPData _data; + CPError _error; + Function _operationFunction; +} + +/* @ignore */ +- (id)initWithFunction:(Function)aFunction +{ + self = [super init]; + + if (self) + { + _didReceiveResponse = NO; + _response = nil; + _data = nil; + _error = nil; + _operationFunction = aFunction; + } + + return self; +} + +- (void)_setResponse:(CPURLResponse)aResponse data:(CPData)aData error:(CPError)anError +{ + _didReceiveResponse = YES; + _response = aResponse; + _data = aData; + _error = anError; +} + +/* @ignore */ +- (void)main +{ + _operationFunction(_response, _data, _error); +} + +/* @ignore */ +- (BOOL)isReady +{ + return (_didReceiveResponse && [super isReady]); +} + @end @implementation CPURLConnection (Deprecated) From e8da7baee2078e56cab09eef406f2ef1f1b2a1a3 Mon Sep 17 00:00:00 2001 From: cacaodev Date: Thu, 1 Oct 2015 13:19:40 +0200 Subject: [PATCH 035/169] Perform operation on network error (try/catch). --- Foundation/CPURLConnection.j | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Foundation/CPURLConnection.j b/Foundation/CPURLConnection.j index d1b9a6838..52df11606 100644 --- a/Foundation/CPURLConnection.j +++ b/Foundation/CPURLConnection.j @@ -274,6 +274,8 @@ var CPURLConnectionDelegate = nil; { if ([_delegate respondsToSelector:@selector(connection:didFailWithError:)]) [_delegate connection:self didFailWithError:anException]; + else if (_connectionOperation !== nil) + [self _connectionOperationDidReceiveResponse:nil data:nil error:anException]; } /* @@ -340,10 +342,10 @@ var CPURLConnectionDelegate = nil; if (!_isCanceled) { - if (_connectionOperation !== nil) - [self _connectionOperationDidReceiveResponse:response data:_HTTPRequest.responseText() error:nil]; - else if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)]) + if ([_delegate respondsToSelector:@selector(connection:didReceiveData:)]) [_delegate connection:self didReceiveData:_HTTPRequest.responseText()]; + else if (_connectionOperation !== nil) + [self _connectionOperationDidReceiveResponse:response data:_HTTPRequest.responseText() error:nil]; if ([_delegate respondsToSelector:@selector(connectionDidFinishLoading:)]) [_delegate connectionDidFinishLoading:self]; From e5e50c2220a395c7741371701e5165a95c294b1c Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Thu, 1 Oct 2015 22:17:13 +0200 Subject: [PATCH 036/169] Fixed: Use the faster objj_msgSend instead of the old slower objj_msgSend In some places the objj_msgSend function is called directly. Most of the times the old slower version is called. This commit will use the never faster version instead. --- AppKit/CPAlert.j | 4 ++-- AppKit/CPApplication.j | 4 ++-- AppKit/CPDocument.j | 35 ++++++++++++++++++++------------ AppKit/CPDocumentController.j | 6 ++++-- AppKit/CPOutlineView.j | 2 +- AppKit/CPTableView.j | 12 +++++------ AppKit/CPWindow/CPWindow.j | 5 +++-- Foundation/CPKeyValueObserving.j | 14 +++++++------ 8 files changed, 48 insertions(+), 34 deletions(-) diff --git a/AppKit/CPAlert.j b/AppKit/CPAlert.j index 2dec01211..c87c2c884 100644 --- a/AppKit/CPAlert.j +++ b/AppKit/CPAlert.j @@ -821,12 +821,12 @@ var bottomHeight = 71; else if (_modalDelegate) { if (_didEndSelector) - objj_msgSend(_modalDelegate, _didEndSelector, self, returnCode, contextInfo); + _modalDelegate.isa.objj_msgSend3(_modalDelegate, _didEndSelector, self, returnCode, contextInfo); } else if (_delegate) { if (_didEndSelector) - objj_msgSend(_delegate, _didEndSelector, self, returnCode); + _delegate.isa.objj_msgSend2(_delegate, _didEndSelector, self, returnCode); else [self _sendDelegateAlertDidEndReturnCode:returnCode]; } diff --git a/AppKit/CPApplication.j b/AppKit/CPApplication.j index 27b7d9736..f20664030 100644 --- a/AppKit/CPApplication.j +++ b/AppKit/CPApplication.j @@ -984,7 +984,7 @@ var CPApplicationDelegate_applicationShouldTerminate_ = 1 << 0, */ - (void)setTarget:(id)aTarget selector:(SEL)aSelector forNextEventMatchingMask:(unsigned int)aMask untilDate:(CPDate)anExpiration inMode:(CPString)aMode dequeue:(BOOL)shouldDequeue { - _eventListeners.splice(_eventListenerInsertionIndex++, 0, _CPEventListenerMake(aMask, function (anEvent) { objj_msgSend(aTarget, aSelector, anEvent); }, shouldDequeue)); + _eventListeners.splice(_eventListenerInsertionIndex++, 0, _CPEventListenerMake(aMask, function (anEvent) { if (aTarget != null) aTarget.isa.objj_msgSend1(aTarget, aSelector, anEvent); }, shouldDequeue)); } /*! @@ -1358,7 +1358,7 @@ var _CPAppBootstrapperActions = nil; { var action = _CPAppBootstrapperActions.shift(); - if (objj_msgSend(self, action)) + if (self.isa.objj_msgSend0(self, action)) return; } diff --git a/AppKit/CPDocument.j b/AppKit/CPDocument.j index 7f0c79c28..8770d57aa 100644 --- a/AppKit/CPDocument.j +++ b/AppKit/CPDocument.j @@ -515,7 +515,9 @@ var CPDocumentUntitledCount = 0; alert("There was an error retrieving the document."); - objj_msgSend(session.delegate, session.didReadSelector, self, NO, session.contextInfo); + var theDelegate = session.delegate; + + theDelegate.isa.objj_msgSend3(theDelegate, session.didReadSelector, self, NO, session.contextInfo); } else { @@ -540,7 +542,9 @@ var CPDocumentUntitledCount = 0; _writeRequest = nil; - objj_msgSend(session.delegate, session.didSaveSelector, self, NO, session.contextInfo); + var theDelegate = session.delegate; + + theDelegate.isa.objj_msgSend3(theDelegate, session.didSaveSelector, self, NO, session.contextInfo); [self _sendDocumentSavedNotification:NO]; } } @@ -553,14 +557,15 @@ var CPDocumentUntitledCount = 0; */ - (void)connection:(CPURLConnection)aConnection didReceiveData:(CPString)aData { - var session = aConnection.session; + var session = aConnection.session, + theDelegate = session.delegate; // READ if (aConnection == _readConnection) { [self readFromData:[CPData dataWithRawString:aData] ofType:session.fileType error:nil]; - objj_msgSend(session.delegate, session.didReadSelector, self, YES, session.contextInfo); + theDelegate.isa.objj_msgSend3(theDelegate, session.didReadSelector, self, YES, session.contextInfo); } else { @@ -569,7 +574,7 @@ var CPDocumentUntitledCount = 0; _writeRequest = nil; - objj_msgSend(session.delegate, session.didSaveSelector, self, YES, session.contextInfo); + theDelegate.isa.objj_msgSend3(theDelegate, session.didSaveSelector, self, YES, session.contextInfo); [self _sendDocumentSavedNotification:YES]; } } @@ -580,10 +585,11 @@ var CPDocumentUntitledCount = 0; */ - (void)connection:(CPURLConnection)aConnection didFailWithError:(CPError)anError { - var session = aConnection.session; + var session = aConnection.session, + theDelegate = session.delegate; if (_readConnection == aConnection) - objj_msgSend(session.delegate, session.didReadSelector, self, NO, session.contextInfo); + theDelegate.isa.objj_msgSend3(theDelegate, session.didReadSelector, self, NO, session.contextInfo); else { @@ -597,7 +603,7 @@ var CPDocumentUntitledCount = 0; alert("There was an error saving the document."); - objj_msgSend(session.delegate, session.didSaveSelector, self, NO, session.contextInfo); + theDelegate.isa.objj_msgSend3(theDelegate, session.didSaveSelector, self, NO, session.contextInfo); [self _sendDocumentSavedNotification:NO]; } } @@ -858,21 +864,24 @@ var CPDocumentUntitledCount = 0; [self canCloseDocumentWithDelegate:self shouldCloseSelector:@selector(_document:shouldClose:context:) contextInfo:{delegate:delegate, selector:selector, context:info}]; else if ([delegate respondsToSelector:selector]) - objj_msgSend(delegate, selector, self, YES, info); + delegate.isa.objj_msgSend3(delegate, selector, self, YES, info); } - (void)_document:(CPDocument)aDocument shouldClose:(BOOL)shouldClose context:(Object)context { + var theDelegate = context.delegate; + if (aDocument === self && shouldClose) [self close]; - objj_msgSend(context.delegate, context.selector, aDocument, shouldClose, context.context); + if (theDelegate != null) + theDelegate.isa.objj_msgSend3(theDelegate, context.selector, aDocument, shouldClose, context.context); } - (void)canCloseDocumentWithDelegate:(id)aDelegate shouldCloseSelector:(SEL)aSelector contextInfo:(Object)context { if (![self isDocumentEdited]) - return [aDelegate respondsToSelector:aSelector] && objj_msgSend(aDelegate, aSelector, self, YES, context); + return [aDelegate respondsToSelector:aSelector] && aDelegate.isa.objj_msgSend3(aDelegate, aSelector, self, YES, context); _canCloseAlert = [[CPAlert alloc] init]; @@ -901,8 +910,8 @@ var CPDocumentUntitledCount = 0; if (returnCode === 0) [self saveDocumentWithDelegate:delegate didSaveSelector:selector contextInfo:context]; - else - objj_msgSend(delegate, selector, self, returnCode === 2, context); + else if (delegate != null) + delegate.isa.objj_msgSend3(delegate, selector, self, returnCode === 2, context); _canCloseAlert = nil; } diff --git a/AppKit/CPDocumentController.j b/AppKit/CPDocumentController.j index 5551dd6f1..b851b046a 100644 --- a/AppKit/CPDocumentController.j +++ b/AppKit/CPDocumentController.j @@ -402,8 +402,10 @@ var CPSharedDocumentController = nil; } } - if ([context.delegate respondsToSelector:context.selector]) - objj_msgSend(context.delegate, context.selector, self, [[self documents] count] === 0, context.context); + var theDelegate = context.delegate; + + if ([theDelegate respondsToSelector:context.selector]) + theDelegate.isa.objj_msgSend3(theDelegate, context.selector, self, [[self documents] count] === 0, context.context); } @end diff --git a/AppKit/CPOutlineView.j b/AppKit/CPOutlineView.j index 6dc83fa0c..eeec78938 100644 --- a/AppKit/CPOutlineView.j +++ b/AppKit/CPOutlineView.j @@ -1417,7 +1417,7 @@ var CPOutlineViewCoalesceSelectionNotificationStateOff = 0, if (_dropItem) { [_dropOperationFeedbackView blink]; - [CPTimer scheduledTimerWithTimeInterval:.3 callback:objj_msgSend(self, "expandItem:", _dropItem) repeats:NO]; + [CPTimer scheduledTimerWithTimeInterval:.3 callback:[self expandItem:_dropItem] repeats:NO]; } }; diff --git a/AppKit/CPTableView.j b/AppKit/CPTableView.j index 9254ba296..d2f2edb58 100644 --- a/AppKit/CPTableView.j +++ b/AppKit/CPTableView.j @@ -3649,7 +3649,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad var view = nil; if (_viewForTableColumnRowSelector) - view = objj_msgSend(self, _viewForTableColumnRowSelector, aTableColumn, aRow); + view = self.isa.objj_msgSend2(self, _viewForTableColumnRowSelector, aTableColumn, aRow); if (!view) { @@ -4211,7 +4211,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad while (count--) { var currentIndex = indexes[count], - rowRect = CGRectIntersection(objj_msgSend(self, rectSelector, currentIndex), aRect); + rowRect = CGRectIntersection(self.isa.objj_msgSend1(self, rectSelector, currentIndex), aRect); // group rows get the same highlight style as other rows if they're source list... if (!drawGradient) @@ -4285,7 +4285,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad for (var i = 0; i < count2; i++) { - var rect = objj_msgSend(self, rectSelector, indexes[i]), + var rect = self.isa.objj_msgSend1(self, rectSelector, indexes[i]), minX = CGRectGetMinX(rect) - 0.5, maxX = CGRectGetMaxX(rect) - 0.5, minY = CGRectGetMinY(rect) - 0.5, @@ -6304,17 +6304,17 @@ var CPTableViewDataSourceKey = @"CPTableViewDataSourceKey", var showCallback = function() { - objj_msgSend(self, "setHidden:", NO) + [self setHidden: NO]; isBlinking = NO; }; var hideCallback = function() { - objj_msgSend(self, "setHidden:", YES) + [self setHidden: YES]; isBlinking = YES; }; - objj_msgSend(self, "setHidden:", YES); + [self setHidden: YES]; [CPTimer scheduledTimerWithTimeInterval:0.1 callback:showCallback repeats:NO]; [CPTimer scheduledTimerWithTimeInterval:0.19 callback:hideCallback repeats:NO]; [CPTimer scheduledTimerWithTimeInterval:0.27 callback:showCallback repeats:NO]; diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index f34e923a5..5853b6913 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -2856,7 +2856,7 @@ CPTexturedBackgroundWindowMask if (delegate && endSelector) { if (_sheetContext["isAttached"]) - objj_msgSend(delegate, endSelector, _sheetContext["sheet"], _sheetContext["returnCode"], + delegate.isa.objj_msgSend3(delegate, endSelector, _sheetContext["sheet"], _sheetContext["returnCode"], _sheetContext["contextInfo"]); else _sheetContext["deferDidEndSelector"] = YES; @@ -2920,7 +2920,8 @@ CPTexturedBackgroundWindowMask _sheetContext = nil; sheet._parentView = nil; - objj_msgSend(delegate, selector, sheet, returnCode, contextInfo); + if (delegate != null) + delegate.isa.objj_msgSend3(delegate, selector, sheet, returnCode, contextInfo); } else { diff --git a/Foundation/CPKeyValueObserving.j b/Foundation/CPKeyValueObserving.j index 53f110b32..b3f01f05a 100644 --- a/Foundation/CPKeyValueObserving.j +++ b/Foundation/CPKeyValueObserving.j @@ -164,10 +164,11 @@ + (BOOL)automaticallyNotifiesObserversForKey:(CPString)aKey { var capitalizedKey = aKey.charAt(0).toUpperCase() + aKey.substring(1), - selector = "automaticallyNotifiesObserversOf" + capitalizedKey; + selector = "automaticallyNotifiesObserversOf" + capitalizedKey, + aClass = [self class]; - if ([[self class] respondsToSelector:selector]) - return objj_msgSend([self class], selector); + if ([aClass respondsToSelector:selector]) + return aClass.isa.objj_msgSend0(aClass, selector); return YES; } @@ -175,10 +176,11 @@ + (CPSet)keyPathsForValuesAffectingValueForKey:(CPString)aKey { var capitalizedKey = aKey.charAt(0).toUpperCase() + aKey.substring(1), - selector = "keyPathsForValuesAffecting" + capitalizedKey; + selector = "keyPathsForValuesAffecting" + capitalizedKey, + aClass = [self class]; - if ([[self class] respondsToSelector:selector]) - return objj_msgSend([self class], selector); + if ([aClass respondsToSelector:selector]) + return aClass.isa.objj_msgSend0(aClass, selector); return [CPSet set]; } From 20d6e365a136f75dbd0eb018492075c6c962592e Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Thu, 1 Oct 2015 22:19:04 +0200 Subject: [PATCH 037/169] Fixed: Use the faster objj_msgSend in nib2cib too. --- Tools/nib2cib/NSClassSwapper.j | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tools/nib2cib/NSClassSwapper.j b/Tools/nib2cib/NSClassSwapper.j index 4f5f3404f..7acfa82ad 100644 --- a/Tools/nib2cib/NSClassSwapper.j +++ b/Tools/nib2cib/NSClassSwapper.j @@ -72,7 +72,7 @@ var _CPCibClassSwapperClassNameKey = @"_CPCibClassSwapperClassNameKey", { // Switch to userland temporarily self.isa = nsClass; - self = objj_msgSend(self, _cmd, aCoder); + self = nsClass.objj_msgSend1(self, _cmd, aCoder); self.isa = swapperClass; } else @@ -100,7 +100,7 @@ var _CPCibClassSwapperClassNameKey = @"_CPCibClassSwapperClassNameKey", { // Switch to userland temporarily self.isa = nsClass; - objj_msgSend(self, _cmd, aCoder); + nsClass.objj_msgSend1(self, _cmd, aCoder); self.isa = swapperClass; } else @@ -110,7 +110,7 @@ var _CPCibClassSwapperClassNameKey = @"_CPCibClassSwapperClassNameKey", // the correct class is swapped during unarchiving. if (nsClass) { - var classForArchiver = objj_msgSend(nsClass, "classForKeyedArchiver"); + var classForArchiver = [nsClass classForKeyedArchiver]; if (classForArchiver) aClassName = [classForArchiver className]; From 860decdac5afe2aa191da17a0c310e8ea87305be Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 2 Oct 2015 10:12:50 -0700 Subject: [PATCH 038/169] Fixed: CPColor and CPView implemented the category CPTheme --- AppKit/CPColor.j | 2 +- AppKit/CPView.j | 2 +- AppKit/_CPObject+Theme.j | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AppKit/CPColor.j b/AppKit/CPColor.j index ac9a52d1c..2e3d1d31a 100644 --- a/AppKit/CPColor.j +++ b/AppKit/CPColor.j @@ -80,7 +80,7 @@ var cachedBlackColor,

It also provides some class helper methods that returns instances of commonly used colors.

*/ -@implementation CPColor : CPObject +@implementation CPColor : CPObject { CPArray _components; diff --git a/AppKit/CPView.j b/AppKit/CPView.j index 7424844e2..7606022a8 100644 --- a/AppKit/CPView.j +++ b/AppKit/CPView.j @@ -149,7 +149,7 @@ var CPViewHighDPIDrawingEnabled = YES; appearance. Other methods of CPView and CPResponder can also be overridden to handle user generated events. */ -@implementation CPView : CPResponder +@implementation CPView : CPResponder { CPWindow _window; diff --git a/AppKit/_CPObject+Theme.j b/AppKit/_CPObject+Theme.j index 59c548f2b..e63dfffc2 100644 --- a/AppKit/_CPObject+Theme.j +++ b/AppKit/_CPObject+Theme.j @@ -54,7 +54,7 @@ var CPViewThemeClassKey = @"CPViewThemeClassKey", @end -@implementation CPObject (ObjectTheming) +@implementation CPObject (ObjectTheming) { // Theming Support CPTheme _theme; From c30f8b09b08404d8898723736f68172f120a391a Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 2 Oct 2015 11:09:48 -0700 Subject: [PATCH 039/169] Fixed: warning when compiling in CPWindow, CPPanel and _CPCibKeyedUnarchiver --- AppKit/CPPanel.j | 1 + AppKit/CPWindow/CPWindow.j | 1 + AppKit/Cib/_CPCibKeyedUnarchiver.j | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/AppKit/CPPanel.j b/AppKit/CPPanel.j index d371ea7a4..c6292c475 100644 --- a/AppKit/CPPanel.j +++ b/AppKit/CPPanel.j @@ -22,6 +22,7 @@ @import "CPWindow.j" +@global CPApp CPOKButton = 1; CPCancelButton = 0; diff --git a/AppKit/CPWindow/CPWindow.j b/AppKit/CPWindow/CPWindow.j index f34e923a5..5b46907d2 100644 --- a/AppKit/CPWindow/CPWindow.j +++ b/AppKit/CPWindow/CPWindow.j @@ -55,6 +55,7 @@ @class _CPWindowFrameAnimation @global CPApp +@global _CPPlatformWindowWillCloseNotification @typedef _CPWindowFullPlatformWindowSession diff --git a/AppKit/Cib/_CPCibKeyedUnarchiver.j b/AppKit/Cib/_CPCibKeyedUnarchiver.j index bdb88d1a0..4858f6b8b 100644 --- a/AppKit/Cib/_CPCibKeyedUnarchiver.j +++ b/AppKit/Cib/_CPCibKeyedUnarchiver.j @@ -21,7 +21,7 @@ */ @import - +@import @implementation _CPCibKeyedUnarchiver : CPKeyedUnarchiver { From 40a9f19352d8a1bbfdf9ccc49f44bc94bca67d31 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 2 Oct 2015 16:00:57 -0700 Subject: [PATCH 040/169] Fixed: crash when opening a platformWindow with a popup blocker Previously, when opening a CPPlatformWindow a crash happened when this new window was blocked by the browser (addblock, or browser feature). Now when opening an external window, we check if the DOMWindow has been created. This PR has modified the method isVisible of CPPlatformWindow. We now check if the _DOMWindow is not NULL and undefined. --- AppKit/Platform/CPPlatformWindow.j | 2 +- AppKit/Platform/DOM/CPPlatformWindow+DOM.j | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/AppKit/Platform/CPPlatformWindow.j b/AppKit/Platform/CPPlatformWindow.j index fb742b351..de2080bcc 100644 --- a/AppKit/Platform/CPPlatformWindow.j +++ b/AppKit/Platform/CPPlatformWindow.j @@ -213,7 +213,7 @@ var PrimaryPlatformWindow = NULL; - (BOOL)isVisible { #if PLATFORM(DOM) - return _DOMWindow !== NULL; + return _DOMWindow !== NULL && _DOMWindow !== undefined; #else return NO; #endif diff --git a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j index e96a5708c..bb183bd99 100644 --- a/AppKit/Platform/DOM/CPPlatformWindow+DOM.j +++ b/AppKit/Platform/DOM/CPPlatformWindow+DOM.j @@ -568,6 +568,9 @@ _CPPlatformWindowWillCloseNotification = @"_CPPlatformWindowWillCloseNotificatio _DOMWindow = window.open("about:blank", "_blank", "menubar=no,location=no,resizable=yes,scrollbars=no,status=no,left=" + CGRectGetMinX(_contentRect) + ",top=" + CGRectGetMinY(_contentRect) + ",width=" + CGRectGetWidth(_contentRect) + ",height=" + CGRectGetHeight(_contentRect)); + if (!_DOMWindow) + return; + [PlatformWindows addObject:self]; // FIXME: cpSetFrame? @@ -1414,6 +1417,9 @@ _CPPlatformWindowWillCloseNotification = @"_CPPlatformWindowWillCloseNotificatio - (void)order:(CPWindowOrderingMode)orderingMode window:(CPWindow)aWindow relativeTo:(CPWindow)otherWindow { + if (!_DOMWindow) + return; + [CPPlatform initializeScreenIfNecessary]; // Grab the appropriate level for the layer, and create it if From 4ba9a19b5c3b246ed04e5f929322f9372c517a58 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Tue, 6 Oct 2015 13:27:10 +0200 Subject: [PATCH 041/169] Fixed: Speed improvements in objj_msgSend and objj_msgSendSuper functions. More efficient implementation of objj_method. --- Objective-J/Runtime.js | 123 +++++++++++++++++++++++++++-------------- 1 file changed, 81 insertions(+), 42 deletions(-) diff --git a/Objective-J/Runtime.js b/Objective-J/Runtime.js index e352cf3e1..2c07e2154 100644 --- a/Objective-J/Runtime.js +++ b/Objective-J/Runtime.js @@ -49,9 +49,12 @@ GLOBAL(objj_ivar) = function(/*String*/ aName, /*String*/ aType) GLOBAL(objj_method) = function(/*String*/ aName, /*IMP*/ anImplementation, /*Array*/ types) { - this.name = aName; - this.method_imp = anImplementation; - this.types = types; + var method = anImplementation || function(/*id*/ aReceiver, /*SEL*/ aSelector) {CPException.isa.objj_msgSend2(CPException, "raise:reason:", CPInternalInconsistencyException, aReceiver.isa.method_msgSend0(self, "className") + " does not have an implementation for selector '" + aSelector + "'")}; + method.method_name = aName; + method.method_imp = anImplementation; + method.method_types = types; + + return method; } GLOBAL(objj_class) = function(displayName) @@ -197,7 +200,7 @@ GLOBAL(class_addMethod) = function(/*Class*/ aClass, /*SEL*/ aName, /*IMP*/ anIm #if DEBUG // Give this function a "pretty" name for the console. - method.method_imp.displayName = METHOD_DISPLAY_NAME(aClass, method); + method.displayName = METHOD_DISPLAY_NAME(aClass, method); #endif // FIXME: Should this be done here? @@ -222,11 +225,11 @@ GLOBAL(class_addMethods) = function(/*Class*/ aClass, /*Array*/ methods) // FIXME: Don't do it if it exists? method_list.push(method); - method_dtable[method.name] = method; + method_dtable[method.method_name] = method; #if DEBUG // Give this function a "pretty" name for the console. - method.method_imp.displayName = METHOD_DISPLAY_NAME(aClass, method); + method.displayName = METHOD_DISPLAY_NAME(aClass, method); #endif } @@ -292,12 +295,22 @@ GLOBAL(class_replaceMethod) = function(/*Class*/ aClass, /*SEL*/ aSelector, /*IM return NULL; var method = aClass.method_dtable[aSelector], - method_imp = NULL; + method_imp = method.method_imp, + new_method = new objj_method(method.method_name, aMethodImplementation, method.method_types); - if (method) - method_imp = method.method_imp; + new_method.displayName = method.displayName; + aClass.method_dtable[aSelector] = new_method; - method.method_imp = aMethodImplementation; + var index = aClass.method_list.indexOf(method); + + if (index !== -1) + { + aClass.method_list[index] = new_method; + } + else + { + aClass.method_list.push(new_method); + } return method_imp; } @@ -419,7 +432,7 @@ GLOBAL(protocol_addMethodDescriptions) = function(/*Protocol*/ proto, /*Array*/ { var method = methods[index]; - method_dtable[method.name] = method; + method_dtable[method.method_name] = method; } } @@ -491,26 +504,43 @@ var _class_initialize = function(/*Class*/ aClass) meta.objj_msgSend2 = objj_msgSendFast2; meta.objj_msgSend3 = objj_msgSendFast3; + aClass.method_msgSend = aClass.method_dtable; + meta.method_msgSend = meta.method_dtable; + meta.objj_msgSend0(aClass, "initialize"); CHANGEINFO(meta, CLS_INITIALIZED, CLS_INITIALIZING); } } -var _objj_forward = function(self, _cmd) +GLOBAL(_objj_forward) = function(self, _cmd) { var isa = self.isa, - implementation = isa.method_dtable[SEL_forwardingTargetForSelector_]; + meta = GETMETA(isa); + + if (!GETINFO(meta, CLS_INITIALIZED) && !GETINFO(meta, CLS_INITIALIZING)) + { + _class_initialize(isa); + } + + var implementation = isa.method_msgSend[_cmd]; if (implementation) { - var target = implementation.method_imp.call(this, self, SEL_forwardingTargetForSelector_, _cmd); + return implementation.apply(isa, arguments); + } + + implementation = isa.method_dtable[SEL_forwardingTargetForSelector_]; + + if (implementation) + { + var target = implementation(self, SEL_forwardingTargetForSelector_, _cmd); if (target && target !== self) { arguments[0] = target; - return objj_msgSend.apply(this, arguments); + return target.isa.objj_msgSend.apply(target.isa, arguments); } } @@ -522,7 +552,7 @@ var _objj_forward = function(self, _cmd) if (forwardInvocationImplementation) { - var signature = implementation.method_imp.call(this, self, SEL_methodSignatureForSelector_, _cmd); + var signature = implementation(self, SEL_methodSignatureForSelector_, _cmd); if (signature) { @@ -541,7 +571,7 @@ var _objj_forward = function(self, _cmd) invocationIsa.objj_msgSend2(invocation, SEL_setArgument_atIndex_, arguments[index], index); } - forwardInvocationImplementation.method_imp.call(this, self, SEL_forwardInvocation_, invocation); + forwardInvocationImplementation(self, SEL_forwardInvocation_, invocation); return invocation == null ? null : invocationIsa.objj_msgSend0(invocation, SEL_returnValue); } @@ -552,7 +582,7 @@ var _objj_forward = function(self, _cmd) implementation = isa.method_dtable[SEL_doesNotRecognizeSelector_]; if (implementation) - return implementation.method_imp.call(this, self, SEL_doesNotRecognizeSelector_, _cmd); + return implementation(self, SEL_doesNotRecognizeSelector_, _cmd); throw class_getName(isa) + " does not implement doesNotRecognizeSelector:. Did you forget a superclass for " + class_getName(isa) + "?"; }; @@ -562,9 +592,7 @@ var _objj_forward = function(self, _cmd) if (!ISINITIALIZED(aClass))\ _class_initialize(aClass);\ \ - var method = aClass.method_dtable[aSelector];\ - \ - aMethodImplementation = method ? method.method_imp : _objj_forward; + aMethodImplementation = aClass.method_dtable[aSelector] || _objj_forward; GLOBAL(class_getMethodImplementation) = function(/*Class*/ aClass, /*SEL*/ aSelector) { @@ -845,11 +873,28 @@ GLOBAL(objj_msgSendSuper) = function(/*id*/ aSuper, /*SEL*/ aSelector) return implementation.apply(aSuper.receiver, arguments); } +GLOBAL(objj_msgSendSuper0) = function(/*id*/ aSuper, /*SEL*/ aSelector) +{ + return (aSuper.super_class.method_dtable[aSelector] || _objj_forward)(aSuper.receiver, aSelector); +} + +GLOBAL(objj_msgSendSuper1) = function(/*id*/ aSuper, /*SEL*/ aSelector, arg0) +{ + return (aSuper.super_class.method_dtable[aSelector] || _objj_forward)(aSuper.receiver, aSelector, arg0); +} + +GLOBAL(objj_msgSendSuper2) = function(/*id*/ aSuper, /*SEL*/ aSelector, arg0, arg1) +{ + return (aSuper.super_class.method_dtable[aSelector] || _objj_forward)(aSuper.receiver, aSelector, arg0, arg1); +} + +GLOBAL(objj_msgSendSuper3) = function(/*id*/ aSuper, /*SEL*/ aSelector, arg0, arg1, arg2) +{ + return (aSuper.super_class.method_dtable[aSelector] || _objj_forward)(aSuper.receiver, aSelector, arg0, arg1, arg2); +} + GLOBAL(objj_msgSendFast) = function(/*id*/ aReceiver, /*SEL*/ aSelector) { - var method = this.method_dtable[aSelector], - implementation = method ? method.method_imp : _objj_forward; - #ifdef MAXIMUM_RECURSION_CHECKS if (__objj_msgSend__StackDepth++ > MAXIMUM_RECURSION_DEPTH) throw new Error("Maximum call stack depth exceeded."); @@ -857,7 +902,7 @@ GLOBAL(objj_msgSendFast) = function(/*id*/ aReceiver, /*SEL*/ aSelector) try { #endif - return implementation.apply(aReceiver, arguments); + return (this.method_dtable[aSelector] || _objj_forward).apply(aReceiver, arguments); #ifdef MAXIMUM_RECURSION_CHECKS } finally { @@ -874,9 +919,6 @@ var objj_msgSendFastInitialize = function(/*id*/ aReceiver, /*SEL*/ aSelector) GLOBAL(objj_msgSendFast0) = function(/*id*/ aReceiver, /*SEL*/ aSelector) { - var method = this.method_dtable[aSelector], - implementation = method ? method.method_imp : _objj_forward; - #ifdef MAXIMUM_RECURSION_CHECKS if (__objj_msgSend__StackDepth++ > MAXIMUM_RECURSION_DEPTH) throw new Error("Maximum call stack depth exceeded."); @@ -884,7 +926,7 @@ GLOBAL(objj_msgSendFast0) = function(/*id*/ aReceiver, /*SEL*/ aSelector) try { #endif - return implementation(aReceiver, aSelector); + return (this.method_dtable[aSelector] || _objj_forward)(aReceiver, aSelector); #ifdef MAXIMUM_RECURSION_CHECKS } finally { @@ -901,9 +943,6 @@ var objj_msgSendFast0Initialize = function(/*id*/ aReceiver, /*SEL*/ aSelector) GLOBAL(objj_msgSendFast1) = function(/*id*/ aReceiver, /*SEL*/ aSelector, arg0) { - var method = this.method_dtable[aSelector], - implementation = method ? method.method_imp : _objj_forward; - #ifdef MAXIMUM_RECURSION_CHECKS if (__objj_msgSend__StackDepth++ > MAXIMUM_RECURSION_DEPTH) throw new Error("Maximum call stack depth exceeded."); @@ -911,7 +950,7 @@ GLOBAL(objj_msgSendFast1) = function(/*id*/ aReceiver, /*SEL*/ aSelector, arg0) try { #endif - return implementation(aReceiver, aSelector, arg0); + return (this.method_dtable[aSelector] || _objj_forward)(aReceiver, aSelector, arg0); #ifdef MAXIMUM_RECURSION_CHECKS } finally { @@ -928,9 +967,6 @@ var objj_msgSendFast1Initialize = function(/*id*/ aReceiver, /*SEL*/ aSelector, GLOBAL(objj_msgSendFast2) = function(/*id*/ aReceiver, /*SEL*/ aSelector, arg0, arg1) { - var method = this.method_dtable[aSelector], - implementation = method ? method.method_imp : _objj_forward; - #ifdef MAXIMUM_RECURSION_CHECKS if (__objj_msgSend__StackDepth++ > MAXIMUM_RECURSION_DEPTH) throw new Error("Maximum call stack depth exceeded."); @@ -938,7 +974,7 @@ GLOBAL(objj_msgSendFast2) = function(/*id*/ aReceiver, /*SEL*/ aSelector, arg0, try { #endif - return implementation(aReceiver, aSelector, arg0, arg1); + return (this.method_dtable[aSelector] || _objj_forward)(aReceiver, aSelector, arg0, arg1); #ifdef MAXIMUM_RECURSION_CHECKS } finally { @@ -955,9 +991,6 @@ var objj_msgSendFast2Initialize = function(/*id*/ aReceiver, /*SEL*/ aSelector, GLOBAL(objj_msgSendFast3) = function(/*id*/ aReceiver, /*SEL*/ aSelector, arg0, arg1, arg2) { - var method = this.method_dtable[aSelector], - implementation = method ? method.method_imp : _objj_forward; - #ifdef MAXIMUM_RECURSION_CHECKS if (__objj_msgSend__StackDepth++ > MAXIMUM_RECURSION_DEPTH) throw new Error("Maximum call stack depth exceeded."); @@ -965,7 +998,7 @@ GLOBAL(objj_msgSendFast3) = function(/*id*/ aReceiver, /*SEL*/ aSelector, arg0, try { #endif - return implementation(aReceiver, aSelector, arg0, arg1, arg2); + return (this.method_dtable[aSelector] || _objj_forward)(aReceiver, aSelector, arg0, arg1, arg2); #ifdef MAXIMUM_RECURSION_CHECKS } finally { @@ -984,7 +1017,12 @@ var objj_msgSendFast3Initialize = function(/*id*/ aReceiver, /*SEL*/ aSelector, GLOBAL(method_getName) = function(/*Method*/ aMethod) { - return aMethod.name; + return aMethod.method_name; +} + +GLOBAL(method_getTypes) = function(/*Method*/ aMethod) +{ + return aMethod.method_types; } GLOBAL(method_getImplementation) = function(/*Method*/ aMethod) @@ -1050,6 +1088,7 @@ objj_class.prototype.objj_msgSend0 = objj_msgSendFast0Initialize; objj_class.prototype.objj_msgSend1 = objj_msgSendFast1Initialize; objj_class.prototype.objj_msgSend2 = objj_msgSendFast2Initialize; objj_class.prototype.objj_msgSend3 = objj_msgSendFast3Initialize; +objj_class.prototype.method_msgSend = Object.create(null); var SEL_description = sel_getUid("description"), SEL_forwardingTargetForSelector_ = sel_getUid("forwardingTargetForSelector:"), From 101261ca63d858913535f2225d2abaec037941b1 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Tue, 6 Oct 2015 13:30:09 +0200 Subject: [PATCH 042/169] Fixed: Optionally inline objj_msgSend function. Generate faster code for Array and Dictionary Literals. --- Objective-J/ObjJAcornCompiler.js | 267 +++++++++++++++++++++++++------ 1 file changed, 217 insertions(+), 50 deletions(-) diff --git a/Objective-J/ObjJAcornCompiler.js b/Objective-J/ObjJAcornCompiler.js index fd7e0e1ec..89d1d6d76 100644 --- a/Objective-J/ObjJAcornCompiler.js +++ b/Objective-J/ObjJAcornCompiler.js @@ -365,7 +365,8 @@ var MethodDef = function(name, types) this.types = types; } -var currentCompilerFlags = ""; +var currentCompilerFlags = 0; +var currentGccCompilerFlags = ""; var reservedIdentifiers = exports.acorn.makePredicate("self _cmd undefined localStorage arguments"); @@ -414,14 +415,12 @@ var ObjJAcornCompiler = function(/*String*/ aString, /*CFURL*/ aURL, /*unsigned* } this.dependencies = []; - this.flags = flags | ObjJAcornCompiler.Flags.IncludeDebugSymbols; + this.flags = flags & (ObjJAcornCompiler.Flags.IncludeDebugSymbols | ObjJAcornCompiler.Flags.InlineMsgSend | ObjJAcornCompiler.Flags.IncludeTypeSignatures); this.classDefs = classDefs ? classDefs : Object.create(null); this.protocolDefs = protocolDefs ? protocolDefs : Object.create(null); this.typeDefs = typeDefs ? typeDefs : Object.create(null); this.lastPos = 0; - if (currentCompilerFlags & ObjJAcornCompiler.Flags.Generate) - this.generate = true; - this.generate = true; + this.generate = true; // Before there was an option to generate the code or copy & paste it from the source. Today we always generate the code. compile(this.tokens, new Scope(null ,{ compiler: this }), pass === 2 ? pass2 : pass1); } @@ -487,7 +486,42 @@ ObjJAcornCompiler.prototype.compilePass2 = function() return this.jsBuffer.toString(); } -var currentCompilerFlags = ""; +exports.setCurrentGccCompilerFlags = function(/*String*/ compilerFlags) +{ + if (currentGccCompilerFlags === compilerFlags) return; + + currentGccCompilerFlags = compilerFlags; + + var args = compilerFlags.split(" "), + count = args.length, + objjcFlags = 0; + + for (var index = 0; index < count; ++index) + { + var argument = args[index]; + + if (argument.indexOf("-g") === 0) + objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.IncludeDebugSymbols; + + else if (argument.indexOf("-O") === 0) { + objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.Compress; + // FIXME: currently we are sending in '-O2' when we want InlineMsgSend. Here we only check if we it is '-O...'. + // Maybe we should have some other option for this + if (argument.length > 2) + objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.InlineMsgSend; + } + + else if (argument.indexOf("-G") === 0) + objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.Generate; + } + + currentCompilerFlags = objjcFlags; +} + +exports.currentGccCompilerFlags = function(/*String*/ compilerFlags) +{ + return currentGccCompilerFlags; +} exports.setCurrentCompilerFlags = function(/*String*/ compilerFlags) { @@ -504,6 +538,7 @@ ObjJAcornCompiler.Flags = { }; ObjJAcornCompiler.Flags.IncludeDebugSymbols = 1 << 0; ObjJAcornCompiler.Flags.IncludeTypeSignatures = 1 << 1; ObjJAcornCompiler.Flags.Generate = 1 << 2; +ObjJAcornCompiler.Flags.InlineMsgSend = 1 << 3; ObjJAcornCompiler.prototype.addWarning = function(/* Warning */ aWarning) { @@ -1626,64 +1661,170 @@ Literal: function(node, st, c) { }, ArrayLiteral: function(node, st, c) { var compiler = st.compiler, - generate = compiler.generate; + generate = compiler.generate, + buffer = compiler.jsBuffer; + if (!generate) { - compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); compiler.lastPos = node.start; } if (!generate) buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. + if (!st.receiverLevel) st.receiverLevel = 0; if (!node.elements.length) { - compiler.jsBuffer.concat("objj_msgSend(objj_msgSend(CPArray, \"alloc\"), \"init\")"); + if (compiler.flags & ObjJAcornCompiler.Flags.InlineMsgSend) { + buffer.concat("(___r"); + buffer.concat(++st.receiverLevel + ""); + buffer.concat(" = (CPArray.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPArray, \"alloc\"), ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(" == null ? null : (___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(".isa.method_msgSend[\"init\"] || _objj_forward)(___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(", \"init\"))"); + } else { + buffer.concat("(___r"); + buffer.concat(++st.receiverLevel + ""); + buffer.concat(" = CPArray.isa.objj_msgSend0(CPArray, \"alloc\"), ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(" == null ? null : ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(".isa.objj_msgSend0(___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(", \"init\"))"); + } + + if (!(st.maxReceiverLevel >= st.receiverLevel)) + st.maxReceiverLevel = st.receiverLevel; } else { - compiler.jsBuffer.concat("objj_msgSend(objj_msgSend(CPArray, \"alloc\"), \"initWithObjects:count:\", ["); + if (compiler.flags & ObjJAcornCompiler.Flags.InlineMsgSend) { + buffer.concat("(___r"); + buffer.concat(++st.receiverLevel + ""); + buffer.concat(" = (CPArray.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPArray, \"alloc\"), ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(" == null ? null : (___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(".isa.method_msgSend[\"initWithObjects:count:\"] || _objj_forward)(___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(", \"initWithObjects:count:\", ["); + } else { + buffer.concat("(___r"); + buffer.concat(++st.receiverLevel + ""); + buffer.concat(" = CPArray.isa.objj_msgSend0(CPArray, \"alloc\"), ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(" == null ? null : ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(".isa.objj_msgSend2(___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(", \"initWithObjects:count:\", ["); + } + + if (!(st.maxReceiverLevel >= st.receiverLevel)) + st.maxReceiverLevel = st.receiverLevel; + for (var i = 0; i < node.elements.length; i++) { var elt = node.elements[i]; if (i) - compiler.jsBuffer.concat(", "); + buffer.concat(", "); if (!generate) compiler.lastPos = elt.start; c(elt, st, "Expression"); - if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, elt.end)); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, elt.end)); } - compiler.jsBuffer.concat("], " + node.elements.length + ")"); + buffer.concat("], " + node.elements.length + "))"); } + st.receiverLevel--; if (!generate) compiler.lastPos = node.end; }, DictionaryLiteral: function(node, st, c) { var compiler = st.compiler, - generate = compiler.generate; + generate = compiler.generate, + buffer = compiler.jsBuffer, + noOfKeys = node.keys.length; + if (!generate) { - compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, node.start)); + buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); compiler.lastPos = node.start; } if (!generate) buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. - if (!node.keys.length) { - compiler.jsBuffer.concat("objj_msgSend(objj_msgSend(CPDictionary, \"alloc\"), \"init\")"); + if (!st.receiverLevel) st.receiverLevel = 0; + if (!noOfKeys) { + if (compiler.flags & ObjJAcornCompiler.Flags.InlineMsgSend) { + buffer.concat("(___r"); + buffer.concat(++st.receiverLevel + ""); + buffer.concat(" = (CPDictionary.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPDictionary, \"alloc\"), ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(" == null ? null : (___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(".isa.method_msgSend[\"init\"] || _objj_forward)(___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(", \"init\"))"); + } else { + buffer.concat("(___r"); + buffer.concat(++st.receiverLevel + ""); + buffer.concat(" = CPDictionary.isa.objj_msgSend0(CPDictionary, \"alloc\"), ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(" == null ? null : ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(".isa.objj_msgSend0(___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(", \"init\"))"); + } + + if (!(st.maxReceiverLevel >= st.receiverLevel)) + st.maxReceiverLevel = st.receiverLevel; } else { - compiler.jsBuffer.concat("objj_msgSend(objj_msgSend(CPDictionary, \"alloc\"), \"initWithObjectsAndKeys:\""); - for (var i = 0; i < node.keys.length; i++) { - var key = node.keys[i], - value = node.values[i]; + if (compiler.flags & ObjJAcornCompiler.Flags.InlineMsgSend) { + buffer.concat("(___r"); + buffer.concat(++st.receiverLevel + ""); + buffer.concat(" = (CPDictionary.isa.method_msgSend[\"alloc\"] || _objj_forward)(CPDictionary, \"alloc\"), ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(" == null ? null : (___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(".isa.method_msgSend[\"initWithObjects:forKeys:\"] || _objj_forward)(___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(", \"initWithObjects:forKeys:\", ["); + } else { + buffer.concat("(___r"); + buffer.concat(++st.receiverLevel + ""); + buffer.concat(" = CPDictionary.isa.objj_msgSend0(CPDictionary, \"alloc\"), ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(" == null ? null : ___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(".isa.objj_msgSend2(___r"); + buffer.concat(st.receiverLevel + ""); + buffer.concat(", \"initWithObjects:forKeys:\", ["); + } - compiler.jsBuffer.concat(", "); + if (!(st.maxReceiverLevel >= st.receiverLevel)) + st.maxReceiverLevel = st.receiverLevel; + for (var i = 0; i < noOfKeys; i++) { + var value = node.values[i]; + + if (i) buffer.concat(", "); if (!generate) compiler.lastPos = value.start; c(value, st, "Expression"); - if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, value.end)); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, value.end)); + } - compiler.jsBuffer.concat(", "); + buffer.concat("], ["); + for (var i = 0; i < noOfKeys; i++) { + var key = node.keys[i]; + + if (i) buffer.concat(", "); if (!generate) compiler.lastPos = key.start; c(key, st, "Expression"); - if (!generate) compiler.jsBuffer.concat(compiler.source.substring(compiler.lastPos, key.end)); + if (!generate) buffer.concat(compiler.source.substring(compiler.lastPos, key.end)); } - compiler.jsBuffer.concat(")"); + buffer.concat("]))"); } + st.receiverLevel--; if (!generate) compiler.lastPos = node.end; }, ImportStatement: function(node, st, c) { @@ -2257,17 +2398,48 @@ MethodDeclarationStatement: function(node, st, c) { MessageSendExpression: function(node, st, c) { var compiler = st.compiler, generate = compiler.generate, + inlineMsgSend = compiler.flags & ObjJAcornCompiler.Flags.InlineMsgSend, buffer = compiler.jsBuffer, - nodeObject = node.object; + nodeObject = node.object, + selectors = node.selectors, + arguments = node.arguments, + argumentsLength = arguments.length, + firstSelector = selectors[0], + selector = firstSelector ? firstSelector.name : ""; // There is always at least one selector + + // Put together the selector. Maybe this should be done in the parser... + for (var i = 0; i < argumentsLength; i++) + if (i === 0) + selector += ":"; + else + selector += (selectors[i] ? selectors[i].name : "") + ":"; + if (!generate) { buffer.concat(compiler.source.substring(compiler.lastPos, node.start)); compiler.lastPos = nodeObject ? nodeObject.start : node.arguments.length ? node.arguments[0].start : node.end; + } else if (!inlineMsgSend) { + // Find out the total number of arguments so we can choose appropriate msgSend function. Only needed if call the function and not inline it + var totalNoOfParameters = argumentsLength; + + if (node.parameters) + totalNoOfParameters += node.parameters.length; } if (node.superObject) { if (!generate) buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. - buffer.concat("objj_msgSendSuper("); - buffer.concat("{ receiver:self, super_class:" + (st.currentMethodType() === "+" ? compiler.currentSuperMetaClass : compiler.currentSuperClass ) + " }"); + if (inlineMsgSend) { + buffer.concat("("); + buffer.concat(st.currentMethodType() === "+" ? compiler.currentSuperMetaClass : compiler.currentSuperClass); + buffer.concat(".method_dtable[\""); + buffer.concat(selector); + buffer.concat("\"] || _objj_forward)(self"); + } else { + buffer.concat("objj_msgSendSuper"); + if (totalNoOfParameters < 4) { + buffer.concat("" + totalNoOfParameters); + } + buffer.concat("({ receiver:self, super_class:" + (st.currentMethodType() === "+" ? compiler.currentSuperMetaClass : compiler.currentSuperClass ) + " }"); + } } else { @@ -2293,6 +2465,8 @@ MessageSendExpression: function(node, st, c) { c(nodeObject, st, "Expression"); buffer.concat(" == null ? null : "); } + if (inlineMsgSend) + buffer.concat("("); c(nodeObject, st, "Expression"); } else { receiverIsNotSelf = true; @@ -2303,12 +2477,20 @@ MessageSendExpression: function(node, st, c) { c(nodeObject, st, "Expression"); buffer.concat("), ___r"); buffer.concat(st.receiverLevel + ""); - buffer.concat(" == null ? null : ___r"); + buffer.concat(" == null ? null : "); + if (inlineMsgSend) + buffer.concat("("); + buffer.concat("___r"); buffer.concat(st.receiverLevel + ""); if (!(st.maxReceiverLevel >= st.receiverLevel)) st.maxReceiverLevel = st.receiverLevel; } - buffer.concat(".isa.objj_msgSend"); + if (inlineMsgSend) { + buffer.concat(".isa.method_msgSend[\""); + buffer.concat(selector); + buffer.concat("\"] || _objj_forward)"); + } else + buffer.concat(".isa.objj_msgSend"); } else { buffer.concat(" "); // Add an extra space if it looks something like this: "return()". No space between return and expression. buffer.concat("objj_msgSend("); @@ -2316,19 +2498,11 @@ MessageSendExpression: function(node, st, c) { } } - var selectors = node.selectors, - arguments = node.arguments, - argumentsLength = arguments.length, - firstSelector = selectors[0], - selector = firstSelector ? firstSelector.name : ""; // There is always at least one selector - if (generate && !node.superObject) { - var totalNoOfParameters = argumentsLength; - - if (node.parameters) - totalNoOfParameters += node.parameters.length; - if (totalNoOfParameters < 4) { - buffer.concat("" + totalNoOfParameters); + if (!inlineMsgSend) { + if (totalNoOfParameters < 4) { + buffer.concat("" + totalNoOfParameters); + } } if (receiverIsIdentifier) { @@ -2340,13 +2514,6 @@ MessageSendExpression: function(node, st, c) { } } - // Put together the selector. Maybe this should be done in the parser... - for (var i = 0; i < argumentsLength; i++) - if (i === 0) - selector += ":"; - else - selector += (selectors[i] ? selectors[i].name : "") + ":"; - buffer.concat(", \""); buffer.concat(selector); // FIXME: sel_getUid(selector + "") ? This FIXME is from the old preprocessor compiler buffer.concat("\""); From e45e31d2236170859ae08bfd4f019d87a88a0aac Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Tue, 6 Oct 2015 13:34:28 +0200 Subject: [PATCH 043/169] =?UTF-8?q?Fixed:=20Introduce=20=E2=80=99jake=20in?= =?UTF-8?q?stall-inline=E2=80=99=20task=20to=20generate=20the=20cappuccino?= =?UTF-8?q?=20framework=20with=20objj=5FmsgSend=20function=20inlined.=20Al?= =?UTF-8?q?so=20introduced=20options=20in=20=E2=80=99index-debug.html?= =?UTF-8?q?=E2=80=99=20templates=20to=20allow=20inline=20of=20objj=5FmsgSe?= =?UTF-8?q?nd=20function=20when=20compiling=20in=20browser.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AppKit/Jakefile | 5 +++-- AppKit/Themes/BlendKit/Jakefile | 2 +- Foundation/Jakefile | 2 +- Jakefile | 14 +++++++++++--- Objective-J/CFHTTPRequest.js | 2 +- Objective-J/CommonJS/lib/objective-j/compiler.js | 6 +++++- .../CommonJS/lib/objective-j/jake/bundletask.js | 2 +- Objective-J/FileExecutable.js | 2 +- .../Preprocessor/OutputTests/OutputTest.j | 2 +- .../capp/Resources/Templates/Application/Jakefile | 2 +- .../Templates/Application/index-debug.html | 5 +++++ Tools/capp/Resources/Templates/Framework/Jakefile | 2 +- .../Resources/Templates/NibApplication/Jakefile | 2 +- .../Templates/NibApplication/index-debug.html | 5 +++++ .../Templates/ThemeDescriptor/index-debug.html | 5 +++++ common.jake | 8 ++++++++ 16 files changed, 51 insertions(+), 15 deletions(-) diff --git a/AppKit/Jakefile b/AppKit/Jakefile index 69f958e4c..b08853fda 100644 --- a/AppKit/Jakefile +++ b/AppKit/Jakefile @@ -33,8 +33,9 @@ appKitTask = framework ("AppKit", function(appKitTask) return "--include \"" + aFilename + "\""; }).join(" "); - if ($CONFIGURATION === "Release") - appKitTask.setCompilerFlags("-O " + INCLUDES); + if ($CONFIGURATION === "Release") { + appKitTask.setCompilerFlags(($INLINE_MSG_SEND ? "-O2 " : "-O ") + INCLUDES); + } else appKitTask.setCompilerFlags("-DDEBUG -g " + INCLUDES); }); diff --git a/AppKit/Themes/BlendKit/Jakefile b/AppKit/Themes/BlendKit/Jakefile index da9439c09..f8797ec56 100644 --- a/AppKit/Themes/BlendKit/Jakefile +++ b/AppKit/Themes/BlendKit/Jakefile @@ -20,7 +20,7 @@ blendKitTask = framework ("BlendKit", function(blendKitTask) blendKitTask.setFlattensSources(true); // FIXME: how do we non flatten? if ($CONFIGURATION === "Release") - blendKitTask.setCompilerFlags("-O"); + blendKitTask.setCompilerFlags($INLINE_MSG_SEND ? "-O2" : "-O"); else blendKitTask.setCompilerFlags("-DDEBUG -g"); }); diff --git a/Foundation/Jakefile b/Foundation/Jakefile index 20d218c9e..e180f19b0 100644 --- a/Foundation/Jakefile +++ b/Foundation/Jakefile @@ -51,7 +51,7 @@ foundationTask = framework ("Foundation", function(foundationTask) INCLUDES = "--include \"../AppKit/Platform/Platform.h\" " + INCLUDES; if ($CONFIGURATION === "Release") - foundationTask.setCompilerFlags("-O " + INCLUDES); + foundationTask.setCompilerFlags(($INLINE_MSG_SEND ? "-O2 " : "-O ") + INCLUDES); else foundationTask.setCompilerFlags("-DDEBUG -g " + INCLUDES); }); diff --git a/Jakefile b/Jakefile index 9bbc5ff57..107458477 100644 --- a/Jakefile +++ b/Jakefile @@ -21,7 +21,7 @@ var subprojects = ["Objective-J", "CommonJS", "Foundation", "AppKit", "Tools"]; $BUILD_CJS_OBJECTIVE_J_DEBUG_FRAMEWORKS = FILE.join($BUILD_CJS_OBJECTIVE_J, "Frameworks", "Debug"); -filedir ($BUILD_CJS_OBJECTIVE_J_DEBUG_FRAMEWORKS, ["debug", "release"], function() +filedir ($BUILD_CJS_OBJECTIVE_J_DEBUG_FRAMEWORKS, [], function() { FILE.mkdirs($BUILD_CJS_OBJECTIVE_J_DEBUG_FRAMEWORKS); @@ -30,7 +30,7 @@ filedir ($BUILD_CJS_OBJECTIVE_J_DEBUG_FRAMEWORKS, ["debug", "release"], function $BUILD_CJS_CAPPUCCINO_DEBUG_FRAMEWORKS = FILE.join($BUILD_CJS_CAPPUCCINO, "Frameworks", "Debug"); -filedir ($BUILD_CJS_CAPPUCCINO_DEBUG_FRAMEWORKS, ["debug", "release"], function() +filedir ($BUILD_CJS_CAPPUCCINO_DEBUG_FRAMEWORKS, [], function() { FILE.mkdirs($BUILD_CJS_CAPPUCCINO_DEBUG_FRAMEWORKS); @@ -39,7 +39,9 @@ filedir ($BUILD_CJS_CAPPUCCINO_DEBUG_FRAMEWORKS, ["debug", "release"], function( cp_r(FILE.join($BUILD_DIR, "Debug", "BlendKit"), FILE.join($BUILD_CJS_CAPPUCCINO_DEBUG_FRAMEWORKS, "BlendKit")); }); -task ("CommonJS", [$BUILD_CJS_OBJECTIVE_J_DEBUG_FRAMEWORKS, $BUILD_CJS_CAPPUCCINO_DEBUG_FRAMEWORKS, "debug", "release"]); +task ("CommonJS", ["debug", "release", $BUILD_CJS_OBJECTIVE_J_DEBUG_FRAMEWORKS, $BUILD_CJS_CAPPUCCINO_DEBUG_FRAMEWORKS, "debug", "release"]); + +task ("CommonJS-inline", ["debug", "release-inline", $BUILD_CJS_OBJECTIVE_J_DEBUG_FRAMEWORKS, $BUILD_CJS_CAPPUCCINO_DEBUG_FRAMEWORKS, "debug", "release-inline"]); task ("install", ["CommonJS"], function() { @@ -47,6 +49,12 @@ task ("install", ["CommonJS"], function() installCopy($BUILD_CJS_CAPPUCCINO, false); }); +task ("install-inline", ["CommonJS-inline"], function() +{ + installCopy($BUILD_CJS_OBJECTIVE_J, false); + installCopy($BUILD_CJS_CAPPUCCINO, false); +}); + task ("sudo-install", ["CommonJS"], function() { installCopy($BUILD_CJS_OBJECTIVE_J, true); diff --git a/Objective-J/CFHTTPRequest.js b/Objective-J/CFHTTPRequest.js index eff9a49df..a961cc67b 100644 --- a/Objective-J/CFHTTPRequest.js +++ b/Objective-J/CFHTTPRequest.js @@ -351,7 +351,7 @@ function FileRequest(/*CFURL*/ aURL, onsuccess, onfailure, onprogress) { var aFilePath = aURL.toString().substring(5), OS = require("os"), - gccFlags = require("objective-j").currentCompilerFlags(), + gccFlags = require("objective-j").currentGccCompilerFlags(), chunk, fileContents = ""; diff --git a/Objective-J/CommonJS/lib/objective-j/compiler.js b/Objective-J/CommonJS/lib/objective-j/compiler.js index 34416cde0..6f7f91972 100644 --- a/Objective-J/CommonJS/lib/objective-j/compiler.js +++ b/Objective-J/CommonJS/lib/objective-j/compiler.js @@ -192,8 +192,12 @@ function resolveFlags(args) else if (argument.indexOf("-g") === 0) objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.IncludeDebugSymbols; - else if (argument.indexOf("-O") === 0) + else if (argument.indexOf("-O") === 0) { objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.Compress; + // FIXME: currently we are sending in '-O2' when we want InlineMsgSend. Here we only check if we it is '-O...' + if (argument.length > 2) + objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.InlineMsgSend; + } else if (argument.indexOf("-G") === 0) objjcFlags |= ObjectiveJ.ObjJAcornCompiler.Flags.Generate; diff --git a/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js b/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js index e71b9129f..613d9b254 100644 --- a/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js +++ b/Objective-J/CommonJS/lib/objective-j/jake/bundletask.js @@ -907,7 +907,7 @@ BundleTask.prototype.defineSourceTasks = function() basePath = absolutePath.substring(0, absolutePath.length - theTranslatedFilename.length); // Here we set the current compiler flags so the load system will know what compiler flags to use - ObjectiveJ.setCurrentCompilerFlags(environmentCompilerFlags); + ObjectiveJ.setCurrentGccCompilerFlags(environmentCompilerFlags); // Here we tell the CFBundle to load frameworks for the current build enviroment and not the enviroment that is running CFBundle.environments = function() {return [anEnvironment.name(), "ObjJ"]}; ObjectiveJ.make_narwhal_factory(absolutePath, basePath, translateFilenameToPath)(require, e, module, system, print); diff --git a/Objective-J/FileExecutable.js b/Objective-J/FileExecutable.js index 8e9bcac7a..a3b471a7e 100644 --- a/Objective-J/FileExecutable.js +++ b/Objective-J/FileExecutable.js @@ -41,7 +41,7 @@ function FileExecutable(/*CFURL|String*/ aURL, /*Dictionary*/ aFilenameTranslate if (fileContents.match(/^@STATIC;/)) executable = decompile(fileContents, aURL); else if ((extension === "j" || !extension) && !fileContents.match(/^{/)) - executable = exports.ObjJAcornCompiler.compileFileDependencies(fileContents, aURL, ObjJAcornCompiler.Flags.IncludeDebugSymbols); + executable = exports.ObjJAcornCompiler.compileFileDependencies(fileContents, aURL, exports.currentCompilerFlags()); else executable = new Executable(fileContents, [], aURL); diff --git a/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j b/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j index fcd96ba3c..5b5ffa070 100644 --- a/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j +++ b/Tests/Objective-J/Preprocessor/OutputTests/OutputTest.j @@ -49,7 +49,7 @@ var FILENAMES = [ correct = FILE.read(FILE.join(FILE.dirname(module.path), filename + ".js")); [self assertNoThrow:function() { - preprocessed = ObjectiveJ.ObjJAcornCompiler.compileToExecutable(unpreprocessed).code(); + preprocessed = ObjectiveJ.ObjJAcornCompiler.compileToExecutable(unpreprocessed, nil, ObjectiveJ.ObjJAcornCompiler.Flags.IncludeDebugSymbols/* | ObjectiveJ.ObjJAcornCompiler.Flags.IncludeTypeSignatures*/).code(); preprocessed = compressor.compress(preprocessed, { charset : "UTF-8", useServer : true }); correct = compressor.compress(correct, { charset : "UTF-8", useServer : true }); }]; diff --git a/Tools/capp/Resources/Templates/Application/Jakefile b/Tools/capp/Resources/Templates/Application/Jakefile index 08a8c0c8b..a25464947 100644 --- a/Tools/capp/Resources/Templates/Application/Jakefile +++ b/Tools/capp/Resources/Templates/Application/Jakefile @@ -40,7 +40,7 @@ app (projectName, function(task) if (configuration === "Debug") task.setCompilerFlags("-DDEBUG -g"); else - task.setCompilerFlags("-O"); + task.setCompilerFlags("-O2"); }); task ("default", [projectName], function() diff --git a/Tools/capp/Resources/Templates/Application/index-debug.html b/Tools/capp/Resources/Templates/Application/index-debug.html index d862fd07e..96a9a1106 100644 --- a/Tools/capp/Resources/Templates/Application/index-debug.html +++ b/Tools/capp/Resources/Templates/Application/index-debug.html @@ -61,6 +61,11 @@ + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPURLConnectionAsyncTest/index.html b/Tests/Manual/CPURLConnectionAsyncTest/index.html new file mode 100644 index 000000000..0bc96c02b --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/index.html @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + CPURLConnectionAsyncTest + + + + + + + + + + + + +
+
+ + + +
+
+ + + diff --git a/Tests/Manual/CPURLConnectionAsyncTest/main.j b/Tests/Manual/CPURLConnectionAsyncTest/main.j new file mode 100644 index 000000000..8c25d0a18 --- /dev/null +++ b/Tests/Manual/CPURLConnectionAsyncTest/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * CPURLConnectionAsyncTest + * + * Created by You on February 1, 2012. + * Copyright 2012, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} From 54e1efd794469c961b784668211fbae225417806 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 8 Oct 2015 11:17:12 -0700 Subject: [PATCH 047/169] Test: refactoring of the manual test CPURLConnectionAsyncTest --- .../CPURLConnectionAsyncTest/AppController.j | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/Tests/Manual/CPURLConnectionAsyncTest/AppController.j b/Tests/Manual/CPURLConnectionAsyncTest/AppController.j index 1138a8578..41015b003 100644 --- a/Tests/Manual/CPURLConnectionAsyncTest/AppController.j +++ b/Tests/Manual/CPURLConnectionAsyncTest/AppController.j @@ -30,9 +30,8 @@ CPLogRegister(CPLogConsole); - (CPURLConnection)startAsyncConnection:(CPInteger)idx responseStatus:(CPInteger)aStatus delay:(CPInteger)aDelay isLast:(BOOL)isLast { var resourcePath = [[CPBundle mainBundle] resourcePath], - url = [CPURL URLWithString:[CPString stringWithFormat:@"%@delayed.php?sleep=%@&status=%@", resourcePath, aDelay, aStatus]]; - - var request = [CPURLRequest requestWithURL:url]; + url = [CPURL URLWithString:[CPString stringWithFormat:@"%@delayed.php?sleep=%@&status=%@", resourcePath, aDelay, aStatus]], + request = [CPURLRequest requestWithURL:url]; return [self startAsyncConnection:idx request:request isLast:isLast]; } @@ -99,9 +98,9 @@ CPLogRegister(CPLogConsole); queue = [[CPOperationQueue alloc] init]; [testField setStringValue:@"Waiting for response ..."]; - var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; - var connection2 = [self startAsyncConnection:2 responseStatus:200 delay:2 isLast:NO]; - var connection3 = [self startAsyncConnection:3 responseStatus:200 delay:3 isLast:NO]; + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES], + connection2 = [self startAsyncConnection:2 responseStatus:200 delay:2 isLast:NO], + connection3 = [self startAsyncConnection:3 responseStatus:200 delay:3 isLast:NO]; [[connection1 operation] addDependency:[connection2 operation]]; [[connection2 operation] addDependency:[connection3 operation]]; @@ -113,9 +112,9 @@ CPLogRegister(CPLogConsole); queue = [[CPOperationQueue alloc] init]; [testField setStringValue:@"Waiting for response ..."]; - var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; - var connection2 = [self startAsyncConnection:2 responseStatus:404 delay:2 isLast:NO]; - var connection3 = [self startAsyncConnection:3 responseStatus:200 delay:3 isLast:NO]; + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES], + connection2 = [self startAsyncConnection:2 responseStatus:404 delay:2 isLast:NO], + connection3 = [self startAsyncConnection:3 responseStatus:200 delay:3 isLast:NO]; [[connection1 operation] addDependency:[connection2 operation]]; [[connection2 operation] addDependency:[connection3 operation]]; @@ -127,9 +126,9 @@ CPLogRegister(CPLogConsole); queue = [[CPOperationQueue alloc] init]; [testField setStringValue:@"Waiting for response ..."]; - var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; - var connection2 = [self startAsyncConnection:2 responseStatus:200 delay:2 isLast:NO]; - var connection3 = [self startAsyncConnection:3 responseStatus:404 delay:3 isLast:NO]; + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES], + connection2 = [self startAsyncConnection:2 responseStatus:200 delay:2 isLast:NO], + connection3 = [self startAsyncConnection:3 responseStatus:404 delay:3 isLast:NO]; [[connection1 operation] addDependency:[connection2 operation]]; [[connection2 operation] addDependency:[connection3 operation]]; @@ -141,9 +140,9 @@ CPLogRegister(CPLogConsole); queue = [[CPOperationQueue alloc] init]; [testField setStringValue:@"Waiting for response ..."]; - var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; - var connection2 = [self startAsyncConnection:2 responseStatus:403 delay:2 isLast:NO]; - var connection3 = [self startAsyncConnection:3 responseStatus:404 delay:3 isLast:NO]; + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES], + connection2 = [self startAsyncConnection:2 responseStatus:403 delay:2 isLast:NO], + connection3 = [self startAsyncConnection:3 responseStatus:404 delay:3 isLast:NO]; [[connection1 operation] addDependency:[connection2 operation]]; [[connection2 operation] addDependency:[connection3 operation]]; @@ -155,9 +154,9 @@ CPLogRegister(CPLogConsole); queue = [[CPOperationQueue alloc] init]; [testField setStringValue:@"Waiting for response ..."]; - var connection1 = [self startAsyncConnection:1 responseStatus:404 delay:1 isLast:YES]; - var connection2 = [self startAsyncConnection:2 responseStatus:1000 delay:2 isLast:NO]; - var connection3 = [self startAsyncConnection:3 responseStatus:404 delay:3 isLast:NO]; + var connection1 = [self startAsyncConnection:1 responseStatus:404 delay:1 isLast:YES], + connection2 = [self startAsyncConnection:2 responseStatus:1000 delay:2 isLast:NO], + connection3 = [self startAsyncConnection:3 responseStatus:404 delay:3 isLast:NO]; [[connection1 operation] addDependency:[connection2 operation]]; [[connection2 operation] addDependency:[connection3 operation]]; @@ -167,12 +166,12 @@ CPLogRegister(CPLogConsole); { results = @[]; queue = [[CPOperationQueue alloc] init]; - var request = [CPURLRequest requestWithURL:"dummy"]; [testField setStringValue:@"Waiting for response ..."]; - var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; - var connection2 = [self startAsyncConnection:2 request:request isLast:NO]; - var connection3 = [self startAsyncConnection:3 request:request isLast:NO]; + var request = [CPURLRequest requestWithURL:"dummy"], + connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES], + connection2 = [self startAsyncConnection:2 request:request isLast:NO], + connection3 = [self startAsyncConnection:3 request:request isLast:NO]; [[connection1 operation] addDependency:[connection2 operation]]; [[connection2 operation] addDependency:[connection3 operation]]; @@ -184,16 +183,15 @@ CPLogRegister(CPLogConsole); queue = [[CPOperationQueue alloc] init]; var resourcePath = [[CPBundle mainBundle] resourcePath], - url = [CPURL URLWithString:[CPString stringWithFormat:@"%@delayed.php?sleep=%@&status=%@", resourcePath, 10, 200]]; - var timeoutrequest = [CPURLRequest requestWithURL:url cachePolicy:CPURLRequestUseProtocolCachePolicy timeoutInterval:3]; - - var nourl = [CPURLRequest requestWithURL:@"nourl"]; + url = [CPURL URLWithString:[CPString stringWithFormat:@"%@delayed.php?sleep=%@&status=%@", resourcePath, 10, 200]], + timeoutrequest = [CPURLRequest requestWithURL:url cachePolicy:CPURLRequestUseProtocolCachePolicy timeoutInterval:3], + nourl = [CPURLRequest requestWithURL:@"nourl"]; [testField setStringValue:@"Waiting for response ..."]; - var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES]; - var connection2 = [self startAsyncConnection:2 request:nourl isLast:NO]; - var connection3 = [self startAsyncConnection:3 request:timeoutrequest isLast:NO]; + var connection1 = [self startAsyncConnection:1 responseStatus:200 delay:1 isLast:YES], + connection2 = [self startAsyncConnection:2 request:nourl isLast:NO], + connection3 = [self startAsyncConnection:3 request:timeoutrequest isLast:NO]; [[connection1 operation] addDependency:[connection2 operation]]; [[connection2 operation] addDependency:[connection3 operation]]; From 3e29732e462e02dacfd66851e6dd67886ed69889 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 8 Oct 2015 11:23:07 -0700 Subject: [PATCH 048/169] Fixed: OperationQueue for the CPNotificationCenter is not ignored anymore Previously, the operationQueue given to the notificationCenter was ignored. Tests in CPNotificationCenterTest.j --- Foundation/CPNotificationCenter.j | 59 ++++++++++++++++++--- Tests/Foundation/CPNotificationCenterTest.j | 51 ++++++++++++++++++ 2 files changed, 102 insertions(+), 8 deletions(-) diff --git a/Foundation/CPNotificationCenter.j b/Foundation/CPNotificationCenter.j index f06c22b0a..5f8ff94da 100644 --- a/Foundation/CPNotificationCenter.j +++ b/Foundation/CPNotificationCenter.j @@ -25,6 +25,8 @@ @import "CPException.j" @import "CPNotification.j" @import "CPNull.j" +@import "CPOperationQueue.j" +@import "CPOperation.j" @import "CPSet.j" @class _CPNotificationRegistry @@ -94,13 +96,13 @@ var CPNotificationDefaultCenter = nil; Adds an entry to the receiver’s dispatch table with a block, and optional criteria: notification name and sender. @param aNotificationName the name of the notification the observer wants to watch @param anObject the object in the notification the observer wants to watch - @param queue is ignored for the moment + @param The operation queue to which block should be added. If you pass nil, the block is run synchronously on the posting thread. @param block the block to be executed when the notification is received. */ -- (id )addObserverForName:(CPString)aNotificationName object:(id)anObject queue:(id)queue usingBlock:(Function)block +- (id )addObserverForName:(CPString)aNotificationName object:(id)anObject queue:(CPOperationQueue)queue usingBlock:(Function)block { var registry = [self _registryForNotificationName:aNotificationName], - observer = [[_CPNotificationObserver alloc] initWithBlock:block]; + observer = [[_CPNotificationObserver alloc] initWithBlock:block queue:queue]; [registry addObserver:observer object:anObject]; @@ -344,9 +346,10 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ /* @ignore */ @implementation _CPNotificationObserver : CPObject { - id _observer; - Function _block; - SEL _selector; + CPOperationQueue _operationQueue; + id _observer; + Function _block; + SEL _selector; } - (id)initWithObserver:(id)anObserver selector:(SEL)aSelector @@ -360,11 +363,12 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ return self; } -- (id)initWithBlock:(Function)aBlock +- (id)initWithBlock:(Function)aBlock queue:(CPOperationQueue)aQueue { if (self) { _block = aBlock; + _operationQueue = aQueue; } return self; @@ -384,7 +388,11 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ { if (_block) { - _block(aNotification); + if (!_operationQueue) + _block(aNotification); + else + [_operationQueue addOperation:[[_CPNotificationObserverOperation alloc] initWithBlock:_block notification:aNotification]]; + return; } @@ -392,3 +400,38 @@ var _CPNotificationCenterPostNotification = function(/* CPNotificationCenter */ } @end + +/* @ignore */ +@implementation _CPNotificationObserverOperation : CPOperation +{ + CPNotification _notification; + Function _block; +} + +/* @ignore */ +- (id)initWithBlock:(Function)aBlock notification:(CPNotification)aNotification +{ + self = [super init]; + + if (self) + { + _block = aBlock; + _notification = aNotification; + } + + return self; +} + +/* @ignore */ +- (void)main +{ + _block(_notification); +} + +/* @ignore */ +- (BOOL)isReady +{ + return YES; +} + +@end diff --git a/Tests/Foundation/CPNotificationCenterTest.j b/Tests/Foundation/CPNotificationCenterTest.j index 47aab1e0f..9695ac810 100644 --- a/Tests/Foundation/CPNotificationCenterTest.j +++ b/Tests/Foundation/CPNotificationCenterTest.j @@ -97,6 +97,57 @@ var TestNotification = @"TestNotification"; [self assert:7 equals:notificationCount message:@"observer should not be notified"]; } +- (void)testNotifyWithBlocksAndOperationQueue +{ + var center = [CPNotificationCenter defaultCenter], + queue = [[CPOperationQueue alloc] init]; + + notificationCount = 0; + + var notificationBlock = function(notification){ + notificationCount += 1; + }; + + var observer2 = [center addObserverForName:TestNotification object:2 queue:queue usingBlock:notificationBlock], + observer25 = [center addObserverForName:TestNotification object:25 queue:queue usingBlock:notificationBlock]; + + [center postNotificationName:TestNotification object:self]; + [center postNotificationName:TestNotification object:2]; + + [queue waitUntilAllOperationsAreFinished]; + [self assert:1 equals:notificationCount message:@"observer should be notified for object '2'"]; + + var observerNil = [center addObserverForName:TestNotification object:nil queue:queue usingBlock:notificationBlock]; + + [center postNotificationName:TestNotification object:2]; + [queue waitUntilAllOperationsAreFinished]; + [self assert:3 equals:notificationCount message:@"observer should be notified for object '2' and for any object"]; + + [center removeObserver:observer2 name:TestNotification object:2]; + [center postNotificationName:TestNotification object:2]; + [queue waitUntilAllOperationsAreFinished]; + [self assert:4 equals:notificationCount message:@"observer should be notified only for any object"]; + + // At this point we have TestNofication:nil observer and a TestNotification:25 observer. + observer2 = [center addObserverForName:nil object:2 queue:queue usingBlock:notificationBlock]; + + [center postNotificationName:TestNotification object:2]; + [queue waitUntilAllOperationsAreFinished]; + [self assert:6 equals:notificationCount message:@"observer should be notified for TestNofication and for object '2' (TestNotification)"]; + [center postNotificationName:@"RandomNotification" object:2]; + [queue waitUntilAllOperationsAreFinished]; + [self assert:7 equals:notificationCount message:@"observer should be notified for object '2' (RandomNotification)"]; + + [center removeObserver:observer2]; + [center removeObserver:observer25]; + [center removeObserver:observerNil]; + [center postNotificationName:TestNotification object:nil]; + [center postNotificationName:TestNotification object:2]; + [center postNotificationName:TestNotification object:25]; + [queue waitUntilAllOperationsAreFinished]; + [self assert:7 equals:notificationCount message:@"observer should not be notified"]; +} + - (void)testAddObserversDuringNotification { var center = [CPNotificationCenter defaultCenter]; From 22b77af9d35c46affaff3d7d768f083599757211 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 8 Oct 2015 16:06:16 -0700 Subject: [PATCH 049/169] New: added the class CPNotificationQueue MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR adds the feature of CPNotificationQueue. Cappuccino provides a framework for sending messages between objects within a process called notifications. CPNotificationQueue objects (or simply notification queues) act as buffers for notification centers (instances of CPNotificationCenter). Whereas a notification center distributes notifications when posted, notifications placed into the queue can be delayed until the end of the current pass through the run loop or until the run loop is idle. Duplicate notifications can also be coalesced so that only one notification is sent although multiple notifications are posted. A notification queue maintains notifications (instances of C¨Notification) generally in a first in first out (FIFO) order. When a notification rises to the front of the queue, the queue posts it to the notification center, which in turn dispatches the notification to all objects registered as observers. More informations here :https://developer.apple.com/library/prerelease/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationQueue_Class/index.html#//apple_ref/occ/instm/NSNotificationQueue/enqueueNotification:postingStyle:coalesceMask:forModes: Unit-Tests in Tests/Foundation/CPNotificationQueueTest.j --- Foundation/CPNotificationQueue.j | 328 +++++++++++++++++++++ Tests/Foundation/CPNotificationQueueTest.j | 124 ++++++++ 2 files changed, 452 insertions(+) create mode 100644 Foundation/CPNotificationQueue.j create mode 100644 Tests/Foundation/CPNotificationQueueTest.j diff --git a/Foundation/CPNotificationQueue.j b/Foundation/CPNotificationQueue.j new file mode 100644 index 000000000..5c497cfa9 --- /dev/null +++ b/Foundation/CPNotificationQueue.j @@ -0,0 +1,328 @@ +/* + * CPNotificationQueue.j + * Foundation + * + * Created by Alexandre Wilhelm. + * Copyright 2015 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +@import "CPObject.j" +@import "CPNotification.j" +@import "CPNotificationCenter.j" + +@typedef CPPostingStyle + +/* + @global + @group CPViewAutoresizingMasks + The default resizingMask, the view will not resize or reposition itself. +*/ +CPPostWhenIdle = 1; +/* + @global + @group CPPostingStyle + The notification is posted at the end of the current notification callout or timer. +*/ +CPPostASAP = 2; +/* + @global + @group CPPostingStyle + The notification is posted immediately after coalescing. +*/ +CPPostNow = 3; + + +@typedef CPNotificationCoalescing + +/* + @global + @group CPNotificationCoalescing + Do not coalesce notifications in the queue. +*/ +CPNotificationNoCoalescing = 1 << 0; +/* + @global + @group CPNotificationCoalescing + Coalesce notifications with the same name. +*/ +CPNotificationCoalescingOnName = 1 << 1; +/* + @global + @group CPNotificationCoalescing + Coalesce notifications with the same object. +*/ +CPNotificationCoalescingOnSender = 1 << 2; + + +var CPNotificationDefaultQueue; + +var runLoop = [CPRunLoop mainRunLoop]; + +/*! + @class CPPostingStyle + @ingroup foundation + @brief CPNotificationQueue objects act as buffers for notification centers (instances of CPNotificationCenter). + + Cappuccino provides a framework for sending messages between objects within + a process called notifications. CPNotificationQueue objects (or simply notification queues) + act as buffers for notification centers (instances of CPNotificationCenter). + Whereas a notification center distributes notifications when posted, + notifications placed into the queue can be delayed until the end of the current pass through the run loop + or until the run loop is idle. Duplicate notifications can also be coalesced so that only one notification + is sent although multiple notifications are posted. A notification queue maintains notifications + (instances of C¨Notification) generally in a first in first out (FIFO) order. + When a notification rises to the front of the queue, the queue posts it to the notification center, + which in turn dispatches the notification to all objects registered as observers. +*/ +@implementation CPNotificationQueue : CPObject +{ + BOOL _runLoopLaunched; + CPMutableArray _postNowNotifications; + CPMutableArray _postIdleNotifications; + CPMutableArray _postASAPNotifications; + CPNotificationCenter _notificationCenter; +} + + +#pragma mark - +#pragma mark Class methods + +/*! + Returns the application's notification queue. This notification queue uses the default notification center +*/ ++ (id)defaultQueue +{ + if (!CPNotificationDefaultQueue) + CPNotificationDefaultQueue = [[CPNotificationQueue alloc] initWithNotificationCenter:[CPNotificationCenter defaultCenter]]; + + return CPNotificationDefaultQueue; +} + + +#pragma mark - +#pragma mark Init methods + +/*! + Initializes and returns a notification queue for the specified notification center. + @param anObserver the specified notification center + @return a new CPNotificationQueue +*/ +- (id)initWithNotificationCenter:(CPNotificationCenter)aNotificationCenter +{ + if (self = [super init]) + { + _notificationCenter = aNotificationCenter; + _postNowNotifications = [CPMutableArray new]; + _postIdleNotifications = [CPMutableArray new]; + _postASAPNotifications = [CPMutableArray new]; + } + + return self; +} + + +#pragma mark - +#pragma mark Enqueue methods + +/*! + Adds a notification to the notification queue with a specified posting style. + @param notification the notification to add to the queue + @param postingStyle the posting style for the notification +*/ +- (void)enqueueNotification:(CPNotification)notification postingStyle:(CPPostingStyle)postingStyle +{ + [self enqueueNotification:notification postingStyle:postingStyle coalesceMask:CPNotificationCoalescingOnName|CPNotificationCoalescingOnSender forModes:[CPDefaultRunLoopMode]]; +} + +/*! + Adds a notification to the notification queue with a specified posting style, criteria for coalescing, and runloop mode. + @param notification the notification to add to the queue + @param postingStyle the posting style for the notification + @param coalesceMask a mask indicating what criteria to use when matching attributes of notification to attributes notifications in the queue. + @modes modes the list of modes the notification may be posted in. +*/ +- (void)enqueueNotification:(CPNotification)notification postingStyle:(CPPostingStyle)postingStyle coalesceMask:(CPNotificationCoalescing)coalesceMask forModes:(CPArray)modes +{ + [self _removeNotification:notification coalesceMask:coalesceMask]; + + switch (postingStyle) + { + case CPPostWhenIdle: + [_postIdleNotifications addObject:notification]; + break; + + case CPPostASAP: + [_postASAPNotifications addObject:notification]; + break; + + case CPPostNow: + [_postNowNotifications addObject:notification]; + break; + } + + if ([_postIdleNotifications count] || [_postASAPNotifications count] || [_postNowNotifications count]) + [self _runRunLoop]; + + if (postingStyle == CPPostNow) + { + for (var i = [modes count] - 1; i >= 0; i--) + [[CPRunLoop currentRunLoop] limitDateForMode:modes[i]]; + } +} + + +#pragma mark - +#pragma mark Dequeue methods + +/*! + Removes all notifications from the queue that match a provided notification using provided matching criteria. + @param notification the notification to add to the queue + @param coalesceMask mask indicating what criteria to use when matching attributes of notification to remove notifications in the queue. +*/ +- (void)dequeueNotificationsMatching:(CPNotification)notification coalesceMask:(CPUInteger)coalesceMask +{ + [self _removeNotification:notification coalesceMask:coalesceMask]; +} + + +#pragma mark - +#pragma mark RunLoop methods + +/*! + @ignore +*/ +- (void)_runRunLoop +{ + if (!_runLoopLaunched) + { + [runLoop performSelector:@selector(_launchNotificationsInQueue) target:self argument:nil order:0 modes:[CPDefaultRunLoopMode]]; + _runLoopLaunched = YES; + } +} + +/*! + @ignore +*/ +- (void)_launchNotificationsInQueue +{ + _runLoopLaunched = NO; + + if ([_postNowNotifications count]) + { + [self _launchNotificationsForArray:_postNowNotifications]; + [self _runRunLoop]; + return; + } + + if ([_postASAPNotifications count]) + { + [self _launchNotificationsForArray:_postASAPNotifications]; + [self _runRunLoop]; + return; + } + + if ([_postIdleNotifications count]) + { + [self _launchNotificationsForArray:_postIdleNotifications]; + [self _runRunLoop]; + return; + } +} + + +#pragma mark - +#pragma mark Posting methods + +/*! + @ignore +*/ +- (void)_launchNotificationsForArray:(CPArray)anArray +{ + for (var i = [anArray count] - 1; i >= 0; i--) + { + var notification = anArray[i]; + [_notificationCenter postNotification:notification]; + } + + [anArray removeAllObjects]; +} + + +#pragma mark - +#pragma mark Remove methods + +/*! + @ignore +*/ +- (void)_removeNotification:(CPNotification)notification coalesceMask:(CPUInteger)coalesceMask +{ + [self _removeNotification:notification coalesceMask:coalesceMask inNotifications:_postNowNotifications]; + [self _removeNotification:notification coalesceMask:coalesceMask inNotifications:_postASAPNotifications]; + [self _removeNotification:notification coalesceMask:coalesceMask inNotifications:_postIdleNotifications]; +} + +/*! + @ignore +*/ +- (void)_removeNotification:(CPNotification)aNotification coalesceMask:(CPUInteger)coalesceMask inNotifications:(CPArray)notifications +{ + var notificationsToRemove = [], + name = [aNotification name], + sender = [aNotification object]; + + for (var i = [notifications count] - 1; i >= 0; i--) + { + var notification = notifications[i]; + + if (notification == aNotification) + { + [notificationsToRemove addObject:notification]; + continue; + } + + if (coalesceMask & CPNotificationNoCoalescing) + continue; + + if (coalesceMask & CPNotificationCoalescingOnName && coalesceMask & CPNotificationCoalescingOnSender) + { + if ([notification object] == sender && [notification name] == name) + [notificationsToRemove addObject:notification] + + continue; + } + + if (coalesceMask & CPNotificationCoalescingOnName) + { + if ([notification name] == name) + [notificationsToRemove addObject:notification] + + continue; + } + + if (coalesceMask & CPNotificationCoalescingOnSender) + { + if ([notification object] == sender) + [notificationsToRemove addObject:notification] + + continue; + } + } + + [notifications removeObjectsInArray:notificationsToRemove]; +} + +@end \ No newline at end of file diff --git a/Tests/Foundation/CPNotificationQueueTest.j b/Tests/Foundation/CPNotificationQueueTest.j new file mode 100644 index 000000000..9992ccd95 --- /dev/null +++ b/Tests/Foundation/CPNotificationQueueTest.j @@ -0,0 +1,124 @@ +@import + +var TestNotification = @"TestNotification"; + +@implementation CPNotificationQueueTest : OJTestCase +{ + int notificationCount; +} + +- (void)setUp +{ + notificationCount = 0; +} + +/*! + Test ceation +*/ +- (void)testCreate +{ + var queue = [CPNotificationQueue defaultQueue]; + [self assert:queue._notificationCenter equals:[CPNotificationCenter defaultCenter]]; + + var notificationCenter = [CPNotificationCenter new], + secondQueue = [[CPNotificationQueue alloc] initWithNotificationCenter:notificationCenter]; + [self assert:secondQueue._notificationCenter equals:notificationCenter]; +} + +- (void)testNotificationPostNow +{ + var queue = [CPNotificationQueue defaultQueue], + notification = [[CPNotification alloc] initWithName:@"TestNotification" object:self userInfo:nil]; + + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(countNotification:) name:@"TestNotification" object:self]; + [queue enqueueNotification:notification postingStyle:CPPostNow]; + [self assert:notificationCount equals:1]; + + [queue enqueueNotification:notification postingStyle:CPPostNow]; + [self assert:notificationCount equals:2]; + + [queue enqueueNotification:notification postingStyle:CPPostASAP]; + [queue enqueueNotification:notification postingStyle:CPPostWhenIdle]; + [queue enqueueNotification:notification postingStyle:CPPostNow]; + [self assert:notificationCount equals:3]; + + [queue enqueueNotification:notification postingStyle:CPPostNow]; + [queue enqueueNotification:notification postingStyle:CPPostNow]; + [self assert:notificationCount equals:5]; + + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + [self assert:notificationCount equals:5]; +} + +- (void)testNotificationPostASAP +{ + var queue = [CPNotificationQueue defaultQueue], + notification = [[CPNotification alloc] initWithName:@"TestNotification" object:self userInfo:nil], + notification2 = [[CPNotification alloc] initWithName:@"TestNotification" object:self userInfo:@{}]; + + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(countNotification:) name:@"TestNotification" object:self]; + [queue enqueueNotification:notification postingStyle:CPPostASAP]; + [self assert:notificationCount equals:0]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + [self assert:notificationCount equals:1]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + [self assert:notificationCount equals:1]; + + [queue enqueueNotification:notification postingStyle:CPPostASAP]; + [queue enqueueNotification:notification postingStyle:CPPostASAP]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + [self assert:notificationCount equals:2]; + + [queue enqueueNotification:notification postingStyle:CPPostASAP]; + [queue enqueueNotification:notification2 postingStyle:CPPostASAP coalesceMask:CPNotificationNoCoalescing forModes:nil]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + [self assert:notificationCount equals:4]; + + [queue enqueueNotification:notification postingStyle:CPPostASAP]; + [queue enqueueNotification:notification2 postingStyle:CPPostASAP coalesceMask:CPNotificationNoCoalescing forModes:nil]; + [queue dequeueNotificationsMatching:notification2 coalesceMask:CPNotificationNoCoalescing]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + [self assert:notificationCount equals:5]; + + [queue enqueueNotification:notification postingStyle:CPPostASAP]; + [queue enqueueNotification:notification2 postingStyle:CPPostASAP coalesceMask:CPNotificationNoCoalescing forModes:nil]; + [queue dequeueNotificationsMatching:notification coalesceMask:CPNotificationCoalescingOnName]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + [self assert:notificationCount equals:5]; + + [queue enqueueNotification:notification postingStyle:CPPostASAP]; + [queue enqueueNotification:notification2 postingStyle:CPPostASAP coalesceMask:CPNotificationNoCoalescing forModes:nil]; + [queue dequeueNotificationsMatching:notification coalesceMask:CPNotificationCoalescingOnSender]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + [self assert:notificationCount equals:5]; +} + +- (void)testNotificationWhenIdle +{ + var queue = [CPNotificationQueue defaultQueue], + notification = [[CPNotification alloc] initWithName:@"TestNotification" object:self userInfo:nil], + notification2 = [[CPNotification alloc] initWithName:@"TestNotificationIdle" object:self userInfo:@{}]; + + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(countNotification:) name:@"TestNotification" object:self]; + [[CPNotificationCenter defaultCenter] addObserver:self selector:@selector(countNotificationIdle:) name:@"TestNotificationIdle" object:self]; + + [queue enqueueNotification:notification postingStyle:CPPostASAP]; + [queue enqueueNotification:notification2 postingStyle:CPPostWhenIdle]; + [self assert:notificationCount equals:0]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + [self assert:notificationCount equals:1]; + [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; + [self assert:notificationCount equals:2]; +} + +- (void)countNotification:(CPNotification)aNotification +{ + notificationCount++; +} + +- (void)countNotificationIdle:(CPNotification)aNotification +{ + notificationCount++; +} + +@end \ No newline at end of file From db3c232173e013848c28171727062faaa8fe1117 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 8 Oct 2015 16:07:50 -0700 Subject: [PATCH 050/169] Fixed: add CPNotificationQueue.j in Foundation.j --- Foundation/Foundation.j | 1 + 1 file changed, 1 insertion(+) diff --git a/Foundation/Foundation.j b/Foundation/Foundation.j index c0865d410..e2d752b17 100755 --- a/Foundation/Foundation.j +++ b/Foundation/Foundation.j @@ -54,6 +54,7 @@ @import "CPMutableSet.j" @import "CPNotification.j" @import "CPNotificationCenter.j" +@import "CPNotificationQueue.j" @import "CPNull.j" @import "CPNumber.j" @import "CPNumberFormatter.j" From 3844b88f7ef6e1eac3448a7c08cfd4143910982f Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Fri, 9 Oct 2015 16:06:53 +0200 Subject: [PATCH 051/169] =?UTF-8?q?Fixed:=20The=20browser=20can=E2=80=99t?= =?UTF-8?q?=20promise=20when=20a=20javascript=20block=20will=20execute=20s?= =?UTF-8?q?o=20compiler=20flags=20can=20be=20set=20after=20the=20files=20a?= =?UTF-8?q?re=20compiled.=20This=20implementation=20works=20all=20the=20ti?= =?UTF-8?q?me.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Objective-J/Bootstrap.js | 17 +++++++++++++++++ .../Templates/Application/index-debug.html | 7 ++----- .../Templates/NibApplication/index-debug.html | 7 ++----- .../Templates/ThemeDescriptor/index-debug.html | 7 ++----- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Objective-J/Bootstrap.js b/Objective-J/Bootstrap.js index 58778f7d0..dcade2283 100644 --- a/Objective-J/Bootstrap.js +++ b/Objective-J/Bootstrap.js @@ -45,6 +45,23 @@ if (DOMBaseElementsCount > 0) pageURL = new CFURL(DOMBaseElementHref, pageURL); } +// Set compiler flags + +if (OBJJ_COMPILER_FLAGS) +{ + var flags = 0; + for (var i = 0; i < OBJJ_COMPILER_FLAGS.length; i++) + { + var flag = ObjJAcornCompiler.Flags[OBJJ_COMPILER_FLAGS[i]]; + + if (flag != null) + { + flags |= flag; + } + } + exports.setCurrentCompilerFlags(flags); +} + // Turn the main file into a URL. var mainFileURL = new CFURL(window.OBJJ_MAIN_FILE || "main.j"), diff --git a/Tools/capp/Resources/Templates/Application/index-debug.html b/Tools/capp/Resources/Templates/Application/index-debug.html index 96a9a1106..91f96346c 100644 --- a/Tools/capp/Resources/Templates/Application/index-debug.html +++ b/Tools/capp/Resources/Templates/Application/index-debug.html @@ -33,6 +33,8 @@ + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/TrackingArea/index.html b/Tests/Manual/TrackingArea/index.html new file mode 100644 index 000000000..cc1a78e03 --- /dev/null +++ b/Tests/Manual/TrackingArea/index.html @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + TrackingArea + + + + + + + + + + + + +
+
+
+ +
+
+ +
+ + diff --git a/Tests/Manual/TrackingArea/main.j b/Tests/Manual/TrackingArea/main.j new file mode 100644 index 000000000..4cbeeb386 --- /dev/null +++ b/Tests/Manual/TrackingArea/main.j @@ -0,0 +1,18 @@ +/* + * AppController.j + * TrackingArea + * + * Created by You on November 2, 2015. + * Copyright 2015, Your Company All rights reserved. + */ + +@import +@import + +@import "AppController.j" + + +function main(args, namedArgs) +{ + CPApplicationMain(args, namedArgs); +} From ad1a15faaa31584fb6898fcd52c3b62be9c35960 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Tue, 10 Nov 2015 11:29:52 +0100 Subject: [PATCH 082/169] New: Added runtime functions 'method_copyReturnType' and 'method_copyArgumentType'. --- Objective-J/Runtime.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Objective-J/Runtime.js b/Objective-J/Runtime.js index 2c07e2154..99bde2448 100644 --- a/Objective-J/Runtime.js +++ b/Objective-J/Runtime.js @@ -1025,6 +1025,18 @@ GLOBAL(method_getTypes) = function(/*Method*/ aMethod) return aMethod.method_types; } +GLOBAL(method_copyReturnType) = function(/*Method*/ aMethod) +{ + var types = aMethod.method_types; + return types ? types[0] : NULL; +} + +GLOBAL(method_copyArgumentType) = function(/*Method*/ aMethod, /*unsigned int*/ index) +{ + var types = aMethod.method_types; + return types ? types[index + 1] : NULL; +} + GLOBAL(method_getImplementation) = function(/*Method*/ aMethod) { return aMethod.method_imp; From 920daf7fde55385414d1f46e1f32483f75e9daa5 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Tue, 10 Nov 2015 11:30:29 +0100 Subject: [PATCH 083/169] Fixed: Marked function 'method_getTypes' as deprecated --- Objective-J/Runtime.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Objective-J/Runtime.js b/Objective-J/Runtime.js index 99bde2448..9188017c2 100644 --- a/Objective-J/Runtime.js +++ b/Objective-J/Runtime.js @@ -1020,8 +1020,11 @@ GLOBAL(method_getName) = function(/*Method*/ aMethod) return aMethod.method_name; } +// FIXME: This function is deprecated and should be removed in a future release +// Please use 'method_copyReturnType' or 'method_copyArgumentType' GLOBAL(method_getTypes) = function(/*Method*/ aMethod) { + console.warn("Runtime function 'method_getTypes' is deprecated. Please use function 'method_copyReturnType' or 'method_copyArgumentType'"); return aMethod.method_types; } From e4560df62fa231327d5a50328d5f0216d6a878f8 Mon Sep 17 00:00:00 2001 From: Martin Carlberg Date: Tue, 10 Nov 2015 11:31:04 +0100 Subject: [PATCH 084/169] Fixed: Use correct property in decorator --- Objective-J/Debug.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objective-J/Debug.js b/Objective-J/Debug.js index 532afc6f2..d8583f634 100644 --- a/Objective-J/Debug.js +++ b/Objective-J/Debug.js @@ -185,7 +185,7 @@ GLOBAL(objj_typecheck_decorator) = function(msgSend) if (!aReceiver) return msgSend.apply(this, arguments); - var types = aReceiver.isa.method_dtable[aSelector].types; + var types = aReceiver.isa.method_dtable[aSelector].method_types; for (var i = 2; i < arguments.length; i++) { try From 372e994617c4fa84ce2cccfea9482d3fadbf1fc0 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Wed, 11 Nov 2015 13:24:18 -0800 Subject: [PATCH 085/169] Fixed: XcodeCapp ignored by defaul the ressources folder --- Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProject.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProject.m b/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProject.m index ffedcf1f4..7da28aeea 100644 --- a/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProject.m +++ b/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProject.m @@ -16,7 +16,7 @@ static NSDictionary* XCCCappuccinoProjectDefaultSettings; static NSString * const XCCSlashReplacement = @"::"; static NSPredicate * XCCDirectoriesToIgnorePredicate = nil; -static NSString * const XCCDirectoriesToIgnorePattern = @"^(?:Build|F(?:rameworks|oundation)|AppKit|Objective-J|(?:Browser|CommonJS)\\.environment|Resources|XcodeSupport|.+\\.xcodeproj)$"; +static NSString * const XCCDirectoriesToIgnorePattern = @"^(?:Build|F(?:rameworks|oundation)|AppKit|Objective-J|(?:Browser|CommonJS)\\.environment|XcodeSupport|.+\\.xcodeproj)$"; static NSArray *XCCCappuccinoProjectDefaultIgnoredPaths = nil; From 671ed3c2fec816d243e30cd8856ecdec423e7e15 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 12 Nov 2015 11:59:00 -0800 Subject: [PATCH 086/169] Fixed: memory leak in XcodeCapp due to NSAppleScript. We now use osascript --- Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.m | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.m b/Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.m index d6d8f165d..4f87baf41 100644 --- a/Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.m +++ b/Tools/XcodeCapp/XcodeCapp/XcodeProjectCloser.m @@ -28,12 +28,18 @@ static const char *kCloseXcodeProjectScript = @implementation XcodeProjectCloser + (void)closeXcodeProjectForProject:(NSString *)projectPath -{ - NSString *format = @(kCloseXcodeProjectScript); - NSString *source = [NSString stringWithFormat:format, projectPath]; - NSAppleScript *script = [[NSAppleScript alloc] initWithSource:source]; - - [script executeAndReturnError:nil]; +{ + NSString *format = @(kCloseXcodeProjectScript); + NSString *source = [NSString stringWithFormat:format, projectPath]; + NSString *arguments = [NSString stringWithFormat:@"-e %@", source]; + NSTask *task = [[NSTask alloc] init]; + + [task setLaunchPath:@"/usr/bin/osascript"]; + [task setArguments:[NSArray arrayWithObjects:arguments, nil]]; + [task launch]; + [task waitUntilExit]; + + DDLogVerbose(@"Osascript launched for the project %@", projectPath); } @end From bacb7018cba2e892a952f80c669cac9f84c31c47 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Thu, 12 Nov 2015 16:29:46 -0800 Subject: [PATCH 087/169] Fixed: thread of the spinning was always launched even if the spinner was not displayed in XcodeCapp --- .../XcodeCapp/XCCCappuccinoProjectControllerDataView.m | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProjectControllerDataView.m b/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProjectControllerDataView.m index 524205f90..82da11a05 100644 --- a/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProjectControllerDataView.m +++ b/Tools/XcodeCapp/XcodeCapp/XCCCappuccinoProjectControllerDataView.m @@ -93,6 +93,7 @@ static NSColor * XCCCappuccinoProjectDataViewColorError; self->boxStatus.fillColor = XCCCappuccinoProjectDataViewColorStopped; self->buttonSwitchStatus.image = self.backgroundStyle == NSBackgroundStyleDark ? [NSImage imageNamed:@"run-white"] : [NSImage imageNamed:@"run"]; self->operationsProgressIndicator.hidden = YES; + [self->operationsProgressIndicator stopAnimation:self]; break; case XCCCappuccinoProjectStatusListening: @@ -103,6 +104,7 @@ static NSColor * XCCCappuccinoProjectDataViewColorError; { self->operationsProgressIndicator.hidden = YES; [self->operationsProgressIndicator setNeedsDisplay:YES]; + [self->operationsProgressIndicator stopAnimation:self]; } else if (self.controller.operationsTotal <= 4) { @@ -115,6 +117,7 @@ static NSColor * XCCCappuccinoProjectDataViewColorError; self->operationsProgressIndicator.hidden = NO; self->operationsProgressIndicator.indeterminate = NO; self->operationsProgressIndicator.currentValue = self.controller.operationsProgress; + [self->operationsProgressIndicator startAnimation:self]; [self->operationsProgressIndicator setNeedsDisplay:YES]; } From f41504ca57d3cfc3b361626a26e2b16438745ec3 Mon Sep 17 00:00:00 2001 From: Alexandre Wilhelm Date: Fri, 13 Nov 2015 10:48:02 -0800 Subject: [PATCH 088/169] Fixed: remove library CocoaLumberjack in XcodeCapp. This lib added memory leaks when using it in an NSOperation. We now simply use NSLog --- .../XcodeCapp.xcodeproj/project.pbxproj | 32 - Tools/XcodeCapp/XcodeCapp/AppDelegate.m | 28 +- Tools/XcodeCapp/XcodeCapp/DDLogLevel.h | 17 - Tools/XcodeCapp/XcodeCapp/DDLogLevel.m | 27 - .../XcodeCapp/Lumberjack/CLI/CLIColor.h | 44 + .../XcodeCapp/Lumberjack/CLI/CLIColor.m | 55 + .../XcodeCapp/Lumberjack/CocoaLumberjack.h | 81 + .../XcodeCapp/Lumberjack/DDASLLogCapture.h | 48 + .../XcodeCapp/Lumberjack/DDASLLogCapture.m | 230 +++ .../XcodeCapp/Lumberjack/DDASLLogger.h | 41 - .../XcodeCapp/Lumberjack/DDASLLogger.m | 99 -- .../Lumberjack/DDAbstractDatabaseLogger.h | 123 ++ .../Lumberjack/DDAbstractDatabaseLogger.m | 660 ++++++++ .../XcodeCapp/Lumberjack/DDAssertMacros.h | 26 + .../XcodeCapp/Lumberjack/DDFileLogger.h | 487 ++++++ .../XcodeCapp/Lumberjack/DDFileLogger.m | 1484 +++++++++++++++++ .../XcodeCapp/Lumberjack/DDLegacyMacros.h | 75 + .../XcodeCapp/Lumberjack/DDLog+LOGV.h | 83 + Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog.h | 596 ------- Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog.m | 1067 ------------ .../XcodeCapp/Lumberjack/DDLogMacros.h | 82 + .../XcodeCapp/Lumberjack/DDTTYLogger.h | 167 -- .../XcodeCapp/Lumberjack/DDTTYLogger.m | 1480 ---------------- .../Extensions/DDContextFilterLogFormatter.h | 117 ++ .../Extensions/DDContextFilterLogFormatter.m | 192 +++ .../Extensions/DDDispatchQueueLogFormatter.h | 178 ++ .../Extensions/DDDispatchQueueLogFormatter.m | 278 +++ .../Lumberjack/Extensions/DDMultiFormatter.h | 56 + .../Lumberjack/Extensions/DDMultiFormatter.m | 144 ++ .../XcodeCapp/XCCCappuccinoProject.m | 6 +- .../XCCCappuccinoProjectController.m | 40 +- Tools/XcodeCapp/XcodeCapp/XCCMainController.m | 12 +- Tools/XcodeCapp/XcodeCapp/XCCPPXOperation.m | 9 +- .../XcodeCapp/XCCSourceProcessingOperation.m | 9 +- .../XcodeCapp/XCCSourcesFinderOperation.m | 17 +- Tools/XcodeCapp/XcodeCapp/XCCTaskLauncher.m | 18 +- Tools/XcodeCapp/XcodeCapp/XCCUserDefaults.h | 1 - Tools/XcodeCapp/XcodeCapp/XCCUserDefaults.m | 1 - .../XcodeCapp/XcodeCapp/XcodeCapp-Prefix.pch | 9 - .../XcodeCapp/XcodeCapp/XcodeProjectCloser.m | 3 +- 40 files changed, 4504 insertions(+), 3618 deletions(-) delete mode 100644 Tools/XcodeCapp/XcodeCapp/DDLogLevel.h delete mode 100644 Tools/XcodeCapp/XcodeCapp/DDLogLevel.m create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/CLI/CLIColor.h create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/CLI/CLIColor.m create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/CocoaLumberjack.h create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogCapture.h create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogCapture.m delete mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.h delete mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.m create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAbstractDatabaseLogger.h create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAbstractDatabaseLogger.m create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAssertMacros.h create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDFileLogger.h create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDFileLogger.m create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLegacyMacros.h create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog+LOGV.h delete mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog.h delete mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLog.m create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDLogMacros.h delete mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDTTYLogger.h delete mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/DDTTYLogger.m create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/Extensions/DDContextFilterLogFormatter.h create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/Extensions/DDContextFilterLogFormatter.m create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/Extensions/DDDispatchQueueLogFormatter.h create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/Extensions/DDDispatchQueueLogFormatter.m create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/Extensions/DDMultiFormatter.h create mode 100755 Tools/XcodeCapp/XcodeCapp/Lumberjack/Extensions/DDMultiFormatter.m diff --git a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj index 2783085e1..350946963 100644 --- a/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj +++ b/Tools/XcodeCapp/XcodeCapp.xcodeproj/project.pbxproj @@ -29,12 +29,8 @@ 6824CDF01B0E9F1400F73447 /* XCCOperationError.m in Sources */ = {isa = PBXBuildFile; fileRef = 6824CDEF1B0E9F1400F73447 /* XCCOperationError.m */; }; 6841F2441AF98CE600CFE60E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6841F2431AF98CE600CFE60E /* main.m */; }; 6841F2461AF98CE600CFE60E /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6841F2451AF98CE600CFE60E /* Images.xcassets */; }; - 6841F2651AF98DCB00CFE60E /* DDASLLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 6841F2601AF98DCB00CFE60E /* DDASLLogger.m */; }; - 6841F2661AF98DCB00CFE60E /* DDLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 6841F2621AF98DCB00CFE60E /* DDLog.m */; }; - 6841F2671AF98DCB00CFE60E /* DDTTYLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 6841F2641AF98DCB00CFE60E /* DDTTYLogger.m */; }; 6841F26C1AF98DDD00CFE60E /* mod_pbxproj.py in Resources */ = {isa = PBXBuildFile; fileRef = 6841F2691AF98DDD00CFE60E /* mod_pbxproj.py */; }; 6841F26E1AF98DDD00CFE60E /* pbxprojModifier.py in Resources */ = {isa = PBXBuildFile; fileRef = 6841F26B1AF98DDD00CFE60E /* pbxprojModifier.py */; }; - 6841F2781AF98FA300CFE60E /* DDLogLevel.m in Sources */ = {isa = PBXBuildFile; fileRef = 6841F2771AF98FA300CFE60E /* DDLogLevel.m */; }; 6841F27C1AF990C300CFE60E /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 6841F27A1AF990C300CFE60E /* Debug.xcconfig */; }; 6841F27D1AF990C300CFE60E /* Release.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 6841F27B1AF990C300CFE60E /* Release.xcconfig */; }; 6841F2A51AF9932300CFE60E /* project.pbxproj in Resources */ = {isa = PBXBuildFile; fileRef = 6841F28A1AF9932300CFE60E /* project.pbxproj */; }; @@ -89,17 +85,9 @@ 6841F2401AF98CE600CFE60E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 6841F2431AF98CE600CFE60E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 6841F2451AF98CE600CFE60E /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ../Images.xcassets; sourceTree = ""; }; - 6841F25F1AF98DCB00CFE60E /* DDASLLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDASLLogger.h; sourceTree = ""; }; - 6841F2601AF98DCB00CFE60E /* DDASLLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDASLLogger.m; sourceTree = ""; }; - 6841F2611AF98DCB00CFE60E /* DDLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDLog.h; sourceTree = ""; }; - 6841F2621AF98DCB00CFE60E /* DDLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDLog.m; sourceTree = ""; }; - 6841F2631AF98DCB00CFE60E /* DDTTYLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDTTYLogger.h; sourceTree = ""; }; - 6841F2641AF98DCB00CFE60E /* DDTTYLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDTTYLogger.m; sourceTree = ""; }; 6841F2691AF98DDD00CFE60E /* mod_pbxproj.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = mod_pbxproj.py; sourceTree = ""; }; 6841F26B1AF98DDD00CFE60E /* pbxprojModifier.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = pbxprojModifier.py; sourceTree = ""; }; 6841F2741AF98F6F00CFE60E /* CoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreServices.framework; path = System/Library/Frameworks/CoreServices.framework; sourceTree = SDKROOT; }; - 6841F2761AF98FA300CFE60E /* DDLogLevel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDLogLevel.h; sourceTree = ""; }; - 6841F2771AF98FA300CFE60E /* DDLogLevel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDLogLevel.m; sourceTree = ""; }; 6841F2791AF9902B00CFE60E /* XcodeCapp-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "XcodeCapp-Prefix.pch"; sourceTree = ""; }; 6841F27A1AF990C300CFE60E /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; 6841F27B1AF990C300CFE60E /* Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; @@ -150,7 +138,6 @@ isa = PBXGroup; children = ( 0275390E1B227D6700F6D824 /* YRKSpinningProgressIndicator */, - 6841F25E1AF98DCB00CFE60E /* Lumberjack */, ); name = Externals; sourceTree = ""; @@ -246,19 +233,6 @@ name = "Supporting Files"; sourceTree = ""; }; - 6841F25E1AF98DCB00CFE60E /* Lumberjack */ = { - isa = PBXGroup; - children = ( - 6841F25F1AF98DCB00CFE60E /* DDASLLogger.h */, - 6841F2601AF98DCB00CFE60E /* DDASLLogger.m */, - 6841F2611AF98DCB00CFE60E /* DDLog.h */, - 6841F2621AF98DCB00CFE60E /* DDLog.m */, - 6841F2631AF98DCB00CFE60E /* DDTTYLogger.h */, - 6841F2641AF98DCB00CFE60E /* DDTTYLogger.m */, - ); - path = Lumberjack; - sourceTree = ""; - }; 6841F2681AF98DDD00CFE60E /* Scripts */ = { isa = PBXGroup; children = ( @@ -287,8 +261,6 @@ 6841F2B81AFA83E900CFE60E /* XCCUserDefaults.h */, 6841F2BD1AFA965300CFE60E /* XCCTaskLauncher.h */, 6841F2BE1AFA965300CFE60E /* XCCTaskLauncher.m */, - 6841F2761AF98FA300CFE60E /* DDLogLevel.h */, - 6841F2771AF98FA300CFE60E /* DDLogLevel.m */, 6815BBE91AFC24430030D8BB /* XcodeProjectCloser.h */, 6815BBEA1AFC24430030D8BB /* XcodeProjectCloser.m */, 6863FBA11AFD55A900040C8E /* XCCFSEventLogUtils.h */, @@ -409,7 +381,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6841F2781AF98FA300CFE60E /* DDLogLevel.m in Sources */, 68B6BF321B1E2546003B265B /* XCCPPXOperation.m in Sources */, 021B94701B20E31F00F12DDA /* XCCSettingsViewController.m in Sources */, 0255B8401B1F71FB000CA4BC /* AppDelegate.m in Sources */, @@ -417,7 +388,6 @@ 6841F2BF1AFA965300CFE60E /* XCCTaskLauncher.m in Sources */, 027539111B227D7500F6D824 /* YRKSpinningProgressIndicator.m in Sources */, 6841F2C41AFABD7200CFE60E /* XCCCappuccinoProject.m in Sources */, - 6841F2661AF98DCB00CFE60E /* DDLog.m in Sources */, 686ACD311B16397F0089EB03 /* XCCCappuccinoProjectController.m in Sources */, 021B946C1B20D71200F12DDA /* XCCErrorsViewController.m in Sources */, 021B94651B20CECA00F12DDA /* XCCOperationsViewController.m in Sources */, @@ -430,12 +400,10 @@ 686C69711B0FAE620095BB3C /* XCCOperationErrorHeaderDataView.m in Sources */, 6824CDF01B0E9F1400F73447 /* XCCOperationError.m in Sources */, 021B94751B21112500F12DDA /* XCCWelcomeView.m in Sources */, - 6841F2671AF98DCB00CFE60E /* DDTTYLogger.m in Sources */, 6841F2441AF98CE600CFE60E /* main.m in Sources */, 6824CDDA1B0D5AA700F73447 /* XCCOperationDataView.m in Sources */, 6841F2CA1AFADEBC00CFE60E /* XCCSourcesFinderOperation.m in Sources */, 681ADE8F1B0D032C00FC8E08 /* XCCPath.m in Sources */, - 6841F2651AF98DCB00CFE60E /* DDASLLogger.m in Sources */, 6841F2B71AFA83D500CFE60E /* XCCUserDefaults.m in Sources */, 6824CDEA1B0E9CDB00F73447 /* XCCOperationErrorDataView.m in Sources */, ); diff --git a/Tools/XcodeCapp/XcodeCapp/AppDelegate.m b/Tools/XcodeCapp/XcodeCapp/AppDelegate.m index cc53ac681..e405bbfd1 100644 --- a/Tools/XcodeCapp/XcodeCapp/AppDelegate.m +++ b/Tools/XcodeCapp/XcodeCapp/AppDelegate.m @@ -19,7 +19,6 @@ { NSDictionary *appDefaults = @{ XCCUserDefaultsAutoOpenXcodeProject: @YES, - XCCUserDefaultsLogLevel: @LOG_LEVEL_WARN, XCCUserDefaultsMaxNumberOfConcurrentOperations: @20 }; @@ -40,26 +39,6 @@ self->statusItem.length = self->imageStatusInactive.size.width + 12; } -- (void)_initLogging -{ -#if DEBUG - [DDLog addLogger:[DDTTYLogger sharedInstance]]; - [[DDTTYLogger sharedInstance] setColorsEnabled:YES]; - [DDLogLevel setLogLevel:LOG_LEVEL_VERBOSE]; -#else - [DDLog addLogger:[DDASLLogger sharedInstance]]; - - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - int logLevel = (int)[defaults integerForKey:XCCUserDefaultsLogLevel]; - NSUInteger modifiers = [NSEvent modifierFlags]; - - if (modifiers & NSAlternateKeyMask) - logLevel = LOG_LEVEL_VERBOSE; - - [DDLogLevel setLogLevel:logLevel]; -#endif -} - - (void)_initOperationQueue { self.mainOperationQueue = [NSOperationQueue new]; @@ -116,12 +95,11 @@ - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { - DDLogVerbose(@"\n******************************\n** XcodeCapp started **\n******************************\n"); + NSLog(@"\n******************************\n** XcodeCapp started **\n******************************\n"); self.version = [NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]; [self _initUserDefaults]; - [self _initLogging]; [self _initOperationQueue]; [self _initStatusItem]; @@ -132,7 +110,7 @@ - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)app { - DDLogVerbose(@"Stop listening to all projects"); + NSLog(@"Stop listening to all projects"); [self.mainWindowController notifyCappuccinoControllersApplicationIsClosing]; [[NSUserDefaults standardUserDefaults] synchronize]; @@ -141,7 +119,7 @@ - (void)applicationWillTerminate:(NSNotification *)aNotification { - DDLogVerbose(@"\n******************************\n** XcodeCapp stopped **\n******************************\n"); + NSLog(@"\n******************************\n** XcodeCapp stopped **\n******************************\n"); } - (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag diff --git a/Tools/XcodeCapp/XcodeCapp/DDLogLevel.h b/Tools/XcodeCapp/XcodeCapp/DDLogLevel.h deleted file mode 100644 index e1c80eb82..000000000 --- a/Tools/XcodeCapp/XcodeCapp/DDLogLevel.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// DDLogLevel.h -// XcodeCapp -// -// Created by Aparajita on 4/29/13. -// Copyright (c) 2013 Cappuccino Project. All rights reserved. -// - -#import - -extern int ddLogLevel; - -@interface DDLogLevel : NSObject - -+ (void)setLogLevel:(int)logLevel; - -@end diff --git a/Tools/XcodeCapp/XcodeCapp/DDLogLevel.m b/Tools/XcodeCapp/XcodeCapp/DDLogLevel.m deleted file mode 100644 index a0fb829b1..000000000 --- a/Tools/XcodeCapp/XcodeCapp/DDLogLevel.m +++ /dev/null @@ -1,27 +0,0 @@ -// -// DDLog.m -// XcodeCapp -// -// Created by Aparajita on 4/29/13. -// Copyright (c) 2013 Cappuccino Project. All rights reserved. -// - -#import "DDLogLevel.h" - - -int ddLogLevel = LOG_LEVEL_OFF; - - -@implementation DDLogLevel - -+ (int)ddLogLevel -{ - return ddLogLevel; -} - -+ (void)setLogLevel:(int)logLevel -{ - ddLogLevel = logLevel; -} - -@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/CLI/CLIColor.h b/Tools/XcodeCapp/XcodeCapp/Lumberjack/CLI/CLIColor.h new file mode 100755 index 000000000..cfa0909cb --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/CLI/CLIColor.h @@ -0,0 +1,44 @@ +// Software License Agreement (BSD License) +// +// Copyright (c) 2010-2015, Deusty, LLC +// All rights reserved. +// +// Redistribution and use of this software in source and binary forms, +// with or without modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Neither the name of Deusty nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific +// prior written permission of Deusty, LLC. + +#import +#import + +/** + * This class represents an NSColor replacement for CLI projects that don't link with AppKit + **/ +@interface CLIColor : NSObject + +/** + * Convenience method for creating a `CLIColor` instance from RGBA params + * + * @param red red channel, between 0 and 1 + * @param green green channel, between 0 and 1 + * @param blue blue channel, between 0 and 1 + * @param alpha alpha channel, between 0 and 1 + */ ++ (CLIColor *)colorWithCalibratedRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; + +/** + * Get the RGBA components from a `CLIColor` + * + * @param red red channel, between 0 and 1 + * @param green green channel, between 0 and 1 + * @param blue blue channel, between 0 and 1 + * @param alpha alpha channel, between 0 and 1 + */ +- (void)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/CLI/CLIColor.m b/Tools/XcodeCapp/XcodeCapp/Lumberjack/CLI/CLIColor.m new file mode 100755 index 000000000..c952c18cf --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/CLI/CLIColor.m @@ -0,0 +1,55 @@ +// Software License Agreement (BSD License) +// +// Copyright (c) 2010-2015, Deusty, LLC +// All rights reserved. +// +// Redistribution and use of this software in source and binary forms, +// with or without modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Neither the name of Deusty nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific +// prior written permission of Deusty, LLC. + +#import "CLIColor.h" + +@interface CLIColor () { + CGFloat _red, _green, _blue, _alpha; +} + +@end + + +@implementation CLIColor + ++ (CLIColor *)colorWithCalibratedRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha { + CLIColor *color = [CLIColor new]; + + color->_red = red; + color->_green = green; + color->_blue = blue; + color->_alpha = alpha; + return color; +} + +- (void)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha { + if (red) { + *red = _red; + } + + if (green) { + *green = _green; + } + + if (blue) { + *blue = _blue; + } + + if (alpha) { + *alpha = _alpha; + } +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/CocoaLumberjack.h b/Tools/XcodeCapp/XcodeCapp/Lumberjack/CocoaLumberjack.h new file mode 100755 index 000000000..0b568fb09 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/CocoaLumberjack.h @@ -0,0 +1,81 @@ +// Software License Agreement (BSD License) +// +// Copyright (c) 2010-2015, Deusty, LLC +// All rights reserved. +// +// Redistribution and use of this software in source and binary forms, +// with or without modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Neither the name of Deusty nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific +// prior written permission of Deusty, LLC. + +/** + * Welcome to CocoaLumberjack! + * + * The project page has a wealth of documentation if you have any questions. + * https://github.com/CocoaLumberjack/CocoaLumberjack + * + * If you're new to the project you may wish to read "Getting Started" at: + * Documentation/GettingStarted.md + * + * Otherwise, here is a quick refresher. + * There are three steps to using the macros: + * + * Step 1: + * Import the header in your implementation or prefix file: + * + * #import + * + * Step 2: + * Define your logging level in your implementation file: + * + * // Log levels: off, error, warn, info, verbose + * static const DDLogLevel ddLogLevel = DDLogLevelVerbose; + * + * Step 2 [3rd party frameworks]: + * + * Define your LOG_LEVEL_DEF to a different variable/function than ddLogLevel: + * + * // #undef LOG_LEVEL_DEF // Undefine first only if needed + * #define LOG_LEVEL_DEF myLibLogLevel + * + * Define your logging level in your implementation file: + * + * // Log levels: off, error, warn, info, verbose + * static const DDLogLevel myLibLogLevel = DDLogLevelVerbose; + * + * Step 3: + * Replace your NSLog statements with DDLog statements according to the severity of the message. + * + * NSLog(@"Fatal error, no dohickey found!"); -> DDLogError(@"Fatal error, no dohickey found!"); + * + * DDLog works exactly the same as NSLog. + * This means you can pass it multiple variables just like NSLog. + **/ + +#import + +// Disable legacy macros +#ifndef DD_LEGACY_MACROS + #define DD_LEGACY_MACROS 0 +#endif + +// Core +#import "DDLog.h" + +// Main macros +#import "DDLogMacros.h" +#import "DDAssertMacros.h" + +// Capture ASL +#import "DDASLLogCapture.h" + +// Loggers +#import "DDTTYLogger.h" +#import "DDASLLogger.h" +#import "DDFileLogger.h" + diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogCapture.h b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogCapture.h new file mode 100755 index 000000000..f7fa79f3c --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogCapture.h @@ -0,0 +1,48 @@ +// Software License Agreement (BSD License) +// +// Copyright (c) 2010-2015, Deusty, LLC +// All rights reserved. +// +// Redistribution and use of this software in source and binary forms, +// with or without modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Neither the name of Deusty nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific +// prior written permission of Deusty, LLC. + +#import "DDASLLogger.h" + +@protocol DDLogger; + +/** + * This class provides the ability to capture the ASL (Apple System Logs) + */ +@interface DDASLLogCapture : NSObject + +/** + * Start capturing logs + */ ++ (void)start; + +/** + * Stop capturing logs + */ ++ (void)stop; + +/** + * Returns the current capture level. + * @note Default log level: DDLogLevelVerbose (i.e. capture all ASL messages). + */ ++ (DDLogLevel)captureLevel; + +/** + * Set the capture level + * + * @param level new level + */ ++ (void)setCaptureLevel:(DDLogLevel)level; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogCapture.m b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogCapture.m new file mode 100755 index 000000000..98d5342d7 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogCapture.m @@ -0,0 +1,230 @@ +// Software License Agreement (BSD License) +// +// Copyright (c) 2010-2015, Deusty, LLC +// All rights reserved. +// +// Redistribution and use of this software in source and binary forms, +// with or without modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Neither the name of Deusty nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific +// prior written permission of Deusty, LLC. + +#import "DDASLLogCapture.h" + +// Disable legacy macros +#ifndef DD_LEGACY_MACROS + #define DD_LEGACY_MACROS 0 +#endif + +#import "DDLog.h" + +#include +#include +#include +#include + +static BOOL _cancel = YES; +static DDLogLevel _captureLevel = DDLogLevelVerbose; + +#ifdef __IPHONE_8_0 + #define DDASL_IOS_PIVOT_VERSION __IPHONE_8_0 +#endif +#ifdef __MAC_10_10 + #define DDASL_OSX_PIVOT_VERSION __MAC_10_10 +#endif + +@implementation DDASLLogCapture + +static aslmsg (*dd_asl_next)(aslresponse obj); +static void (*dd_asl_release)(aslresponse obj); + ++ (void)initialize +{ + #if (defined(DDASL_IOS_PIVOT_VERSION) && __IPHONE_OS_VERSION_MAX_ALLOWED >= DDASL_IOS_PIVOT_VERSION) || (defined(DDASL_OSX_PIVOT_VERSION) && __MAC_OS_X_VERSION_MAX_ALLOWED >= DDASL_OSX_PIVOT_VERSION) + #if __IPHONE_OS_VERSION_MIN_REQUIRED < DDASL_IOS_PIVOT_VERSION || __MAC_OS_X_VERSION_MIN_REQUIRED < DDASL_OSX_PIVOT_VERSION + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + // Building on falsely advertised SDK, targeting deprecated API + dd_asl_next = &aslresponse_next; + dd_asl_release = &aslresponse_free; + #pragma GCC diagnostic pop + #else + // Building on lastest, correct SDK, targeting latest API + dd_asl_next = &asl_next; + dd_asl_release = &asl_release; + #endif + #else + // Building on old SDKs, targeting deprecated API + dd_asl_next = &aslresponse_next; + dd_asl_release = &aslresponse_free; + #endif +} + ++ (void)start { + // Ignore subsequent calls + if (!_cancel) { + return; + } + + _cancel = NO; + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) { + [self captureAslLogs]; + }); +} + ++ (void)stop { + _cancel = YES; +} + ++ (DDLogLevel)captureLevel { + return _captureLevel; +} + ++ (void)setCaptureLevel:(DDLogLevel)level { + _captureLevel = level; +} + +#pragma mark - Private methods + ++ (void)configureAslQuery:(aslmsg)query { + const char param[] = "7"; // ASL_LEVEL_DEBUG, which is everything. We'll rely on regular DDlog log level to filter + + asl_set_query(query, ASL_KEY_LEVEL, param, ASL_QUERY_OP_LESS_EQUAL | ASL_QUERY_OP_NUMERIC); + + // Don't retrieve logs from our own DDASLLogger + asl_set_query(query, kDDASLKeyDDLog, kDDASLDDLogValue, ASL_QUERY_OP_NOT_EQUAL); + +#if !TARGET_OS_IPHONE || TARGET_SIMULATOR + int processId = [[NSProcessInfo processInfo] processIdentifier]; + char pid[16]; + sprintf(pid, "%d", processId); + asl_set_query(query, ASL_KEY_PID, pid, ASL_QUERY_OP_EQUAL | ASL_QUERY_OP_NUMERIC); +#endif +} + ++ (void)aslMessageReceived:(aslmsg)msg { + const char* messageCString = asl_get( msg, ASL_KEY_MSG ); + if ( messageCString == NULL ) + return; + + int flag; + BOOL async; + + const char* levelCString = asl_get(msg, ASL_KEY_LEVEL); + switch (levelCString? atoi(levelCString) : 0) { + // By default all NSLog's with a ASL_LEVEL_WARNING level + case ASL_LEVEL_EMERG : + case ASL_LEVEL_ALERT : + case ASL_LEVEL_CRIT : flag = DDLogFlagError; async = NO; break; + case ASL_LEVEL_ERR : flag = DDLogFlagWarning; async = YES; break; + case ASL_LEVEL_WARNING : flag = DDLogFlagInfo; async = YES; break; + case ASL_LEVEL_NOTICE : flag = DDLogFlagDebug; async = YES; break; + case ASL_LEVEL_INFO : + case ASL_LEVEL_DEBUG : + default : flag = DDLogFlagVerbose; async = YES; break; + } + + if (!(_captureLevel & flag)) { + return; + } + + // NSString * sender = [NSString stringWithCString:asl_get(msg, ASL_KEY_SENDER) encoding:NSUTF8StringEncoding]; + NSString *message = @(messageCString); + + const char* secondsCString = asl_get( msg, ASL_KEY_TIME ); + const char* nanoCString = asl_get( msg, ASL_KEY_TIME_NSEC ); + NSTimeInterval seconds = secondsCString ? strtod(secondsCString, NULL) : [NSDate timeIntervalSinceReferenceDate] - NSTimeIntervalSince1970; + double nanoSeconds = nanoCString? strtod(nanoCString, NULL) : 0; + NSTimeInterval totalSeconds = seconds + (nanoSeconds / 1e9); + + NSDate *timeStamp = [NSDate dateWithTimeIntervalSince1970:totalSeconds]; + + DDLogMessage *logMessage = [[DDLogMessage alloc]initWithMessage:message + level:_captureLevel + flag:flag + context:0 + file:@"DDASLLogCapture" + function:0 + line:0 + tag:nil + options:0 + timestamp:timeStamp]; + + [DDLog log:async message:logMessage]; +} + ++ (void)captureAslLogs { + @autoreleasepool + { + /* + We use ASL_KEY_MSG_ID to see each message once, but there's no + obvious way to get the "next" ID. To bootstrap the process, we'll + search by timestamp until we've seen a message. + */ + + struct timeval timeval = { + .tv_sec = 0 + }; + gettimeofday(&timeval, NULL); + unsigned long long startTime = timeval.tv_sec; + __block unsigned long long lastSeenID = 0; + + /* + syslogd posts kNotifyASLDBUpdate (com.apple.system.logger.message) + through the notify API when it saves messages to the ASL database. + There is some coalescing - currently it is sent at most twice per + second - but there is no documented guarantee about this. In any + case, there may be multiple messages per notification. + + Notify notifications don't carry any payload, so we need to search + for the messages. + */ + int notifyToken = 0; // Can be used to unregister with notify_cancel(). + notify_register_dispatch(kNotifyASLDBUpdate, ¬ifyToken, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(int token) + { + // At least one message has been posted; build a search query. + @autoreleasepool + { + aslmsg query = asl_new(ASL_TYPE_QUERY); + char stringValue[64]; + + if (lastSeenID > 0) { + snprintf(stringValue, sizeof stringValue, "%llu", lastSeenID); + asl_set_query(query, ASL_KEY_MSG_ID, stringValue, ASL_QUERY_OP_GREATER | ASL_QUERY_OP_NUMERIC); + } else { + snprintf(stringValue, sizeof stringValue, "%llu", startTime); + asl_set_query(query, ASL_KEY_TIME, stringValue, ASL_QUERY_OP_GREATER_EQUAL | ASL_QUERY_OP_NUMERIC); + } + + [self configureAslQuery:query]; + + // Iterate over new messages. + aslmsg msg; + aslresponse response = asl_search(NULL, query); + + while ((msg = dd_asl_next(response))) + { + [self aslMessageReceived:msg]; + + // Keep track of which messages we've seen. + lastSeenID = atoll(asl_get(msg, ASL_KEY_MSG_ID)); + } + dd_asl_release(response); + asl_free(query); + + if (_cancel) { + notify_cancel(token); + return; + } + + } + }); + } +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.h b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.h deleted file mode 100755 index 0f2e9633e..000000000 --- a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.h +++ /dev/null @@ -1,41 +0,0 @@ -#import -#import - -#import "DDLog.h" - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted - * - * - * This class provides a logger for the Apple System Log facility. - * - * As described in the "Getting Started" page, - * the traditional NSLog() function directs it's output to two places: - * - * - Apple System Log - * - StdErr (if stderr is a TTY) so log statements show up in Xcode console - * - * To duplicate NSLog() functionality you can simply add this logger and a tty logger. - * However, if you instead choose to use file logging (for faster performance), - * you may choose to use a file logger and a tty logger. -**/ - -@interface DDASLLogger : DDAbstractLogger -{ - aslclient client; -} - -+ (DDASLLogger *)sharedInstance; - -// Inherited from DDAbstractLogger - -// - (id )logFormatter; -// - (void)setLogFormatter:(id )formatter; - -@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.m b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.m deleted file mode 100755 index 540efada1..000000000 --- a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDASLLogger.m +++ /dev/null @@ -1,99 +0,0 @@ -#import "DDASLLogger.h" - -#import - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted -**/ - -#if ! __has_feature(objc_arc) -#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). -#endif - - -@implementation DDASLLogger - -static DDASLLogger *sharedInstance; - -/** - * The runtime sends initialize to each class in a program exactly one time just before the class, - * or any class that inherits from it, is sent its first message from within the program. (Thus the - * method may never be invoked if the class is not used.) The runtime sends the initialize message to - * classes in a thread-safe manner. Superclasses receive this message before their subclasses. - * - * This method may also be called directly (assumably by accident), hence the safety mechanism. -**/ -+ (void)initialize -{ - static BOOL initialized = NO; - if (!initialized) - { - initialized = YES; - - sharedInstance = [[DDASLLogger alloc] init]; - } -} - -+ (DDASLLogger *)sharedInstance -{ - return sharedInstance; -} - -- (instancetype)init -{ - if (sharedInstance != nil) - { - return nil; - } - - if ((self = [super init])) - { - // A default asl client is provided for the main thread, - // but background threads need to create their own client. - - client = asl_open(NULL, "com.apple.console", 0); - } - return self; -} - -- (void)logMessage:(DDLogMessage *)logMessage -{ - NSString *logMsg = logMessage->logMsg; - - if (formatter) - { - logMsg = [formatter formatLogMessage:logMessage]; - } - - if (logMsg) - { - const char *msg = [logMsg UTF8String]; - - int aslLogLevel; - switch (logMessage->logLevel) - { - // Note: By default ASL will filter anything above level 5 (Notice). - // So our mappings shouldn't go above that level. - - case 1 : aslLogLevel = ASL_LEVEL_CRIT; break; - case 2 : aslLogLevel = ASL_LEVEL_ERR; break; - case 3 : aslLogLevel = ASL_LEVEL_WARNING; break; - default : aslLogLevel = ASL_LEVEL_NOTICE; break; - } - - asl_log(client, NULL, aslLogLevel, "%s", msg); - } -} - -- (NSString *)loggerName -{ - return @"cocoa.lumberjack.aslLogger"; -} - -@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAbstractDatabaseLogger.h b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAbstractDatabaseLogger.h new file mode 100755 index 000000000..aad36661e --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAbstractDatabaseLogger.h @@ -0,0 +1,123 @@ +// Software License Agreement (BSD License) +// +// Copyright (c) 2010-2015, Deusty, LLC +// All rights reserved. +// +// Redistribution and use of this software in source and binary forms, +// with or without modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Neither the name of Deusty nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific +// prior written permission of Deusty, LLC. + +// Disable legacy macros +#ifndef DD_LEGACY_MACROS + #define DD_LEGACY_MACROS 0 +#endif + +#import "DDLog.h" + +/** + * This class provides an abstract implementation of a database logger. + * + * That is, it provides the base implementation for a database logger to build atop of. + * All that is needed for a concrete database logger is to extend this class + * and override the methods in the implementation file that are prefixed with "db_". + **/ +@interface DDAbstractDatabaseLogger : DDAbstractLogger { + +@protected + NSUInteger _saveThreshold; + NSTimeInterval _saveInterval; + NSTimeInterval _maxAge; + NSTimeInterval _deleteInterval; + BOOL _deleteOnEverySave; + + BOOL _saveTimerSuspended; + NSUInteger _unsavedCount; + dispatch_time_t _unsavedTime; + dispatch_source_t _saveTimer; + dispatch_time_t _lastDeleteTime; + dispatch_source_t _deleteTimer; +} + +/** + * Specifies how often to save the data to disk. + * Since saving is an expensive operation (disk io) it is not done after every log statement. + * These properties allow you to configure how/when the logger saves to disk. + * + * A save is done when either (whichever happens first): + * + * - The number of unsaved log entries reaches saveThreshold + * - The amount of time since the oldest unsaved log entry was created reaches saveInterval + * + * You can optionally disable the saveThreshold by setting it to zero. + * If you disable the saveThreshold you are entirely dependent on the saveInterval. + * + * You can optionally disable the saveInterval by setting it to zero (or a negative value). + * If you disable the saveInterval you are entirely dependent on the saveThreshold. + * + * It's not wise to disable both saveThreshold and saveInterval. + * + * The default saveThreshold is 500. + * The default saveInterval is 60 seconds. + **/ +@property (assign, readwrite) NSUInteger saveThreshold; + +/** + * See the description for the `saveThreshold` property + */ +@property (assign, readwrite) NSTimeInterval saveInterval; + +/** + * It is likely you don't want the log entries to persist forever. + * Doing so would allow the database to grow infinitely large over time. + * + * The maxAge property provides a way to specify how old a log statement can get + * before it should get deleted from the database. + * + * The deleteInterval specifies how often to sweep for old log entries. + * Since deleting is an expensive operation (disk io) is is done on a fixed interval. + * + * An alternative to the deleteInterval is the deleteOnEverySave option. + * This specifies that old log entries should be deleted during every save operation. + * + * You can optionally disable the maxAge by setting it to zero (or a negative value). + * If you disable the maxAge then old log statements are not deleted. + * + * You can optionally disable the deleteInterval by setting it to zero (or a negative value). + * + * If you disable both deleteInterval and deleteOnEverySave then old log statements are not deleted. + * + * It's not wise to enable both deleteInterval and deleteOnEverySave. + * + * The default maxAge is 7 days. + * The default deleteInterval is 5 minutes. + * The default deleteOnEverySave is NO. + **/ +@property (assign, readwrite) NSTimeInterval maxAge; + +/** + * See the description for the `maxAge` property + */ +@property (assign, readwrite) NSTimeInterval deleteInterval; + +/** + * See the description for the `maxAge` property + */ +@property (assign, readwrite) BOOL deleteOnEverySave; + +/** + * Forces a save of any pending log entries (flushes log entries to disk). + **/ +- (void)savePendingLogEntries; + +/** + * Removes any log entries that are older than maxAge. + **/ +- (void)deleteOldLogEntries; + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAbstractDatabaseLogger.m b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAbstractDatabaseLogger.m new file mode 100755 index 000000000..c8782de48 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAbstractDatabaseLogger.m @@ -0,0 +1,660 @@ +// Software License Agreement (BSD License) +// +// Copyright (c) 2010-2015, Deusty, LLC +// All rights reserved. +// +// Redistribution and use of this software in source and binary forms, +// with or without modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Neither the name of Deusty nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific +// prior written permission of Deusty, LLC. + +#import "DDAbstractDatabaseLogger.h" +#import + + +#if !__has_feature(objc_arc) +#error This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). +#endif + +@interface DDAbstractDatabaseLogger () + +- (void)destroySaveTimer; +- (void)destroyDeleteTimer; + +@end + +#pragma mark - + +@implementation DDAbstractDatabaseLogger + +- (instancetype)init { + if ((self = [super init])) { + _saveThreshold = 500; + _saveInterval = 60; // 60 seconds + _maxAge = (60 * 60 * 24 * 7); // 7 days + _deleteInterval = (60 * 5); // 5 minutes + } + + return self; +} + +- (void)dealloc { + [self destroySaveTimer]; + [self destroyDeleteTimer]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Override Me +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (BOOL)db_log:(DDLogMessage *)logMessage { + // Override me and add your implementation. + // + // Return YES if an item was added to the buffer. + // Return NO if the logMessage was ignored. + + return NO; +} + +- (void)db_save { + // Override me and add your implementation. +} + +- (void)db_delete { + // Override me and add your implementation. +} + +- (void)db_saveAndDelete { + // Override me and add your implementation. +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Private API +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)performSaveAndSuspendSaveTimer { + if (_unsavedCount > 0) { + if (_deleteOnEverySave) { + [self db_saveAndDelete]; + } else { + [self db_save]; + } + } + + _unsavedCount = 0; + _unsavedTime = 0; + + if (_saveTimer && !_saveTimerSuspended) { + dispatch_suspend(_saveTimer); + _saveTimerSuspended = YES; + } +} + +- (void)performDelete { + if (_maxAge > 0.0) { + [self db_delete]; + + _lastDeleteTime = dispatch_time(DISPATCH_TIME_NOW, 0); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Timers +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)destroySaveTimer { + if (_saveTimer) { + dispatch_source_cancel(_saveTimer); + + if (_saveTimerSuspended) { + // Must resume a timer before releasing it (or it will crash) + dispatch_resume(_saveTimer); + _saveTimerSuspended = NO; + } + + #if !OS_OBJECT_USE_OBJC + dispatch_release(_saveTimer); + #endif + _saveTimer = NULL; + } +} + +- (void)updateAndResumeSaveTimer { + if ((_saveTimer != NULL) && (_saveInterval > 0.0) && (_unsavedTime > 0.0)) { + uint64_t interval = (uint64_t)(_saveInterval * NSEC_PER_SEC); + dispatch_time_t startTime = dispatch_time(_unsavedTime, interval); + + dispatch_source_set_timer(_saveTimer, startTime, interval, 1.0); + + if (_saveTimerSuspended) { + dispatch_resume(_saveTimer); + _saveTimerSuspended = NO; + } + } +} + +- (void)createSuspendedSaveTimer { + if ((_saveTimer == NULL) && (_saveInterval > 0.0)) { + _saveTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.loggerQueue); + + dispatch_source_set_event_handler(_saveTimer, ^{ @autoreleasepool { + [self performSaveAndSuspendSaveTimer]; + } }); + + _saveTimerSuspended = YES; + } +} + +- (void)destroyDeleteTimer { + if (_deleteTimer) { + dispatch_source_cancel(_deleteTimer); + #if !OS_OBJECT_USE_OBJC + dispatch_release(_deleteTimer); + #endif + _deleteTimer = NULL; + } +} + +- (void)updateDeleteTimer { + if ((_deleteTimer != NULL) && (_deleteInterval > 0.0) && (_maxAge > 0.0)) { + uint64_t interval = (uint64_t)(_deleteInterval * NSEC_PER_SEC); + dispatch_time_t startTime; + + if (_lastDeleteTime > 0) { + startTime = dispatch_time(_lastDeleteTime, interval); + } else { + startTime = dispatch_time(DISPATCH_TIME_NOW, interval); + } + + dispatch_source_set_timer(_deleteTimer, startTime, interval, 1.0); + } +} + +- (void)createAndStartDeleteTimer { + if ((_deleteTimer == NULL) && (_deleteInterval > 0.0) && (_maxAge > 0.0)) { + _deleteTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, self.loggerQueue); + + if (_deleteTimer != NULL) { + dispatch_source_set_event_handler(_deleteTimer, ^{ @autoreleasepool { + [self performDelete]; + } }); + + [self updateDeleteTimer]; + + if (_deleteTimer != NULL) { + dispatch_resume(_deleteTimer); + } + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Configuration +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (NSUInteger)saveThreshold { + // The design of this method is taken from the DDAbstractLogger implementation. + // For extensive documentation please refer to the DDAbstractLogger implementation. + + // Note: The internal implementation MUST access the colorsEnabled variable directly, + // This method is designed explicitly for external access. + // + // Using "self." syntax to go through this method will cause immediate deadlock. + // This is the intended result. Fix it by accessing the ivar directly. + // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. + + NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); + NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); + + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + + __block NSUInteger result; + + dispatch_sync(globalLoggingQueue, ^{ + dispatch_sync(self.loggerQueue, ^{ + result = _saveThreshold; + }); + }); + + return result; +} + +- (void)setSaveThreshold:(NSUInteger)threshold { + dispatch_block_t block = ^{ + @autoreleasepool { + if (_saveThreshold != threshold) { + _saveThreshold = threshold; + + // Since the saveThreshold has changed, + // we check to see if the current unsavedCount has surpassed the new threshold. + // + // If it has, we immediately save the log. + + if ((_unsavedCount >= _saveThreshold) && (_saveThreshold > 0)) { + [self performSaveAndSuspendSaveTimer]; + } + } + } + }; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + if ([self isOnInternalLoggerQueue]) { + block(); + } else { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(self.loggerQueue, block); + }); + } +} + +- (NSTimeInterval)saveInterval { + // The design of this method is taken from the DDAbstractLogger implementation. + // For extensive documentation please refer to the DDAbstractLogger implementation. + + // Note: The internal implementation MUST access the colorsEnabled variable directly, + // This method is designed explicitly for external access. + // + // Using "self." syntax to go through this method will cause immediate deadlock. + // This is the intended result. Fix it by accessing the ivar directly. + // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. + + NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); + NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); + + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + + __block NSTimeInterval result; + + dispatch_sync(globalLoggingQueue, ^{ + dispatch_sync(self.loggerQueue, ^{ + result = _saveInterval; + }); + }); + + return result; +} + +- (void)setSaveInterval:(NSTimeInterval)interval { + dispatch_block_t block = ^{ + @autoreleasepool { + // C99 recommended floating point comparison macro + // Read: isLessThanOrGreaterThan(floatA, floatB) + + if (/* saveInterval != interval */ islessgreater(_saveInterval, interval)) { + _saveInterval = interval; + + // There are several cases we need to handle here. + // + // 1. If the saveInterval was previously enabled and it just got disabled, + // then we need to stop the saveTimer. (And we might as well release it.) + // + // 2. If the saveInterval was previously disabled and it just got enabled, + // then we need to setup the saveTimer. (Plus we might need to do an immediate save.) + // + // 3. If the saveInterval increased, then we need to reset the timer so that it fires at the later date. + // + // 4. If the saveInterval decreased, then we need to reset the timer so that it fires at an earlier date. + // (Plus we might need to do an immediate save.) + + if (_saveInterval > 0.0) { + if (_saveTimer == NULL) { + // Handles #2 + // + // Since the saveTimer uses the unsavedTime to calculate it's first fireDate, + // if a save is needed the timer will fire immediately. + + [self createSuspendedSaveTimer]; + [self updateAndResumeSaveTimer]; + } else { + // Handles #3 + // Handles #4 + // + // Since the saveTimer uses the unsavedTime to calculate it's first fireDate, + // if a save is needed the timer will fire immediately. + + [self updateAndResumeSaveTimer]; + } + } else if (_saveTimer) { + // Handles #1 + + [self destroySaveTimer]; + } + } + } + }; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + if ([self isOnInternalLoggerQueue]) { + block(); + } else { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(self.loggerQueue, block); + }); + } +} + +- (NSTimeInterval)maxAge { + // The design of this method is taken from the DDAbstractLogger implementation. + // For extensive documentation please refer to the DDAbstractLogger implementation. + + // Note: The internal implementation MUST access the colorsEnabled variable directly, + // This method is designed explicitly for external access. + // + // Using "self." syntax to go through this method will cause immediate deadlock. + // This is the intended result. Fix it by accessing the ivar directly. + // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. + + NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); + NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); + + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + + __block NSTimeInterval result; + + dispatch_sync(globalLoggingQueue, ^{ + dispatch_sync(self.loggerQueue, ^{ + result = _maxAge; + }); + }); + + return result; +} + +- (void)setMaxAge:(NSTimeInterval)interval { + dispatch_block_t block = ^{ + @autoreleasepool { + // C99 recommended floating point comparison macro + // Read: isLessThanOrGreaterThan(floatA, floatB) + + if (/* maxAge != interval */ islessgreater(_maxAge, interval)) { + NSTimeInterval oldMaxAge = _maxAge; + NSTimeInterval newMaxAge = interval; + + _maxAge = interval; + + // There are several cases we need to handle here. + // + // 1. If the maxAge was previously enabled and it just got disabled, + // then we need to stop the deleteTimer. (And we might as well release it.) + // + // 2. If the maxAge was previously disabled and it just got enabled, + // then we need to setup the deleteTimer. (Plus we might need to do an immediate delete.) + // + // 3. If the maxAge was increased, + // then we don't need to do anything. + // + // 4. If the maxAge was decreased, + // then we should do an immediate delete. + + BOOL shouldDeleteNow = NO; + + if (oldMaxAge > 0.0) { + if (newMaxAge <= 0.0) { + // Handles #1 + + [self destroyDeleteTimer]; + } else if (oldMaxAge > newMaxAge) { + // Handles #4 + shouldDeleteNow = YES; + } + } else if (newMaxAge > 0.0) { + // Handles #2 + shouldDeleteNow = YES; + } + + if (shouldDeleteNow) { + [self performDelete]; + + if (_deleteTimer) { + [self updateDeleteTimer]; + } else { + [self createAndStartDeleteTimer]; + } + } + } + } + }; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + if ([self isOnInternalLoggerQueue]) { + block(); + } else { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(self.loggerQueue, block); + }); + } +} + +- (NSTimeInterval)deleteInterval { + // The design of this method is taken from the DDAbstractLogger implementation. + // For extensive documentation please refer to the DDAbstractLogger implementation. + + // Note: The internal implementation MUST access the colorsEnabled variable directly, + // This method is designed explicitly for external access. + // + // Using "self." syntax to go through this method will cause immediate deadlock. + // This is the intended result. Fix it by accessing the ivar directly. + // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. + + NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); + NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); + + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + + __block NSTimeInterval result; + + dispatch_sync(globalLoggingQueue, ^{ + dispatch_sync(self.loggerQueue, ^{ + result = _deleteInterval; + }); + }); + + return result; +} + +- (void)setDeleteInterval:(NSTimeInterval)interval { + dispatch_block_t block = ^{ + @autoreleasepool { + // C99 recommended floating point comparison macro + // Read: isLessThanOrGreaterThan(floatA, floatB) + + if (/* deleteInterval != interval */ islessgreater(_deleteInterval, interval)) { + _deleteInterval = interval; + + // There are several cases we need to handle here. + // + // 1. If the deleteInterval was previously enabled and it just got disabled, + // then we need to stop the deleteTimer. (And we might as well release it.) + // + // 2. If the deleteInterval was previously disabled and it just got enabled, + // then we need to setup the deleteTimer. (Plus we might need to do an immediate delete.) + // + // 3. If the deleteInterval increased, then we need to reset the timer so that it fires at the later date. + // + // 4. If the deleteInterval decreased, then we need to reset the timer so that it fires at an earlier date. + // (Plus we might need to do an immediate delete.) + + if (_deleteInterval > 0.0) { + if (_deleteTimer == NULL) { + // Handles #2 + // + // Since the deleteTimer uses the lastDeleteTime to calculate it's first fireDate, + // if a delete is needed the timer will fire immediately. + + [self createAndStartDeleteTimer]; + } else { + // Handles #3 + // Handles #4 + // + // Since the deleteTimer uses the lastDeleteTime to calculate it's first fireDate, + // if a save is needed the timer will fire immediately. + + [self updateDeleteTimer]; + } + } else if (_deleteTimer) { + // Handles #1 + + [self destroyDeleteTimer]; + } + } + } + }; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + if ([self isOnInternalLoggerQueue]) { + block(); + } else { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(self.loggerQueue, block); + }); + } +} + +- (BOOL)deleteOnEverySave { + // The design of this method is taken from the DDAbstractLogger implementation. + // For extensive documentation please refer to the DDAbstractLogger implementation. + + // Note: The internal implementation MUST access the colorsEnabled variable directly, + // This method is designed explicitly for external access. + // + // Using "self." syntax to go through this method will cause immediate deadlock. + // This is the intended result. Fix it by accessing the ivar directly. + // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. + + NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); + NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); + + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + + __block BOOL result; + + dispatch_sync(globalLoggingQueue, ^{ + dispatch_sync(self.loggerQueue, ^{ + result = _deleteOnEverySave; + }); + }); + + return result; +} + +- (void)setDeleteOnEverySave:(BOOL)flag { + dispatch_block_t block = ^{ + _deleteOnEverySave = flag; + }; + + // The design of the setter logic below is taken from the DDAbstractLogger implementation. + // For documentation please refer to the DDAbstractLogger implementation. + + if ([self isOnInternalLoggerQueue]) { + block(); + } else { + dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; + NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); + + dispatch_async(globalLoggingQueue, ^{ + dispatch_async(self.loggerQueue, block); + }); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark Public API +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)savePendingLogEntries { + dispatch_block_t block = ^{ + @autoreleasepool { + [self performSaveAndSuspendSaveTimer]; + } + }; + + if ([self isOnInternalLoggerQueue]) { + block(); + } else { + dispatch_async(self.loggerQueue, block); + } +} + +- (void)deleteOldLogEntries { + dispatch_block_t block = ^{ + @autoreleasepool { + [self performDelete]; + } + }; + + if ([self isOnInternalLoggerQueue]) { + block(); + } else { + dispatch_async(self.loggerQueue, block); + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark DDLogger +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +- (void)didAddLogger { + // If you override me be sure to invoke [super didAddLogger]; + + [self createSuspendedSaveTimer]; + + [self createAndStartDeleteTimer]; +} + +- (void)willRemoveLogger { + // If you override me be sure to invoke [super willRemoveLogger]; + + [self performSaveAndSuspendSaveTimer]; + + [self destroySaveTimer]; + [self destroyDeleteTimer]; +} + +- (void)logMessage:(DDLogMessage *)logMessage { + if ([self db_log:logMessage]) { + BOOL firstUnsavedEntry = (++_unsavedCount == 1); + + if ((_unsavedCount >= _saveThreshold) && (_saveThreshold > 0)) { + [self performSaveAndSuspendSaveTimer]; + } else if (firstUnsavedEntry) { + _unsavedTime = dispatch_time(DISPATCH_TIME_NOW, 0); + [self updateAndResumeSaveTimer]; + } + } +} + +- (void)flush { + // This method is invoked by DDLog's flushLog method. + // + // It is called automatically when the application quits, + // or if the developer invokes DDLog's flushLog method prior to crashing or something. + + [self performSaveAndSuspendSaveTimer]; +} + +@end diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAssertMacros.h b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAssertMacros.h new file mode 100755 index 000000000..870d31f5d --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDAssertMacros.h @@ -0,0 +1,26 @@ +// Software License Agreement (BSD License) +// +// Copyright (c) 2010-2015, Deusty, LLC +// All rights reserved. +// +// Redistribution and use of this software in source and binary forms, +// with or without modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Neither the name of Deusty nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific +// prior written permission of Deusty, LLC. + +/** + * NSAsset replacement that will output a log message even when assertions are disabled. + **/ +#define DDAssert(condition, frmt, ...) \ + if (!(condition)) { \ + NSString *description = [NSString stringWithFormat:frmt, ## __VA_ARGS__]; \ + DDLogError(@"%@", description); \ + NSAssert(NO, description); \ + } +#define DDAssertCondition(condition) DDAssert(condition, @"Condition not satisfied: %s", #condition) + diff --git a/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDFileLogger.h b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDFileLogger.h new file mode 100755 index 000000000..f0bfdb6b7 --- /dev/null +++ b/Tools/XcodeCapp/XcodeCapp/Lumberjack/DDFileLogger.h @@ -0,0 +1,487 @@ +// Software License Agreement (BSD License) +// +// Copyright (c) 2010-2015, Deusty, LLC +// All rights reserved. +// +// Redistribution and use of this software in source and binary forms, +// with or without modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Neither the name of Deusty nor the names of its contributors may be used +// to endorse or promote products derived from this software without specific +// prior written permission of Deusty, LLC. + +// Disable legacy macros +#ifndef DD_LEGACY_MACROS + #define DD_LEGACY_MACROS 0 +#endif + +#import "DDLog.h" + +@class DDLogFileInfo; + +/** + * This class provides a logger to write log statements to a file. + **/ + + +// Default configuration and safety/sanity values. +// +// maximumFileSize -> kDDDefaultLogMaxFileSize +// rollingFrequency -> kDDDefaultLogRollingFrequency +// maximumNumberOfLogFiles -> kDDDefaultLogMaxNumLogFiles +// logFilesDiskQuota -> kDDDefaultLogFilesDiskQuota +// +// You should carefully consider the proper configuration values for your application. + +extern unsigned long long const kDDDefaultLogMaxFileSize; +extern NSTimeInterval const kDDDefaultLogRollingFrequency; +extern NSUInteger const kDDDefaultLogMaxNumLogFiles; +extern unsigned long long const kDDDefaultLogFilesDiskQuota; + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * The LogFileManager protocol is designed to allow you to control all aspects of your log files. + * + * The primary purpose of this is to allow you to do something with the log files after they have been rolled. + * Perhaps you want to compress them to save disk space. + * Perhaps you want to upload them to an FTP server. + * Perhaps you want to run some analytics on the file. + * + * A default LogFileManager is, of course, provided. + * The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property. + * + * This protocol provides various methods to fetch the list of log files. + * + * There are two variants: sorted and unsorted. + * If sorting is not necessary, the unsorted variant is obviously faster. + * The sorted variant will return an array sorted by when the log files were created, + * with the most recently created log file at index 0, and the oldest log file at the end of the array. + * + * You can fetch only the log file paths (full path including name), log file names (name only), + * or an array of `DDLogFileInfo` objects. + * The `DDLogFileInfo` class is documented below, and provides a handy wrapper that + * gives you easy access to various file attributes such as the creation date or the file size. + */ +@protocol DDLogFileManager +@required + +// Public properties + +/** + * The maximum number of archived log files to keep on disk. + * For example, if this property is set to 3, + * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk. + * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted. + * + * You may optionally disable this option by setting it to zero. + **/ +@property (readwrite, assign, atomic) NSUInteger maximumNumberOfLogFiles; + +/** + * The maximum space that logs can take. On rolling logfile all old logfiles that exceed logFilesDiskQuota will + * be deleted. + * + * You may optionally disable this option by setting it to zero. + **/ +@property (readwrite, assign, atomic) unsigned long long logFilesDiskQuota; + +// Public methods + +/** + * Returns the logs directory (path) + */ +- (NSString *)logsDirectory; + +/** + * Returns an array of `NSString` objects, + * each of which is the filePath to an existing log file on disk. + **/ +- (NSArray *)unsortedLogFilePaths; + +/** + * Returns an array of `NSString` objects, + * each of which is the fileName of an existing log file on disk. + **/ +- (NSArray *)unsortedLogFileNames; + +/** + * Returns an array of `DDLogFileInfo` objects, + * each representing an existing log file on disk, + * and containing important information about the log file such as it's modification date and size. + **/ +- (NSArray *)unsortedLogFileInfos; + +/** + * Just like the `unsortedLogFilePaths` method, but sorts the array. + * The items in the array are sorted by creation date. + * The first item in the array will be the most recently created log file. + **/ +- (NSArray *)sortedLogFilePaths; + +/** + * Just like the `unsortedLogFileNames` method, but sorts the array. + * The items in the array are sorted by creation date. + * The first item in the array will be the most recently created log file. + **/ +- (NSArray *)sortedLogFileNames; + +/** + * Just like the `unsortedLogFileInfos` method, but sorts the array. + * The items in the array are sorted by creation date. + * The first item in the array will be the most recently created log file. + **/ +- (NSArray *)sortedLogFileInfos; + +// Private methods (only to be used by DDFileLogger) + +/** + * Generates a new unique log file path, and creates the corresponding log file. + **/ +- (NSString *)createNewLogFile; + +@optional + +// Notifications from DDFileLogger + +/** + * Called when a log file was archieved + */ +- (void)didArchiveLogFile:(NSString *)logFilePath; + +/** + * Called when the roll action was executed and the log was archieved + */ +- (void)didRollAndArchiveLogFile:(NSString *)logFilePath; + +@end + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +#pragma mark - +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * Default log file manager. + * + * All log files are placed inside the logsDirectory. + * If a specific logsDirectory isn't specified, the default directory is used. + * On Mac, this is in `~/Library/Logs/`. + * On iPhone, this is in `~/Library/Caches/Logs`. + * + * Log files are named `"