Permalink
Browse files

Remove runtime and compile-time checks for Panther

  • Loading branch information...
1 parent 43e434d commit 82a1d92028e8d5b837216659f77846469c2e20ad Zachary Schneirov committed Jan 25, 2010
View
@@ -328,41 +328,37 @@ - (NoteObject*)noteWithFile:(NSString*)filename {
attributedStringFromData = [[NSMutableAttributedString alloc] initWithDocFormat:[NSData uncachedDataFromFile:filename] documentAttributes:NULL];
} else if ([extension isEqualToString:@"docx"] || [extension isEqualToString:@"webarchive"]) {
- if (RunningTigerAppKitOrHigher) {
- //make it guess for us, but if it's a webarchive we'll get the URL
- NSData *data = [NSData uncachedDataFromFile:filename];
- NSString *path = [data pathURLFromWebArchive];
- attributedStringFromData = [[NSMutableAttributedString alloc] initWithData:data options:nil documentAttributes:NULL error:NULL];
-
- if ([path length] > 0 && [attributedStringFromData length] > 0)
- [attributedStringFromData prefixWithSourceString:path];
- }
+ //make it guess for us, but if it's a webarchive we'll get the URL
+ NSData *data = [NSData uncachedDataFromFile:filename];
+ NSString *path = [data pathURLFromWebArchive];
+ attributedStringFromData = [[NSMutableAttributedString alloc] initWithData:data options:nil documentAttributes:NULL error:NULL];
+
+ if ([path length] > 0 && [attributedStringFromData length] > 0)
+ [attributedStringFromData prefixWithSourceString:path];
} else if (fileType == PDF_TYPE_ID || [extension isEqualToString:@"pdf"]) {
- //try PDFKit if on 10.4
- if (RunningTigerAppKitOrHigher) {
- @try {
- Class PdfDocClass = [[self class] PDFDocClass];
- if (PdfDocClass != Nil) {
- id doc = [[PdfDocClass alloc] initWithURL:[NSURL fileURLWithPath:filename]];
- if (doc) {
- //this method reliably crashes in 64-bit Leopard, and sometimes elsewhere as well
- id sel = [doc performSelector:@selector(selectionForEntireDocument)];
- if (sel) {
- attributedStringFromData = [[NSMutableAttributedString alloc] initWithAttributedString:[sel attributedString]];
- //maybe we could check pages and boundsForPage: to try to determine where a line was soft-wrapped in the document?
- } else {
- NSLog(@"Couldn't get entire doc selection for PDF");
- }
- [doc autorelease];
+ //try PDFKit loading lazily
+ @try {
+ Class PdfDocClass = [[self class] PDFDocClass];
+ if (PdfDocClass != Nil) {
+ id doc = [[PdfDocClass alloc] initWithURL:[NSURL fileURLWithPath:filename]];
+ if (doc) {
+ //this method reliably crashes in 64-bit Leopard, and sometimes elsewhere as well
+ id sel = [doc performSelector:@selector(selectionForEntireDocument)];
+ if (sel) {
+ attributedStringFromData = [[NSMutableAttributedString alloc] initWithAttributedString:[sel attributedString]];
+ //maybe we could check pages and boundsForPage: to try to determine where a line was soft-wrapped in the document?
} else {
- NSLog(@"Couldn't parse data into PDF");
+ NSLog(@"Couldn't get entire doc selection for PDF");
}
+ [doc autorelease];
} else {
- NSLog(@"No PDFDocument!");
+ NSLog(@"Couldn't parse data into PDF");
}
- } @catch (NSException *e) {
- NSLog(@"Error importing PDF %@ (%@, %@)", filename, [e name], [e reason]);
+ } else {
+ NSLog(@"No PDFDocument!");
}
+ } @catch (NSException *e) {
+ NSLog(@"Error importing PDF %@ (%@, %@)", filename, [e name], [e reason]);
}
} else if (fileType == TEXT_TYPE_ID || [extension isEqualToString:@"txt"] || [extension isEqualToString:@"text"] ||
[filename UTIOfFileConformsToType:@"public.plain-text"]) {
View
@@ -97,9 +97,9 @@ - (void)setupViewsAfterAppAwakened {
[field setNextKeyView:textView];
[textView setNextKeyView:field];
- if (RunningTigerAppKitOrHigher) [window setAutorecalculatesKeyViewLoop:NO];
+ [window setAutorecalculatesKeyViewLoop:NO];
- //this is necessary on 10.3, apparently
+ //this is necessary on 10.3, apparently, just in case regardless
[splitView display];
awakenedViews = YES;
@@ -133,7 +133,7 @@ - (void)runDelayedUIActionsAfterLaunch {
[notationController checkIfNotationIsTrashed];
//connect sparkle programmatically to avoid loading its framework at nib awake;
- if (RunningTigerAppKitOrHigher && !NSClassFromString(@"SUUpdater")) {
+ if (!NSClassFromString(@"SUUpdater")) {
NSString *frameworkPath = [[[NSBundle bundleForClass:[self class]] privateFrameworksPath] stringByAppendingPathComponent:@"Sparkle.framework"];
if ([[NSBundle bundleWithPath:frameworkPath] load]) {
[sparkleUpdateItem setTarget:[[NSClassFromString(@"SUUpdater") alloc] init]];
@@ -1124,7 +1124,7 @@ - (IBAction)fieldAction:(id)sender {
- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)sender {
if ([sender firstResponder] == textView) {
- if (RunningTigerAppKitOrHigher && currentNote) {
+ if ((floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_3) && currentNote) {
NSLog(@"windowWillReturnUndoManager should not be called when textView is first responder on Tiger or higher");
}
View
@@ -23,7 +23,7 @@ - (id) init {
[self setBordered:NO];
[self setDrawsBackground:NO];
[self setWraps:YES];
- if (RunningTigerAppKitOrHigher) [self setPlaceholderString:NSLocalizedString(@"Search or Create", @"placeholder text in search/create field")];
+ [self setPlaceholderString:NSLocalizedString(@"Search or Create", @"placeholder text in search/create field")];
[self setFocusRingType:NSFocusRingTypeExterior];
@@ -185,11 +185,8 @@ - (void)awakeFromNib {
[self setBezeled:NO];
[self setFocusRingType:NSFocusRingTypeExterior];
-
- if (RunningTigerAppKitOrHigher) { // on 10.4
- [myCell setAllowsUndo:NO];
- [myCell setLineBreakMode:NSLineBreakByCharWrapping];
- }
+ [myCell setAllowsUndo:NO];
+ [myCell setLineBreakMode:NSLineBreakByCharWrapping];
docIconRectTag = [self addTrackingRect:[[self cell] snapbackButtonRectForBounds:[self bounds]] owner:self userData:NULL assumeInside:NO];
}
View
@@ -14,19 +14,9 @@ + (ExporterManager *)sharedManager {
}
- (void)awakeFromNib {
- int itemIndex;
- if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_3) {
- //prevent HTML and WordML storage format on 10.3.x, as they are not in Foundation
-
- itemIndex = [formatSelectorPopup indexOfItemWithTag:HTMLFormat];
- if (itemIndex > -1) [formatSelectorPopup removeItemAtIndex:itemIndex];
-
- itemIndex = [formatSelectorPopup indexOfItemWithTag:WordXMLFormat];
- if (itemIndex > -1) [formatSelectorPopup removeItemAtIndex:itemIndex];
- }
int storageFormat = [[[GlobalPrefs defaultPrefs] notationPrefs] notesStorageFormat];
- itemIndex = [formatSelectorPopup indexOfItemWithTag:storageFormat];
+ int itemIndex = [formatSelectorPopup indexOfItemWithTag:storageFormat];
if (itemIndex > -1)
[formatSelectorPopup selectItemAtIndex:itemIndex];
View
@@ -13,16 +13,14 @@ - (id)init {
- (void)_resizeColumn:(NSInteger)resizedColIdx withEvent:(id)event {
//use a more understandable column resizing by changing the resizing mask immediately before calling through to the private method,
//and reverting it back to the original at the next runloop iteration
- if (RunningTigerAppKitOrHigher) {
- NSUInteger originalResizingMask = 0;
- int i;
- //change all user-resizable-only columns
- for (i=0; i<[[self tableView] numberOfColumns]; i++) {
- NoteAttributeColumn *col = [[[self tableView] tableColumns] objectAtIndex:i];
- if ((originalResizingMask = [col resizingMask]) == NSTableColumnUserResizingMask) {
- [col setResizingMask: NSTableColumnAutoresizingMask | NSTableColumnUserResizingMask];
- [col performSelector:@selector(setResizingMaskNumber:) withObject:[NSNumber numberWithUnsignedInt:originalResizingMask] afterDelay:0];
- }
+ NSUInteger originalResizingMask = 0;
+ int i;
+ //change all user-resizable-only columns
+ for (i=0; i<[[self tableView] numberOfColumns]; i++) {
+ NoteAttributeColumn *col = [[[self tableView] tableColumns] objectAtIndex:i];
+ if ((originalResizingMask = [col resizingMask]) == NSTableColumnUserResizingMask) {
+ [col setResizingMask: NSTableColumnAutoresizingMask | NSTableColumnUserResizingMask];
+ [col performSelector:@selector(setResizingMaskNumber:) withObject:[NSNumber numberWithUnsignedInt:originalResizingMask] afterDelay:0];
}
}
View
@@ -148,15 +148,15 @@
<key>CFBundleVersion</key>
<string>5</string>
<key>LSMinimumSystemVersion</key>
- <string>10.3.9</string>
+ <string>10.4</string>
<key>LSMinimumSystemVersionByArchitecture</key>
<dict>
<key>i386</key>
<string>10.4.4</string>
<key>x86_64</key>
<string>10.6.0</string>
<key>ppc</key>
- <string>10.3.9</string>
+ <string>10.4</string>
</dict>
<key>LSArchitecturePriority</key>
<array>
View
@@ -247,9 +247,7 @@ - (BOOL)fsRefAsAlias:(FSRef*)fsRef {
}
+ (NSData*)uncachedDataFromFile:(NSString*)filename {
-
- if (!RunningTigerAppKitOrHigher) return [NSData dataWithContentsOfFile:filename];
-
+
return [NSData dataWithContentsOfFile:filename options:NSUncachedRead error:NULL];
}
View
@@ -634,7 +634,6 @@ + (NSString*)pathWithFSRef:(FSRef*)fsRef {
- (BOOL)UTIOfFileConformsToType:(NSString*)type {
- if (!RunningTigerAppKitOrHigher) return NO;
CFStringRef fileUTI = NULL;
FSRef fileRef;
@@ -802,7 +801,7 @@ + (NSMutableString*)newShortLivedStringFromData:(NSMutableData*)data ofGuessedEn
AddIfUnique(firstEncodingToTry);
- if (hasHighASCII && RunningTigerAppKitOrHigher) {
+ if (hasHighASCII) {
//check the file on disk for extended attributes only if absolutely necessary
NSStringEncoding extendedAttrsEncoding = 0;
if (!aPath && fsRef && !IsZeros(fsRef, sizeof(FSRef))) {
@@ -821,12 +820,8 @@ + (NSMutableString*)newShortLivedStringFromData:(NSMutableData*)data ofGuessedEn
encodingIndex = 0;
do {
- if (RunningTigerAppKitOrHigher) {
- stringFromData = [[NSMutableString alloc] initWithBytesNoCopy:[data mutableBytes] length:[data length]
- encoding:encodingsToTry[encodingIndex] freeWhenDone:NO];
- } else {
- stringFromData = [[NSMutableString alloc] initWithData:data encoding:encodingsToTry[encodingIndex]];
- }
+ stringFromData = [[NSMutableString alloc] initWithBytesNoCopy:[data mutableBytes] length:[data length]
+ encoding:encodingsToTry[encodingIndex] freeWhenDone:NO];
} while (!stringFromData && ++encodingIndex < 5);
if (stringFromData) {
@@ -50,7 +50,6 @@
2144957A0ADCC06300E2A2B6 /* PassphrasePicker.nib in Resources */ = {isa = PBXBuildFile; fileRef = 214495740ADCC06300E2A2B6 /* PassphrasePicker.nib */; };
214495870ADCC07E00E2A2B6 /* PassphraseChanger.nib in Resources */ = {isa = PBXBuildFile; fileRef = 214495810ADCC07E00E2A2B6 /* PassphraseChanger.nib */; };
21469C8C0BEBA6A10094835F /* TemporaryFileCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 21469C8A0BEBA6A10094835F /* TemporaryFileCache.m */; };
- 214C6C59105445410085D386 /* Notality.icns in Resources */ = {isa = PBXBuildFile; fileRef = 214C6C58105445410085D386 /* Notality.icns */; };
21544FBE0B06331800C0D1D5 /* KeyDerivationManager.nib in Resources */ = {isa = PBXBuildFile; fileRef = 21544FB80B06331800C0D1D5 /* KeyDerivationManager.nib */; };
21544FC10B06332600C0D1D5 /* KeyDerivationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 21544FC00B06332600C0D1D5 /* KeyDerivationManager.m */; };
215452080B06541800C0D1D5 /* PassphraseChanger.m in Sources */ = {isa = PBXBuildFile; fileRef = 215450F80B06509600C0D1D5 /* PassphraseChanger.m */; };
@@ -100,6 +99,9 @@
21A6E6FD0974204F008436A9 /* LabelsListController.m in Sources */ = {isa = PBXBuildFile; fileRef = 21A6E6FC0974204F008436A9 /* LabelsListController.m */; };
21A73DC8099712A8009F8A6C /* WALController.m in Sources */ = {isa = PBXBuildFile; fileRef = 21A73DC7099712A8009F8A6C /* WALController.m */; };
21AD2550110A8BA600B7A985 /* SimplenoteEntryCollector.m in Sources */ = {isa = PBXBuildFile; fileRef = 21AD254F110A8BA600B7A985 /* SimplenoteEntryCollector.m */; };
+ 21AD2850110BE99B00B7A985 /* SyncSessionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 21AD284F110BE99B00B7A985 /* SyncSessionController.m */; };
+ 21AD292D110C188800B7A985 /* TinyAlert.tif in Resources */ = {isa = PBXBuildFile; fileRef = 21AD292C110C188800B7A985 /* TinyAlert.tif */; };
+ 21AD292F110C18AA00B7A985 /* Notality.icns in Resources */ = {isa = PBXBuildFile; fileRef = 21AD292E110C18AA00B7A985 /* Notality.icns */; };
21B1BC361104D20E0004A7D0 /* InvocationRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = 21B1BC351104D20E0004A7D0 /* InvocationRecorder.m */; };
21B1C171110764570004A7D0 /* statusValidated.png in Resources */ = {isa = PBXBuildFile; fileRef = 21B1C16E110764570004A7D0 /* statusValidated.png */; };
21B1C172110764570004A7D0 /* statusError.png in Resources */ = {isa = PBXBuildFile; fileRef = 21B1C16F110764570004A7D0 /* statusError.png */; };
@@ -222,7 +224,6 @@
2144987D0AE192F900E2A2B6 /* PassphraseChanger.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PassphraseChanger.h; sourceTree = "<group>"; };
21469C890BEBA6A10094835F /* TemporaryFileCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TemporaryFileCache.h; sourceTree = "<group>"; };
21469C8A0BEBA6A10094835F /* TemporaryFileCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TemporaryFileCache.m; sourceTree = "<group>"; };
- 214C6C58105445410085D386 /* Notality.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = Notality.icns; sourceTree = "<group>"; };
21544FB90B06331800C0D1D5 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/KeyDerivationManager.nib; sourceTree = "<group>"; };
21544FBF0B06332600C0D1D5 /* KeyDerivationManager.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = KeyDerivationManager.h; sourceTree = "<group>"; };
21544FC00B06332600C0D1D5 /* KeyDerivationManager.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = KeyDerivationManager.m; sourceTree = "<group>"; };
@@ -303,6 +304,10 @@
21A73DC7099712A8009F8A6C /* WALController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WALController.m; sourceTree = "<group>"; };
21AD254E110A8BA600B7A985 /* SimplenoteEntryCollector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SimplenoteEntryCollector.h; sourceTree = "<group>"; };
21AD254F110A8BA600B7A985 /* SimplenoteEntryCollector.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SimplenoteEntryCollector.m; sourceTree = "<group>"; };
+ 21AD284E110BE99B00B7A985 /* SyncSessionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SyncSessionController.h; sourceTree = "<group>"; };
+ 21AD284F110BE99B00B7A985 /* SyncSessionController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SyncSessionController.m; sourceTree = "<group>"; };
+ 21AD292C110C188800B7A985 /* TinyAlert.tif */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; name = TinyAlert.tif; path = Images/TinyAlert.tif; sourceTree = "<group>"; };
+ 21AD292E110C18AA00B7A985 /* Notality.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; name = Notality.icns; path = Images/Notality.icns; sourceTree = "<group>"; };
21B1BC341104D20E0004A7D0 /* InvocationRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InvocationRecorder.h; sourceTree = "<group>"; };
21B1BC351104D20E0004A7D0 /* InvocationRecorder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InvocationRecorder.m; sourceTree = "<group>"; };
21B1C16E110764570004A7D0 /* statusValidated.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = statusValidated.png; path = Images/statusValidated.png; sourceTree = "<group>"; };
@@ -599,8 +604,9 @@
219196B109D4F1DB00586B15 /* Images */ = {
isa = PBXGroup;
children = (
+ 21AD292E110C18AA00B7A985 /* Notality.icns */,
+ 21AD292C110C188800B7A985 /* TinyAlert.tif */,
213FB0230B3CB1C4004C74BD /* PTKeyboardIcon.tiff */,
- 214C6C58105445410085D386 /* Notality.icns */,
2144950D0ADC883000E2A2B6 /* PasswordAssistantButton.tif */,
2144950E0ADC883000E2A2B6 /* PasswordAssistantButtonPressed.tif */,
21BD2F3510DAF61700BA3DF6 /* SplitViewDimple.tif */,
@@ -640,6 +646,8 @@
21F0794210EC5EA2004FE56F /* SimplenoteSession.m */,
21F0797C10EC93B0004FE56F /* SyncResponseFetcher.h */,
21F0797D10EC93B0004FE56F /* SyncResponseFetcher.m */,
+ 21AD284E110BE99B00B7A985 /* SyncSessionController.h */,
+ 21AD284F110BE99B00B7A985 /* SyncSessionController.m */,
);
name = "Sync Services";
sourceTree = "<group>";
@@ -829,7 +837,6 @@
2111A3C00B88FEFD006A1691 /* Excruciatingly Useful Shortcuts.nvhelp in Resources */,
2111A3C10B88FEFD006A1691 /* How does this thing work?.nvhelp in Resources */,
213621ED0B92413F008C0830 /* FindPanel.nib in Resources */,
- 214C6C59105445410085D386 /* Notality.icns in Resources */,
21813562105AF27400A0AE18 /* Acknowledgments.txt in Resources */,
2182B3C3106B2509008641E4 /* MainMenu.nib in Resources */,
216BA24310746E3900F62D93 /* ImporterAccessory.nib in Resources */,
@@ -847,6 +854,8 @@
21B1C171110764570004A7D0 /* statusValidated.png in Resources */,
21B1C172110764570004A7D0 /* statusError.png in Resources */,
21B1C173110764570004A7D0 /* statusInProgress.png in Resources */,
+ 21AD292D110C188800B7A985 /* TinyAlert.tif in Resources */,
+ 21AD292F110C18AA00B7A985 /* Notality.icns in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -928,6 +937,7 @@
21F07C7F10EDED93004FE56F /* NSString+BSJSONAdditions.m in Sources */,
21B1BC361104D20E0004A7D0 /* InvocationRecorder.m in Sources */,
21AD2550110A8BA600B7A985 /* SimplenoteEntryCollector.m in Sources */,
+ 21AD2850110BE99B00B7A985 /* SyncSessionController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1326,7 +1336,7 @@
GCC_WARN_SIGN_COMPARE = YES;
GCC_WARN_UNUSED_VALUE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- MACOSX_DEPLOYMENT_TARGET = 10.3;
+ MACOSX_DEPLOYMENT_TARGET = 10.4;
"MACOSX_DEPLOYMENT_TARGET[arch=x86_64]" = 10.5;
SDKROOT = macosx10.4;
"SDKROOT[arch=x86_64]" = macosx10.5;
View
@@ -86,41 +86,10 @@ long BlockSizeForNotation(NotationController *controller) {
}
-#if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_4
-OSErr FSDetermineIfRefIsEnclosedByFolder(short domainOrVRefNum, OSType folderType, const FSRef *inRef, Boolean *outResult);
-#endif
-
- (BOOL)notesDirectoryIsTrashed {
- Boolean isInTrash = false;
-
- if (FSDetermineIfRefIsEnclosedByFolder == NULL) {
- FSCatalogInfo info;
- FSRef workingRef;
-
- memmove(&workingRef, &noteDirectoryRef, sizeof(FSRef));
-
- while (FSGetCatalogInfo(&workingRef, kFSCatInfoVolume | kFSCatInfoParentDirID,
- &info, NULL, NULL, &workingRef) == noErr) {
- FolderType folderType;
-
- if (IdentifyFolder(info.volume, info.parentDirID, &folderType) != noErr)
- break;
-
- if (folderType == kTrashFolderType ||
- folderType == kWhereToEmptyTrashFolderType ||
- folderType == kSystemTrashFolderType) {
- isInTrash = true;
- break;
- }
-
- if (info.parentDirID == fsRtDirID)
- break;
- }
- } else {
- if (FSDetermineIfRefIsEnclosedByFolder(0, kTrashFolderType, &noteDirectoryRef, &isInTrash) != noErr)
- isInTrash = false;
- }
-
+ Boolean isInTrash = false;
+ if (FSDetermineIfRefIsEnclosedByFolder(0, kTrashFolderType, &noteDirectoryRef, &isInTrash) != noErr)
+ isInTrash = false;
return (BOOL)isInTrash;
}
@@ -308,6 +277,7 @@ - (OSStatus)fileInNotesDirectory:(FSRef*)childRef isOwnedByUs:(BOOL*)owned hasCa
if (info) {
whichInfo = kFSCatInfoContentMod | kFSCatInfoCreateDate | kFSCatInfoNodeID;
+ //may have to be adjusted to include logical size if we start tracking that
bzero(info, sizeof(FSCatalogInfo));
}
Oops, something went wrong.

0 comments on commit 82a1d92

Please sign in to comment.