diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index c8fc3f6bf..0a8805327 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -109,6 +109,7 @@ 56462DDA0D61D71E000AB68C /* SpotlightPlaylistView.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462DD90D61D71E000AB68C /* SpotlightPlaylistView.m */; }; 56462EAF0D6341F6000AB68C /* SpotlightTransformers.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462EAE0D6341F6000AB68C /* SpotlightTransformers.m */; }; 56462EB20D634206000AB68C /* SpotlightPlaylistController.m in Sources */ = {isa = PBXBuildFile; fileRef = 56462EB10D634206000AB68C /* SpotlightPlaylistController.m */; }; + 56C63D910D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.m in Sources */ = {isa = PBXBuildFile; fileRef = 56C63D900D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.m */; }; 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; @@ -602,6 +603,8 @@ 56462EB00D634206000AB68C /* SpotlightPlaylistController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SpotlightPlaylistController.h; path = Spotlight/SpotlightPlaylistController.h; sourceTree = ""; }; 56462EB10D634206000AB68C /* SpotlightPlaylistController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SpotlightPlaylistController.m; path = Spotlight/SpotlightPlaylistController.m; sourceTree = ""; }; 566D32160D538550004466A5 /* APL.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = APL.xcodeproj; path = Plugins/APL/APL.xcodeproj; sourceTree = ""; }; + 56C63D8F0D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "NSComparisonPredicate+CogPredicate.h"; path = "Spotlight/NSComparisonPredicate+CogPredicate.h"; sourceTree = ""; }; + 56C63D900D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "NSComparisonPredicate+CogPredicate.m"; path = "Spotlight/NSComparisonPredicate+CogPredicate.m"; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8E07AAEE0AAC910500A4B32F /* SS_PreferencePaneProtocol.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SS_PreferencePaneProtocol.h; path = Preferences/SS_PreferencePaneProtocol.h; sourceTree = ""; }; 8E07AAEF0AAC910500A4B32F /* SS_PrefsController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SS_PrefsController.h; path = Preferences/SS_PrefsController.h; sourceTree = ""; }; @@ -1099,6 +1102,8 @@ 5604D4F50D60726E004F5C5D /* SpotlightPlaylistEntry.m */, 56462DD80D61D71E000AB68C /* SpotlightPlaylistView.h */, 56462DD90D61D71E000AB68C /* SpotlightPlaylistView.m */, + 56C63D8F0D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.h */, + 56C63D900D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.m */, ); name = Spotlight; sourceTree = ""; @@ -1638,6 +1643,7 @@ 56462DDA0D61D71E000AB68C /* SpotlightPlaylistView.m in Sources */, 56462EAF0D6341F6000AB68C /* SpotlightTransformers.m in Sources */, 56462EB20D634206000AB68C /* SpotlightPlaylistController.m in Sources */, + 56C63D910D647DF300EAE25A /* NSComparisonPredicate+CogPredicate.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Spotlight/NSComparisonPredicate+CogPredicate.h b/Spotlight/NSComparisonPredicate+CogPredicate.h new file mode 100644 index 000000000..60512b738 --- /dev/null +++ b/Spotlight/NSComparisonPredicate+CogPredicate.h @@ -0,0 +1,16 @@ +// +// NSComparisonPredicate+CogPredicate.h +// Cog +// +// Created by Matthew Grinshpun on 14/02/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import + + +@interface NSComparisonPredicate (CogPredicate) + ++ (NSPredicate *)predicateForMdKey:(NSString *)key withString:(NSString *)aString; + +@end diff --git a/Spotlight/NSComparisonPredicate+CogPredicate.m b/Spotlight/NSComparisonPredicate+CogPredicate.m new file mode 100644 index 000000000..4d7bb2aea --- /dev/null +++ b/Spotlight/NSComparisonPredicate+CogPredicate.m @@ -0,0 +1,28 @@ +// +// NSComparisonPredicate+CogPredicate.m +// Cog +// +// Created by Matthew Grinshpun on 14/02/08. +// Copyright 2008 __MyCompanyName__. All rights reserved. +// + +#import "NSComparisonPredicate+CogPredicate.h" + +// Ignore case and diacritics +static const unsigned OPTIONS = (NSCaseInsensitivePredicateOption| + NSDiacriticInsensitivePredicateOption); + +@implementation NSComparisonPredicate (CogPredicate) + ++ (NSPredicate *)predicateForMdKey:(NSString *)key withString:(NSString *)aString +{ + NSString * likeString = [NSString stringWithFormat:@"*%@*", aString]; + return [NSComparisonPredicate + predicateWithLeftExpression:[NSExpression expressionForKeyPath:key] + rightExpression:[NSExpression expressionForConstantValue:likeString] + modifier:NSDirectPredicateModifier + type:NSLikePredicateOperatorType + options:OPTIONS]; +} + +@end diff --git a/Spotlight/SpotlightPanel.xib b/Spotlight/SpotlightPanel.xib index 0eafaaf82..53d77ce98 100644 --- a/Spotlight/SpotlightPanel.xib +++ b/Spotlight/SpotlightPanel.xib @@ -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 @@ -767,7 +767,7 @@ - spotlightWindowController + spotlightWindowController @@ -775,7 +775,7 @@ - playlistController + playlistController @@ -783,13 +783,13 @@ - contentArray: query.results + contentArray: query.results - + contentArray query.results 2 @@ -797,6 +797,14 @@ 162 + + + addToPlaylist: + + + + 163 + @@ -1201,7 +1209,7 @@ - 162 + 163 @@ -1228,7 +1236,7 @@ - IBProjectSource + IBProjectSource ThirdParty/UKKQueue/UKFileWatcher.h @@ -1254,7 +1262,7 @@ - + ThirdParty/UKKQueue/UKMainThreadProxy.h @@ -1280,7 +1288,7 @@ - + ThirdParty/GCWindowMenu/GCOneShotEffectTimer.h @@ -1306,7 +1314,7 @@ - + ThirdParty/NDHotKeys/NDHotKeyEvent.h @@ -1332,7 +1340,7 @@ - + ThirdParty/AppleRemote/AppleRemote.h @@ -1358,58 +1366,10 @@ - + ThirdParty/UKKQueue/UKKQueue.h - - SpotlightPlaylistController - PlaylistController - - YES - - YES - - - YES - - - - - SpotlightWindowController - - - - Spotlight/SpotlightPlaylistController.h - - - - SpotlightWindowController - NSWindowController - - addToPlaylist: - id - - - YES - - YES - pathControl - - playlistLoader - - - YES - NSPathControl - NSArrayController - PlaylistLoader - - - - - Spotlight/SpotlightWindowController.h - - DNDArrayController NSArrayController @@ -1427,7 +1387,7 @@ NSTableView - + Playlist/DNDArrayController.h @@ -1445,10 +1405,10 @@ YES - - - - + id + + + @@ -1465,36 +1425,10 @@ - + Playlist/PlaylistView.h - - SpotlightPlaylistView - PlaylistView - - YES - - YES - - - YES - - - - YES - - YES - - - YES - - - - - Spotlight/SpotlightPlaylistView.h - - TrackingSlider NSSlider @@ -1517,10 +1451,63 @@ - + Utils/TrackingSlider.h + + SpotlightWindowController + NSWindowController + + + + + + YES + + YES + pathControl + playlistController + playlistLoader + + + YES + NSPathControl + NSArrayController + PlaylistLoader + + + + + Spotlight/SpotlightWindowController.h + + + + SpotlightPlaylistView + PlaylistView + + YES + + YES + + + YES + + + + YES + + YES + + + YES + + + + + Spotlight/SpotlightPlaylistView.h + + PlaylistLoader @@ -1538,7 +1525,7 @@ PlaylistController - + Playlist/PlaylistLoader.h @@ -1564,7 +1551,7 @@ - + Playlist/EntriesController.h @@ -1583,11 +1570,11 @@ YES - - - - - + + + + + @@ -1604,10 +1591,31 @@ - + Playlist/PlaylistController.h + + SpotlightPlaylistController + PlaylistController + + YES + + YES + + + YES + + + + spotlightWindowController + SpotlightWindowController + + + + Spotlight/SpotlightPlaylistController.h + + PlaybackController @@ -1634,22 +1642,22 @@ YES - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -1676,7 +1684,7 @@ - + Application/PlaybackController.h @@ -1687,247 +1695,249 @@ 3 YnBsaXN0MDDUAAEAAgADAAQABQAGAAkAClgkdmVyc2lvblQkdG9wWSRhcmNoaXZlclgkb2JqZWN0cxIA -AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBQAALAAwAMQA1ADYAPAA9 +AYag0QAHAAhdSUIub2JqZWN0ZGF0YYABXxAPTlNLZXllZEFyY2hpdmVyrxEBRAALAAwAMQA1ADYAPAA9 AEIAWgBbAFwAXQBeAAsAbAB0AIAAgQCZAJoAogCjAKYApwCrALEAyQDRAN8A4wEJAQoBCwEMARMBHgEf ASIBKQEqAS0BNwFKAUsBUwFUAVkBXgFhAWkBagFrAW4BcgF7AXwBgQGCAYUBigGLAY0BkAGZAZoBoAGh AaYBpwGqAbEBugG7AcEBwgHJAdQB1QHcAd0BewHlAe8B8AH2AfcB/gIHAggCDgIPAhYCHwIgAiYCJwIu AjICNwI4AjsCPAI/AkACQwJPAlACUQJUAl0CXgEeAmICYwJmAm8CcAKCAocCiAKTApQClQKeAp8CowKs Aq0CrgD8Aq8CswK0ArcCuwLEAsUCzgLPAtQC1QLXAuEC5gLnAugC7ALtAvgC+wL+AwEACwMCAwQDBQMG -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 +AwkDHgMmAzwDPQM+A0kDSgNMA04DTwNTA1gDWQNeA18DZANlA2oDawNuA3MDdAN5A3oDfwOAA4oDiwOM +A40DkAOXA5gDmQOaA6MDpAOlA6sDrAOuA7YDtwO4A74DxgPHA8gDzgPWA9cD2APeA+YD5wPoA+4D9gP3 +A/gD/gQGBAcECAQOBBYEFwQYBB4EHwQgBEIERQRGBEgEagSNBLAEsQSyBLMEtAS1BLYEtwS4BLkEugS7 +BLwEvQS+BL8EwATBBMIEwwTEBMUExgTHBMgEyQTKBMsEzATNBM4EzwTQBNUE2gUPBUQFRQVGBUcFSAFm +BUkFSgVLBUwFTQBXBU4FTwVQBVEFUgVTAJAFVAVVBVYFVwVYBVkFWgVbBVwFXQVeBV8AVgVgBWEFYgVj +BWQFZQVmBWcFaAVpBWoFawVsBW0FbgVvBXAFcQV0BXcFelUkbnVsbN8QEgANAA4ADwAQABEAEgATABQA +FQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMFZOU1Jv +b3RWJGNsYXNzXU5TT2JqZWN0c0tleXNfEA9OU0NsYXNzZXNWYWx1ZXNfEBlOU0FjY2Vzc2liaWxpdHlP +aWRzVmFsdWVzXU5TQ29ubmVjdGlvbnNbTlNOYW1lc0tleXNbTlNGcmFtZXdvcmtdTlNDbGFzc2VzS2V5 +c1pOU09pZHNLZXlzXU5TTmFtZXNWYWx1ZXNfEBlOU0FjY2Vzc2liaWxpdHlDb25uZWN0b3JzXU5TRm9u +dE1hbmFnZXJfEBBOU1Zpc2libGVXaW5kb3dzXxAPTlNPYmplY3RzVmFsdWVzXxAXTlNBY2Nlc3NpYmls +aXR5T2lkc0tleXNZTlNOZXh0T2lkXE5TT2lkc1ZhbHVlc4ACgQFDgOSBAQyBAUKAnYDpgAWBAQuBAQ2A +6oEBQIAAgAaA6IEBQRClgQEO0gAOADIAMwA0W05TQ2xhc3NOYW1lgASAA18QGVNwb3RsaWdodFdpbmRv +d0NvbnRyb2xsZXLSADcAOAA5ADpYJGNsYXNzZXNaJGNsYXNzbmFtZaIAOgA7Xk5TQ3VzdG9tT2JqZWN0 +WE5TT2JqZWN0XxAQSUJDb2NvYUZyYW1ld29ya9IADgA+AD8AQFpOUy5vYmplY3RzgJGhAEGAB9wAQwAO +AEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYACtcTlNXaW5kb3dWaWV3XE5T +U2NyZWVuUmVjdF1OU1dpbmRvd1RpdGxlWU5TV1RGbGFnc11OU1dpbmRvd0NsYXNzXxAWTlNXaW5kb3dD +b250ZW50TWluU2l6ZVxOU1dpbmRvd1JlY3RfEA9OU1dpbmRvd0JhY2tpbmdfEBFOU1dpbmRvd1N0eWxl +TWFza1lOU01pblNpemVbTlNWaWV3Q2xhc3OADICcgJqACRIgAAAAgAqAC4AIEAIQH4CbgABfEBh7ezE5 +NiwgMTkyfSwgezQ4MCwgMzIwfX1fEBNPcGVuIGZyb20gU3BvdGxpZ2h0V05TUGFuZWxaezQwMCwgMjYw +fdcAXwAOAGAAYQBiAGMAZABlAGYAZwBoAGkAZQBrXxAPTlNOZXh0UmVzcG9uZGVyWk5TU3Vidmlld3NY +TlN2RmxhZ3NbTlNGcmFtZVNpemVYTlNXaW5kb3dbTlNTdXBlcnZpZXeADYCZgA4RAQCAl4ANgJjSAA4A +PgBtAG6AYKUAbwBwAHEAcgBzgA+AGYBygIaAjdgAXwAOAHUAdgBhAHcAYwBkAE4AeQB6AHsAfAB9AGUA +TldOU0ZyYW1lVk5TQ2VsbFlOU0VuYWJsZWSADIAYgBCAEREBCQmADYAMXxAXe3szMzUsIDI3NX0sIHsx +MzEsIDMyfX3cAIIADgCDAIQAhQCGAIcAiACJAIoAiwCMAI0AjgCPAJAAkQCPAJMAlABvAJYAlwCYW05T +Q2VsbEZsYWdzXxATTlNBbHRlcm5hdGVDb250ZW50c18QEk5TUGVyaW9kaWNJbnRlcnZhbF5OU0J1dHRv +bkZsYWdzMl8QD05TS2V5RXF1aXZhbGVudFpOU0NvbnRlbnRzWU5TU3VwcG9ydF1OU0NvbnRyb2xWaWV3 +XxAPTlNQZXJpb2RpY0RlbGF5XE5TQ2VsbEZsYWdzMl1OU0J1dHRvbkZsYWdzEgQB/gCAF4AWEBkQgYAW +gBKAE4APEMgSCAAAABP/////hoJA/18QD0FkZCB0byBQbGF5bGlzdNQADgCbAJwAnQCeAJ8AoAChVk5T +U2l6ZVZOU05hbWVYTlNmRmxhZ3OAFSNAKgAAAAAAAIAUEQQUXEx1Y2lkYUdyYW5kZdIANwA4AKQApaIA +pQA7Vk5TRm9udFDSADcAOACoAKmkAKkAqgB2ADtcTlNCdXR0b25DZWxsXE5TQWN0aW9uQ2VsbNIANwA4 +AKwAraUArQCuAK8AsAA7WE5TQnV0dG9uWU5TQ29udHJvbFZOU1ZpZXdbTlNSZXNwb25kZXLfEA8AXwCy +AA4AdQCzALQAtQBgALYAYQBjAGQAtwC4ALkATgC7ALwAvQC+AL8AwADBAMIAwwBlAE4AxgDHAMdbTlNI +U2Nyb2xsZXJYTlNzRmxhZ3NcTlNDb3JuZXJWaWV3XxAQTlNIZWFkZXJDbGlwVmlld1xOU1Njcm9sbEFt +dHNbTlNWU2Nyb2xsZXJdTlNOZXh0S2V5Vmlld11OU0NvbnRlbnRWaWV3gAyAbIBxgHARAjCAJYAigBpP +EBAAAAAAAAAAAEGYAABBmAAAEQESgA2ADIBogBuAG9IADgA+AG0Ay4BgpQDHAMYAuwDAAL+AG4BogGyA +IoAl2wBfAA4AdQDSAGAAYQDTAGMA1ABkALgAcADWANcAVgDYANkA2gBlANwAcADaWU5TY3ZGbGFnc1lO +U0RvY1ZpZXdZTlNCR0NvbG9ygBmAZ4BmgBwRCQCAHYANgDeAGYAd0gAOAD4AbQDhgGChANqAHd8QFwBf +AOQADgDlAOYA5wDoAOkAtADqAOsA7ABhAGIAdwDtAGMAMgDuAO8AZADwAPEAxwDzAPQA9QD2APcA3AB9 +AL8A+wD8AP0A/gD/AH0BAQBlAQMBBAEFAMcBBwEIXxAfTlNEcmFnZ2luZ1NvdXJjZU1hc2tGb3JOb25M +b2NhbFlOU1R2RmxhZ3NfEBNOU09yaWdpbmFsQ2xhc3NOYW1lXE5TSGVhZGVyVmlld18QEU5TQmFja2dy +b3VuZENvbG9yXxASTlNBbGxvd3NUeXBlU2VsZWN0XxAXTlNJbnRlcmNlbGxTcGFjaW5nV2lkdGhfEBlO +U0NvbHVtbkF1dG9yZXNpemluZ1N0eWxlXxAYTlNJbnRlcmNlbGxTcGFjaW5nSGVpZ2h0Xk5TQXV0b3Nh +dmVOYW1lW05TR3JpZENvbG9yXxAcTlNEcmFnZ2luZ1NvdXJjZU1hc2tGb3JMb2NhbF5OU1RhYmxlQ29s +dW1uc1tOU1Jvd0hlaWdodIAbEACAZRP/////28CAAIAfgCGANwmAJSNACAAAAAAAABABI0AAAAAAAAAA +ERESgCAJgGSADYAegGEQD4AbgCgjQDEAAAAAAABfEBVTcG90bGlnaHRQbGF5bGlzdFZpZXdbTlNUYWJs +ZVZpZXdaezQ0MCwgMjExfdcAXwAOAGEAYgBjAGQBCgDAAQ4AaAEPAGUAwADagCKAJIAjgA2AIoAd2wBf +AA4A0gBgAGEAYgDTAGMA1ABkALgAcADWARYBFwDZARgA9wBlANwAcAD3gBmAZxAEgG6Ab4AhgA2AN4AZ +gCFZezQ0MCwgMTd90gA3ADgBIAEhpAEhAK8AsAA7XxARTlNUYWJsZUhlYWRlclZpZXfWAF8ADgB1AGEA +YwBkAHABJAElASYAZQBwgBmAJ4AmE/////+AAAEAgA2AGV8QFHt7LTI2LCAwfSwgezE2LCAxN3190gA3 +ADgBKwEspAEsAK8AsAA7XV9OU0Nvcm5lclZpZXfSAA4APgBtAS+AYKcBMAExATIBMwE0ATUBNoApgD6A +RoBLgFGAVoBb2gE4AA4BOQE6ATsBPAE9AT4BPwEKAH0BQQFCAUMBRAFFAUYBRwFIANpeTlNJc1Jlc2l6 +ZWFibGVcTlNIZWFkZXJDZWxsXE5TSWRlbnRpZmllcldOU1dpZHRoWk5TRGF0YUNlbGxeTlNSZXNpemlu +Z01hc2taTlNNaW5XaWR0aFpOU01heFdpZHRoCYA9gCuAKiNAYAAAAAAAAIA1EAMjQESAAAAAAAAjQI9A +AAAAAACAHVV0aXRsZdcAggAOAOgAhwCIAIsBTAFNAU4BTwFQAVEA8wFSW05TVGV4dENvbG9yEgSB/gCA +NIAugCyALYAwVVRpdGxl1AAOAJsAnACdAJ4BVgCgAViAFSNAJgAAAAAAAIAUEQwc0wAOAVoBWwFcAUYB +XVxOU0NvbG9yU3BhY2VXTlNXaGl0ZYAvSzAuMzMzMzMyOTkA0gA3ADgBXwFgogFgADtXTlNDb2xvctUA +DgFgAVoBYgFjAVwBZQFmAWcBaFtOU0NvbG9yTmFtZV1OU0NhdGFsb2dOYW1lgC+AMxAGgDKAMVZTeXN0 +ZW1fEA9oZWFkZXJUZXh0Q29sb3LTAA4BWgFbAVwBRgFtgC9CMADSADcAOAFvAXClAXABcQCqAHYAO18Q +EU5TVGFibGVIZWFkZXJDZWxsXxAPTlNUZXh0RmllbGRDZWxs2ACCAA4A6ACHAIgAiQCLAUwBcwF0ANwB +dgCUANoBeQF6EhQh/kCAPIA3gDaAE4AdEQgAgDpZVGV4dCBDZWxs1QAOAWABWgFiAWMBXAF+AWYBfwFo +gC+AOYA4gDFfEBZjb250cm9sQmFja2dyb3VuZENvbG9y0wAOAVoBWwFcAUYBhIAvSzAuNjY2NjY2NjkA +1QAOAWABWgFiAWMBXAFlAWYBiAFogC+AM4A7gDFfEBBjb250cm9sVGV4dENvbG9y0gA3ADgBjAFxpAFx +AKoAdgA70gA3ADgBjgGPogGPADtdTlNUYWJsZUNvbHVtbtoBOAAOATkBOgE7ATwBPQE+AT8BCgB9AUEB +kwGUAZUBlgFGAZcBSADaCYA9gECAPyNAXsAAAAAAAIBFI0BCAAAAAAAAgB1WYXJ0aXN01wCCAA4A6ACH +AIgAiwFMAI0BTgGcAZ0BUQDzAVKANIBCgEGALYAwVkFydGlzdNUADgFgAVoBYgFjAVwBowFmAaQBaIAv +gESAQ4AxW2hlYWRlckNvbG9y0wAOAVoBWwFcAUYBqYAvQjEA2ACCAA4A6ACHAIgAiQCLAUwBcwF0ANwB +dgCUANoBeQF6gDyAN4A2gBOAHYA62gE4AA4BOQE6ATsBPAE9AT4BPwEKAH0BQQG0AbUBtgG3AUYBuAFI +ANoJgD2ASIBHI0BfQAAAAAAAgEojQEOAAAAAAACAHVVhbGJ1bdcAggAOAOgAhwCIAIsBTACNAU4BnAG+ +AVEA8wFSgDSAQoBJgC2AMFVBbGJ1bdgAggAOAOgAhwCIAIkAiwFMAXMBdADcAXYAlADaAXkBeoA8gDeA +NoATgB2AOtsBOAHKATkBOgAOATsBPAE9AT4BPwEKAH0AfQHNAc4BQQHQAdEBRgHSAUgA2lhOU0hpZGRl +bgkJgE2ATIA9I0BJAAAAAAAAgE8jQERPYCAAAACAHVZsZW5ndGjXAIIADgDoAIcAiACLAUwAjQFOAZwB +2AFRAdoBUoA0gEKAToAtEgQAAACAMFZMZW5ndGjYAIIADgDoAIcAiACJAIsBTAFzAXQA3AHgAJQA2gHj +AXqAPIA3gFCAE4AdEgQACACAOtsBOAHKATkBOgAOATsBPAE9AT4BPwEKAH0AfQHoAekBQQHrAewBRgHt +AUgA2gkJgFOAUoA9I0BHgAAAAAAAgFUjQCQAAAAAAACAHVR5ZWFy1wCCAA4A6ACHAIgAiwFMAI0BTgGc +AfMBUQHaAVKANIBCgFSALYAwVFllYXLYAIIADgDoAIcAiACJAIsBTAFzAXQA3AHgAJQA2gHjAXqAPIA3 +gFCAE4AdgDrbATgBygE5AToADgE7ATwBPQE+AT8BCgB9AH0CAQICAUECBAIFAUYB7QFIANoJCYBYgFeA +PSNARwAAAAAAAIBagB1VZ2VucmXXAIIADgDoAIcAiACLAUwAjQFOAZwCCwFRAPMBUoA0gEKAWYAtgDBV +R2VucmXYAIIADgDoAIcAiACJAIsBTAFzAXQA3AHgAJQA2gF5AXqAPIA3gFCAE4AdgDraATgADgE5AToB +OwE8AT0BPgE/AQoAfQFBAhkCGgIbAhwBRgIdAhsA2gmAPYBdgFwjQEoAAAAAAACAXyNAIAAAAAAAAIAd +VXRyYWNr1wCCAA4A6ACHAIgAiwFMAI0BTgGcAiMBUQHaAVKANIBCgF6ALYAwVVRyYWNr2ACCAA4A6ACH +AIgAiQCLAUwBcwF0ANwBdgCUANoB4wF6gDyAN4A2gBOAHYA60gA3ADgCLwIwowIwAjEAO15OU011dGFi +bGVBcnJheVdOU0FycmF51QAOAWABWgFiAWMBXAI0AWYCNQFogC+AY4BigDFZZ3JpZENvbG9y0wAOAVoB +WwFcAUYCOoAvRDAuNQBfEBRDb2dTcG90bGlnaHRQbGF5bGlzdNIANwA4Aj0CPqICPgA7Xk5TQ2xhc3NT +d2FwcGVyXxAVe3swLCAxN30sIHs0NDAsIDIxMX190gA3ADgCQQJCpAJCAK8AsAA7Wk5TQ2xpcFZpZXfZ +AF8CRAAOAHUAYQBjAkUAZAJGAHAAcAJJAkoBJgBlAkwAcAJOWE5TVGFyZ2V0WE5TQWN0aW9uWU5TUGVy +Y2VudIAZgBmAa4BpgA2AaoAZIz/qN4SgAAAAXxAUe3s4NSwgMTd9LCB7MTUsIDY4fX1cX2RvU2Nyb2xs +ZXI60gA3ADgCUgJTpQJTAK4ArwCwADtaTlNTY3JvbGxlctoAXwJEAA4AdQCzAGEAYwJFAGQCRgBwAHAC +SQJYAPwBJgBlAkwAcAJcgBmAGYBrgG2ADYBqgBkjP+2kYQAAAABfEBV7ezAsIDIxM30sIHs0NDAsIDE1 +fX3SAA4APgBtAmCAYKEA94AhXxAWe3syMCwgNDR9LCB7NDQwLCAyMjh9fdIANwA4AmQCZaQCZQCvALAA +O1xOU1Njcm9sbFZpZXfYAF8ADgB1AHYAYQB3AGMAZABOAmgCaQJqAmsAfQBlAE6ADICFgHOAdBEBCgmA +DYAMXxAWe3syMCwgMjgyfSwgezMxMywgMjJ9fd0AggAOAnEA6ACHAIgAiQCLAnICcwJ0AnUBTAJ2AncC +eAJ5AI8AlABxAn0A/AB9An8CgAF6XxASTlNDYW5jZWxCdXR0b25DZWxsXxAQTlNUZXh0QmV6ZWxTdHls +ZV8QEU5TRHJhd3NCYWNrZ3JvdW5kXxASTlNTZWFyY2hCdXR0b25DZWxsXxAQTlNNYXhpbXVtUmVjZW50 +cxIUcf5AgISAeoB1gBaAE4ByEhAABAAJgHcQ/4A61QAOAWABWgFiAWMBXAGjAWYChQFogC+ARIB2gDFf +EBN0ZXh0QmFja2dyb3VuZENvbG9y3AJEAIIADgCEAIUAhgCHAIkAigCLAkUAjAJqAooAjgKMAPMAjwKO +AHECkADzApECkoB0EgAB/gCAFxBLgBaAeIByEQGQgHkSCERA/1ZzZWFyY2hfEBNfc2VhcmNoRmllbGRT +ZWFyY2g63QJEAIIADgCEAIUAhgKWAIcAiQCKAIsCRQCMAmoCigCOAowA8wCPApoCmwBxApAA8wKdApJf +ECNOU0FjY2Vzc2liaWxpdHlPdmVycmlkZGVuQXR0cmlidXRlc4B0gBeAFoB8gHuAcoCDVWNsZWFy0gAO +AD4AbQKhgGChAqKAfdMADgKkAD4CpQKmAqlXTlMua2V5c4CCogKnAqiAfoB/ogKqAquAgICBXUFYRGVz +Y3JpcHRpb25fEClOU0FjY2Vzc2liaWxpdHlFbmNvZGVkQXR0cmlidXRlc1ZhbHVlVHlwZVZjYW5jZWzS +ADcAOAKwArGjArECsgA7XxATTlNNdXRhYmxlRGljdGlvbmFyeVxOU0RpY3Rpb25hcnlfEBNfc2VhcmNo +RmllbGRDYW5jZWw60gA3ADgCtQK2pQK2AXEAqgB2ADtfEBFOU1NlYXJjaEZpZWxkQ2VsbNIANwA4ArgC +uaYCuQK6AK4ArwCwADtdTlNTZWFyY2hGaWVsZFtOU1RleHRGaWVsZNgAXwAOAHUAdgBhAHcAYwBkAE4C +vQK+Ar8CwAB9AGUAToAMgIyAh4CIEQEhCYANgAxfEBR7ezg4LCAxNH0sIHs5NiwgMTd9fdgAggAOAOgA +hwCIAIkAiwFMAsYBdALIAskAlAByAswBehIEAf5AgDyAioCJgBOAhhIQQAQAgDpcU2VhcmNoIFBhdGg6 +1QAOAWABWgFiAWMBXAF+AWYC0gFogC+AOYCLgDFcY29udHJvbENvbG9y0gA3ADgC1gK6pQK6AK4ArwCw +ADvZAF8ADgB1AHYC2ABhAHcAYwBkAE4C2gLbAtwC3QLAAH0AZQBOW05TRHJhZ1R5cGVzgAyAloCSgJOA +jgmADYAM0gAOAD4APwLjgJGiAuQC5YCPgJBfEBlBcHBsZSBVUkwgcGFzdGVib2FyZCB0eXBlXxAVTlNG +aWxlbmFtZXNQYm9hcmRUeXBl0gA3ADgC6QLqowLqAusAO1xOU011dGFibGVTZXRVTlNTZXRfEBZ7ezE4 +OSwgMTB9LCB7MjcxLCAyNn192ALuAIIADgCIAIkAiwLvAvAAVgLxAvIAlABzAvUC9gBzW05TUGF0aFN0 +eWxlXxAUTlNQYXRoQ29tcG9uZW50Q2VsbHNaTlNEZWxlZ2F0ZRIUIf4BgJWAE4CNEYAAgJSAjdIADgA+ +AG0C+oBgoNIANwA4AvwC/aQC/QCqAHYAO1pOU1BhdGhDZWxs0gA3ADgC/wMApQMAAK4ArwCwADtdTlNQ +YXRoQ29udHJvbFp7NDgwLCAzMjB90gA3ADgDAwCvowCvALAAO18QFXt7MCwgMH0sIHsxMjgwLCA3Nzh9 +fVp7NDAwLCAyNzZ90gA3ADgDBwMIogMIADtfEBBOU1dpbmRvd1RlbXBsYXRl0gAOAD4AbQMLgGCvEBID +DAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx2AnoCogKqArICugLGAs4C1gLeAvIDAgMaA +yoDOgNKA1oDagN7UAA4DHwMgAyEDIgMjANoDJV1OU0Rlc3RpbmF0aW9uWE5TU291cmNlV05TTGFiZWyA +p4CfgB2AptwDJwAOAygA5gMpAyoDKwMsAy0AMgMuAy8AfQD0AH0DMwB9AzUDNgM3AH0DOQB9AH1fEBpO +U0ZpbHRlclJlc3RyaWN0c0luc2VydGlvbl8QFE5TUHJlc2VydmVzU2VsZWN0aW9uWk5TRWRpdGFibGVf +EA9fTlNNYW5hZ2VkUHJveHlfEBFOU09iamVjdENsYXNzTmFtZV5OU0RlY2xhcmVkS2V5c18QIk5TQ2xl +YXJzRmlsdGVyUHJlZGljYXRlT25JbnNlcnRpb25fEBhOU1NlbGVjdHNJbnNlcnRlZE9iamVjdHNfEBZO +U0F2b2lkc0VtcHR5U2VsZWN0aW9uCYBlCYChCYCkgKOAogmAoAkJXxAbU3BvdGxpZ2h0UGxheWxpc3RD +b250cm9sbGVyXxARTlNBcnJheUNvbnRyb2xsZXLSAA4APgBtA0CAYKgBUAFDAekBlAG1AgIBzgIagCyA +KoBSgD+AR4BXgEyAXF1QbGF5bGlzdEVudHJ50QAOA0uApdIANwA4A00DKqIDKgA7WmRhdGFTb3VyY2XS +ADcAOANQA1GjA1EDUgA7XxAUTlNOaWJPdXRsZXRDb25uZWN0b3JeTlNOaWJDb25uZWN0b3LUAA4DHwMg +AyEDIgDaAyMDV4CngB2An4CpWXRhYmxlVmlld9QADgMfAyADIQMiAyMAHwNdgKeAn4ACgKtfEBJwbGF5 +bGlzdENvbnRyb2xsZXLUAA4DHwMgAyEDIgBxAEEDY4CngHKAB4CtXxAVaW5pdGlhbEZpcnN0UmVzcG9u +ZGVy1AAOAx8DIAMhA2YAHwBvA2mAsIACgA+Ar15hZGRUb1BsYXlsaXN0OtIANwA4A2wDbaMDbQNSADtf +EBVOU05pYkNvbnRyb2xDb25uZWN0b3LUAA4DHwMgAyEDIgAfAyMDcoCngAKAn4CyXxAZc3BvdGxpZ2h0 +V2luZG93Q29udHJvbGxlctQADgMfAyADIQMiAHMAHwN4gKeAjYACgLRbcGF0aENvbnRyb2zUAA4DHwMg +AyEDIgBBAB8DfoCngAeAAoC2VndpbmRvd9cADgMfA4EDggMgAyEDgwOEAB8DhgOHAHEDiQBWWU5TS2V5 +UGF0aFlOU0JpbmRpbmdfEBxOU05pYkJpbmRpbmdDb25uZWN0b3JWZXJzaW9ugLuAAoC6gLmAcoC4XxAT +dmFsdWU6IHNlYXJjaFN0cmluZ1V2YWx1ZVxzZWFyY2hTdHJpbmfSADcAOAOOA4+jA48DUgA7XxAVTlNO +aWJCaW5kaW5nQ29ubmVjdG9y1wAOAx8DgQOCAyADIQODA4QAHwOTA5QDIwOWAFaAu4ACgL+AvoCfgL1f +EBtjb250ZW50QXJyYXk6IHF1ZXJ5LnJlc3VsdHNcY29udGVudEFycmF5XXF1ZXJ5LnJlc3VsdHPYAA4D +HwOBA4IDIAMhA5sDgwOEAyMDngOHATYDoQOiAFZZTlNPcHRpb25zgLuAn4DCgLmAW4DBgMNfEBx2YWx1 +ZTogYXJyYW5nZWRPYmplY3RzLnRyYWNrXxAVYXJyYW5nZWRPYmplY3RzLnRyYWNr0wAOAqQAPgOmA6cD +qYDFoQOogMShAquAgV8QG05TQ29uZGl0aW9uYWxseVNldHNFZGl0YWJsZdIANwA4A60CsqICsgA72AAO +Ax8DgQOCAyADIQObA4MDhAMjA7EDhwEwA7QDtQBWgLuAn4DIgLmAKYDHgMlfEBx2YWx1ZTogYXJyYW5n +ZWRPYmplY3RzLnRpdGxlXxAVYXJyYW5nZWRPYmplY3RzLnRpdGxl0wAOAqQAPgOmA7oDvIDFoQOogMSh +AquAgdgADgMfA4EDggMgAyEDmwODA4QDIwPBA4cBMwPEA8UAVoC7gJ+AzIC5gEuAy4DNXxAddmFsdWU6 +IGFycmFuZ2VkT2JqZWN0cy5sZW5ndGhfEBZhcnJhbmdlZE9iamVjdHMubGVuZ3Ro0wAOAqQAPgOmA8oD +zIDFoQOogMShAquAgdgADgMfA4EDggMgAyEDmwODA4QDIwPRA4cBMQPUA9UAVoC7gJ+A0IC5gD6Az4DR +XxAddmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5hcnRpc3RfEBZhcnJhbmdlZE9iamVjdHMuYXJ0aXN00wAO +AqQAPgOmA9oD3IDFoQOogMShAquAgdgADgMfA4EDggMgAyEDmwODA4QDIwPhA4cBNAPkA+UAVoC7gJ+A +1IC5gFGA04DVXxAbdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy55ZWFyXxAUYXJyYW5nZWRPYmplY3RzLnll +YXLTAA4CpAA+A6YD6gPsgMWhA6iAxKECq4CB2AAOAx8DgQOCAyADIQObA4MDhAMjA/EDhwE1A/QD9QBW +gLuAn4DYgLmAVoDXgNlfEBx2YWx1ZTogYXJyYW5nZWRPYmplY3RzLmdlbnJlXxAVYXJyYW5nZWRPYmpl +Y3RzLmdlbnJl0wAOAqQAPgOmA/oD/IDFoQOogMShAquAgdgADgMfA4EDggMgAyEDmwODA4QDIwQBA4cB +MgQEBAUAVoC7gJ+A3IC5gEaA24DdXxAcdmFsdWU6IGFycmFuZ2VkT2JqZWN0cy5hbGJ1bV8QFWFycmFu +Z2VkT2JqZWN0cy5hbGJ1bdMADgKkAD4DpgQKBAyAxaEDqIDEoQKrgIHYAA4DHwOBA4IDIAMhA5sDgwOE +AB8EEQOHAHMEFAQVAFaAu4ACgOCAuYCNgN+A4V8QGnZhbHVlOiBzcG90bGlnaHRTZWFyY2hQYXRoXxAT +c3BvdGxpZ2h0U2VhcmNoUGF0aNMADgKkAD4DpgQaBByAxaEEG4DioQQdgONfEBZOU1ZhbHVlVHJhbnNm +b3JtZXJOYW1lXxAWU3RyaW5nVG9VUkxUcmFuc2Zvcm1lctIADgA+BCEEIoDnrxAfAtwCHAQlAHABRQHR +ATABNgBBANoAewK/AMYATgJqAZYBNABxATEDIwBvALsBMwEyAbcB7AE1AHMCBQD3AHKAk4BfgOWAGYA1 +gE+AKYBbgAeAHYARgIiAaIAMgHSARYBRgHKAPoCfgA+AbIBLgEaASoBVgFaAjYBagCGAhtIADgAyADME +RIAEgOZdTlNBcHBsaWNhdGlvbtIANwA4BEcCMaICMQA70gAOAD4EIQRKgOevEB8AcwE2AB8ATgEwATMA +2gDaAB8AcABvAHIAcABBAHEBMQDaAE4A2gAfAE4AcADaANoBMgE0ANoATgE1AHAAToCNgFuAAoAMgCmA +S4AdgB2AAoAZgA+AhoAZgAeAcoA+gB2ADIAdgAKADIAZgB2AHYBGgFGAHYAMgFaAGYAM0gAOAD4EIQRs +gOevECAC3AIcBCUAcAFFAdEBMAE2AEEA2gDGAHsCvwBOAmoBlgMjAHEBNAExAG8AuwEzATIAHwD3ATUA +cwHsAbcCBQBygJOAX4DlgBmANYBPgCmAW4AHgB2AaIARgIiADIB0gEWAn4BygFGAPoAPgGyAS4BGgAKA +IYBWgI2AVYBKgFqAhtIADgA+BCEEj4DnrxAgBJAEkQSSBJMElASVBJYElwSYBJkEmgSbBJwEnQSeBJ8E +oAShBKIEowSkBKUEpgSnBKgEqQSqBKsErAStBK4Er4DrgOyA7YDugO+A8IDxgPKA84D0gPWA9oD3gPiA ++YD6gPuA/ID9gP6A/4EBAIEBAYEBAoEBA4EBBIEBBYEBBoEBB4EBCIEBCYEBCllQYXRoIENlbGxfEB1U +ZXh0IEZpZWxkIENlbGwgKFRleHQgQ2VsbCktMVtBcHBsaWNhdGlvbltTY3JvbGwgVmlld18QG1RleHQg +RmllbGQgQ2VsbCAoVGV4dCBDZWxsKV8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS00XxAUVGFi +bGUgQ29sdW1uICh0aXRsZSlfEBRUYWJsZSBDb2x1bW4gKHRyYWNrKV8QG1BhbmVsIChPcGVuIGZyb20g +U3BvdGxpZ2h0KV8QSlNwb3RsaWdodCBQbGF5bGlzdCBWaWV3IChUaXRsZSwgQXJ0aXN0LCBBbGJ1bSwg +TGVuZ3RoLCBZZWFyLCBHZW5yZSwgVHJhY2spXxARVmVydGljYWwgU2Nyb2xsZXJfEB1CdXR0b24gQ2Vs +bCAoQWRkIHRvIFBsYXlsaXN0KV8QHlRleHQgRmllbGQgQ2VsbCAoU2VhcmNoIFBhdGg6KVxDb250ZW50 +IFZpZXdfEBFTZWFyY2ggRmllbGQgQ2VsbF8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBDZWxsKS0zXxAd +U3BvdGxpZ2h0IFBsYXlsaXN0IENvbnRyb2xsZXJcU2VhcmNoIEZpZWxkXxATVGFibGUgQ29sdW1uICh5 +ZWFyKV8QFVRhYmxlIENvbHVtbiAoYXJ0aXN0KV8QHVB1c2ggQnV0dG9uIChBZGQgdG8gUGxheWxpc3Qp +XxATSG9yaXpvbnRhbCBTY3JvbGxlcl8QFVRhYmxlIENvbHVtbiAobGVuZ3RoKV8QFFRhYmxlIENvbHVt +biAoYWxidW0pXEZpbGUncyBPd25lcl8QEVRhYmxlIEhlYWRlciBWaWV3XxAUVGFibGUgQ29sdW1uIChn +ZW5yZSlfEBpQb3AgVXAgUGF0aCBDb250cm9sIFdpZGdldF8QHVRleHQgRmllbGQgQ2VsbCAoVGV4dCBD +ZWxsKS0yXxAdVGV4dCBGaWVsZCBDZWxsIChUZXh0IENlbGwpLTVfEB1UZXh0IEZpZWxkIENlbGwgKFRl +eHQgQ2VsbCktNl8QGlN0YXRpYyBUZXh0IChTZWFyY2ggUGF0aDop0gAOAD4EIQTSgOeiANoDI4AdgJ/S +AA4APgQhBNeA56IBAwM5gB6AoNIADgA+BCEE3IDnrxAyAtwEJQBwAUUBNgBBAHsCvwMZAxUCagGWATQB +MQBvALsDGwIFAB8A9wMSAhwDDQHRAxQDEQEwAx0A2gDGAw8DEwBOAxADHAMaAxgDIwBxAw4BMwEyAbcB +7AMXAHMBNQMWAwwAcoCTgOWAGYA1gFuAB4ARgIiAzoC8gHSARYBRgD6AD4BsgNaAWoACgCGAs4BfgKiA +T4C3gLGAKYDegB2AaICsgLWADICugNqA0oDKgJ+AcoCqgEuARoBKgFWAxoCNgFaAwICegIbSAA4APgQh +BRGA568QMgUSBRMFFAUVBRYCqwUYBRkFGgUbBRwFHQUeBR8FIAUhBSIFIwUkBSUFJgUnBSgFKQUqBSsF +LAUtBS4FLwUwBTEFMgUzBTQFNQU2BTcFOAU5BToFOwU8BT0FPgU/BUAFQQVCBUOBAQ+BARCBARGBARKB +AROAgYEBFIEBFYEBFoEBF4EBGIEBGYEBGoEBG4EBHIEBHYEBHoEBH4EBIIEBIYEBIoEBI4EBJIEBJYEB +JoEBJ4EBKIEBKYEBKoEBK4EBLIEBLYEBLoEBL4EBMIEBMYEBMoEBM4EBNIEBNYEBNoEBN4EBOIEBOYEB +OoEBO4EBPIEBPYEBPoEBPxBZE//////////9EBgQJRAdEFAQaBCiEDgQJxAiEAUQGhBmECsQpBCfECwQ +lRApEJoQoBAkEJ0QHBAbED0QSBCjEGUQXhBpEBAQNxChECAQIRAoECoQXRBYEB4QaxCXEE/SAA4APgBt +BXOAYKDSAA4APgQhBXaA56DSAA4APgQhBXmA56DSADcAOAV7BXyiBXwAO15OU0lCT2JqZWN0RGF0YQAI +ABkAIgAnADEAOgA/AEQAUgBUAGYC8gL4A0MDSgNRA18DcQONA5sDpwOzA8EDzAPaA/YEBAQXBCkEQwRN +BFoEXARfBGEEZARnBGkEawRtBHAEcwR1BHgEegR8BH4EgQSDBIYEjwSbBJ0EnwS7BMQEzQTYBN0E7AT1 +BQgFEQUcBR4FIQUjBVQFYQVuBXwFhgWUBa0FugXMBeAF6gX2BfgF+gX8Bf4GAwYFBgcGCQYLBg0GDwYR +BiwGQgZKBlUGcgaEBo8GmAakBq0GuQa7Br0GvwbCBsQGxgbIBtEG0wbeBuAG4gbkBuYG6AcJBxEHGAci +ByQHJgcoByoHLQcuBzAHMgdMB30HiQefB7QHwwfVB+AH6gf4CAoIFwglCCoILAguCDAIMgg0CDYIOAg6 +CDwIQQhKCFwIbQh0CHsIhAiGCI8IkQiUCKEIqgivCLYItwjACMkI1gjjCOwI9wkACQoJEQkdCVwJaAlx +CX4JkQmeCaoJuAnGCcgJygnMCc4J0QnTCdUJ1wnqCe0J7wnxCfMJ9Qn3CgAKAgoNCg8KEQoTChUKFwpE +Ck4KWApiCmQKZgpoCmoKbQpvCnEKcwp1CncKgAqCCoUKhwrmCwgLEgsoCzULSQteC3gLlAuvC74Lygvp +C/gMBAwGDAgMCgwTDBUMFwwZDBoMHAwlDCcMMAwzDDUMNgw4DDoMPAw+DEAMQgxEDE0MZQxxDHwMmQyb +DJ0MnwyhDKMMpQzSDNQM1gzYDNoM3AzeDOAM4gzkDOYM8Az5DQINFg0vDTENMw01DT4NQA1CDVkNYg1r +DXkNgg2EDZMNlQ2XDZkNmw2dDZ8NoQ3KDdkN5g3zDfsOBg4VDiAOKw4sDi4OMA4yDjsOPQ4/DkgOUQ5T +DlkOdg6CDocOiQ6LDo0Ojw6RDpcOqA6qDrMOtQ64DsUO0g7aDtwO6A7xDvYO/g8TDx8PLQ8vDzEPMw81 +DzcPPg9QD10PXw9iD2sPdg+KD5wPvQ/CD8QPxg/ID8oPzA/PD9EP2w/wD/IP9A/2D/gQERAeECAQLBBB +EEMQRRBHEEkQXBBlEG4QdxB8EIoQsxC0ELYQuBC6EMMQxRDOENAQ1xD0EPYQ+BD6EPwQ/hEFERoRHBEe +ESARIhEuETsRPRFAEWERYxFlEWcRaRFrEW0RlhGXEZkRmxGdEaYRqBGxEbMRuRHWEdgR2hHcEd4R4BHm +EgcSCRILEg0SDxIREhMSQBJJEkoSSxJNEk8SURJaElwSZRJnEm4SixKNEo8SkRKTEpgSmhKhEsISxBLG +EsgSyhLMEtES0xMAEwETAhMEEwYTCBMRExMTHBMeEyMTQBNCE0QTRhNIE0oTTxNwE3ITdBN2E3gTehN8 +E6kTqhOrE60TrxOxE7oTvBO+E8QT4RPjE+UT5xPpE+sT8RQSFBQUFhQYFBoUHBQeFEcUSBRKFEwUThRX +FFkUYhRkFGoUhxSJFIsUjRSPFJEUlxS4FLoUvBS+FMAUwhTEFM0U1BTjFOsVABUCFQQVBhUIFRIVHxUh +FSYVPRVGFUsVWhVyFXsVhBWPFbQVvRXGFdAV0hXUFdYV2BXaFdwV3hXnFf4WCxYUFh8WKhZTFlUWVxZZ +FlsWXRZfFmEWahaCFosWjRaQFpIWqxa0Fr0WyhbrFu0W7xbxFvMW9hb3FvkW+xcUF0kXXhdxF4UXmhet +F7IXtBe2F7gXuhe8F74XwxfEF8YXyBfKF98X4RfjF+UX5xf9GC4YMBg1GDcYORg7GD0YPxhCGEQYSRhQ +GGYYmxjBGMMYxRjHGMkYyxjNGM8Y1RjeGOAY4xjlGPIY+hj8GQEZAxkFGQoZDBkOGRwZSBlPGVgZXxl1 +GYIZmBmhGawZwBnJGdYZ5BnwGhEaExoVGhcaGRocGh0aHxohGjgaWRpeGmAaYhpkGmYaaBptGm8afBqR +GpMalRqXGpkaphqvGroa3xrrGu0a7xrxGvMa9Rr2Gvga+hsDGwUbChsMGw4bKhtCG0sbUhtfG2Ubfhuf +G6sbwhvNG9Ib1BvWG9gb2xvdG98b6BvqG+sb9Bv9HAgcERwcHCocNRw+HEUcXRxoHHEcdhyJHJIclBy7 +HL0cvxzBHMMcxRzHHMkcyxzNHM8c0RzTHNUc1xzZHNsc3RzfHPAc/h0HHQ8dER0THRUdFx1IHWUdfB2H +HZkdrR28HeEd/B4VHhYeGB4ZHhseHB4eHiAeIh4jHiUeJh4nHkUeWR5iHmQedR53Hnkeex59Hn8egR6D +HoUekx6YHpoeox6oHrMevB7DHtoe6R76Hvwe/h8AHwIfDB8dHx8fIR8jHyUfOh9LH00fTx9RH1Mfax98 +H34fgB+CH4Qfkx+cH6Mfux/MH84f0B/SH9Qf8CABIAMgBSAHIAkgFSAmICggKiAsIC4gNSBSIFwgZiCF +IIcgiSCLII0gjyCRIKcgrSC6IMMgyiDiIP8hASEDIQUhByEJIQshKSE2IUQhZSFvIXEhcyF1IXcheSF7 +IX0hnCG0IcEhwyHGIcghyyHNIesh9CH5IhoiHCIeIiAiIiIkIiYiKCJHIl8ibCJuInEicyJ2IngimSKb +Ip0inyKhIqMipSKnIsci4CLtIu8i8iL0Ivci+SMaIxwjHiMgIyIjJCMmIygjSCNhI24jcCNzI3UjeCN6 +I5sjnSOfI6EjoyOlI6cjqSPHI94j6yPtI/Aj8iP1I/ckGCQaJBwkHiQgJCIkJCQmJEUkXSRqJGwkbyRx +JHQkdiSXJJkkmySdJJ8koSSjJKUkxCTcJOkk6yTuJPAk8yT1JRYlGCUaJRwlHiUgJSIlJCVBJVclZCVm +JWklayVuJXAliSWiJaslrSXuJfAl8iX0JfYl+CX6Jfwl/iYAJgImBCYGJggmCiYMJg4mECYSJhQmFiYY +JhomHCYeJiAmIiYkJiYmKCYqJiwmNSY3JjkmRyZQJlUmXiZgJqEmoyalJqcmqSarJq0mryaxJrMmtSa3 +Jrkmuya9Jr8mwSbDJsUmxybJJssmzSbPJtEm0ybVJtcm2SbbJt0m3yboJuonLScvJzEnMyc1JzcnOSc7 +Jz0nPydBJ0MnRSdHJ0knSydNJ08nUSdTJ1UnVydZJ1snXSdfJ2EnYydlJ2cnaSdrJ20ndid4J7snvSe/ +J8EnwyfFJ8cnySfLJ80nzyfRJ9Mn1SfXJ9kn2yfdJ98n4SfjJ+Un6CfrJ+4n8Sf0J/cn+if9KAAoAygG +KBAoMCg8KEgoZiiGKJ0otCjSKR8pMylTKXQpgSmVKbUp1SniKfgqECowKkYqXip1KoIqliqtKsoq6isK +KyorRytQK1IrVytZK1srZCtmK2srbStvK3greivhK+Mr5SvnK+kr6yvtK+8r8SvzK/Ur9yv5K/sr/Sv/ +LAEsAywFLAcsCSwLLA0sDywRLBMsFSwXLBksGywdLB8sISwjLCUsJywpLCssLSwvLDEsMyw1LDcsOSw7 +LD0sPyxBLEMsRSxOLFAstyy6LL0swCzDLMYsyCzLLM4s0SzULNcs2izdLOAs4yzmLOks7CzvLPIs9Sz4 +LPss/i0BLQQtBy0KLQ0tEC0TLRYtGS0cLR8tIi0lLSgtKy0uLTEtNC03LTotPS1ALUMtRi1JLUwtTi1X +LVktWy1dLV8tYS1jLWUtZy1pLWstbS1vLXEtcy11LXcteS17LX0tfy2BLYMthS2HLYktiy2NLY8tkS2T +LZUtly2ZLZstnS2fLaEtoy2lLactqS2rLa0tti24Lbktwi3ELcUtzi3QLdEt2i3fAAAAAAAAAgIAAAAA +AAAFfQAAAAAAAAAAAAAAAAAALe4 diff --git a/Spotlight/SpotlightPlaylistController.h b/Spotlight/SpotlightPlaylistController.h index 9702d932d..0255aa727 100644 --- a/Spotlight/SpotlightPlaylistController.h +++ b/Spotlight/SpotlightPlaylistController.h @@ -3,7 +3,7 @@ // Cog // // Created by Matthew Grinshpun on 13/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. +// Copyright 2008 Matthew Leon Grinshpun. All rights reserved. // #import diff --git a/Spotlight/SpotlightPlaylistController.m b/Spotlight/SpotlightPlaylistController.m index 36c93e67d..70bdfa8ca 100644 --- a/Spotlight/SpotlightPlaylistController.m +++ b/Spotlight/SpotlightPlaylistController.m @@ -3,7 +3,7 @@ // Cog // // Created by Matthew Grinshpun on 13/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. +// Copyright 2008 Matthew Leon Grinshpun. All rights reserved. // #import "SpotlightPlaylistController.h" diff --git a/Spotlight/SpotlightPlaylistEntry.h b/Spotlight/SpotlightPlaylistEntry.h index a3405be44..35309eee5 100644 --- a/Spotlight/SpotlightPlaylistEntry.h +++ b/Spotlight/SpotlightPlaylistEntry.h @@ -3,7 +3,7 @@ // Cog // // Created by Matthew Grinshpun on 11/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. +// Copyright 2008 Matthew Leon Grinshpun. All rights reserved. // #import diff --git a/Spotlight/SpotlightPlaylistEntry.m b/Spotlight/SpotlightPlaylistEntry.m index 9fa35eef5..088e0d612 100644 --- a/Spotlight/SpotlightPlaylistEntry.m +++ b/Spotlight/SpotlightPlaylistEntry.m @@ -3,7 +3,7 @@ // Cog // // Created by Matthew Grinshpun on 11/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. +// Copyright 2008 Matthew Leon Grinshpun. All rights reserved. // #import "SpotlightPlaylistEntry.h" diff --git a/Spotlight/SpotlightPlaylistView.h b/Spotlight/SpotlightPlaylistView.h index 7e7320099..eebf94d17 100644 --- a/Spotlight/SpotlightPlaylistView.h +++ b/Spotlight/SpotlightPlaylistView.h @@ -3,7 +3,7 @@ // Cog // // Created by Matthew Grinshpun on 12/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. +// Copyright 2008 Matthew Leon Grinshpun. All rights reserved. // #import diff --git a/Spotlight/SpotlightPlaylistView.m b/Spotlight/SpotlightPlaylistView.m index 48d502091..f143eaa68 100644 --- a/Spotlight/SpotlightPlaylistView.m +++ b/Spotlight/SpotlightPlaylistView.m @@ -3,7 +3,7 @@ // Cog // // Created by Matthew Grinshpun on 12/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. +// Copyright 2008 Matthew Leon Grinshpun. All rights reserved. // #import "SpotlightPlaylistView.h" diff --git a/Spotlight/SpotlightTransformers.m b/Spotlight/SpotlightTransformers.m index 060e63e7b..6ead43643 100644 --- a/Spotlight/SpotlightTransformers.m +++ b/Spotlight/SpotlightTransformers.m @@ -3,7 +3,7 @@ // Cog // // Created by Matthew Grinshpun on 11/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. +// Copyright 2008 Matthew Leon Grinshpun. All rights reserved. // #include diff --git a/Spotlight/SpotlightWindowController.h b/Spotlight/SpotlightWindowController.h index e361bad8d..f0b5f2e40 100644 --- a/Spotlight/SpotlightWindowController.h +++ b/Spotlight/SpotlightWindowController.h @@ -3,7 +3,7 @@ // Cog // // Created by Matthew Grinshpun on 10/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. +// Copyright 2008 Matthew Leon Grinshpun. All rights reserved. // #import diff --git a/Spotlight/SpotlightWindowController.m b/Spotlight/SpotlightWindowController.m index 307871d46..5d1d76664 100644 --- a/Spotlight/SpotlightWindowController.m +++ b/Spotlight/SpotlightWindowController.m @@ -3,12 +3,13 @@ // Cog // // Created by Matthew Grinshpun on 10/02/08. -// Copyright 2008 __MyCompanyName__. All rights reserved. +// Copyright 2008 Matthew Leon Grinshpun. All rights reserved. // #import "SpotlightWindowController.h" #import "PlaylistLoader.h" #import "SpotlightPlaylistEntry.h" +#import "NSComparisonPredicate+CogPredicate.h" // Minimum length of a search string (searching for very small strings gets ugly) #define MINIMUM_SEARCH_STRING_LENGTH 3 @@ -77,7 +78,7 @@ static NSPredicate * musicOnlyPredicate = nil; - (NSPredicate *)processSearchString { - NSMutableArray *searchComponents = [NSMutableArray arrayWithCapacity:10]; + NSMutableArray *subpredicates = [NSMutableArray arrayWithCapacity:10]; NSScanner *scanner = [NSScanner scannerWithString:self.searchString]; @@ -86,39 +87,47 @@ static NSPredicate * musicOnlyPredicate = nil; 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) + if ([scannedString length] < MINIMUM_SEARCH_STRING_LENGTH) + continue; + + if ([scannedString characterAtIndex:0] == '%') { - [searchComponents addObject:scannedString]; + if ([scannedString length] < (MINIMUM_SEARCH_STRING_LENGTH + 2)) + continue; + + // Search for artist + if([scannedString characterAtIndex:1] == 'a') + { + [subpredicates addObject: + [NSComparisonPredicate predicateForMdKey:@"kMDItemAuthors" + withString:[scannedString substringFromIndex:2]]]; + } + + // Search for album + if([scannedString characterAtIndex:1] == 'l') + { + [subpredicates addObject: + [NSComparisonPredicate predicateForMdKey:@"kMDItemAlbum" + withString:[scannedString substringFromIndex:2]]]; + } + + // Search for title + if([scannedString characterAtIndex:1] == 't') + { + [subpredicates addObject: + [NSComparisonPredicate predicateForMdKey:@"kMDItemTitle" + withString:[scannedString substringFromIndex:2]]]; + } + } + else + { + [subpredicates addObject: + [NSComparisonPredicate predicateForMdKey:@"*" + withString: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) @@ -178,9 +187,9 @@ replacementObjectForResultObject:(NSMetadataItem*)result return [[[NSUserDefaults standardUserDefaults] stringForKey:@"spotlightSearchPath"]copy]; } -// Normally, our nspathcontrol would just bind to the user defaults +// 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 +// the path changes. This getter/setter combo wraps the user // defaults while performing a new search when the value changes. - (void)setSpotlightSearchPath:(NSString *)aString {