diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index c8da2b895..c8fc3f6bf 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -103,7 +103,6 @@ 17F3BB890CBC565900864489 /* CueSheet.bundle in CopyFiles */ = {isa = PBXBuildFile; fileRef = 17F3BB880CBC565100864489 /* CueSheet.bundle */; }; 17F561400C3BD4F30019975C /* CogAudio.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 17F561330C3BD4DC0019975C /* CogAudio.framework */; }; 17F562390C3BD91B0019975C /* General.preferencePane in Resources */ = {isa = PBXBuildFile; fileRef = 17F5622E0C3BD8FB0019975C /* General.preferencePane */; }; - 5604D4550D603430004F5C5D /* SpotlightSearchController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5604D4510D603430004F5C5D /* SpotlightSearchController.m */; }; 5604D4580D603459004F5C5D /* SpotlightPanel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5604D4570D603459004F5C5D /* SpotlightPanel.xib */; }; 5604D45B0D60349B004F5C5D /* SpotlightWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5604D4590D60349B004F5C5D /* SpotlightWindowController.m */; }; 5604D4F60D60726E004F5C5D /* SpotlightPlaylistEntry.m in Sources */ = {isa = PBXBuildFile; fileRef = 5604D4F50D60726E004F5C5D /* SpotlightPlaylistEntry.m */; }; @@ -592,8 +591,6 @@ 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* Cog_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cog_Prefix.pch; sourceTree = ""; }; - 5604D4510D603430004F5C5D /* SpotlightSearchController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpotlightSearchController.m; path = Spotlight/SpotlightSearchController.m; sourceTree = ""; }; - 5604D4520D603430004F5C5D /* SpotlightSearchController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SpotlightSearchController.h; path = Spotlight/SpotlightSearchController.h; sourceTree = ""; }; 5604D4570D603459004F5C5D /* SpotlightPanel.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = SpotlightPanel.xib; path = Spotlight/SpotlightPanel.xib; sourceTree = ""; }; 5604D4590D60349B004F5C5D /* SpotlightWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpotlightWindowController.m; path = Spotlight/SpotlightWindowController.m; sourceTree = ""; }; 5604D45A0D60349B004F5C5D /* SpotlightWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SpotlightWindowController.h; path = Spotlight/SpotlightWindowController.h; sourceTree = ""; }; @@ -1098,8 +1095,6 @@ 56462EAE0D6341F6000AB68C /* SpotlightTransformers.m */, 5604D4590D60349B004F5C5D /* SpotlightWindowController.m */, 5604D45A0D60349B004F5C5D /* SpotlightWindowController.h */, - 5604D4510D603430004F5C5D /* SpotlightSearchController.m */, - 5604D4520D603430004F5C5D /* SpotlightSearchController.h */, 5604D4F40D60726E004F5C5D /* SpotlightPlaylistEntry.h */, 5604D4F50D60726E004F5C5D /* SpotlightPlaylistEntry.m */, 56462DD80D61D71E000AB68C /* SpotlightPlaylistView.h */, @@ -1638,7 +1633,6 @@ 178BAB9B0CD4E1B700B33D47 /* PopupButton.m in Sources */, 17BBE5BC0CD95CFA00258F7A /* InvertedToolbarWindow.m in Sources */, 173428F50D5FB1C400E8D854 /* EntriesController.m in Sources */, - 5604D4550D603430004F5C5D /* SpotlightSearchController.m in Sources */, 5604D45B0D60349B004F5C5D /* SpotlightWindowController.m in Sources */, 5604D4F60D60726E004F5C5D /* SpotlightPlaylistEntry.m in Sources */, 56462DDA0D61D71E000AB68C /* SpotlightPlaylistView.m in Sources */, diff --git a/Spotlight/SpotlightPanel.xib b/Spotlight/SpotlightPanel.xib index 98b2e2bf8..0eafaaf82 100644 --- a/Spotlight/SpotlightPanel.xib +++ b/Spotlight/SpotlightPanel.xib @@ -8,7 +8,7 @@ 352.00 YES - + YES @@ -52,7 +52,7 @@ 134217728 Add to Playlist - LucidaGrande + LucidaGrande 1.300000e+01 1044 @@ -109,7 +109,7 @@ 0 Title - + 1.100000e+01 3100 @@ -119,7 +119,7 @@ 6 - System + System headerTextColor 3 @@ -130,12 +130,12 @@ 337772096 2048 - Text Cell + Text Cell 6 - + controlBackgroundColor 3 @@ -144,7 +144,7 @@ 6 - + controlTextColor @@ -165,7 +165,7 @@ 6 - + headerColor 3 @@ -177,7 +177,7 @@ 337772096 2048 - + @@ -203,7 +203,7 @@ 337772096 2048 - + @@ -310,7 +310,7 @@ 337772096 67110912 - + @@ -326,7 +326,7 @@ 6 - + gridColor 3 @@ -417,7 +417,7 @@ 1 6 - + textBackgroundColor @@ -482,7 +482,7 @@ 6 - + controlColor @@ -545,45 +545,10 @@ YES YES - - SpotlightSearchController - YES - - - contentArray: query.results - - - - - - - contentArray - query.results - 2 - - - 45 - - - - value: searchString - - - - - - - value - searchString - 2 - - - 58 - initialFirstResponder @@ -600,38 +565,6 @@ 72 - - - addToPlaylist: - - - - 74 - - - - playlistController - - - - 75 - - - - spotlightWindowController - - - - 76 - - - - pathControl - - - - 90 - value: arrangedObjects.title @@ -641,7 +574,7 @@ - + value arrangedObjects.title NSConditionallySetsEditable @@ -661,7 +594,7 @@ - + arrangedObjects.year @@ -681,7 +614,7 @@ - + arrangedObjects.album @@ -701,7 +634,7 @@ - + arrangedObjects.genre @@ -721,7 +654,7 @@ - + arrangedObjects.artist @@ -741,7 +674,7 @@ - + arrangedObjects.length @@ -761,7 +694,7 @@ - + arrangedObjects.track @@ -780,14 +713,6 @@ 149 - - - spotlightSearchController - - - - 150 - dataSource @@ -798,14 +723,30 @@ - value: spotlightSearchPath + value: searchString + + + + + + + + searchString + 2 + + + 154 + + + + value: spotlightSearchPath - + - - - + + + spotlightSearchPath NSValueTransformerName @@ -814,7 +755,47 @@ 2 - 153 + 157 + + + + pathControl + + + + 159 + + + + spotlightWindowController + + + + 160 + + + + playlistController + + + + 161 + + + + contentArray: query.results + + + + + + + contentArray + query.results + 2 + + + 162 @@ -887,11 +868,6 @@ - - 17 - - - 79 @@ -1092,7 +1068,6 @@ 1.windowTemplate.minSize 16.CustomClassName 16.IBPluginDependency - 17.IBPluginDependency 2.IBPluginDependency 24.IBPluginDependency 24.ImportedFromIB2 @@ -1148,17 +1123,16 @@ - {{33, 67}, {480, 320}} + {{33, 67}, {480, 320}} {196, 240} - + {400, 260} SpotlightPlaylistController - @@ -1227,184 +1201,272 @@ - 153 + 162 YES + + NSObject + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + IBProjectSource + ThirdParty/UKKQueue/UKFileWatcher.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/UKKQueue/UKMainThreadProxy.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/GCWindowMenu/GCOneShotEffectTimer.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/NDHotKeys/NDHotKeyEvent.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/AppleRemote/AppleRemote.h + + + + + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + ThirdParty/UKKQueue/UKKQueue.h + + + + SpotlightPlaylistController + PlaylistController + + YES + + YES + + + YES + + + + + SpotlightWindowController + + + + Spotlight/SpotlightPlaylistController.h + + SpotlightWindowController NSWindowController - YES - - YES - - - YES - - - - playlistLoader - PlaylistLoader - - - IBProjectSource - Spotlight/SpotlightWindowController.h - - - - TrackingSlider - NSSlider - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - Utils/TrackingSlider.h - - - - EntriesController - NSObject - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - Playlist/EntriesController.h - - - - SpotlightSearchController - - - YES - - YES - addToPlaylist: - changeSearchPath: - - - YES - id - - + addToPlaylist: + id YES YES pathControl - playlistController - spotlightWindowController + + playlistLoader YES NSPathControl NSArrayController - SpotlightWindowController - - - - - Spotlight/SpotlightSearchController.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - IBUserSource - - - - - PlaylistController - DNDArrayController - - YES - - YES - clear: - clearFilterPredicate: - showEntryInFinder: - takeRepeatFromObject: - takeShuffleFromObject: - - - YES - - - - - - - - - YES - - YES - entriesController - playlistLoader - - - YES - EntriesController PlaylistLoader - - Playlist/PlaylistController.h + + Spotlight/SpotlightWindowController.h + + + + DNDArrayController + NSArrayController + + YES + + YES + + + YES + + + + tableView + NSTableView + + + + Playlist/DNDArrayController.h + + + + PlaylistView + NSTableView + + YES + + YES + scrollToCurrentEntry: + shufflePlaylist: + sortByPath: + toggleColumn: + + + YES + + + + + + + + YES + + YES + playbackController + playlistController + + + YES + PlaybackController + PlaylistController + + + + + Playlist/PlaylistView.h @@ -1429,13 +1491,13 @@ - + Spotlight/SpotlightPlaylistView.h - SpotlightPlaylistController - PlaylistController + TrackingSlider + NSSlider YES @@ -1446,12 +1508,17 @@ - spotlightSearchController - SpotlightSearchController + YES + + YES + + + YES + - - Spotlight/SpotlightPlaylistController.h + + Utils/TrackingSlider.h @@ -1471,10 +1538,76 @@ PlaylistController - + Playlist/PlaylistLoader.h + + EntriesController + + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + Playlist/EntriesController.h + + + + PlaylistController + DNDArrayController + + YES + + YES + clear: + clearFilterPredicate: + showEntryInFinder: + takeRepeatFromObject: + takeShuffleFromObject: + + + YES + + + + + + + + + YES + + YES + entriesController + playlistLoader + + + YES + EntriesController + PlaylistLoader + + + + + Playlist/PlaylistController.h + + PlaybackController @@ -1501,22 +1634,22 @@ YES - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -1543,225 +1676,10 @@ - + Application/PlaybackController.h - - PlaylistView - NSTableView - - YES - - YES - scrollToCurrentEntry: - shufflePlaylist: - sortByPath: - toggleColumn: - - - YES - - - - - - - - YES - - YES - playbackController - playlistController - - - YES - PlaybackController - PlaylistController - - - - - Playlist/PlaylistView.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/UKKQueue/UKMainThreadProxy.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/UKKQueue/UKKQueue.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/NDHotKeys/NDHotKeyEvent.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/UKKQueue/UKFileWatcher.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/GCWindowMenu/GCOneShotEffectTimer.h - - - - - - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - ThirdParty/AppleRemote/AppleRemote.h - - - - DNDArrayController - NSArrayController - - YES - - YES - - - YES - - - - tableView - NSTableView - - - - Playlist/DNDArrayController.h - - 0 @@ -1769,253 +1687,247 @@ 3 YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBSwALAAwAMQA1ADYAPAA9 +AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBQAALAAwAMQA1ADYAPAA9 AEIAWgBbAFwAXQBeAAsAbAB0AIAAgQCZAJoAogCjAKYApwCrALEAyQDRAN8A4wEJAQoBCwEMARMBHgEf ASIBKQEqAS0BNwFKAUsBUwFUAVkBXgFhAWkBagFrAW4BcgF7AXwBgQGCAYUBigGLAY0BkAGZAZoBoAGh AaYBpwGqAbEBugG7AcEBwgHJAdQB1QHcAd0BewHlAe8B8AH2AfcB/gIHAggCDgIPAhYCHwIgAiYCJwIu AjICNwI4AjsCPAI/AkACQwJPAlACUQJUAl0CXgEeAmICYwJmAm8CcAKCAocCiAKTApQClQKeAp8CowKs Aq0CrgD8Aq8CswK0ArcCuwLEAsUCzgLPAtQC1QLXAuEC5gLnAugC7ALtAvgC+wL+AwEACwMCAwQDBQMG -AwkDHwMnAyoDKwMsAzADNQNLA0wDTQNYA1kDWwNdA14DYwNkA2kDagNtA3IDcwN4A3kDfgN/A4QDhQOK -A4sDlwOYA5kDmgOgA6EDowOmA60DrgOvA7cDuAO5A78DxwPIA8kDzwPQA9ED2QPaA9sD4QPpA+oD6wPx -A/kD+gP7BAEECAQJBAoECwQTBBQEFQQbBCMEJAQlBCsETgRRBFIEVAR3BJsEvwTABMEEwgTDBMQExQTG -BMcEyATJBMoEywTMBM0EzgTPBNAE0QTSBNME1ATVBNYE1wTYBNkE2gTbBNwE3QTeBN8E4ATlBOoFIQVY -BVkFWgVbBVwFXQVeBV8FYAVhBWIFYwVkBWUAkAVmBWcFaAVpBWoBZgVrBWwFbQVuAowFbwVwBXEFcgVz -BXQFdQBXBXYFdwV4BXkFegV7BXwFfQV+BX8FgABWBYEFggWDBYQFhQWGBYkFjAWPVSRudWxs3xASAA0A -DgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsA -LAAtAC4ALwAwVk5TUm9vdFYkY2xhc3NdTlNPYmplY3RzS2V5c18QD05TQ2xhc3Nlc1ZhbHVlc18QGU5T -QWNjZXNzaWJpbGl0eU9pZHNWYWx1ZXNdTlNDb25uZWN0aW9uc1tOU05hbWVzS2V5c1tOU0ZyYW1ld29y -a11OU0NsYXNzZXNLZXlzWk5TT2lkc0tleXNdTlNOYW1lc1ZhbHVlc18QGU5TQWNjZXNzaWJpbGl0eUNv -bm5lY3RvcnNdTlNGb250TWFuYWdlcl8QEE5TVmlzaWJsZVdpbmRvd3NfEA9OU09iamVjdHNWYWx1ZXNf -EBdOU0FjY2Vzc2liaWxpdHlPaWRzS2V5c1lOU05leHRPaWRcTlNPaWRzVmFsdWVzgAKBAUqA6IEBEYEB -SYCdgO2ABYEBEIEBEoDugQFHgACABoDsgQFIEJuBARPSAA4AMgAzADRbTlNDbGFzc05hbWWABIADXxAZ -U3BvdGxpZ2h0V2luZG93Q29udHJvbGxlctIANwA4ADkAOlgkY2xhc3Nlc1okY2xhc3NuYW1logA6ADte -TlNDdXN0b21PYmplY3RYTlNPYmplY3RfEBBJQkNvY29hRnJhbWV3b3Jr0gAOAD4APwBAWk5TLm9iamVj -dHOAkaEAQYAH3ABDAA4ARABFAEYARwBIAEkASgBLAEwATQBOAE8AUABRAFIAUwBUAFUAVgBXAFgAK1xO -U1dpbmRvd1ZpZXdcTlNTY3JlZW5SZWN0XU5TV2luZG93VGl0bGVZTlNXVEZsYWdzXU5TV2luZG93Q2xh -c3NfEBZOU1dpbmRvd0NvbnRlbnRNaW5TaXplXE5TV2luZG93UmVjdF8QD05TV2luZG93QmFja2luZ18Q -EU5TV2luZG93U3R5bGVNYXNrWU5TTWluU2l6ZVtOU1ZpZXdDbGFzc4AMgJyAmoAJEiAAAACACoALgAgQ -AhAfgJuAAF8QGHt7MTk2LCAxOTJ9LCB7NDgwLCAzMjB9fV8QE09wZW4gZnJvbSBTcG90bGlnaHRXTlNQ -YW5lbFp7NDAwLCAyNjB91wBfAA4AYABhAGIAYwBkAGUAZgBnAGgAaQBlAGtfEA9OU05leHRSZXNwb25k -ZXJaTlNTdWJ2aWV3c1hOU3ZGbGFnc1tOU0ZyYW1lU2l6ZVhOU1dpbmRvd1tOU1N1cGVydmlld4ANgJmA -DhEBAICXgA2AmNIADgA+AG0AboBgpQBvAHAAcQByAHOAD4AZgHKAhoCN2ABfAA4AdQB2AGEAdwBjAGQA -TgB5AHoAewB8AH0AZQBOV05TRnJhbWVWTlNDZWxsWU5TRW5hYmxlZIAMgBiAEIAREQEJCYANgAxfEBd7 -ezMzNSwgMjc1fSwgezEzMSwgMzJ9fdwAggAOAIMAhACFAIYAhwCIAIkAigCLAIwAjQCOAI8AkACRAI8A -kwCUAG8AlgCXAJhbTlNDZWxsRmxhZ3NfEBNOU0FsdGVybmF0ZUNvbnRlbnRzXxASTlNQZXJpb2RpY0lu -dGVydmFsXk5TQnV0dG9uRmxhZ3MyXxAPTlNLZXlFcXVpdmFsZW50Wk5TQ29udGVudHNZTlNTdXBwb3J0 -XU5TQ29udHJvbFZpZXdfEA9OU1BlcmlvZGljRGVsYXlcTlNDZWxsRmxhZ3MyXU5TQnV0dG9uRmxhZ3MS -BAH+AIAXgBYQGRCBgBaAEoATgA8QyBIIAAAAE/////+GgkD/XxAPQWRkIHRvIFBsYXlsaXN01AAOAJsA -nACdAJ4AnwCgAKFWTlNTaXplVk5TTmFtZVhOU2ZGbGFnc4AVI0AqAAAAAAAAgBQRBBRcTHVjaWRhR3Jh -bmRl0gA3ADgApAClogClADtWTlNGb250UNIANwA4AKgAqaQAqQCqAHYAO1xOU0J1dHRvbkNlbGxcTlNB -Y3Rpb25DZWxs0gA3ADgArACtpQCtAK4ArwCwADtYTlNCdXR0b25ZTlNDb250cm9sVk5TVmlld1tOU1Jl -c3BvbmRlct8QDwBfALIADgB1ALMAtAC1AGAAtgBhAGMAZAC3ALgAuQBOALsAvAC9AL4AvwDAAMEAwgDD -AGUATgDGAMcAx1tOU0hTY3JvbGxlclhOU3NGbGFnc1xOU0Nvcm5lclZpZXdfEBBOU0hlYWRlckNsaXBW -aWV3XE5TU2Nyb2xsQW10c1tOU1ZTY3JvbGxlcl1OU05leHRLZXlWaWV3XU5TQ29udGVudFZpZXeADIBs -gHGAcBECMIAlgCKAGk8QEAAAAAAAAAAAQZgAAEGYAAARARKADYAMgGiAG4Ab0gAOAD4AbQDLgGClAMcA -xgC7AMAAv4AbgGiAbIAigCXbAF8ADgB1ANIAYABhANMAYwDUAGQAuABwANYA1wBWANgA2QDaAGUA3ABw -ANpZTlNjdkZsYWdzWU5TRG9jVmlld1lOU0JHQ29sb3KAGYBngGaAHBEJAIAdgA2AN4AZgB3SAA4APgBt -AOGAYKEA2oAd3xAXAF8A5AAOAOUA5gDnAOgA6QC0AOoA6wDsAGEAYgB3AO0AYwAyAO4A7wBkAPAA8QDH -APMA9AD1APYA9wDcAH0AvwD7APwA/QD+AP8AfQEBAGUBAwEEAQUAxwEHAQhfEB9OU0RyYWdnaW5nU291 -cmNlTWFza0Zvck5vbkxvY2FsWU5TVHZGbGFnc18QE05TT3JpZ2luYWxDbGFzc05hbWVcTlNIZWFkZXJW -aWV3XxARTlNCYWNrZ3JvdW5kQ29sb3JfEBJOU0FsbG93c1R5cGVTZWxlY3RfEBdOU0ludGVyY2VsbFNw -YWNpbmdXaWR0aF8QGU5TQ29sdW1uQXV0b3Jlc2l6aW5nU3R5bGVfEBhOU0ludGVyY2VsbFNwYWNpbmdI -ZWlnaHReTlNBdXRvc2F2ZU5hbWVbTlNHcmlkQ29sb3JfEBxOU0RyYWdnaW5nU291cmNlTWFza0Zvckxv -Y2FsXk5TVGFibGVDb2x1bW5zW05TUm93SGVpZ2h0gBsQAIBlE//////bwIAAgB+AIYA3CYAlI0AIAAAA -AAAAEAEjQAAAAAAAAAARERKAIAmAZIANgB6AYRAPgBuAKCNAMQAAAAAAAF8QFVNwb3RsaWdodFBsYXls -aXN0Vmlld1tOU1RhYmxlVmlld1p7NDQwLCAyMTF91wBfAA4AYQBiAGMAZAEKAMABDgBoAQ8AZQDAANqA -IoAkgCOADYAigB3bAF8ADgDSAGAAYQBiANMAYwDUAGQAuABwANYBFgEXANkBGAD3AGUA3ABwAPeAGYBn -EASAboBvgCGADYA3gBmAIVl7NDQwLCAxN33SADcAOAEgASGkASEArwCwADtfEBFOU1RhYmxlSGVhZGVy -Vmlld9YAXwAOAHUAYQBjAGQAcAEkASUBJgBlAHCAGYAngCYT/////4AAAQCADYAZXxAUe3stMjYsIDB9 -LCB7MTYsIDE3fX3SADcAOAErASykASwArwCwADtdX05TQ29ybmVyVmlld9IADgA+AG0BL4BgpwEwATEB -MgEzATQBNQE2gCmAPoBGgEuAUYBWgFvaATgADgE5AToBOwE8AT0BPgE/AQoAfQFBAUIBQwFEAUUBRgFH -AUgA2l5OU0lzUmVzaXplYWJsZVxOU0hlYWRlckNlbGxcTlNJZGVudGlmaWVyV05TV2lkdGhaTlNEYXRh -Q2VsbF5OU1Jlc2l6aW5nTWFza1pOU01pbldpZHRoWk5TTWF4V2lkdGgJgD2AK4AqI0BgAAAAAAAAgDUQ -AyNARIAAAAAAACNAj0AAAAAAAIAdVXRpdGxl1wCCAA4A6ACHAIgAiwFMAU0BTgFPAVABUQDzAVJbTlNU -ZXh0Q29sb3ISBIH+AIA0gC6ALIAtgDBVVGl0bGXUAA4AmwCcAJ0AngFWAKABWIAVI0AmAAAAAAAAgBQR -DBzTAA4BWgFbAVwBRgFdXE5TQ29sb3JTcGFjZVdOU1doaXRlgC9LMC4zMzMzMzI5OQDSADcAOAFfAWCi -AWAAO1dOU0NvbG9y1QAOAWABWgFiAWMBXAFlAWYBZwFoW05TQ29sb3JOYW1lXU5TQ2F0YWxvZ05hbWWA -L4AzEAaAMoAxVlN5c3RlbV8QD2hlYWRlclRleHRDb2xvctMADgFaAVsBXAFGAW2AL0IwANIANwA4AW8B -cKUBcAFxAKoAdgA7XxARTlNUYWJsZUhlYWRlckNlbGxfEA9OU1RleHRGaWVsZENlbGzYAIIADgDoAIcA -iACJAIsBTAFzAXQA3AF2AJQA2gF5AXoSFCH+QIA8gDeANoATgB0RCACAOllUZXh0IENlbGzVAA4BYAFa -AWIBYwFcAX4BZgF/AWiAL4A5gDiAMV8QFmNvbnRyb2xCYWNrZ3JvdW5kQ29sb3LTAA4BWgFbAVwBRgGE -gC9LMC42NjY2NjY2OQDVAA4BYAFaAWIBYwFcAWUBZgGIAWiAL4AzgDuAMV8QEGNvbnRyb2xUZXh0Q29s -b3LSADcAOAGMAXGkAXEAqgB2ADvSADcAOAGOAY+iAY8AO11OU1RhYmxlQ29sdW1u2gE4AA4BOQE6ATsB -PAE9AT4BPwEKAH0BQQGTAZQBlQGWAUYBlwFIANoJgD2AQIA/I0BewAAAAAAAgEUjQEIAAAAAAACAHVZh -cnRpc3TXAIIADgDoAIcAiACLAUwAjQFOAZwBnQFRAPMBUoA0gEKAQYAtgDBWQXJ0aXN01QAOAWABWgFi -AWMBXAGjAWYBpAFogC+ARIBDgDFbaGVhZGVyQ29sb3LTAA4BWgFbAVwBRgGpgC9CMQDYAIIADgDoAIcA -iACJAIsBTAFzAXQA3AF2AJQA2gF5AXqAPIA3gDaAE4AdgDraATgADgE5AToBOwE8AT0BPgE/AQoAfQFB -AbQBtQG2AbcBRgG4AUgA2gmAPYBIgEcjQF9AAAAAAACASiNAQ4AAAAAAAIAdVWFsYnVt1wCCAA4A6ACH -AIgAiwFMAI0BTgGcAb4BUQDzAVKANIBCgEmALYAwVUFsYnVt2ACCAA4A6ACHAIgAiQCLAUwBcwF0ANwB -dgCUANoBeQF6gDyAN4A2gBOAHYA62wE4AcoBOQE6AA4BOwE8AT0BPgE/AQoAfQB9Ac0BzgFBAdAB0QFG -AdIBSADaWE5TSGlkZGVuCQmATYBMgD0jQEkAAAAAAACATyNARE9gIAAAAIAdVmxlbmd0aNcAggAOAOgA -hwCIAIsBTACNAU4BnAHYAVEB2gFSgDSAQoBOgC0SBAAAAIAwVkxlbmd0aNgAggAOAOgAhwCIAIkAiwFM -AXMBdADcAeAAlADaAeMBeoA8gDeAUIATgB0SBAAIAIA62wE4AcoBOQE6AA4BOwE8AT0BPgE/AQoAfQB9 -AegB6QFBAesB7AFGAe0BSADaCQmAU4BSgD0jQEeAAAAAAACAVSNAJAAAAAAAAIAdVHllYXLXAIIADgDo -AIcAiACLAUwAjQFOAZwB8wFRAdoBUoA0gEKAVIAtgDBUWWVhctgAggAOAOgAhwCIAIkAiwFMAXMBdADc -AeAAlADaAeMBeoA8gDeAUIATgB2AOtsBOAHKATkBOgAOATsBPAE9AT4BPwEKAH0AfQIBAgIBQQIEAgUB -RgHtAUgA2gkJgFiAV4A9I0BHAAAAAAAAgFqAHVVnZW5yZdcAggAOAOgAhwCIAIsBTACNAU4BnAILAVEA -8wFSgDSAQoBZgC2AMFVHZW5yZdgAggAOAOgAhwCIAIkAiwFMAXMBdADcAeAAlADaAXkBeoA8gDeAUIAT -gB2AOtoBOAAOATkBOgE7ATwBPQE+AT8BCgB9AUECGQIaAhsCHAFGAh0CGwDaCYA9gF2AXCNASgAAAAAA -AIBfI0AgAAAAAAAAgB1VdHJhY2vXAIIADgDoAIcAiACLAUwAjQFOAZwCIwFRAdoBUoA0gEKAXoAtgDBV -VHJhY2vYAIIADgDoAIcAiACJAIsBTAFzAXQA3AF2AJQA2gHjAXqAPIA3gDaAE4AdgDrSADcAOAIvAjCj -AjACMQA7Xk5TTXV0YWJsZUFycmF5V05TQXJyYXnVAA4BYAFaAWIBYwFcAjQBZgI1AWiAL4BjgGKAMVln -cmlkQ29sb3LTAA4BWgFbAVwBRgI6gC9EMC41AF8QFENvZ1Nwb3RsaWdodFBsYXlsaXN00gA3ADgCPQI+ -ogI+ADteTlNDbGFzc1N3YXBwZXJfEBV7ezAsIDE3fSwgezQ0MCwgMjExfX3SADcAOAJBAkKkAkIArwCw -ADtaTlNDbGlwVmlld9kAXwJEAA4AdQBhAGMCRQBkAkYAcABwAkkCSgEmAGUCTABwAk5YTlNUYXJnZXRY -TlNBY3Rpb25ZTlNQZXJjZW50gBmAGYBrgGmADYBqgBkjP+o3hKAAAABfEBR7ezg1LCAxN30sIHsxNSwg -Njh9fVxfZG9TY3JvbGxlcjrSADcAOAJSAlOlAlMArgCvALAAO1pOU1Njcm9sbGVy2gBfAkQADgB1ALMA -YQBjAkUAZAJGAHAAcAJJAlgA/AEmAGUCTABwAlyAGYAZgGuAbYANgGqAGSM/7aRhAAAAAF8QFXt7MCwg -MjEzfSwgezQ0MCwgMTV9fdIADgA+AG0CYIBgoQD3gCFfEBZ7ezIwLCA0NH0sIHs0NDAsIDIyOH190gA3 -ADgCZAJlpAJlAK8AsAA7XE5TU2Nyb2xsVmlld9gAXwAOAHUAdgBhAHcAYwBkAE4CaAJpAmoCawB9AGUA -ToAMgIWAc4B0EQEKCYANgAxfEBZ7ezIwLCAyODJ9LCB7MzEzLCAyMn193QCCAA4CcQDoAIcAiACJAIsC -cgJzAnQCdQFMAnYCdwJ4AnkAjwCUAHECfQD8AH0CfwKAAXpfEBJOU0NhbmNlbEJ1dHRvbkNlbGxfEBBO -U1RleHRCZXplbFN0eWxlXxARTlNEcmF3c0JhY2tncm91bmRfEBJOU1NlYXJjaEJ1dHRvbkNlbGxfEBBO -U01heGltdW1SZWNlbnRzEhRx/kCAhIB6gHWAFoATgHISEAAEAAmAdxD/gDrVAA4BYAFaAWIBYwFcAaMB -ZgKFAWiAL4BEgHaAMV8QE3RleHRCYWNrZ3JvdW5kQ29sb3LcAkQAggAOAIQAhQCGAIcAiQCKAIsCRQCM -AmoCigCOAowA8wCPAo4AcQKQAPMCkQKSgHQSAAH+AIAXEEuAFoB4gHIRAZCAeRIIRED/VnNlYXJjaF8Q -E19zZWFyY2hGaWVsZFNlYXJjaDrdAkQAggAOAIQAhQCGApYAhwCJAIoAiwJFAIwCagKKAI4CjADzAI8C -mgKbAHECkADzAp0Ckl8QI05TQWNjZXNzaWJpbGl0eU92ZXJyaWRkZW5BdHRyaWJ1dGVzgHSAF4AWgHyA -e4BygINVY2xlYXLSAA4APgBtAqGAYKECooB90wAOAqQAPgKlAqYCqVdOUy5rZXlzgIKiAqcCqIB+gH+i -AqoCq4CAgIFdQVhEZXNjcmlwdGlvbl8QKU5TQWNjZXNzaWJpbGl0eUVuY29kZWRBdHRyaWJ1dGVzVmFs -dWVUeXBlVmNhbmNlbNIANwA4ArACsaMCsQKyADtfEBNOU011dGFibGVEaWN0aW9uYXJ5XE5TRGljdGlv -bmFyeV8QE19zZWFyY2hGaWVsZENhbmNlbDrSADcAOAK1AralArYBcQCqAHYAO18QEU5TU2VhcmNoRmll -bGRDZWxs0gA3ADgCuAK5pgK5AroArgCvALAAO11OU1NlYXJjaEZpZWxkW05TVGV4dEZpZWxk2ABfAA4A -dQB2AGEAdwBjAGQATgK9Ar4CvwLAAH0AZQBOgAyAjICHgIgRASEJgA2ADF8QFHt7ODgsIDE0fSwgezk2 -LCAxN3192ACCAA4A6ACHAIgAiQCLAUwCxgF0AsgCyQCUAHICzAF6EgQB/kCAPICKgImAE4CGEhBABACA -OlxTZWFyY2ggUGF0aDrVAA4BYAFaAWIBYwFcAX4BZgLSAWiAL4A5gIuAMVxjb250cm9sQ29sb3LSADcA -OALWArqlAroArgCvALAAO9kAXwAOAHUAdgLYAGEAdwBjAGQATgLaAtsC3ALdAsAAfQBlAE5bTlNEcmFn -VHlwZXOADICWgJKAk4COCYANgAzSAA4APgA/AuOAkaIC5ALlgI+AkF8QGUFwcGxlIFVSTCBwYXN0ZWJv -YXJkIHR5cGVfEBVOU0ZpbGVuYW1lc1Bib2FyZFR5cGXSADcAOALpAuqjAuoC6wA7XE5TTXV0YWJsZVNl -dFVOU1NldF8QFnt7MTg5LCAxMH0sIHsyNzEsIDI2fX3YAu4AggAOAIgAiQCLAu8C8ABWAvEC8gCUAHMC -9QL2AHNbTlNQYXRoU3R5bGVfEBROU1BhdGhDb21wb25lbnRDZWxsc1pOU0RlbGVnYXRlEhQh/gGAlYAT -gI0RgACAlICN0gAOAD4AbQL6gGCg0gA3ADgC/AL9pAL9AKoAdgA7Wk5TUGF0aENlbGzSADcAOAL/AwCl -AwAArgCvALAAO11OU1BhdGhDb250cm9sWns0ODAsIDMyMH3SADcAOAMDAK+jAK8AsAA7XxAVe3swLCAw -fSwgezEyODAsIDc3OH19Wns0MDAsIDI3Nn3SADcAOAMHAwiiAwgAO18QEE5TV2luZG93VGVtcGxhdGXS -AA4APgBtAwuAYK8QEwMMAw0DDgMPAxADEQMSAxMDFAMVAxYDFwMYAxkDGgMbAxwDHQMegJ6Ao4CsgK6A -sYCzgLWAt4C5gLuAw4DGgMqA0IDUgNiA3IDggOTUAA4DIAMhAyIDIwAfAyUDJl1OU0Rlc3RpbmF0aW9u -WE5TU291cmNlV05TTGFiZWyAooACgJ+AodIADgAyADMDKYAEgKBfEBlTcG90bGlnaHRTZWFyY2hDb250 -cm9sbGVyXxAZc3BvdGxpZ2h0V2luZG93Q29udHJvbGxlctIANwA4Ay0DLqMDLgMvADtfEBROU05pYk91 -dGxldENvbm5lY3Rvcl5OU05pYkNvbm5lY3RvctQADgMgAyEDIgMjAzIDJQM0gKKApICfgKvcAzYADgM3 -AOYDOAM5AzoDOwM8ADIDPQM+AH0A9AB9A0IAfQNEA0UDRgB9A0gAfQB9XxAaTlNGaWx0ZXJSZXN0cmlj -dHNJbnNlcnRpb25fEBROU1ByZXNlcnZlc1NlbGVjdGlvblpOU0VkaXRhYmxlXxAPX05TTWFuYWdlZFBy -b3h5XxARTlNPYmplY3RDbGFzc05hbWVeTlNEZWNsYXJlZEtleXNfECJOU0NsZWFyc0ZpbHRlclByZWRp -Y2F0ZU9uSW5zZXJ0aW9uXxAYTlNTZWxlY3RzSW5zZXJ0ZWRPYmplY3RzXxAWTlNBdm9pZHNFbXB0eVNl -bGVjdGlvbgmAZQmApgmAqYCogKcJgKUJCV8QG1Nwb3RsaWdodFBsYXlsaXN0Q29udHJvbGxlcl8QEU5T -QXJyYXlDb250cm9sbGVy0gAOAD4AbQNPgGCoAVABQwHpAZQBtQICAc4CGoAsgCqAUoA/gEeAV4BMgFxd -UGxheWxpc3RFbnRyedEADgNagKrSADcAOANcAzmiAzkAO18QEnBsYXlsaXN0Q29udHJvbGxlctQADgMg -AyEDIgMjAHEAQQNigKKAcoAHgK1fEBVpbml0aWFsRmlyc3RSZXNwb25kZXLUAA4DIAMhAyIDZQMlAG8D -aICwgJ+AD4CvXmFkZFRvUGxheWxpc3Q60gA3ADgDawNsowNsAy8AO18QFU5TTmliQ29udHJvbENvbm5l -Y3RvctQADgMgAyEDIgMjAHMDJQNxgKKAjYCfgLJbcGF0aENvbnRyb2zUAA4DIAMhAyIDIwMyANoDd4Ci -gKSAHYC0WmRhdGFTb3VyY2XUAA4DIAMhAyIDIwMlAzIDfYCigJ+ApIC2XxAZc3BvdGxpZ2h0U2VhcmNo -Q29udHJvbGxlctQADgMgAyEDIgMjANoDMgODgKKAHYCkgLhZdGFibGVWaWV31AAOAyADIQMiAyMAQQAf -A4mAooAHgAKAulZ3aW5kb3fYAA4DIAOMA40DIQMiA44DjwOQAzIDkgOTATYDlQOWAFZZTlNLZXlQYXRo -WU5TQmluZGluZ1lOU09wdGlvbnNfEBxOU05pYkJpbmRpbmdDb25uZWN0b3JWZXJzaW9ugMKApIC+gL2A -W4C8gL9fEBx2YWx1ZTogYXJyYW5nZWRPYmplY3RzLnRyYWNrVXZhbHVlXxAVYXJyYW5nZWRPYmplY3Rz -LnRyYWNr0wAOAqQAPgObA5wDnoDBoQOdgMChAquAgV8QG05TQ29uZGl0aW9uYWxseVNldHNFZGl0YWJs -ZdIANwA4A6ICsqICsgA70gA3ADgDpAOlowOlAy8AO18QFU5TTmliQmluZGluZ0Nvbm5lY3RvctcADgMg -A4wDjQMhAyIDjwOQAyUDqQOTAmoDrABWgMKAn4DFgL2AdIDEXxATdmFsdWU6IHNlYXJjaFN0cmluZ1xz -ZWFyY2hTdHJpbmfYAA4DIAOMA40DIQMiA44DjwOQAzIDsgOTATEDtQO2AFaAwoCkgMiAvYA+gMeAyV8Q -HXZhbHVlOiBhcnJhbmdlZE9iamVjdHMuYXJ0aXN0XxAWYXJyYW5nZWRPYmplY3RzLmFydGlzdNMADgKk -AD4DmwO7A72AwaEDnYDAoQKrgIHYAA4DIAOMA40DIQMiA44DjwOQAyUDwgOTAHMDxQPGAFaAwoCfgMyA -vYCNgMuAzV8QGnZhbHVlOiBzcG90bGlnaHRTZWFyY2hQYXRoXxATc3BvdGxpZ2h0U2VhcmNoUGF0aNMA -DgKkAD4DmwPLA82AwaEDzIDOoQPOgM9fEBZOU1ZhbHVlVHJhbnNmb3JtZXJOYW1lXxAWU3RyaW5nVG9V -UkxUcmFuc2Zvcm1lctgADgMgA4wDjQMhAyIDjgOPA5ADMgPUA5MBMwPXA9gAVoDCgKSA0oC9gEuA0YDT -XxAddmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5sZW5ndGhfEBZhcnJhbmdlZE9iamVjdHMubGVuZ3Ro0wAO -AqQAPgObA90D34DBoQOdgMChAquAgdgADgMgA4wDjQMhAyIDjgOPA5ADMgPkA5MBMAPnA+gAVoDCgKSA -1oC9gCmA1YDXXxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy50aXRsZV8QFWFycmFuZ2VkT2JqZWN0cy50 -aXRsZdMADgKkAD4DmwPtA++AwaEDnYDAoQKrgIHYAA4DIAOMA40DIQMiA44DjwOQAzID9AOTATID9wP4 -AFaAwoCkgNqAvYBGgNmA218QHHZhbHVlOiBhcnJhbmdlZE9iamVjdHMuYWxidW1fEBVhcnJhbmdlZE9i -amVjdHMuYWxidW3TAA4CpAA+A5sD/QP/gMGhA52AwKECq4CB1wAOAyADjAONAyEDIgOPA5ADJQQEBAUD -MgQHAFaAwoCfgN+A3oCkgN1fEBtjb250ZW50QXJyYXk6IHF1ZXJ5LnJlc3VsdHNcY29udGVudEFycmF5 -XXF1ZXJ5LnJlc3VsdHPYAA4DIAOMA40DIQMiA44DjwOQAzIEDgOTATUEEQQSAFaAwoCkgOKAvYBWgOGA -418QHHZhbHVlOiBhcnJhbmdlZE9iamVjdHMuZ2VucmVfEBVhcnJhbmdlZE9iamVjdHMuZ2VucmXTAA4C -pAA+A5sEFwQZgMGhA52AwKECq4CB2AAOAyADjAONAyEDIgOOA48DkAMyBB4DkwE0BCEEIgBWgMKApIDm -gL2AUYDlgOdfEBt2YWx1ZTogYXJyYW5nZWRPYmplY3RzLnllYXJfEBRhcnJhbmdlZE9iamVjdHMueWVh -ctMADgKkAD4DmwQnBCmAwaEDnYDAoQKrgIHSAA4APgQsBC2A668QIAE1AbcCHAE0ALsB7ABwAr8CagBv -ATEBlgDaATYAcgD3BD4DMgEwAHMCBQB7AyUAxgBOAdEBRQBBATMC3ABxATKAVoBKgF+AUYBsgFWAGYCI -gHSAD4A+gEWAHYBbgIaAIYDpgKSAKYCNgFqAEYCfgGiADIBPgDWAB4BLgJOAcoBG0gAOADIAMwRQgASA -6l1OU0FwcGxpY2F0aW9u0gA3ADgEUwIxogIxADvSAA4APgQsBFaA668QIADaATIBNgDaAHABNABOAHIA -cQBOANoBMQBwANoATgBwAB8AHwDaAE4BNQBvAB8AcABBATMBMAAfANoAcwBOANqAHYBGgFuAHYAZgFGA -DICGgHKADIAdgD6AGYAdgAyAGYACgAKAHYAMgFaAD4ACgBmAB4BLgCmAAoAdgI2ADIAd0gAOAD4ELAR5 -gOuvECEBNQIcAB8BtwE0ALsB7ABwAG8CvwJqATEBNgDaAZYAcgMyBD4A9wEwAHMCBQB7AyUAxgBOAdEB -RQBBATMC3ABxATKAVoBfgAKASoBRgGyAVYAZgA+AiIB0gD6AW4AdgEWAhoCkgOmAIYApgI2AWoARgJ+A -aIAMgE+ANYAHgEuAk4BygEbSAA4APgQsBJ2A668QIQSeBJ8EoAShBKIEowSkBKUEpgSnBKgEqQSqBKsE -rAStBK4ErwSwBLEEsgSzBLQEtQS2BLcEuAS5BLoEuwS8BL0EvoDvgPCA8YDygPOA9ID1gPaA94D4gPmA -+oD7gPyA/YD+gP+BAQCBAQGBAQKBAQOBAQSBAQWBAQaBAQeBAQiBAQmBAQqBAQuBAQyBAQ2BAQ6BAQ9f -EBRUYWJsZSBDb2x1bW4gKGdlbnJlKV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS0zXEZpbGUn -cyBPd25lcl8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS02XxATVGFibGUgQ29sdW1uICh5ZWFy -KV8QE0hvcml6b250YWwgU2Nyb2xsZXJfEB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktMVtTY3Jv -bGwgVmlld18QHVB1c2ggQnV0dG9uIChBZGQgdG8gUGxheWxpc3QpXxAeVGV4dCBGaWVsZCBDZWxsIChT -ZWFyY2ggUGF0aDopXxARU2VhcmNoIEZpZWxkIENlbGxfEBVUYWJsZSBDb2x1bW4gKGFydGlzdClfEBRU -YWJsZSBDb2x1bW4gKHRyYWNrKV8QSlNwb3RsaWdodCBQbGF5bGlzdCBWaWV3IChUaXRsZSwgQXJ0aXN0 -LCBBbGJ1bSwgTGVuZ3RoLCBZZWFyLCBHZW5yZSwgVHJhY2spXxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0 -IENlbGwpLTJfEBpTdGF0aWMgVGV4dCAoU2VhcmNoIFBhdGg6KV8QHVNwb3RsaWdodCBQbGF5bGlzdCBD -b250cm9sbGVyW0FwcGxpY2F0aW9uXxARVGFibGUgSGVhZGVyIFZpZXdfEBRUYWJsZSBDb2x1bW4gKHRp -dGxlKV8QGlBvcCBVcCBQYXRoIENvbnRyb2wgV2lkZ2V0XxAbVGV4dCBGaWVsZCBDZWxsIChUZXh0IENl -bGwpXxAdQnV0dG9uIENlbGwgKEFkZCB0byBQbGF5bGlzdClfEBtTcG90bGlnaHQgU2VhcmNoIENvbnRy -b2xsZXJfEBFWZXJ0aWNhbCBTY3JvbGxlclxDb250ZW50IFZpZXdfEB1UZXh0IEZpZWxkIENlbGwgKFRl -eHQgQ2VsbCktNV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS00XxAbUGFuZWwgKE9wZW4gZnJv -bSBTcG90bGlnaHQpXxAVVGFibGUgQ29sdW1uIChsZW5ndGgpWVBhdGggQ2VsbFxTZWFyY2ggRmllbGRf -EBRUYWJsZSBDb2x1bW4gKGFsYnVtKdIADgA+BCwE4oDrogDaAzKAHYCk0gAOAD4ELATngOuiAQMDSIAe -gKXSAA4APgQsBOyA668QNAMeAB8AuwHsAHACvwJqAG8DFwMVANoDGwMSAxkA9wMyATADFgBzAxMAewMl -Aw4BRQEzAw0C3AMYATIBNQG3AhwDDAE0Aw8BlgMRATYBMQByBD4CBQMQAxQAxgBOAdEAQQMdAxoAcQMc -gOSAAoBsgFWAGYCIgHSAD4DGgLuAHYDYgLWA0IAhgKSAKYDDgI2At4ARgJ+ArIA1gEuAo4CTgMqARoBW -gEqAX4CegFGAroBFgLOAW4A+gIaA6YBagLGAuYBogAyAT4AHgOCA1IBygNzSAA4APgQsBSOA668QNAUk -BSUFJgUnBSgFKQUqBSsFLAUtBS4FLwUwBTEFMgUzBTQFNQU2BTcFOAU5BToFOwU8BT0FPgU/BUAFQQVC -BUMFRAVFBUYFRwVIBUkFSgVLBUwFTQVOBU8FUAVRBVICqwVUBVUFVgVXgQEUgQEVgQEWgQEXgQEYgQEZ -gQEagQEbgQEcgQEdgQEegQEfgQEggQEhgQEigQEjgQEkgQElgQEmgQEngQEogQEpgQEqgQErgQEsgQEt -gQEugQEvgQEwgQExgQEygQEzgQE0gQE1gQE2gQE3gQE4gQE5gQE6gQE7gQE8gQE9gQE+gQE/gQFAgQFB -gQFCgIGBAUOBAUSBAUWBAUYQXhCaEBoQKhAYEFAQOBAFEGgQaxAcEGUQlhBpEBAQJBA6EFgQlRARED0Q -JRAgEFkQmRAhEB4QKBAsEEwQShAnEJcQHRAiEE8T//////////0QKxBaEEgQGxApEGYQXRA3EC3SAA4A -PgBtBYiAYKDSAA4APgQsBYuA66DSAA4APgQsBY6A66DSADcAOAWQBZGiBZEAO15OU0lCT2JqZWN0RGF0 -YQAIABkAIgAnADEAOgA/AEQAUgBUAGYDAAMGA1EDWANfA20DfwObA6kDtQPBA88D2gPoBAQEEgQlBDcE -UQRbBGgEagRtBG8EcgR1BHcEeQR7BH4EgQSDBIYEiASKBIwEjwSRBJQEnQSpBKsErQTJBNIE2wTmBOsE -+gUDBRYFHwUqBSwFLwUxBWIFbwV8BYoFlAWiBbsFyAXaBe4F+AYEBgYGCAYKBgwGEQYTBhUGFwYZBhsG -HQYfBjoGUAZYBmMGgAaSBp0GpgayBrsGxwbJBssGzQbQBtIG1AbWBt8G4QbsBu4G8AbyBvQG9gcXBx8H -JgcwBzIHNAc2BzgHOwc8Bz4HQAdaB4sHlwetB8IH0QfjB+4H+AgGCBgIJQgzCDgIOgg8CD4IQAhCCEQI -RghICEoITwhYCGoIewiCCIkIkgiUCJ0InwiiCK8IuAi9CMQIxQjOCNcI5AjxCPoJBQkOCRgJHwkrCWoJ -dgl/CYwJnwmsCbgJxgnUCdYJ2AnaCdwJ3wnhCeMJ5Qn4CfsJ/Qn/CgEKAwoFCg4KEAobCh0KHwohCiMK -JQpSClwKZgpwCnIKdAp2CngKewp9Cn8KgQqDCoUKjgqQCpMKlQr0CxYLIAs2C0MLVwtsC4YLogu9C8wL -2Av3DAYMEgwUDBYMGAwhDCMMJQwnDCgMKgwzDDUMPgxBDEMMRAxGDEgMSgxMDE4MUAxSDFsMcwx/DIoM -pwypDKsMrQyvDLEMswzgDOIM5AzmDOgM6gzsDO4M8AzyDPQM/g0HDRANJA09DT8NQQ1DDUwNTg1QDWcN -cA15DYcNkA2SDaENow2lDacNqQ2rDa0Nrw3YDecN9A4BDgkOFA4jDi4OOQ46DjwOPg5ADkkOSw5NDlYO -Xw5hDmcOhA6QDpUOlw6ZDpsOnQ6fDqUOtg64DsEOww7GDtMO4A7oDuoO9g7/DwQPDA8hDy0POw89Dz8P -QQ9DD0UPTA9eD2sPbQ9wD3kPhA+YD6oPyw/QD9IP1A/WD9gP2g/dD98P6Q/+EAAQAhAEEAYQHxAsEC4Q -OhBPEFEQUxBVEFcQahBzEHwQhRCKEJgQwRDCEMQQxhDIENEQ0xDcEN4Q5RECEQQRBhEIEQoRDBETESgR -KhEsES4RMBE8EUkRSxFOEW8RcRFzEXURdxF5EXsRpBGlEacRqRGrEbQRthG/EcERxxHkEeYR6BHqEewR -7hH0EhUSFxIZEhsSHRIfEiESThJXElgSWRJbEl0SXxJoEmoScxJ1EnwSmRKbEp0SnxKhEqYSqBKvEtAS -0hLUEtYS2BLaEt8S4RMOEw8TEBMSExQTFhMfEyETKhMsEzETThNQE1ITVBNWE1gTXRN+E4ATghOEE4YT -iBOKE7cTuBO5E7sTvRO/E8gTyhPME9IT7xPxE/MT9RP3E/kT/xQgFCIUJBQmFCgUKhQsFFUUVhRYFFoU -XBRlFGcUcBRyFHgUlRSXFJkUmxSdFJ8UpRTGFMgUyhTMFM4U0BTSFNsU4hTxFPkVDhUQFRIVFBUWFSAV -LRUvFTQVSxVUFVkVaBWAFYkVkhWdFcIVyxXUFd4V4BXiFeQV5hXoFeoV7BX1FgwWGRYiFi0WOBZhFmMW -ZRZnFmkWaxZtFm8WeBaQFpkWmxaeFqAWuRbCFssW2Bb5FvsW/Rb/FwEXBBcFFwcXCRciF1cXbBd/F5MX -qBe7F8AXwhfEF8YXyBfKF8wX0RfSF9QX1hfYF+0X7xfxF/MX9RgLGDwYPhhDGEUYRxhJGEsYTRhQGFIY -VxheGHQYqRjPGNEY0xjVGNcY2RjbGN0Y4xjsGO4Y8RjzGQAZCBkKGQ8ZERkTGRgZGhkcGSoZVhldGWYZ -bRmDGZAZphmvGboZzhnXGeQZ8hn+Gh8aIRojGiUaJxoqGisaLRovGkYaZxpsGm4acBpyGnQadhp7Gn0a -ihqfGqEaoxqlGqcatBq9Gsga7Rr5Gvsa/Rr/GwEbAxsEGwYbCBsRGxMbGBsaGxwbOBtQG1kbYBttG3Mb -jButG7kb0BvbG+Ab4hvkG+Yb6RvrG+0b9hv4G/kcAhwLHBYcHxwqHDgcQxxMHFMcaxx2HH8chByXHKAc -ohzLHM0czxzRHNMc1RzXHNkc2xzdHN8c4RzjHOUc5xzpHOsc7RzvHPEdAh0QHRkdIR0jHSUdJx0pHTId -NB02HVIdbh13HX4dlR2kHbUdtx25HbsdvR3uHgseIh4tHj8eUx5iHoceoh67Hrwevh6/HsEewh7EHsYe -yB7JHssezB7NHuse/x8IHwofGx8dHx8fIR8jHyUfJx8pHysfOR8+H0AfSR9OH2MfdB92H3gfeh98H5Qf -pR+nH6kfqx+tH7wfxR/MH+Qf9R/3H/kf+x/9IAkgGiAcIB4gICAiIC0gPiBAIEIgRCBGIGIgcyB1IHcg -eSB7IIUgliCYIJognCCeIKUgxiDQINog5CEDIQUhByEJIQshDSEPIREhMCE2IU4hWyFdIWAhYiFlIWch -hSGOIZMhnCGjIbsh2CHaIdwh3iHgIeIh5CH6IgciKCIqIiwiLiIwIjIiNCI2IlYibyJ8In4igSKDIoYi -iCKpIqsirSKvIrEisyK1Irci1CLqIvci+SL8Iv4jASMDIxwjNSNWI1gjWiNcI14jYCNiI2QjhCOdI6oj -rCOvI7EjtCO2I9cj2SPbI90j3yPhI+Mj5SQEJBwkKSQrJC4kMCQzJDUkViRYJFokXCReJGAkYiRkJIMk -mySoJKokrSSvJLIktCTRJNMk1STXJNkk2yTdJPslCCUWJTclOSU7JT0lPyVBJUMlRSVkJXwliSWLJY4l -kCWTJZUltiW4JbolvCW+JcAlwiXEJeIl+SYGJggmCyYNJhAmEiYbJh0mYCZiJmQmZiZoJmombCZuJnAm -ciZ0JnYmeCZ6JnwmfiaAJoImhCaGJogmiiaMJo4mkCaSJpQmliaYJpomnCaeJqAmqSarJq0muybEJskm -0ibUJxcnGScbJx0nHychJyMnJScnJyknKyctJy8nMSczJzUnNyc5JzsnPSc/J0EnQydFJ0cnSSdLJ00n -TydRJ1MnVSdXJ2AnYienJ6knqyetJ68nsSezJ7Untye5J7snvSe/J8EnwyfFJ8cnySfLJ80nzyfRJ9Mn -1SfXJ9kn2yfdJ98n4SfjJ+Un5yfpJ/In9Cg5KDsoPSg/KEEoQyhFKEcoSShLKE0oTyhRKFMoVShXKFko -WyheKGEoZChnKGoobShwKHModih5KHwofyiCKIUoiCiLKKIowijPKO8pBSkbKTspRylnKYgpnCm0Kcsq -GCo4KlUqdSqBKpUqrCrJKucrByslKzkrRitmK4YrpCu8K8Yr0yvqK/Mr9Sv6K/wr/iwHLAksDiwQLBIs -GywdLIgsiiyMLI4skCySLJQsliyYLJosnCyeLKAsoiykLKYsqCyqLKwsriywLLIstCy2LLgsuiy8LL4s -wCzCLMQsxizILMoszCzOLNAs0izULNYs2CzaLNws3izgLOIs5CzmLOgs6izsLO4s8Cz5LPstZi1pLWwt -by1yLXUteC17LX4tgS2ELYctii2NLZAtky2WLZktnC2fLaItpS2oLastri2xLbQtty26Lb0twC3DLcYt -yS3MLc8t0i3VLdgt2y3eLeEt5C3nLeot7S3wLfMt9S34Lfst/i4BLgMuBS4HLgkuCy4NLg8uES4TLhUu -Fy4ZLhsuHS4fLiEuIy4lLicuKS4rLi0uLy4xLjMuNS43LjkuOy49Lj8uQS5DLkUuRy5JLlIuVC5WLlgu -Wi5cLl4uYC5iLmQubS5vLnAueS57LnwuhS6HLogukS6WAAAAAAAAAgIAAAAAAAAFkgAAAAAAAAAAAAAA -AAAALqU +AwkDHQMlAzsDPAM9A0gDSQNLA00DTgNSA1cDWANdA14DYwNkA2kDagNvA3ADdQN2A4ADgQOCA4MDhgON +A44DjwOQA5kDmgObA6EDogOkA6wDrQOuA7QDvAO9A74DxAPMA80DzgPUA9wD3QPeA+QD7APtA+4D9AP8 +A/0D/gQEBAwEDQQOBBQEFQQWBDgEOwQ8BD4EYASDBKYEpwSoBKkEqgSrBKwErQSuBK8EsASxBLIEswS0 +BLUEtgS3BLgEuQS6BLsEvAS9BL4EvwTABMEEwgTDBMQExQTGBMsE0AUEBTgFOQU6BTsFPAU9BT4BZgU/ +BUAFQQVCBUMFRABXBUUFRgVHBUgFSQVKBUsAkAVMBU0FTgVPBVAFUQVSBVMAVgVUBVUFVgVXBVgFWQVa +BVsFXAVdBV4FXwVgBWEFYgVjBWQFZwVqBW1VJG51bGzfEBIADQAOAA8AEAARABIAEwAUABUAFgAXABgA +GQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADBWTlNSb290ViRjbGFz +c11OU09iamVjdHNLZXlzXxAPTlNDbGFzc2VzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5T2lkc1ZhbHVl +c11OU0Nvbm5lY3Rpb25zW05TTmFtZXNLZXlzW05TRnJhbWV3b3JrXU5TQ2xhc3Nlc0tleXNaTlNPaWRz +S2V5c11OU05hbWVzVmFsdWVzXxAZTlNBY2Nlc3NpYmlsaXR5Q29ubmVjdG9yc11OU0ZvbnRNYW5hZ2Vy +XxAQTlNWaXNpYmxlV2luZG93c18QD05TT2JqZWN0c1ZhbHVlc18QF05TQWNjZXNzaWJpbGl0eU9pZHNL +ZXlzWU5TTmV4dE9pZFxOU09pZHNWYWx1ZXOAAoEBP4DhgQEJgQE+gJ2A5oAFgQEIgQEKgOeBATyAAIAG +gOWBAT0QpIEBC9IADgAyADMANFtOU0NsYXNzTmFtZYAEgANfEBlTcG90bGlnaHRXaW5kb3dDb250cm9s +bGVy0gA3ADgAOQA6WCRjbGFzc2VzWiRjbGFzc25hbWWiADoAO15OU0N1c3RvbU9iamVjdFhOU09iamVj +dF8QEElCQ29jb2FGcmFtZXdvcmvSAA4APgA/AEBaTlMub2JqZWN0c4CRoQBBgAfcAEMADgBEAEUARgBH +AEgASQBKAEsATABNAE4ATwBQAFEAUgBTAFQAVQBWAFcAWAArXE5TV2luZG93Vmlld1xOU1NjcmVlblJl +Y3RdTlNXaW5kb3dUaXRsZVlOU1dURmxhZ3NdTlNXaW5kb3dDbGFzc18QFk5TV2luZG93Q29udGVudE1p +blNpemVcTlNXaW5kb3dSZWN0XxAPTlNXaW5kb3dCYWNraW5nXxARTlNXaW5kb3dTdHlsZU1hc2tZTlNN +aW5TaXplW05TVmlld0NsYXNzgAyAnICagAkSIAAAAIAKgAuACBACEB+Am4AAXxAYe3sxOTYsIDE5Mn0s +IHs0ODAsIDMyMH19XxATT3BlbiBmcm9tIFNwb3RsaWdodFdOU1BhbmVsWns0MDAsIDI2MH3XAF8ADgBg +AGEAYgBjAGQAZQBmAGcAaABpAGUAa18QD05TTmV4dFJlc3BvbmRlclpOU1N1YnZpZXdzWE5TdkZsYWdz +W05TRnJhbWVTaXplWE5TV2luZG93W05TU3VwZXJ2aWV3gA2AmYAOEQEAgJeADYCY0gAOAD4AbQBugGCl +AG8AcABxAHIAc4APgBmAcoCGgI3YAF8ADgB1AHYAYQB3AGMAZABOAHkAegB7AHwAfQBlAE5XTlNGcmFt +ZVZOU0NlbGxZTlNFbmFibGVkgAyAGIAQgBERAQkJgA2ADF8QF3t7MzM1LCAyNzV9LCB7MTMxLCAzMn19 +3ACCAA4AgwCEAIUAhgCHAIgAiQCKAIsAjACNAI4AjwCQAJEAjwCTAJQAbwCWAJcAmFtOU0NlbGxGbGFn +c18QE05TQWx0ZXJuYXRlQ29udGVudHNfEBJOU1BlcmlvZGljSW50ZXJ2YWxeTlNCdXR0b25GbGFnczJf +EA9OU0tleUVxdWl2YWxlbnRaTlNDb250ZW50c1lOU1N1cHBvcnRdTlNDb250cm9sVmlld18QD05TUGVy +aW9kaWNEZWxheVxOU0NlbGxGbGFnczJdTlNCdXR0b25GbGFncxIEAf4AgBeAFhAZEIGAFoASgBOADxDI +EggAAAAT/////4aCQP9fEA9BZGQgdG8gUGxheWxpc3TUAA4AmwCcAJ0AngCfAKAAoVZOU1NpemVWTlNO +YW1lWE5TZkZsYWdzgBUjQCoAAAAAAACAFBEEFFxMdWNpZGFHcmFuZGXSADcAOACkAKWiAKUAO1ZOU0Zv +bnRQ0gA3ADgAqACppACpAKoAdgA7XE5TQnV0dG9uQ2VsbFxOU0FjdGlvbkNlbGzSADcAOACsAK2lAK0A +rgCvALAAO1hOU0J1dHRvbllOU0NvbnRyb2xWTlNWaWV3W05TUmVzcG9uZGVy3xAPAF8AsgAOAHUAswC0 +ALUAYAC2AGEAYwBkALcAuAC5AE4AuwC8AL0AvgC/AMAAwQDCAMMAZQBOAMYAxwDHW05TSFNjcm9sbGVy +WE5Tc0ZsYWdzXE5TQ29ybmVyVmlld18QEE5TSGVhZGVyQ2xpcFZpZXdcTlNTY3JvbGxBbXRzW05TVlNj +cm9sbGVyXU5TTmV4dEtleVZpZXddTlNDb250ZW50Vmlld4AMgGyAcYBwEQIwgCWAIoAaTxAQAAAAAAAA +AABBmAAAQZgAABEBEoANgAyAaIAbgBvSAA4APgBtAMuAYKUAxwDGALsAwAC/gBuAaIBsgCKAJdsAXwAO +AHUA0gBgAGEA0wBjANQAZAC4AHAA1gDXAFYA2ADZANoAZQDcAHAA2llOU2N2RmxhZ3NZTlNEb2NWaWV3 +WU5TQkdDb2xvcoAZgGeAZoAcEQkAgB2ADYA3gBmAHdIADgA+AG0A4YBgoQDagB3fEBcAXwDkAA4A5QDm +AOcA6ADpALQA6gDrAOwAYQBiAHcA7QBjADIA7gDvAGQA8ADxAMcA8wD0APUA9gD3ANwAfQC/APsA/AD9 +AP4A/wB9AQEAZQEDAQQBBQDHAQcBCF8QH05TRHJhZ2dpbmdTb3VyY2VNYXNrRm9yTm9uTG9jYWxZTlNU +dkZsYWdzXxATTlNPcmlnaW5hbENsYXNzTmFtZVxOU0hlYWRlclZpZXdfEBFOU0JhY2tncm91bmRDb2xv +cl8QEk5TQWxsb3dzVHlwZVNlbGVjdF8QF05TSW50ZXJjZWxsU3BhY2luZ1dpZHRoXxAZTlNDb2x1bW5B +dXRvcmVzaXppbmdTdHlsZV8QGE5TSW50ZXJjZWxsU3BhY2luZ0hlaWdodF5OU0F1dG9zYXZlTmFtZVtO +U0dyaWRDb2xvcl8QHE5TRHJhZ2dpbmdTb3VyY2VNYXNrRm9yTG9jYWxeTlNUYWJsZUNvbHVtbnNbTlNS +b3dIZWlnaHSAGxAAgGUT/////9vAgACAH4AhgDcJgCUjQAgAAAAAAAAQASNAAAAAAAAAABEREoAgCYBk +gA2AHoBhEA+AG4AoI0AxAAAAAAAAXxAVU3BvdGxpZ2h0UGxheWxpc3RWaWV3W05TVGFibGVWaWV3Wns0 +NDAsIDIxMX3XAF8ADgBhAGIAYwBkAQoAwAEOAGgBDwBlAMAA2oAigCSAI4ANgCKAHdsAXwAOANIAYABh +AGIA0wBjANQAZAC4AHAA1gEWARcA2QEYAPcAZQDcAHAA94AZgGcQBIBugG+AIYANgDeAGYAhWXs0NDAs +IDE3fdIANwA4ASABIaQBIQCvALAAO18QEU5TVGFibGVIZWFkZXJWaWV31gBfAA4AdQBhAGMAZABwASQB +JQEmAGUAcIAZgCeAJhP/////gAABAIANgBlfEBR7ey0yNiwgMH0sIHsxNiwgMTd9fdIANwA4ASsBLKQB +LACvALAAO11fTlNDb3JuZXJWaWV30gAOAD4AbQEvgGCnATABMQEyATMBNAE1ATaAKYA+gEaAS4BRgFaA +W9oBOAAOATkBOgE7ATwBPQE+AT8BCgB9AUEBQgFDAUQBRQFGAUcBSADaXk5TSXNSZXNpemVhYmxlXE5T +SGVhZGVyQ2VsbFxOU0lkZW50aWZpZXJXTlNXaWR0aFpOU0RhdGFDZWxsXk5TUmVzaXppbmdNYXNrWk5T +TWluV2lkdGhaTlNNYXhXaWR0aAmAPYArgCojQGAAAAAAAACANRADI0BEgAAAAAAAI0CPQAAAAAAAgB1V +dGl0bGXXAIIADgDoAIcAiACLAUwBTQFOAU8BUAFRAPMBUltOU1RleHRDb2xvchIEgf4AgDSALoAsgC2A +MFVUaXRsZdQADgCbAJwAnQCeAVYAoAFYgBUjQCYAAAAAAACAFBEMHNMADgFaAVsBXAFGAV1cTlNDb2xv +clNwYWNlV05TV2hpdGWAL0swLjMzMzMzMjk5ANIANwA4AV8BYKIBYAA7V05TQ29sb3LVAA4BYAFaAWIB +YwFcAWUBZgFnAWhbTlNDb2xvck5hbWVdTlNDYXRhbG9nTmFtZYAvgDMQBoAygDFWU3lzdGVtXxAPaGVh +ZGVyVGV4dENvbG9y0wAOAVoBWwFcAUYBbYAvQjAA0gA3ADgBbwFwpQFwAXEAqgB2ADtfEBFOU1RhYmxl +SGVhZGVyQ2VsbF8QD05TVGV4dEZpZWxkQ2VsbNgAggAOAOgAhwCIAIkAiwFMAXMBdADcAXYAlADaAXkB +ehIUIf5AgDyAN4A2gBOAHREIAIA6WVRleHQgQ2VsbNUADgFgAVoBYgFjAVwBfgFmAX8BaIAvgDmAOIAx +XxAWY29udHJvbEJhY2tncm91bmRDb2xvctMADgFaAVsBXAFGAYSAL0swLjY2NjY2NjY5ANUADgFgAVoB +YgFjAVwBZQFmAYgBaIAvgDOAO4AxXxAQY29udHJvbFRleHRDb2xvctIANwA4AYwBcaQBcQCqAHYAO9IA +NwA4AY4Bj6IBjwA7XU5TVGFibGVDb2x1bW7aATgADgE5AToBOwE8AT0BPgE/AQoAfQFBAZMBlAGVAZYB +RgGXAUgA2gmAPYBAgD8jQF7AAAAAAACARSNAQgAAAAAAAIAdVmFydGlzdNcAggAOAOgAhwCIAIsBTACN +AU4BnAGdAVEA8wFSgDSAQoBBgC2AMFZBcnRpc3TVAA4BYAFaAWIBYwFcAaMBZgGkAWiAL4BEgEOAMVto +ZWFkZXJDb2xvctMADgFaAVsBXAFGAamAL0IxANgAggAOAOgAhwCIAIkAiwFMAXMBdADcAXYAlADaAXkB +eoA8gDeANoATgB2AOtoBOAAOATkBOgE7ATwBPQE+AT8BCgB9AUEBtAG1AbYBtwFGAbgBSADaCYA9gEiA +RyNAX0AAAAAAAIBKI0BDgAAAAAAAgB1VYWxidW3XAIIADgDoAIcAiACLAUwAjQFOAZwBvgFRAPMBUoA0 +gEKASYAtgDBVQWxidW3YAIIADgDoAIcAiACJAIsBTAFzAXQA3AF2AJQA2gF5AXqAPIA3gDaAE4AdgDrb +ATgBygE5AToADgE7ATwBPQE+AT8BCgB9AH0BzQHOAUEB0AHRAUYB0gFIANpYTlNIaWRkZW4JCYBNgEyA +PSNASQAAAAAAAIBPI0BET2AgAAAAgB1WbGVuZ3Ro1wCCAA4A6ACHAIgAiwFMAI0BTgGcAdgBUQHaAVKA +NIBCgE6ALRIEAAAAgDBWTGVuZ3Ro2ACCAA4A6ACHAIgAiQCLAUwBcwF0ANwB4ACUANoB4wF6gDyAN4BQ +gBOAHRIEAAgAgDrbATgBygE5AToADgE7ATwBPQE+AT8BCgB9AH0B6AHpAUEB6wHsAUYB7QFIANoJCYBT +gFKAPSNAR4AAAAAAAIBVI0AkAAAAAAAAgB1UeWVhctcAggAOAOgAhwCIAIsBTACNAU4BnAHzAVEB2gFS +gDSAQoBUgC2AMFRZZWFy2ACCAA4A6ACHAIgAiQCLAUwBcwF0ANwB4ACUANoB4wF6gDyAN4BQgBOAHYA6 +2wE4AcoBOQE6AA4BOwE8AT0BPgE/AQoAfQB9AgECAgFBAgQCBQFGAe0BSADaCQmAWIBXgD0jQEcAAAAA +AACAWoAdVWdlbnJl1wCCAA4A6ACHAIgAiwFMAI0BTgGcAgsBUQDzAVKANIBCgFmALYAwVUdlbnJl2ACC +AA4A6ACHAIgAiQCLAUwBcwF0ANwB4ACUANoBeQF6gDyAN4BQgBOAHYA62gE4AA4BOQE6ATsBPAE9AT4B +PwEKAH0BQQIZAhoCGwIcAUYCHQIbANoJgD2AXYBcI0BKAAAAAAAAgF8jQCAAAAAAAACAHVV0cmFja9cA +ggAOAOgAhwCIAIsBTACNAU4BnAIjAVEB2gFSgDSAQoBegC2AMFVUcmFja9gAggAOAOgAhwCIAIkAiwFM +AXMBdADcAXYAlADaAeMBeoA8gDeANoATgB2AOtIANwA4Ai8CMKMCMAIxADteTlNNdXRhYmxlQXJyYXlX +TlNBcnJhedUADgFgAVoBYgFjAVwCNAFmAjUBaIAvgGOAYoAxWWdyaWRDb2xvctMADgFaAVsBXAFGAjqA +L0QwLjUAXxAUQ29nU3BvdGxpZ2h0UGxheWxpc3TSADcAOAI9Aj6iAj4AO15OU0NsYXNzU3dhcHBlcl8Q +FXt7MCwgMTd9LCB7NDQwLCAyMTF9fdIANwA4AkECQqQCQgCvALAAO1pOU0NsaXBWaWV32QBfAkQADgB1 +AGEAYwJFAGQCRgBwAHACSQJKASYAZQJMAHACTlhOU1RhcmdldFhOU0FjdGlvbllOU1BlcmNlbnSAGYAZ +gGuAaYANgGqAGSM/6jeEoAAAAF8QFHt7ODUsIDE3fSwgezE1LCA2OH19XF9kb1Njcm9sbGVyOtIANwA4 +AlICU6UCUwCuAK8AsAA7Wk5TU2Nyb2xsZXLaAF8CRAAOAHUAswBhAGMCRQBkAkYAcABwAkkCWAD8ASYA +ZQJMAHACXIAZgBmAa4BtgA2AaoAZIz/tpGEAAAAAXxAVe3swLCAyMTN9LCB7NDQwLCAxNX190gAOAD4A +bQJggGChAPeAIV8QFnt7MjAsIDQ0fSwgezQ0MCwgMjI4fX3SADcAOAJkAmWkAmUArwCwADtcTlNTY3Jv +bGxWaWV32ABfAA4AdQB2AGEAdwBjAGQATgJoAmkCagJrAH0AZQBOgAyAhYBzgHQRAQoJgA2ADF8QFnt7 +MjAsIDI4Mn0sIHszMTMsIDIyfX3dAIIADgJxAOgAhwCIAIkAiwJyAnMCdAJ1AUwCdgJ3AngCeQCPAJQA +cQJ9APwAfQJ/AoABel8QEk5TQ2FuY2VsQnV0dG9uQ2VsbF8QEE5TVGV4dEJlemVsU3R5bGVfEBFOU0Ry +YXdzQmFja2dyb3VuZF8QEk5TU2VhcmNoQnV0dG9uQ2VsbF8QEE5TTWF4aW11bVJlY2VudHMSFHH+QICE +gHqAdYAWgBOAchIQAAQACYB3EP+AOtUADgFgAVoBYgFjAVwBowFmAoUBaIAvgESAdoAxXxATdGV4dEJh +Y2tncm91bmRDb2xvctwCRACCAA4AhACFAIYAhwCJAIoAiwJFAIwCagKKAI4CjADzAI8CjgBxApAA8wKR +ApKAdBIAAf4AgBcQS4AWgHiAchEBkIB5EghEQP9Wc2VhcmNoXxATX3NlYXJjaEZpZWxkU2VhcmNoOt0C +RACCAA4AhACFAIYClgCHAIkAigCLAkUAjAJqAooAjgKMAPMAjwKaApsAcQKQAPMCnQKSXxAjTlNBY2Nl +c3NpYmlsaXR5T3ZlcnJpZGRlbkF0dHJpYnV0ZXOAdIAXgBaAfIB7gHKAg1VjbGVhctIADgA+AG0CoYBg +oQKigH3TAA4CpAA+AqUCpgKpV05TLmtleXOAgqICpwKogH6Af6ICqgKrgICAgV1BWERlc2NyaXB0aW9u +XxApTlNBY2Nlc3NpYmlsaXR5RW5jb2RlZEF0dHJpYnV0ZXNWYWx1ZVR5cGVWY2FuY2Vs0gA3ADgCsAKx +owKxArIAO18QE05TTXV0YWJsZURpY3Rpb25hcnlcTlNEaWN0aW9uYXJ5XxATX3NlYXJjaEZpZWxkQ2Fu +Y2VsOtIANwA4ArUCtqUCtgFxAKoAdgA7XxARTlNTZWFyY2hGaWVsZENlbGzSADcAOAK4ArmmArkCugCu +AK8AsAA7XU5TU2VhcmNoRmllbGRbTlNUZXh0RmllbGTYAF8ADgB1AHYAYQB3AGMAZABOAr0CvgK/AsAA +fQBlAE6ADICMgIeAiBEBIQmADYAMXxAUe3s4OCwgMTR9LCB7OTYsIDE3fX3YAIIADgDoAIcAiACJAIsB +TALGAXQCyALJAJQAcgLMAXoSBAH+QIA8gIqAiYATgIYSEEAEAIA6XFNlYXJjaCBQYXRoOtUADgFgAVoB +YgFjAVwBfgFmAtIBaIAvgDmAi4AxXGNvbnRyb2xDb2xvctIANwA4AtYCuqUCugCuAK8AsAA72QBfAA4A +dQB2AtgAYQB3AGMAZABOAtoC2wLcAt0CwAB9AGUATltOU0RyYWdUeXBlc4AMgJaAkoCTgI4JgA2ADNIA +DgA+AD8C44CRogLkAuWAj4CQXxAZQXBwbGUgVVJMIHBhc3RlYm9hcmQgdHlwZV8QFU5TRmlsZW5hbWVz +UGJvYXJkVHlwZdIANwA4AukC6qMC6gLrADtcTlNNdXRhYmxlU2V0VU5TU2V0XxAWe3sxODksIDEwfSwg +ezI3MSwgMjZ9fdgC7gCCAA4AiACJAIsC7wLwAFYC8QLyAJQAcwL1AvYAc1tOU1BhdGhTdHlsZV8QFE5T +UGF0aENvbXBvbmVudENlbGxzWk5TRGVsZWdhdGUSFCH+AYCVgBOAjRGAAICUgI3SAA4APgBtAvqAYKDS +ADcAOAL8Av2kAv0AqgB2ADtaTlNQYXRoQ2VsbNIANwA4Av8DAKUDAACuAK8AsAA7XU5TUGF0aENvbnRy +b2xaezQ4MCwgMzIwfdIANwA4AwMAr6MArwCwADtfEBV7ezAsIDB9LCB7MTI4MCwgNzc4fX1aezQwMCwg +Mjc2fdIANwA4AwcDCKIDCAA7XxAQTlNXaW5kb3dUZW1wbGF0ZdIADgA+AG0DC4BgrxARAwwDDQMOAw8D +EAMRAxIDEwMUAxUDFgMXAxgDGQMaAxsDHICegKiAqoCsgK6AsICygLSAuYC9gMOAx4DLgM+A04DXgNvU +AA4DHgMfAyADIQMiANoDJF1OU0Rlc3RpbmF0aW9uWE5TU291cmNlV05TTGFiZWyAp4CfgB2AptwDJgAO +AycA5gMoAykDKgMrAywAMgMtAy4AfQD0AH0DMgB9AzQDNQM2AH0DOAB9AH1fEBpOU0ZpbHRlclJlc3Ry +aWN0c0luc2VydGlvbl8QFE5TUHJlc2VydmVzU2VsZWN0aW9uWk5TRWRpdGFibGVfEA9fTlNNYW5hZ2Vk +UHJveHlfEBFOU09iamVjdENsYXNzTmFtZV5OU0RlY2xhcmVkS2V5c18QIk5TQ2xlYXJzRmlsdGVyUHJl +ZGljYXRlT25JbnNlcnRpb25fEBhOU1NlbGVjdHNJbnNlcnRlZE9iamVjdHNfEBZOU0F2b2lkc0VtcHR5 +U2VsZWN0aW9uCYBlCYChCYCkgKOAogmAoAkJXxAbU3BvdGxpZ2h0UGxheWxpc3RDb250cm9sbGVyXxAR +TlNBcnJheUNvbnRyb2xsZXLSAA4APgBtAz+AYKgBUAFDAekBlAG1AgIBzgIagCyAKoBSgD+AR4BXgEyA +XF1QbGF5bGlzdEVudHJ50QAOA0qApdIANwA4A0wDKaIDKQA7WmRhdGFTb3VyY2XSADcAOANPA1CjA1AD +UQA7XxAUTlNOaWJPdXRsZXRDb25uZWN0b3JeTlNOaWJDb25uZWN0b3LUAA4DHgMfAyADIQDaAyIDVoCn +gB2An4CpWXRhYmxlVmlld9QADgMeAx8DIAMhAyIAHwNcgKeAn4ACgKtfEBJwbGF5bGlzdENvbnRyb2xs +ZXLUAA4DHgMfAyADIQBxAEEDYoCngHKAB4CtXxAVaW5pdGlhbEZpcnN0UmVzcG9uZGVy1AAOAx4DHwMg +AyEAHwMiA2iAp4ACgJ+Ar18QGXNwb3RsaWdodFdpbmRvd0NvbnRyb2xsZXLUAA4DHgMfAyADIQBzAB8D +boCngI2AAoCxW3BhdGhDb250cm9s1AAOAx4DHwMgAyEAQQAfA3SAp4AHgAKAs1Z3aW5kb3fXAA4DHgN3 +A3gDHwMgA3kDegAfA3wDfQBxA38AVllOU0tleVBhdGhZTlNCaW5kaW5nXxAcTlNOaWJCaW5kaW5nQ29u +bmVjdG9yVmVyc2lvboC4gAKAt4C2gHKAtV8QE3ZhbHVlOiBzZWFyY2hTdHJpbmdVdmFsdWVcc2VhcmNo +U3RyaW5n0gA3ADgDhAOFowOFA1EAO18QFU5TTmliQmluZGluZ0Nvbm5lY3RvctcADgMeA3cDeAMfAyAD +eQN6AB8DiQOKAyIDjABWgLiAAoC8gLuAn4C6XxAbY29udGVudEFycmF5OiBxdWVyeS5yZXN1bHRzXGNv +bnRlbnRBcnJheV1xdWVyeS5yZXN1bHRz2AAOAx4DdwN4Ax8DIAORA3kDegMiA5QDfQE2A5cDmABWWU5T +T3B0aW9uc4C4gJ+Av4C2gFuAvoDAXxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy50cmFja18QFWFycmFu +Z2VkT2JqZWN0cy50cmFja9MADgKkAD4DnAOdA5+AwqEDnoDBoQKrgIFfEBtOU0NvbmRpdGlvbmFsbHlT +ZXRzRWRpdGFibGXSADcAOAOjArKiArIAO9gADgMeA3cDeAMfAyADkQN5A3oDIgOnA30BMAOqA6sAVoC4 +gJ+AxYC2gCmAxIDGXxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy50aXRsZV8QFWFycmFuZ2VkT2JqZWN0 +cy50aXRsZdMADgKkAD4DnAOwA7KAwqEDnoDBoQKrgIHYAA4DHgN3A3gDHwMgA5EDeQN6AyIDtwN9ATMD +ugO7AFaAuICfgMmAtoBLgMiAyl8QHXZhbHVlOiBhcnJhbmdlZE9iamVjdHMubGVuZ3RoXxAWYXJyYW5n +ZWRPYmplY3RzLmxlbmd0aNMADgKkAD4DnAPAA8KAwqEDnoDBoQKrgIHYAA4DHgN3A3gDHwMgA5EDeQN6 +AyIDxwN9ATEDygPLAFaAuICfgM2AtoA+gMyAzl8QHXZhbHVlOiBhcnJhbmdlZE9iamVjdHMuYXJ0aXN0 +XxAWYXJyYW5nZWRPYmplY3RzLmFydGlzdNMADgKkAD4DnAPQA9KAwqEDnoDBoQKrgIHYAA4DHgN3A3gD +HwMgA5EDeQN6AyID1wN9ATQD2gPbAFaAuICfgNGAtoBRgNCA0l8QG3ZhbHVlOiBhcnJhbmdlZE9iamVj +dHMueWVhcl8QFGFycmFuZ2VkT2JqZWN0cy55ZWFy0wAOAqQAPgOcA+AD4oDCoQOegMGhAquAgdgADgMe +A3cDeAMfAyADkQN5A3oDIgPnA30BNQPqA+sAVoC4gJ+A1YC2gFaA1IDWXxAcdmFsdWU6IGFycmFuZ2Vk +T2JqZWN0cy5nZW5yZV8QFWFycmFuZ2VkT2JqZWN0cy5nZW5yZdMADgKkAD4DnAPwA/KAwqEDnoDBoQKr +gIHYAA4DHgN3A3gDHwMgA5EDeQN6AyID9wN9ATID+gP7AFaAuICfgNmAtoBGgNiA2l8QHHZhbHVlOiBh +cnJhbmdlZE9iamVjdHMuYWxidW1fEBVhcnJhbmdlZE9iamVjdHMuYWxidW3TAA4CpAA+A5wEAAQCgMKh +A56AwaECq4CB2AAOAx4DdwN4Ax8DIAORA3kDegAfBAcDfQBzBAoECwBWgLiAAoDdgLaAjYDcgN5fEBp2 +YWx1ZTogc3BvdGxpZ2h0U2VhcmNoUGF0aF8QE3Nwb3RsaWdodFNlYXJjaFBhdGjTAA4CpAA+A5wEEAQS +gMKhBBGA36EEE4DgXxAWTlNWYWx1ZVRyYW5zZm9ybWVyTmFtZV8QFlN0cmluZ1RvVVJMVHJhbnNmb3Jt +ZXLSAA4APgQXBBiA5K8QHwLcAhwEGwBwAUUB0QEwATYAQQDaAHsCvwDGAE4CagGWATQAcQExAyIAbwC7 +ATMBMgG3AewBNQBzAgUA9wBygJOAX4DigBmANYBPgCmAW4AHgB2AEYCIgGiADIB0gEWAUYBygD6An4AP +gGyAS4BGgEqAVYBWgI2AWoAhgIbSAA4AMgAzBDqABIDjXU5TQXBwbGljYXRpb27SADcAOAQ9AjGiAjEA +O9IADgA+BBcEQIDkrxAfAHMBNgAfAE4BMAEzANoA2gAfAHAAbwByAHAAQQBxATEA2gBOANoAHwBOAHAA +2gDaATIBNADaAE4BNQBwAE6AjYBbgAKADIApgEuAHYAdgAKAGYAPgIaAGYAHgHKAPoAdgAyAHYACgAyA +GYAdgB2ARoBRgB2ADIBWgBmADNIADgA+BBcEYoDkrxAgAtwCHAQbAHABRQHRATABNgBBANoAxgB7Ar8A +TgJqAZYDIgBxATQBMQBvALsBMwEyAB8A9wE1AHMB7AG3AgUAcoCTgF+A4oAZgDWAT4ApgFuAB4AdgGiA +EYCIgAyAdIBFgJ+AcoBRgD6AD4BsgEuARoACgCGAVoCNgFWASoBagIbSAA4APgQXBIWA5K8QIASGBIcE +iASJBIoEiwSMBI0EjgSPBJAEkQSSBJMElASVBJYElwSYBJkEmgSbBJwEnQSeBJ8EoAShBKIEowSkBKWA +6IDpgOqA64DsgO2A7oDvgPCA8YDygPOA9ID1gPaA94D4gPmA+oD7gPyA/YD+gP+BAQCBAQGBAQKBAQOB +AQSBAQWBAQaBAQdZUGF0aCBDZWxsXxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTFbQXBwbGlj +YXRpb25bU2Nyb2xsIFZpZXdfEBtUZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbClfEB1UZXh0IEZpZWxk +IENlbGwgKFRleHQgQ2VsbCktNF8QFFRhYmxlIENvbHVtbiAodGl0bGUpXxAUVGFibGUgQ29sdW1uICh0 +cmFjaylfEBtQYW5lbCAoT3BlbiBmcm9tIFNwb3RsaWdodClfEEpTcG90bGlnaHQgUGxheWxpc3QgVmll +dyAoVGl0bGUsIEFydGlzdCwgQWxidW0sIExlbmd0aCwgWWVhciwgR2VucmUsIFRyYWNrKV8QEVZlcnRp +Y2FsIFNjcm9sbGVyXxAdQnV0dG9uIENlbGwgKEFkZCB0byBQbGF5bGlzdClfEB5UZXh0IEZpZWxkIENl +bGwgKFNlYXJjaCBQYXRoOilcQ29udGVudCBWaWV3XxARU2VhcmNoIEZpZWxkIENlbGxfEB1UZXh0IEZp +ZWxkIENlbGwgKFRleHQgQ2VsbCktM18QHVNwb3RsaWdodCBQbGF5bGlzdCBDb250cm9sbGVyXFNlYXJj +aCBGaWVsZF8QE1RhYmxlIENvbHVtbiAoeWVhcilfEBVUYWJsZSBDb2x1bW4gKGFydGlzdClfEB1QdXNo +IEJ1dHRvbiAoQWRkIHRvIFBsYXlsaXN0KV8QE0hvcml6b250YWwgU2Nyb2xsZXJfEBVUYWJsZSBDb2x1 +bW4gKGxlbmd0aClfEBRUYWJsZSBDb2x1bW4gKGFsYnVtKVxGaWxlJ3MgT3duZXJfEBFUYWJsZSBIZWFk +ZXIgVmlld18QFFRhYmxlIENvbHVtbiAoZ2VucmUpXxAaUG9wIFVwIFBhdGggQ29udHJvbCBXaWRnZXRf +EB1UZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktMl8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxs +KS01XxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTZfEBpTdGF0aWMgVGV4dCAoU2VhcmNoIFBh +dGg6KdIADgA+BBcEyIDkogDaAyKAHYCf0gAOAD4EFwTNgOSiAQMDOIAegKDSAA4APgQXBNKA5K8QMQLc +AxAEGwBwAUUBNgBBAw0AewK/AxgDFAJqAZYDDwE0ATEDEgBvALsDGgIFAB8A9wIcAdEDEwEwAxwA2gDG +Aw4ATgMbAxkDFwMiAHEDEQMMATMBMgG3AewBNQBzAxUDFgBygJOAroDigBmANYBbgAeAqIARgIiAy4C5 +gHSARYCsgFGAPoCygA+AbIDTgFqAAoAhgF+AT4C0gCmA24AdgGiAqoAMgNeAz4DHgJ+AcoCwgJ6AS4BG +gEqAVYBWgI2AvYDDgIbSAA4APgQXBQaA5K8QMQUHBQgFCQUKBQsFDAKrBQ4FDwUQBREFEgUTBRQFFQUW +BRcFGAUZBRoFGwUcBR0FHgUfBSAFIQUiBSMFJAUlBSYFJwUoBSkFKgUrBSwFLQUuBS8FMAUxBTIFMwU0 +BTUFNgU3gQEMgQENgQEOgQEPgQEQgQERgIGBARKBAROBARSBARWBARaBAReBARiBARmBARqBARuBARyB +AR2BAR6BAR+BASCBASGBASKBASOBASSBASWBASaBASeBASiBASmBASqBASuBASyBAS2BAS6BAS+BATCB +ATGBATKBATOBATSBATWBATaBATeBATiBATmBATqBATsQWRCgE//////////9EBgQJRAdEJUQUBBoEKIQ +OBAnED0QIhBIEAUQGhBmECsQoxAsECkQmhAkEJ0QHBAbEKEQZRBeEGkQEBA3EJ8QlxAgECEQKBAqEB4Q +WBBrEF0QT9IADgA+AG0FZoBgoNIADgA+BBcFaYDkoNIADgA+BBcFbIDkoNIANwA4BW4Fb6IFbwA7Xk5T +SUJPYmplY3REYXRhAAgAGQAiACcAMQA6AD8ARABSAFQAZgLqAvADOwNCA0kDVwNpA4UDkwOfA6sDuQPE +A9ID7gP8BA8EIQQ7BEUEUgRUBFcEWQRcBF8EYQRjBGUEaARrBG0EcARyBHQEdgR5BHsEfgSHBJMElQSX +BLMEvATFBNAE1QTkBO0FAAUJBRQFFgUZBRsFTAVZBWYFdAV+BYwFpQWyBcQF2AXiBe4F8AXyBfQF9gX7 +Bf0F/wYBBgMGBQYHBgkGJAY6BkIGTQZqBnwGhwaQBpwGpQaxBrMGtQa3BroGvAa+BsAGyQbLBtYG2Aba +BtwG3gbgBwEHCQcQBxoHHAceByAHIgclByYHKAcqB0QHdQeBB5cHrAe7B80H2AfiB/AIAggPCB0IIggk +CCYIKAgqCCwILggwCDIINAg5CEIIVAhlCGwIcwh8CH4IhwiJCIwImQiiCKcIrgivCLgIwQjOCNsI5Ajv +CPgJAgkJCRUJVAlgCWkJdgmJCZYJogmwCb4JwAnCCcQJxgnJCcsJzQnPCeIJ5QnnCekJ6wntCe8J+An6 +CgUKBwoJCgsKDQoPCjwKRgpQCloKXApeCmAKYgplCmcKaQprCm0Kbwp4CnoKfQp/Ct4LAAsKCyALLQtB +C1YLcAuMC6cLtgvCC+EL8Av8C/4MAAwCDAsMDQwPDBEMEgwUDB0MHwwoDCsMLQwuDDAMMgw0DDYMOAw6 +DDwMRQxdDGkMdAyRDJMMlQyXDJkMmwydDMoMzAzODNAM0gzUDNYM2AzaDNwM3gzoDPEM+g0ODScNKQ0r +DS0NNg04DToNUQ1aDWMNcQ16DXwNiw2NDY8NkQ2TDZUNlw2ZDcIN0Q3eDesN8w3+Dg0OGA4jDiQOJg4o +DioOMw41DjcOQA5JDksOUQ5uDnoOfw6BDoMOhQ6HDokOjw6gDqIOqw6tDrAOvQ7KDtIO1A7gDukO7g72 +DwsPFw8lDycPKQ8rDy0PLw82D0gPVQ9XD1oPYw9uD4IPlA+1D7oPvA++D8APwg/ED8cPyQ/TD+gP6g/s +D+4P8BAJEBYQGBAkEDkQOxA9ED8QQRBUEF0QZhBvEHQQghCrEKwQrhCwELIQuxC9EMYQyBDPEOwQ7hDw +EPIQ9BD2EP0REhEUERYRGBEaESYRMxE1ETgRWRFbEV0RXxFhEWMRZRGOEY8RkRGTEZURnhGgEakRqxGx +Ec4R0BHSEdQR1hHYEd4R/xIBEgMSBRIHEgkSCxI4EkESQhJDEkUSRxJJElISVBJdEl8SZhKDEoUShxKJ +EosSkBKSEpkSuhK8Er4SwBLCEsQSyRLLEvgS+RL6EvwS/hMAEwkTCxMUExYTGxM4EzoTPBM+E0ATQhNH +E2gTahNsE24TcBNyE3QToROiE6MTpROnE6kTshO0E7YTvBPZE9sT3RPfE+ET4xPpFAoUDBQOFBAUEhQU +FBYUPxRAFEIURBRGFE8UURRaFFwUYhR/FIEUgxSFFIcUiRSPFLAUshS0FLYUuBS6FLwUxRTMFNsU4xT4 +FPoU/BT+FQAVChUXFRkVHhU1FT4VQxVSFWoVcxV8FYcVrBW1Fb4VyBXKFcwVzhXQFdIV1BXWFd8V9hYD +FgwWFxYiFksWTRZPFlEWUxZVFlcWWRZiFnoWgxaFFogWihajFqwWtRbCFuMW5RbnFukW6xbuFu8W8Rbz +FwwXQRdWF2kXfReSF6UXqhesF64XsBeyF7QXthe7F7wXvhfAF8IX1xfZF9sX3RffF/UYJhgoGC0YLxgx +GDMYNRg3GDoYPBhBGEgYXhiTGLkYuxi9GL8YwRjDGMUYxxjNGNYY2BjbGN0Y6hjyGPQY+Rj7GP0ZAhkE +GQYZFBlAGUcZUBlXGW0ZehmQGZkZpBm4GcEZzhncGegaCRoLGg0aDxoRGhQaFRoXGhkaMBpRGlYaWBpa +GlwaXhpgGmUaZxp0GokaixqNGo8akRqeGqcashrXGuMa5RrnGuka6xrtGu4a8BryGvsa/RsCGwQbBhsi +GzobQxtKG1cbXRt2G5cboxu6G8UbyhvMG84b0BvTG9Ub1xvgG+Ib4xvsG/UcABwJHBQcIhwtHDYcPRxV +HGAcaRxuHIEcihyMHLEcsxy1HLccuRy7HL0cvxzBHMMcxRzHHMkcyxzNHM8c0RzTHOQc8hz7HQMdBR0H +HQkdCx08HVkdcB17HY0doR2wHdUd8B4JHgoeDB4NHg8eEB4SHhQeFh4XHhkeGh4bHjkeTR5WHlgeaR5r +Hm0ebx5xHnMedR53Hnkehx6MHo4elx6cHqcesB63Hs4e3R7uHvAe8h70HvYfAB8RHxMfFR8XHxkfLh8/ +H0EfQx9FH0cfXx9wH3IfdB92H3gflB+lH6cfqR+rH60fuR/KH8wfzh/QH9If2R/2IAAgCiApICsgLSAv +IDEgMyA1IEsgUSBeIGcgbiCGIKMgpSCnIKkgqyCtIK8gzSDaIOghCSETIRUhFyEZIRshHSEfISEhQCFY +IWUhZyFqIWwhbyFxIY8hmCGdIb4hwCHCIcQhxiHIIcohzCHrIgMiECISIhUiFyIaIhwiPSI/IkEiQyJF +IkciSSJLImsihCKRIpMiliKYIpsinSK+IsAiwiLEIsYiyCLKIswi7CMFIxIjFCMXIxkjHCMeIz8jQSND +I0UjRyNJI0sjTSNrI4IjjyORI5QjliOZI5sjvCO+I8AjwiPEI8YjyCPKI+kkASQOJBAkEyQVJBgkGiQ7 +JD0kPyRBJEMkRSRHJEkkaCSAJI0kjySSJJQklySZJLokvCS+JMAkwiTEJMYkyCTlJPslCCUKJQ0lDyUS +JRQlLSVGJU8lUSWSJZQlliWYJZolnCWeJaAloiWkJaYlqCWqJawlriWwJbIltCW2JbgluiW8Jb4lwCXC +JcQlxiXIJcolzCXOJdAl2SXbJd0l6yX0JfkmAiYEJkUmRyZJJksmTSZPJlEmUyZVJlcmWSZbJl0mXyZh +JmMmZSZnJmkmayZtJm8mcSZzJnUmdyZ5JnsmfSZ/JoEmgyaMJo4m0SbTJtUm1ybZJtsm3SbfJuEm4ybl +Jucm6SbrJu0m7ybxJvMm9Sb3Jvkm+yb9Jv8nAScDJwUnBycJJwsnDScPJxEnGiccJ18nYSdjJ2UnZydp +J2snbSdvJ3Encyd1J3cneSd7J30nfyeBJ4MnhSeHJ4kniyeNJ48nkieVJ5gnmyeeJ6EnpCenJ7En0Sfd +J+koBygnKD4oVShzKMAo1Cj0KRUpIik2KVYpdimDKZkpsSnRKecp/yoWKiMqNypOKmsqiyqrKssq6Crx +KvMq+Cr6KvwrBSsHKwwrDisQKxkrGyuAK4IrhCuGK4griiuMK44rkCuSK5QrliuYK5ornCueK6Aroiuk +K6YrqCuqK6wrriuwK7IrtCu2K7gruiu8K74rwCvCK8QrxivIK8orzCvOK9Ar0ivUK9Yr2CvaK9wr3ivg +K+Ir6yvtLFIsVSxYLFssXixhLGQsZixpLGwsbyxyLHUseCx7LH4sgSyELIcsiiyNLJAskyyWLJksnCyf +LKIspSyoLKssriyxLLQstyy6LL0swCzDLMYsySzMLM8s0izVLNgs2yzeLOEs5CzmLOgs8SzzLPUs9yz5 +LPss/Sz/LQEtAy0FLQctCS0LLQ0tDy0RLRMtFS0XLRktGy0dLR8tIS0jLSUtJy0pLSstLS0vLTEtMy01 +LTctOS07LT0tPy1BLUMtTC1OLU8tWC1aLVstZC1mLWctcC11AAAAAAAAAgIAAAAAAAAFcAAAAAAAAAAA +AAAAAAAALYQ diff --git a/Spotlight/SpotlightPlaylistController.h b/Spotlight/SpotlightPlaylistController.h index aa49fbe1c..9702d932d 100644 --- a/Spotlight/SpotlightPlaylistController.h +++ b/Spotlight/SpotlightPlaylistController.h @@ -8,10 +8,10 @@ #import #import "PlaylistController.h" -#import "SpotlightSearchController.h" +#import "SpotlightWindowController.h" @interface SpotlightPlaylistController : PlaylistController { - IBOutlet SpotlightSearchController * spotlightSearchController; + IBOutlet SpotlightWindowController * spotlightWindowController; } - (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard*)pboard; diff --git a/Spotlight/SpotlightPlaylistController.m b/Spotlight/SpotlightPlaylistController.m index 8ddd45ac4..36c93e67d 100644 --- a/Spotlight/SpotlightPlaylistController.m +++ b/Spotlight/SpotlightPlaylistController.m @@ -15,13 +15,13 @@ writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard*)pboard { - [spotlightSearchController.query disableUpdates]; + [spotlightWindowController.query disableUpdates]; NSArray *urls = [[self selectedObjects]valueForKey:@"url"]; [pboard declareTypes:[NSArray arrayWithObjects:CogUrlsPboardType,nil] owner:nil]; //add it to pboard [pboard setData:[NSArchiver archivedDataWithRootObject:urls] forType:CogUrlsPboardType]; - [spotlightSearchController.query enableUpdates]; + [spotlightWindowController.query enableUpdates]; return YES; } diff --git a/Spotlight/SpotlightSearchController.h b/Spotlight/SpotlightSearchController.h deleted file mode 100644 index 780dfba09..000000000 --- a/Spotlight/SpotlightSearchController.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// SpotlightSearchController.h -// Cog -// -// Created by Matthew Grinshpun on 10/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - -#import - -@class SpotlightWindowController; - -@interface SpotlightSearchController : NSObject { - IBOutlet NSArrayController *playlistController; - IBOutlet SpotlightWindowController *spotlightWindowController; - IBOutlet NSPathControl *pathControl; - NSMetadataQuery *query; - NSString *searchString; - NSString *spotlightSearchPath; -} - -- (IBAction)addToPlaylist:(id)sender; - -- (void)performSearch; -- (NSPredicate *)processSearchString; - -@property(retain) NSMetadataQuery *query; -@property(copy) NSString *searchString; -@property(copy) NSString *spotlightSearchPath; - -@end diff --git a/Spotlight/SpotlightSearchController.m b/Spotlight/SpotlightSearchController.m deleted file mode 100644 index ce8f4466a..000000000 --- a/Spotlight/SpotlightSearchController.m +++ /dev/null @@ -1,198 +0,0 @@ -// -// SpotlightSearchController.m -// Cog -// -// Created by Matthew Grinshpun on 10/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. -// - -#import "SpotlightSearchController.h" -#import "SpotlightWindowController.h" -#import "PlaylistLoader.h" -#import "SpotlightPlaylistEntry.h" - -// Minimum length of a search string (searching for very small strings gets ugly) -#define MINIMUM_SEARCH_STRING_LENGTH 3 - -// Store a class predicate for searching for music -static NSPredicate * musicOnlyPredicate = nil; - -@implementation SpotlightSearchController - -+ (void)initialize -{ - musicOnlyPredicate = [[NSPredicate predicateWithFormat: - @"kMDItemContentTypeTree==\'public.audio\'"] retain]; - - NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; - - // Set the home directory as the default search directory - NSString * homeDir = @"~"; - homeDir = [homeDir stringByExpandingTildeInPath]; - homeDir = [[NSURL fileURLWithPath:homeDir isDirectory:YES] absoluteString]; - NSDictionary *searchDefault = - [NSDictionary dictionaryWithObject:homeDir - forKey:@"spotlightSearchPath"]; - [defaults registerDefaults:searchDefault]; -} - -- (id)init -{ - if (self = [super init]) { - self.query = [[NSMetadataQuery alloc] init]; - [self.query setDelegate:self]; - } - - return self; -} - -- (void)performSearch -{ - NSPredicate *searchPredicate; - // Process the search string into a compound predicate. If Nil is returned do nothing - if(searchPredicate = [self processSearchString]) - { - // spotlightPredicate, which is what will finally be used for the spotlight search - // is the union of the (potentially) compound searchPredicate and the static - // musicOnlyPredicate - - NSPredicate *spotlightPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: - [NSArray arrayWithObjects: musicOnlyPredicate, - searchPredicate, - nil]]; - // Only preform a new search if the predicate has changed or there is a new path - if(![self.query.predicate isEqual:spotlightPredicate] - || ![self.query.searchScopes isEqualToArray: - [NSArray arrayWithObjects:pathControl.URL, nil]]) - { - if([self.query isStarted]) - [self.query stopQuery]; - self.query.predicate = spotlightPredicate; - // Set scope to contents of pathControl - self.query.searchScopes = [NSArray arrayWithObjects:pathControl.URL, nil]; - [self.query startQuery]; - NSLog(@"Started query: %@", [self.query.predicate description]); - } - } -} - -- (NSPredicate *)processSearchString -{ - NSMutableArray *searchComponents = [NSMutableArray arrayWithCapacity:10]; - - NSScanner *scanner = [NSScanner scannerWithString:self.searchString]; - - while (![scanner isAtEnd]) - { - NSString *scannedString; - if ([scanner scanUpToString:@" " intoString:&scannedString]) - { - // don't add tiny strings in... They're make the system go nuts - // TODO: Maybe consider a better solution to the issue? - if ([scannedString length] >= MINIMUM_SEARCH_STRING_LENGTH) - { - [searchComponents addObject:scannedString]; - } - } - } - - // create an array of all the predicates to join together - NSMutableArray * subpredicates = [NSMutableArray - arrayWithCapacity:[searchComponents count]]; - - // we will ignore case and diacritics - unsigned options = (NSCaseInsensitivePredicateOption| - NSDiacriticInsensitivePredicateOption); - - for(NSString *s in searchComponents) - { - // convert each "word" into "*word*" - NSString *processedKey = [NSString stringWithFormat: @"*%@*", s]; - - // Search all tags for something like word - NSPredicate *predicate = [NSComparisonPredicate - predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"*"] - rightExpression:[NSExpression expressionForConstantValue:processedKey] - modifier:NSDirectPredicateModifier - type:NSLikePredicateOperatorType - options:options]; - - //TODO: Ability to search only artist, albums, etc. - [subpredicates addObject: predicate]; - } - if ([subpredicates count] == 0) - return Nil; - else if ([subpredicates count] == 1) - return [subpredicates objectAtIndex: 0]; - - // Create a compound predicate from subPredicates - return [NSCompoundPredicate andPredicateWithSubpredicates: subpredicates]; -} - -- (void)dealloc -{ - [self.query stopQuery]; - [self.query release]; - [self.searchString release]; - [musicOnlyPredicate release]; - [super dealloc]; -} - -- (IBAction)addToPlaylist:(id)sender -{ - [self.query disableUpdates]; - - NSArray *urls = [[playlistController selectedObjects]valueForKey:@"url"]; - [spotlightWindowController.playlistLoader addURLs:urls sort:NO]; - - [self.query enableUpdates]; -} - -#pragma mark NSMetadataQuery delegate methods - -// replace the NSMetadataItem with a PlaylistEntry -- (id)metadataQuery:(NSMetadataQuery*)query -replacementObjectForResultObject:(NSMetadataItem*)result -{ - return [SpotlightPlaylistEntry playlistEntryWithMetadataItem: result]; -} - -#pragma mark Getters and setters - -@synthesize query; - -@synthesize searchString; -- (void)setSearchString:(NSString *)aString -{ - // Make sure the string is changed - if (![searchString isEqualToString:aString]) - { - searchString = [aString copy]; - [self performSearch]; - } -} - -@dynamic spotlightSearchPath; -// getter reads from user defaults -- (NSString *)spotlightSearchPath -{ - return [[[NSUserDefaults standardUserDefaults] - stringForKey:@"spotlightSearchPath"]copy]; -} -// Normally, our nspathcontrol would just bind to the user defaults -// However, this does not allow us to perform a new search when -// the path changes. This getter/setter combo wraps around the user -// defaults while performing a new search when the value changes. -- (void)setSpotlightSearchPath:(NSString *)aString -{ - // Make sure the string is changed - if (![spotlightSearchPath isEqualToString: aString]) - { - spotlightSearchPath = [aString copy]; - [[NSUserDefaults standardUserDefaults] setObject:spotlightSearchPath - forKey:@"spotlightSearchPath"]; - [self performSearch]; - } -} - -@end diff --git a/Spotlight/SpotlightWindowController.h b/Spotlight/SpotlightWindowController.h index ab8cada61..e361bad8d 100644 --- a/Spotlight/SpotlightWindowController.h +++ b/Spotlight/SpotlightWindowController.h @@ -12,8 +12,20 @@ @interface SpotlightWindowController : NSWindowController { IBOutlet PlaylistLoader *playlistLoader; + IBOutlet NSArrayController *playlistController; + IBOutlet NSPathControl *pathControl; + NSMetadataQuery *query; + NSString *searchString; + NSString *spotlightSearchPath; } -@property(retain) PlaylistLoader *playlistLoader; +- (IBAction)addToPlaylist:(id)sender; + +- (void)performSearch; +- (NSPredicate *)processSearchString; + +@property(retain) NSMetadataQuery *query; +@property(copy) NSString *searchString; +@property(copy) NSString *spotlightSearchPath; @end diff --git a/Spotlight/SpotlightWindowController.m b/Spotlight/SpotlightWindowController.m index d5d2013a3..307871d46 100644 --- a/Spotlight/SpotlightWindowController.m +++ b/Spotlight/SpotlightWindowController.m @@ -7,10 +7,191 @@ // #import "SpotlightWindowController.h" +#import "PlaylistLoader.h" +#import "SpotlightPlaylistEntry.h" +// Minimum length of a search string (searching for very small strings gets ugly) +#define MINIMUM_SEARCH_STRING_LENGTH 3 + +// Store a class predicate for searching for music +static NSPredicate * musicOnlyPredicate = nil; @implementation SpotlightWindowController -@synthesize playlistLoader; ++ (void)initialize +{ + musicOnlyPredicate = [[NSPredicate predicateWithFormat: + @"kMDItemContentTypeTree==\'public.audio\'"] retain]; + + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + + // Set the home directory as the default search directory + NSString * homeDir = @"~"; + homeDir = [homeDir stringByExpandingTildeInPath]; + homeDir = [[NSURL fileURLWithPath:homeDir isDirectory:YES] absoluteString]; + NSDictionary *searchDefault = + [NSDictionary dictionaryWithObject:homeDir + forKey:@"spotlightSearchPath"]; + [defaults registerDefaults:searchDefault]; +} + +- (id)init +{ + if (self = [super init]) { + self.query = [[NSMetadataQuery alloc] init]; + [self.query setDelegate:self]; + } + + return self; +} + +- (void)performSearch +{ + NSPredicate *searchPredicate; + // Process the search string into a compound predicate. If Nil is returned do nothing + if(searchPredicate = [self processSearchString]) + { + // spotlightPredicate, which is what will finally be used for the spotlight search + // is the union of the (potentially) compound searchPredicate and the static + // musicOnlyPredicate + + NSPredicate *spotlightPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: + [NSArray arrayWithObjects: musicOnlyPredicate, + searchPredicate, + nil]]; + // Only preform a new search if the predicate has changed or there is a new path + if(![self.query.predicate isEqual:spotlightPredicate] + || ![self.query.searchScopes isEqualToArray: + [NSArray arrayWithObjects:pathControl.URL, nil]]) + { + if([self.query isStarted]) + [self.query stopQuery]; + self.query.predicate = spotlightPredicate; + // Set scope to contents of pathControl + self.query.searchScopes = [NSArray arrayWithObjects:pathControl.URL, nil]; + [self.query startQuery]; + NSLog(@"Started query: %@", [self.query.predicate description]); + } + } +} + +- (NSPredicate *)processSearchString +{ + NSMutableArray *searchComponents = [NSMutableArray arrayWithCapacity:10]; + + NSScanner *scanner = [NSScanner scannerWithString:self.searchString]; + + while (![scanner isAtEnd]) + { + NSString *scannedString; + if ([scanner scanUpToString:@" " intoString:&scannedString]) + { + // don't add tiny strings in... They're make the system go nuts + // TODO: Maybe consider a better solution to the issue? + if ([scannedString length] >= MINIMUM_SEARCH_STRING_LENGTH) + { + [searchComponents addObject:scannedString]; + } + } + } + + // create an array of all the predicates to join together + NSMutableArray * subpredicates = [NSMutableArray + arrayWithCapacity:[searchComponents count]]; + + // we will ignore case and diacritics + unsigned options = (NSCaseInsensitivePredicateOption| + NSDiacriticInsensitivePredicateOption); + + for(NSString *s in searchComponents) + { + // convert each "word" into "*word*" + NSString *processedKey = [NSString stringWithFormat: @"*%@*", s]; + + // Search all tags for something like word + NSPredicate *predicate = [NSComparisonPredicate + predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"*"] + rightExpression:[NSExpression expressionForConstantValue:processedKey] + modifier:NSDirectPredicateModifier + type:NSLikePredicateOperatorType + options:options]; + + //TODO: Ability to search only artist, albums, etc. + [subpredicates addObject: predicate]; + } + if ([subpredicates count] == 0) + return Nil; + else if ([subpredicates count] == 1) + return [subpredicates objectAtIndex: 0]; + + // Create a compound predicate from subPredicates + return [NSCompoundPredicate andPredicateWithSubpredicates: subpredicates]; +} + +- (void)dealloc +{ + [self.query stopQuery]; + [self.query release]; + [self.searchString release]; + [musicOnlyPredicate release]; + [super dealloc]; +} + +- (IBAction)addToPlaylist:(id)sender +{ + [self.query disableUpdates]; + + NSArray *urls = [[playlistController selectedObjects]valueForKey:@"url"]; + [playlistLoader addURLs:urls sort:NO]; + + [self.query enableUpdates]; +} + +#pragma mark NSMetadataQuery delegate methods + +// replace the NSMetadataItem with a PlaylistEntry +- (id)metadataQuery:(NSMetadataQuery*)query +replacementObjectForResultObject:(NSMetadataItem*)result +{ + return [SpotlightPlaylistEntry playlistEntryWithMetadataItem: result]; +} + +#pragma mark Getters and setters + +@synthesize query; + +@synthesize searchString; +- (void)setSearchString:(NSString *)aString +{ + // Make sure the string is changed + if (![searchString isEqualToString:aString]) + { + searchString = [aString copy]; + [self performSearch]; + } +} + +@dynamic spotlightSearchPath; +// getter reads from user defaults +- (NSString *)spotlightSearchPath +{ + return [[[NSUserDefaults standardUserDefaults] + stringForKey:@"spotlightSearchPath"]copy]; +} +// Normally, our nspathcontrol would just bind to the user defaults +// However, this does not allow us to perform a new search when +// the path changes. This getter/setter combo wraps around the user +// defaults while performing a new search when the value changes. +- (void)setSpotlightSearchPath:(NSString *)aString +{ + // Make sure the string is changed + if (![spotlightSearchPath isEqualToString: aString]) + { + spotlightSearchPath = [aString copy]; + [[NSUserDefaults standardUserDefaults] setObject:spotlightSearchPath + forKey:@"spotlightSearchPath"]; + [self performSearch]; + } +} @end