mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			2696 lines
		
	
	
		
			122 KiB
		
	
	
	
		
			Objective-C
		
	
			
		
		
	
	
			2696 lines
		
	
	
		
			122 KiB
		
	
	
	
		
			Objective-C
		
	
| #import "MIMETypeUtil.h"
 | |
| #import "OWSFileSystem.h"
 | |
| 
 | |
| #if TARGET_OS_IPHONE
 | |
| #import <MobileCoreServices/MobileCoreServices.h>
 | |
| 
 | |
| #else
 | |
| #import <CoreServices/CoreServices.h>
 | |
| 
 | |
| #endif
 | |
| 
 | |
| NS_ASSUME_NONNULL_BEGIN
 | |
| 
 | |
| NSString *const OWSMimeTypeApplicationOctetStream = @"application/octet-stream";
 | |
| NSString *const OWSMimeTypeImagePng = @"image/png";
 | |
| NSString *const OWSMimeTypeImageJpeg = @"image/jpeg";
 | |
| NSString *const OWSMimeTypeImageGif = @"image/gif";
 | |
| NSString *const OWSMimeTypeImageTiff1 = @"image/tiff";
 | |
| NSString *const OWSMimeTypeImageTiff2 = @"image/x-tiff";
 | |
| NSString *const OWSMimeTypeImageBmp1 = @"image/bmp";
 | |
| NSString *const OWSMimeTypeImageBmp2 = @"image/x-windows-bmp";
 | |
| NSString *const OWSMimeTypeImageWebp = @"image/webp";
 | |
| NSString *const OWSMimeTypeImageHeic = @"image/heic";
 | |
| NSString *const OWSMimeTypeImageHeif = @"image/heif";
 | |
| NSString *const OWSMimeTypeUnknownForTests = @"unknown/mimetype";
 | |
| NSString *const OWSMimeTypeApplicationZip = @"application/zip";
 | |
| NSString *const OWSMimeTypeApplicationPdf = @"application/pdf";
 | |
| 
 | |
| NSString *const kTextAttachmentFileExtension = @"txt";
 | |
| NSString *const kUnknownTestAttachmentUTI = @"org.whispersystems.unknown";
 | |
| NSString *const kSyncMessageFileExtension = @"bin";
 | |
| 
 | |
| @implementation MIMETypeUtil
 | |
| 
 | |
| + (NSDictionary *)supportedVideoMIMETypesToExtensionTypes {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             @"video/3gpp" : @"3gp",
 | |
|             @"video/3gpp2" : @"3g2",
 | |
|             @"video/mp4" : @"mp4",
 | |
|             @"video/quicktime" : @"mov",
 | |
|             @"video/x-m4v" : @"m4v",
 | |
|             @"video/mpeg" : @"mpg",
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSDictionary *)supportedAudioMIMETypesToExtensionTypes {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             @"audio/aac" : @"m4a",
 | |
|             @"audio/x-m4p" : @"m4p",
 | |
|             @"audio/x-m4b" : @"m4b",
 | |
|             @"audio/x-m4a" : @"m4a",
 | |
|             @"audio/wav" : @"wav",
 | |
|             @"audio/x-wav" : @"wav",
 | |
|             @"audio/x-mpeg" : @"mp3",
 | |
|             @"audio/mpeg" : @"mp3",
 | |
|             @"audio/mp4" : @"mp4",
 | |
|             @"audio/mp3" : @"mp3",
 | |
|             @"audio/mpeg3" : @"mp3",
 | |
|             @"audio/x-mp3" : @"mp3",
 | |
|             @"audio/x-mpeg3" : @"mp3",
 | |
|             @"audio/aiff" : @"aiff",
 | |
|             @"audio/x-aiff" : @"aiff",
 | |
|             @"audio/3gpp2" : @"3g2",
 | |
|             @"audio/3gpp" : @"3gp",
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSDictionary *)supportedImageMIMETypesToExtensionTypes {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             OWSMimeTypeImageJpeg : @"jpeg",
 | |
|             @"image/pjpeg" : @"jpeg",
 | |
|             OWSMimeTypeImagePng : @"png",
 | |
|             @"image/tiff" : @"tif",
 | |
|             @"image/x-tiff" : @"tif",
 | |
|             @"image/bmp" : @"bmp",
 | |
|             @"image/x-windows-bmp" : @"bmp",
 | |
|             @"image/gif" : @"gif",
 | |
|             @"image/x-icon": @"ico",
 | |
|             OWSMimeTypeImageWebp : @"webp"
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSDictionary *)supportedAnimatedMIMETypesToExtensionTypes {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             OWSMimeTypeImageGif : @"gif",
 | |
|             OWSMimeTypeImageWebp : @"image/webp",
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSDictionary *)supportedBinaryDataMIMETypesToExtensionTypes
 | |
| {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             OWSMimeTypeApplicationOctetStream : @"dat",
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSDictionary *)supportedVideoExtensionTypesToMIMETypes {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             @"3gp" : @"video/3gpp",
 | |
|             @"3gpp" : @"video/3gpp",
 | |
|             @"3gp2" : @"video/3gpp2",
 | |
|             @"3gpp2" : @"video/3gpp2",
 | |
|             @"mp4" : @"video/mp4",
 | |
|             @"mov" : @"video/quicktime",
 | |
|             @"mqv" : @"video/quicktime",
 | |
|             @"m4v" : @"video/x-m4v",
 | |
|             @"mpg" : @"video/mpeg",
 | |
|             @"mpeg" : @"video/mpeg",
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSDictionary *)supportedAudioExtensionTypesToMIMETypes {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             @"3gp" : @"audio/3gpp",
 | |
|             @"3gpp" : @"@audio/3gpp",
 | |
|             @"3g2" : @"audio/3gpp2",
 | |
|             @"3gp2" : @"audio/3gpp2",
 | |
|             @"aiff" : @"audio/aiff",
 | |
|             @"aif" : @"audio/aiff",
 | |
|             @"aifc" : @"audio/aiff",
 | |
|             @"cdda" : @"audio/aiff",
 | |
|             @"mp3" : @"audio/mp3",
 | |
|             @"swa" : @"audio/mp3",
 | |
|             @"mp4" : @"audio/mp4",
 | |
|             @"wav" : @"audio/wav",
 | |
|             @"bwf" : @"audio/wav",
 | |
|             @"m4a" : @"audio/x-m4a",
 | |
|             @"m4b" : @"audio/x-m4b",
 | |
|             @"m4p" : @"audio/x-m4p"
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSDictionary *)supportedImageExtensionTypesToMIMETypes {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             @"png" : OWSMimeTypeImagePng,
 | |
|             @"x-png" : OWSMimeTypeImagePng,
 | |
|             @"jfif" : @"image/jpeg",
 | |
|             @"jfif" : @"image/pjpeg",
 | |
|             @"jfif-tbnl" : @"image/jpeg",
 | |
|             @"jpe" : @"image/jpeg",
 | |
|             @"jpe" : @"image/pjpeg",
 | |
|             @"jpeg" : @"image/jpeg",
 | |
|             @"jpg" : @"image/jpeg",
 | |
|             @"tif" : @"image/tiff",
 | |
|             @"tiff" : @"image/tiff",
 | |
|             @"webp" : OWSMimeTypeImageWebp
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSDictionary *)supportedAnimatedExtensionTypesToMIMETypes {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             @"gif" : OWSMimeTypeImageGif,
 | |
|             @"image/webp" : OWSMimeTypeImageWebp
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (BOOL)isSupportedVideoMIMEType:(NSString *)contentType {
 | |
|     return [[self supportedVideoMIMETypesToExtensionTypes] objectForKey:contentType] != nil;
 | |
| }
 | |
| 
 | |
| + (BOOL)isSupportedAudioMIMEType:(NSString *)contentType {
 | |
|     return [[self supportedAudioMIMETypesToExtensionTypes] objectForKey:contentType] != nil;
 | |
| }
 | |
| 
 | |
| + (BOOL)isSupportedImageMIMEType:(NSString *)contentType {
 | |
|     return [[self supportedImageMIMETypesToExtensionTypes] objectForKey:contentType] != nil;
 | |
| }
 | |
| 
 | |
| + (BOOL)isSupportedAnimatedMIMEType:(NSString *)contentType {
 | |
|     return [[self supportedAnimatedMIMETypesToExtensionTypes] objectForKey:contentType] != nil;
 | |
| }
 | |
| 
 | |
| + (BOOL)isSupportedBinaryDataMIMEType:(NSString *)contentType
 | |
| {
 | |
|     return [[self supportedBinaryDataMIMETypesToExtensionTypes] objectForKey:contentType] != nil;
 | |
| }
 | |
| 
 | |
| + (BOOL)isSupportedVideoFile:(NSString *)filePath {
 | |
|     return [[self supportedVideoExtensionTypesToMIMETypes] objectForKey:filePath.pathExtension.lowercaseString] != nil;
 | |
| }
 | |
| 
 | |
| + (BOOL)isSupportedAudioFile:(NSString *)filePath {
 | |
|     return [[self supportedAudioExtensionTypesToMIMETypes] objectForKey:filePath.pathExtension.lowercaseString] != nil;
 | |
| }
 | |
| 
 | |
| + (BOOL)isSupportedImageFile:(NSString *)filePath {
 | |
|     return [[self supportedImageExtensionTypesToMIMETypes] objectForKey:filePath.pathExtension.lowercaseString] != nil;
 | |
| }
 | |
| 
 | |
| + (BOOL)isSupportedAnimatedFile:(NSString *)filePath {
 | |
|     return
 | |
|         [[self supportedAnimatedExtensionTypesToMIMETypes] objectForKey:filePath.pathExtension.lowercaseString] != nil;
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)getSupportedExtensionFromVideoMIMEType:(NSString *)supportedMIMEType
 | |
| {
 | |
|     return [[self supportedVideoMIMETypesToExtensionTypes] objectForKey:supportedMIMEType];
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)getSupportedExtensionFromAudioMIMEType:(NSString *)supportedMIMEType
 | |
| {
 | |
|     return [[self supportedAudioMIMETypesToExtensionTypes] objectForKey:supportedMIMEType];
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)getSupportedExtensionFromImageMIMEType:(NSString *)supportedMIMEType
 | |
| {
 | |
|     return [[self supportedImageMIMETypesToExtensionTypes] objectForKey:supportedMIMEType];
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)getSupportedExtensionFromAnimatedMIMEType:(NSString *)supportedMIMEType
 | |
| {
 | |
|     return [[self supportedAnimatedMIMETypesToExtensionTypes] objectForKey:supportedMIMEType];
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)getSupportedExtensionFromBinaryDataMIMEType:(NSString *)supportedMIMEType
 | |
| {
 | |
|     return [[self supportedBinaryDataMIMETypesToExtensionTypes] objectForKey:supportedMIMEType];
 | |
| }
 | |
| 
 | |
| #pragma mark full attachment utilities
 | |
| + (BOOL)isAnimated:(NSString *)contentType {
 | |
|     return [MIMETypeUtil isSupportedAnimatedMIMEType:contentType];
 | |
| }
 | |
| 
 | |
| + (BOOL)isBinaryData:(NSString *)contentType
 | |
| {
 | |
|     return [MIMETypeUtil isSupportedBinaryDataMIMEType:contentType];
 | |
| }
 | |
| 
 | |
| + (BOOL)isImage:(NSString *)contentType {
 | |
|     return [MIMETypeUtil isSupportedImageMIMEType:contentType];
 | |
| }
 | |
| 
 | |
| + (BOOL)isVideo:(NSString *)contentType {
 | |
|     return [MIMETypeUtil isSupportedVideoMIMEType:contentType];
 | |
| }
 | |
| 
 | |
| + (BOOL)isAudio:(NSString *)contentType {
 | |
|     return [MIMETypeUtil isSupportedAudioMIMEType:contentType];
 | |
| }
 | |
| 
 | |
| + (BOOL)isText:(NSString *)contentType {
 | |
|     return [
 | |
|         @[
 | |
|             @"text/plain",
 | |
|             @"text/csv",
 | |
|             @"text/tab-separated-values"
 | |
|         ]
 | |
|         containsObject:contentType
 | |
|     ];
 | |
| }
 | |
| 
 | |
| + (BOOL)isMicrosoftDoc:(NSString *)contentType {
 | |
|     return [
 | |
|         @[
 | |
|             // Word files
 | |
|             @"application/msword",
 | |
| 
 | |
|             @"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
 | |
|             @"application/vnd.openxmlformats-officedocument.wordprocessingml.template",
 | |
|             @"application/vnd.ms-word.document.macroEnabled.12",
 | |
|             @"application/vnd.ms-word.template.macroEnabled.12",
 | |
| 
 | |
|             // Excel files
 | |
|             @"application/vnd.ms-excel",
 | |
| 
 | |
|             @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
 | |
|             @"application/vnd.openxmlformats-officedocument.spreadsheetml.template",
 | |
|             @"application/vnd.ms-excel.sheet.macroEnabled.12",
 | |
|             @"application/vnd.ms-excel.template.macroEnabled.12",
 | |
|             @"application/vnd.ms-excel.addin.macroEnabled.12",
 | |
|             @"application/vnd.ms-excel.sheet.binary.macroEnabled.12",
 | |
| 
 | |
|             // Powerpoint files
 | |
|             @"application/vnd.ms-powerpoint",
 | |
| 
 | |
|             @"application/vnd.openxmlformats-officedocument.presentationml.presentation",
 | |
|             @"application/vnd.openxmlformats-officedocument.presentationml.template",
 | |
|             @"application/vnd.openxmlformats-officedocument.presentationml.slideshow",
 | |
|             @"application/vnd.ms-powerpoint.addin.macroEnabled.12",
 | |
|             @"application/vnd.ms-powerpoint.presentation.macroEnabled.12",
 | |
|             @"application/vnd.ms-powerpoint.template.macroEnabled.12",
 | |
|             @"application/vnd.ms-powerpoint.slideshow.macroEnabled.12"
 | |
|         ]
 | |
|         containsObject:contentType
 | |
|     ];
 | |
| }
 | |
| 
 | |
| + (BOOL)isVisualMedia:(NSString *)contentType
 | |
| {
 | |
|     if ([self isImage:contentType]) {
 | |
|         return YES;
 | |
|     }
 | |
| 
 | |
|     if ([self isVideo:contentType]) {
 | |
|         return YES;
 | |
|     }
 | |
| 
 | |
|     if ([self isAnimated:contentType]) {
 | |
|         return YES;
 | |
|     }
 | |
| 
 | |
|     return NO;
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)filePathForAttachment:(NSString *)uniqueId
 | |
|                                   ofMIMEType:(NSString *)contentType
 | |
|                               sourceFilename:(nullable NSString *)sourceFilename
 | |
|                                     inFolder:(NSString *)folder
 | |
| {
 | |
|     NSString *kDefaultFileExtension = @"bin";
 | |
| 
 | |
|     if (sourceFilename.length > 0) {
 | |
|         NSString *normalizedFilename =
 | |
|             [sourceFilename stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
 | |
|         // Ensure that the filename is a valid filesystem name,
 | |
|         // replacing invalid characters with an underscore.
 | |
|         for (NSCharacterSet *invalidCharacterSet in @[
 | |
|                  [NSCharacterSet whitespaceAndNewlineCharacterSet],
 | |
|                  [NSCharacterSet illegalCharacterSet],
 | |
|                  [NSCharacterSet controlCharacterSet],
 | |
|                  [NSCharacterSet characterSetWithCharactersInString:@"<>|\\:()&;?*/~"],
 | |
|              ]) {
 | |
|             normalizedFilename = [[normalizedFilename componentsSeparatedByCharactersInSet:invalidCharacterSet]
 | |
|                 componentsJoinedByString:@"_"];
 | |
|         }
 | |
|         
 | |
|         // Remove leading periods to prevent hidden files,
 | |
|         // "." and ".." special file names.
 | |
|         while ([normalizedFilename hasPrefix:@"."]) {
 | |
|             normalizedFilename = [normalizedFilename substringFromIndex:1];
 | |
|         }
 | |
| 
 | |
|         NSString *fileExtension = [[normalizedFilename pathExtension]
 | |
|             stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
 | |
|         NSString *filenameWithoutExtension = [[[normalizedFilename lastPathComponent] stringByDeletingPathExtension]
 | |
|             stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
 | |
| 
 | |
|         // If the filename has not file extension, deduce one
 | |
|         // from the MIME type.
 | |
|         if (fileExtension.length < 1) {
 | |
|             fileExtension = [self fileExtensionForMIMEType:contentType];
 | |
|             if (fileExtension.length < 1) {
 | |
|                 fileExtension = kDefaultFileExtension;
 | |
|             }
 | |
|         }
 | |
|         fileExtension = [fileExtension lowercaseString];
 | |
| 
 | |
|         if (filenameWithoutExtension.length > 0) {
 | |
|             // Store the file in a subdirectory whose name is the uniqueId of this attachment,
 | |
|             // to avoid collisions between multiple attachments with the same name.
 | |
|             NSString *attachmentFolderPath = [folder stringByAppendingPathComponent:uniqueId];
 | |
|             if (![OWSFileSystem ensureDirectoryExists:attachmentFolderPath]) {
 | |
|                 return nil;
 | |
|             }
 | |
|             return [attachmentFolderPath
 | |
|                 stringByAppendingPathComponent:[NSString
 | |
|                                                    stringWithFormat:@"%@.%@", filenameWithoutExtension, fileExtension]];
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if ([self isVideo:contentType]) {
 | |
|         return [MIMETypeUtil filePathForVideo:uniqueId ofMIMEType:contentType inFolder:folder];
 | |
|     } else if ([self isAudio:contentType]) {
 | |
|         return [MIMETypeUtil filePathForAudio:uniqueId ofMIMEType:contentType inFolder:folder];
 | |
|     } else if ([self isImage:contentType]) {
 | |
|         return [MIMETypeUtil filePathForImage:uniqueId ofMIMEType:contentType inFolder:folder];
 | |
|     } else if ([self isAnimated:contentType]) {
 | |
|         return [MIMETypeUtil filePathForAnimated:uniqueId ofMIMEType:contentType inFolder:folder];
 | |
|     } else if ([self isBinaryData:contentType]) {
 | |
|         return [MIMETypeUtil filePathForBinaryData:uniqueId ofMIMEType:contentType inFolder:folder];
 | |
|     } else if ([contentType isEqualToString:OWSMimeTypeUnknownForTests]) {
 | |
|         // This file extension is arbitrary - it should never be exposed to the user or
 | |
|         // be used outside the app.
 | |
|         return [self filePathForData:uniqueId withFileExtension:@"unknown" inFolder:folder];
 | |
|     }
 | |
| 
 | |
|     NSString *fileExtension = [self fileExtensionForMIMEType:contentType];
 | |
|     if (fileExtension) {
 | |
|         return [self filePathForData:uniqueId withFileExtension:fileExtension inFolder:folder];
 | |
|     }
 | |
| 
 | |
|     // Use a fallback file extension.
 | |
|     return [self filePathForData:uniqueId withFileExtension:kDefaultFileExtension inFolder:folder];
 | |
| }
 | |
| 
 | |
| + (NSString *)filePathForImage:(NSString *)uniqueId ofMIMEType:(NSString *)contentType inFolder:(NSString *)folder {
 | |
|     return [self filePathForData:uniqueId
 | |
|                withFileExtension:[self getSupportedExtensionFromImageMIMEType:contentType]
 | |
|                         inFolder:folder];
 | |
| }
 | |
| 
 | |
| + (NSString *)filePathForVideo:(NSString *)uniqueId ofMIMEType:(NSString *)contentType inFolder:(NSString *)folder {
 | |
|     return [self filePathForData:uniqueId
 | |
|                withFileExtension:[self getSupportedExtensionFromVideoMIMEType:contentType]
 | |
|                         inFolder:folder];
 | |
| }
 | |
| 
 | |
| + (NSString *)filePathForAudio:(NSString *)uniqueId ofMIMEType:(NSString *)contentType inFolder:(NSString *)folder {
 | |
|     return [self filePathForData:uniqueId
 | |
|                withFileExtension:[self getSupportedExtensionFromAudioMIMEType:contentType]
 | |
|                         inFolder:folder];
 | |
| }
 | |
| 
 | |
| + (NSString *)filePathForAnimated:(NSString *)uniqueId ofMIMEType:(NSString *)contentType inFolder:(NSString *)folder {
 | |
|     return [self filePathForData:uniqueId
 | |
|                withFileExtension:[self getSupportedExtensionFromAnimatedMIMEType:contentType]
 | |
|                         inFolder:folder];
 | |
| }
 | |
| 
 | |
| + (NSString *)filePathForBinaryData:(NSString *)uniqueId ofMIMEType:(NSString *)contentType inFolder:(NSString *)folder
 | |
| {
 | |
|     return [self filePathForData:uniqueId
 | |
|                withFileExtension:[self getSupportedExtensionFromBinaryDataMIMEType:contentType]
 | |
|                         inFolder:folder];
 | |
| }
 | |
| 
 | |
| + (NSString *)filePathForData:(NSString *)uniqueId
 | |
|             withFileExtension:(NSString *)fileExtension
 | |
|                      inFolder:(NSString *)folder
 | |
| {
 | |
|     return [folder stringByAppendingPathComponent:[uniqueId stringByAppendingPathExtension:fileExtension]];
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)utiTypeForMIMEType:(NSString *)mimeType
 | |
| {
 | |
|     NSString *utiType = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(
 | |
|         kUTTagClassMIMEType, (__bridge CFStringRef)mimeType, NULL);
 | |
| 
 | |
|     if (!utiType) {
 | |
|         if ([mimeType isEqualToString:@"audio/amr"]) {
 | |
|             utiType = @"org.3gpp.adaptive-multi-rate-audio";
 | |
|         } else if ([mimeType isEqualToString:@"audio/mp3"] || [mimeType isEqualToString:@"audio/x-mpeg"] ||
 | |
|             [mimeType isEqualToString:@"audio/mpeg"] || [mimeType isEqualToString:@"audio/mpeg3"] ||
 | |
|             [mimeType isEqualToString:@"audio/x-mp3"] || [mimeType isEqualToString:@"audio/x-mpeg3"]) {
 | |
|             utiType = (NSString *)kUTTypeMP3;
 | |
|         } else if ([mimeType isEqualToString:@"audio/aac"] || [mimeType isEqualToString:@"audio/x-m4a"]) {
 | |
|             utiType = (NSString *)kUTTypeMPEG4Audio;
 | |
|         } else if ([mimeType isEqualToString:@"audio/aiff"] || [mimeType isEqualToString:@"audio/x-aiff"]) {
 | |
|             utiType = (NSString *)kUTTypeAudioInterchangeFileFormat;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return utiType;
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)fileExtensionForUTIType:(NSString *)utiType
 | |
| {
 | |
|     // Special-case the "aac" filetype we use for voice messages (for legacy reasons)
 | |
|     // to use a .m4a file extension, not .aac, since AVAudioPlayer can't handle .aac
 | |
|     // properly. Doesn't affect file contents.
 | |
|     if ([utiType isEqualToString:@"public.aac-audio"]) {
 | |
|         return @"m4a";
 | |
|     }
 | |
|     CFStringRef fileExtension
 | |
|         = UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)utiType, kUTTagClassFilenameExtension);
 | |
|     return (__bridge_transfer NSString *)fileExtension;
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)fileExtensionForMIMETypeViaUTIType:(NSString *)mimeType
 | |
| {
 | |
|     NSString *utiType = [self utiTypeForMIMEType:mimeType];
 | |
|     if (!utiType) {
 | |
|         return nil;
 | |
|     }
 | |
|     NSString *fileExtension = [self fileExtensionForUTIType:utiType];
 | |
|     return fileExtension;
 | |
| }
 | |
| 
 | |
| + (NSSet<NSString *> *)utiTypesForMIMETypes:(NSArray *)mimeTypes
 | |
| {
 | |
|     NSMutableSet<NSString *> *result = [NSMutableSet new];
 | |
|     for (NSString *mimeType in mimeTypes) {
 | |
|         NSString *_Nullable utiType = [self utiTypeForMIMEType:mimeType];
 | |
|         if (!utiType) { continue; }
 | |
|         [result addObject:utiType];
 | |
|     }
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSSet<NSString *> *)supportedVideoUTITypes
 | |
| {
 | |
|     static NSSet<NSString *> *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = [self utiTypesForMIMETypes:[self supportedVideoMIMETypesToExtensionTypes].allKeys];
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSSet<NSString *> *)supportedAudioUTITypes
 | |
| {
 | |
|     static NSSet<NSString *> *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = [self utiTypesForMIMETypes:[self supportedAudioMIMETypesToExtensionTypes].allKeys];
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSSet<NSString *> *)supportedImageUTITypes
 | |
| {
 | |
|     static NSSet<NSString *> *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = [self utiTypesForMIMETypes:[self supportedImageMIMETypesToExtensionTypes].allKeys];
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSSet<NSString *> *)supportedAnimatedImageUTITypes
 | |
| {
 | |
|     static NSSet<NSString *> *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = [self utiTypesForMIMETypes:[self supportedAnimatedMIMETypesToExtensionTypes].allKeys];
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSArray<NSString *> *)supportedImageMIMETypes
 | |
| {
 | |
|     static NSArray<NSString *> *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = [self supportedImageMIMETypesToExtensionTypes].allKeys;
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSArray<NSString *> *)supportedAnimatedImageMIMETypes
 | |
| {
 | |
|     static NSArray<NSString *> *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = [self supportedAnimatedMIMETypesToExtensionTypes].allKeys;
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSArray<NSString *> *)supportedVideoMIMETypes
 | |
| {
 | |
|     static NSArray<NSString *> *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = [self supportedVideoMIMETypesToExtensionTypes].allKeys;
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (NSDictionary *)genericMIMETypesToExtensionTypes
 | |
| {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             @"application/acad" : @"dwg",
 | |
|             @"application/andrew-inset" : @"ez",
 | |
|             @"application/applixware" : @"aw",
 | |
|             @"application/arj" : @"arj",
 | |
|             @"application/atom+xml" : @"atom",
 | |
|             @"application/atomcat+xml" : @"atomcat",
 | |
|             @"application/atomsvc+xml" : @"atomsvc",
 | |
|             @"application/binhex" : @"hqx",
 | |
|             @"application/binhex4" : @"hqx",
 | |
|             @"application/book" : @"book",
 | |
|             @"application/ccxml+xml" : @"ccxml",
 | |
|             @"application/cdf" : @"cdf",
 | |
|             @"application/cdmi-capability" : @"cdmia",
 | |
|             @"application/cdmi-container" : @"cdmic",
 | |
|             @"application/cdmi-domain" : @"cdmid",
 | |
|             @"application/cdmi-object" : @"cdmio",
 | |
|             @"application/cdmi-queue" : @"cdmiq",
 | |
|             @"application/clariscad" : @"ccad",
 | |
|             @"application/commonground" : @"dp",
 | |
|             @"application/cu-seeme" : @"cu",
 | |
|             @"application/davmount+xml" : @"davmount",
 | |
|             @"application/docbook+xml" : @"dbk",
 | |
|             @"application/drafting" : @"drw",
 | |
|             @"application/dsptype" : @"tsp",
 | |
|             @"application/dssc+der" : @"dssc",
 | |
|             @"application/dssc+xml" : @"xdssc",
 | |
|             @"application/dxf" : @"dxf",
 | |
|             @"application/ecmascript" : @"js",
 | |
|             @"application/emma+xml" : @"emma",
 | |
|             @"application/envoy" : @"evy",
 | |
|             @"application/epub+zip" : @"epub",
 | |
|             @"application/excel" : @"xls",
 | |
|             @"application/exi" : @"exi",
 | |
|             @"application/font-tdpfr" : @"pfr",
 | |
|             @"application/font-woff" : @"woff",
 | |
|             @"application/fractals" : @"fif",
 | |
|             @"application/freeloader" : @"frl",
 | |
|             @"application/futuresplash" : @"spl",
 | |
|             @"application/gml+xml" : @"gml",
 | |
|             @"application/gnutar" : @"tgz",
 | |
|             @"application/gpx+xml" : @"gpx",
 | |
|             @"application/groupwise" : @"vew",
 | |
|             @"application/gxf" : @"gxf",
 | |
|             @"application/hlp" : @"hlp",
 | |
|             @"application/hta" : @"hta",
 | |
|             @"application/hyperstudio" : @"stk",
 | |
|             @"application/i-deas" : @"unv",
 | |
|             @"application/iges" : @"iges",
 | |
|             @"application/inf" : @"inf",
 | |
|             @"application/inkml+xml" : @"ink",
 | |
|             @"application/internet-property-stream" : @"acx",
 | |
|             @"application/ipfix" : @"ipfix",
 | |
|             @"application/java" : @"class",
 | |
|             @"application/java-archive" : @"jar",
 | |
|             @"application/java-byte-code" : @"class",
 | |
|             @"application/java-serialized-object" : @"ser",
 | |
|             @"application/java-vm" : @"class",
 | |
|             @"application/javascript" : @"js",
 | |
|             @"application/json" : @"json",
 | |
|             @"application/jsonml+json" : @"jsonml",
 | |
|             @"application/lha" : @"lha",
 | |
|             @"application/lost+xml" : @"lostxml",
 | |
|             @"application/lzx" : @"lzx",
 | |
|             @"application/mac-binary" : @"bin",
 | |
|             @"application/mac-binhex" : @"hqx",
 | |
|             @"application/mac-binhex40" : @"hqx",
 | |
|             @"application/mac-compactpro" : @"cpt",
 | |
|             @"application/macbinary" : @"bin",
 | |
|             @"application/mads+xml" : @"mads",
 | |
|             @"application/marc" : @"mrc",
 | |
|             @"application/marcxml+xml" : @"mrcx",
 | |
|             @"application/mathematica" : @"ma",
 | |
|             @"application/mathml+xml" : @"mathml",
 | |
|             @"application/mbedlet" : @"mbd",
 | |
|             @"application/mbox" : @"mbox",
 | |
|             @"application/mcad" : @"mcd",
 | |
|             @"application/mediaservercontrol+xml" : @"mscml",
 | |
|             @"application/metalink+xml" : @"metalink",
 | |
|             @"application/metalink4+xml" : @"meta4",
 | |
|             @"application/mets+xml" : @"mets",
 | |
|             @"application/mime" : @"aps",
 | |
|             @"application/mods+xml" : @"mods",
 | |
|             @"application/mp21" : @"m21",
 | |
|             @"application/mp4" : @"mp4",
 | |
|             @"application/mspowerpoint" : @"ppt",
 | |
|             @"application/msword" : @"doc",
 | |
|             @"application/mswrite" : @"wri",
 | |
|             @"application/mxf" : @"mxf",
 | |
|             @"application/netmc" : @"mcp",
 | |
|             @"application/octet-stream" : @"bin",
 | |
|             @"application/oda" : @"oda",
 | |
|             @"application/oebps-package+xml" : @"opf",
 | |
|             @"application/ogg" : @"oga",
 | |
|             @"application/olescript" : @"axs",
 | |
|             @"application/omdoc+xml" : @"omdoc",
 | |
|             @"application/onenote" : @"onetoc",
 | |
|             @"application/oxps" : @"oxps",
 | |
|             @"application/patch-ops-error+xml" : @"xer",
 | |
|             @"application/pdf" : @"pdf",
 | |
|             @"application/pgp-encrypted" : @"pgp",
 | |
|             @"application/pgp-signature" : @"sig",
 | |
|             @"application/pics-rules" : @"prf",
 | |
|             @"application/pkcs-12" : @"p12",
 | |
|             @"application/pkcs-crl" : @"crl",
 | |
|             @"application/pkcs10" : @"p10",
 | |
|             @"application/pkcs7-mime" : @"p7m",
 | |
|             @"application/pkcs7-signature" : @"p7s",
 | |
|             @"application/pkcs8" : @"p8",
 | |
|             @"application/pkix-attr-cert" : @"ac",
 | |
|             @"application/pkix-cert" : @"cer",
 | |
|             @"application/pkix-crl" : @"crl",
 | |
|             @"application/pkix-pkipath" : @"pkipath",
 | |
|             @"application/pkixcmp" : @"pki",
 | |
|             @"application/plain" : @"text",
 | |
|             @"application/pls+xml" : @"pls",
 | |
|             @"application/postscript" : @"ps",
 | |
|             @"application/powerpoint" : @"ppt",
 | |
|             @"application/prs.cww" : @"cww",
 | |
|             @"application/pskc+xml" : @"pskcxml",
 | |
|             @"application/rdf+xml" : @"rdf",
 | |
|             @"application/reginfo+xml" : @"rif",
 | |
|             @"application/relax-ng-compact-syntax" : @"rnc",
 | |
|             @"application/resource-lists+xml" : @"rl",
 | |
|             @"application/resource-lists-diff+xml" : @"rld",
 | |
|             @"application/ringing-tones" : @"rng",
 | |
|             @"application/rls-services+xml" : @"rs",
 | |
|             @"application/rpki-ghostbusters" : @"gbr",
 | |
|             @"application/rpki-manifest" : @"mft",
 | |
|             @"application/rpki-roa" : @"roa",
 | |
|             @"application/rsd+xml" : @"rsd",
 | |
|             @"application/rss+xml" : @"rss",
 | |
|             @"application/rtf" : @"rtf",
 | |
|             @"application/sbml+xml" : @"sbml",
 | |
|             @"application/scvp-cv-request" : @"scq",
 | |
|             @"application/scvp-cv-response" : @"scs",
 | |
|             @"application/scvp-vp-request" : @"spq",
 | |
|             @"application/scvp-vp-response" : @"spp",
 | |
|             @"application/sdp" : @"sdp",
 | |
|             @"application/sea" : @"sea",
 | |
|             @"application/set" : @"set",
 | |
|             @"application/set-payment-initiation" : @"setpay",
 | |
|             @"application/set-registration-initiation" : @"setreg",
 | |
|             @"application/shf+xml" : @"shf",
 | |
|             @"application/sla" : @"stl",
 | |
|             @"application/smil" : @"smi",
 | |
|             @"application/smil+xml" : @"smi",
 | |
|             @"application/solids" : @"sol",
 | |
|             @"application/sounder" : @"sdr",
 | |
|             @"application/sparql-query" : @"rq",
 | |
|             @"application/sparql-results+xml" : @"srx",
 | |
|             @"application/srgs" : @"gram",
 | |
|             @"application/srgs+xml" : @"grxml",
 | |
|             @"application/sru+xml" : @"sru",
 | |
|             @"application/ssdl+xml" : @"ssdl",
 | |
|             @"application/ssml+xml" : @"ssml",
 | |
|             @"application/step" : @"step",
 | |
|             @"application/streamingmedia" : @"ssm",
 | |
|             @"application/tei+xml" : @"tei",
 | |
|             @"application/thraud+xml" : @"tfi",
 | |
|             @"application/timestamped-data" : @"tsd",
 | |
|             @"application/toolbook" : @"tbk",
 | |
|             @"application/vda" : @"vda",
 | |
|             @"application/vnd.3gpp.pic-bw-large" : @"plb",
 | |
|             @"application/vnd.3gpp.pic-bw-small" : @"psb",
 | |
|             @"application/vnd.3gpp.pic-bw-var" : @"pvb",
 | |
|             @"application/vnd.3gpp2.tcap" : @"tcap",
 | |
|             @"application/vnd.3m.post-it-notes" : @"pwn",
 | |
|             @"application/vnd.accpac.simply.aso" : @"aso",
 | |
|             @"application/vnd.accpac.simply.imp" : @"imp",
 | |
|             @"application/vnd.acucobol" : @"acu",
 | |
|             @"application/vnd.acucorp" : @"atc",
 | |
|             @"application/vnd.adobe.air-application-installer-package+zip" : @"air",
 | |
|             @"application/vnd.adobe.formscentral.fcdt" : @"fcdt",
 | |
|             @"application/vnd.adobe.fxp" : @"fxp",
 | |
|             @"application/vnd.adobe.xdp+xml" : @"xdp",
 | |
|             @"application/vnd.adobe.xfdf" : @"xfdf",
 | |
|             @"application/vnd.ahead.space" : @"ahead",
 | |
|             @"application/vnd.airzip.filesecure.azf" : @"azf",
 | |
|             @"application/vnd.airzip.filesecure.azs" : @"azs",
 | |
|             @"application/vnd.amazon.ebook" : @"azw",
 | |
|             @"application/vnd.americandynamics.acc" : @"acc",
 | |
|             @"application/vnd.amiga.ami" : @"ami",
 | |
|             @"application/vnd.android.package-archive" : @"apk",
 | |
|             @"application/vnd.anser-web-certificate-issue-initiation" : @"cii",
 | |
|             @"application/vnd.anser-web-funds-transfer-initiation" : @"fti",
 | |
|             @"application/vnd.antix.game-component" : @"atx",
 | |
|             @"application/vnd.apple.installer+xml" : @"mpkg",
 | |
|             @"application/vnd.apple.mpegurl" : @"m3u8",
 | |
|             @"application/vnd.aristanetworks.swi" : @"swi",
 | |
|             @"application/vnd.astraea-software.iota" : @"iota",
 | |
|             @"application/vnd.audiograph" : @"aep",
 | |
|             @"application/vnd.blueice.multipass" : @"mpm",
 | |
|             @"application/vnd.bmi" : @"bmi",
 | |
|             @"application/vnd.businessobjects" : @"rep",
 | |
|             @"application/vnd.chemdraw+xml" : @"cdxml",
 | |
|             @"application/vnd.chipnuts.karaoke-mmd" : @"mmd",
 | |
|             @"application/vnd.cinderella" : @"cdy",
 | |
|             @"application/vnd.claymore" : @"cla",
 | |
|             @"application/vnd.cloanto.rp9" : @"rp9",
 | |
|             @"application/vnd.clonk.c4group" : @"c4g",
 | |
|             @"application/vnd.cluetrust.cartomobile-config" : @"c11amc",
 | |
|             @"application/vnd.cluetrust.cartomobile-config-pkg" : @"c11amz",
 | |
|             @"application/vnd.commonspace" : @"csp",
 | |
|             @"application/vnd.contact.cmsg" : @"cdbcmsg",
 | |
|             @"application/vnd.cosmocaller" : @"cmc",
 | |
|             @"application/vnd.crick.clicker" : @"clkx",
 | |
|             @"application/vnd.crick.clicker.keyboard" : @"clkk",
 | |
|             @"application/vnd.crick.clicker.palette" : @"clkp",
 | |
|             @"application/vnd.crick.clicker.template" : @"clkt",
 | |
|             @"application/vnd.crick.clicker.wordbank" : @"clkw",
 | |
|             @"application/vnd.criticaltools.wbs+xml" : @"wbs",
 | |
|             @"application/vnd.ctc-posml" : @"pml",
 | |
|             @"application/vnd.cups-ppd" : @"ppd",
 | |
|             @"application/vnd.curl.car" : @"car",
 | |
|             @"application/vnd.curl.pcurl" : @"pcurl",
 | |
|             @"application/vnd.dart" : @"dart",
 | |
|             @"application/vnd.data-vision.rdz" : @"rdz",
 | |
|             @"application/vnd.dece.data" : @"uvf",
 | |
|             @"application/vnd.dece.ttml+xml" : @"uvt",
 | |
|             @"application/vnd.dece.unspecified" : @"uvx",
 | |
|             @"application/vnd.dece.zip" : @"uvz",
 | |
|             @"application/vnd.denovo.fcselayout-link" : @"fe_launch",
 | |
|             @"application/vnd.dna" : @"dna",
 | |
|             @"application/vnd.dolby.mlp" : @"mlp",
 | |
|             @"application/vnd.dpgraph" : @"dpg",
 | |
|             @"application/vnd.dreamfactory" : @"dfac",
 | |
|             @"application/vnd.ds-keypoint" : @"kpxx",
 | |
|             @"application/vnd.dvb.ait" : @"ait",
 | |
|             @"application/vnd.dvb.service" : @"svc",
 | |
|             @"application/vnd.dynageo" : @"geo",
 | |
|             @"application/vnd.ecowin.chart" : @"mag",
 | |
|             @"application/vnd.enliven" : @"nml",
 | |
|             @"application/vnd.epson.esf" : @"esf",
 | |
|             @"application/vnd.epson.msf" : @"msf",
 | |
|             @"application/vnd.epson.quickanime" : @"qam",
 | |
|             @"application/vnd.epson.salt" : @"slt",
 | |
|             @"application/vnd.epson.ssf" : @"ssf",
 | |
|             @"application/vnd.eszigno3+xml" : @"es3",
 | |
|             @"application/vnd.ezpix-album" : @"ez2",
 | |
|             @"application/vnd.ezpix-package" : @"ez3",
 | |
|             @"application/vnd.fdf" : @"fdf",
 | |
|             @"application/vnd.fdsn.mseed" : @"mseed",
 | |
|             @"application/vnd.fdsn.seed" : @"seed",
 | |
|             @"application/vnd.flographit" : @"gph",
 | |
|             @"application/vnd.fluxtime.clip" : @"ftc",
 | |
|             @"application/vnd.framemaker" : @"fm",
 | |
|             @"application/vnd.frogans.fnc" : @"fnc",
 | |
|             @"application/vnd.frogans.ltf" : @"ltf",
 | |
|             @"application/vnd.fsc.weblaunch" : @"fsc",
 | |
|             @"application/vnd.fujitsu.oasys" : @"oas",
 | |
|             @"application/vnd.fujitsu.oasys2" : @"oa2",
 | |
|             @"application/vnd.fujitsu.oasys3" : @"oa3",
 | |
|             @"application/vnd.fujitsu.oasysgp" : @"fg5",
 | |
|             @"application/vnd.fujitsu.oasysprs" : @"bh2",
 | |
|             @"application/vnd.fujixerox.ddd" : @"ddd",
 | |
|             @"application/vnd.fujixerox.docuworks" : @"xdw",
 | |
|             @"application/vnd.fujixerox.docuworks.binder" : @"xbd",
 | |
|             @"application/vnd.fuzzysheet" : @"fzs",
 | |
|             @"application/vnd.genomatix.tuxedo" : @"txd",
 | |
|             @"application/vnd.geogebra.file" : @"ggb",
 | |
|             @"application/vnd.geogebra.tool" : @"ggt",
 | |
|             @"application/vnd.geometry-explorer" : @"gex",
 | |
|             @"application/vnd.geonext" : @"gxt",
 | |
|             @"application/vnd.geoplan" : @"g2w",
 | |
|             @"application/vnd.geospace" : @"g3w",
 | |
|             @"application/vnd.gmx" : @"gmx",
 | |
|             @"application/vnd.google-earth.kml+xml" : @"kml",
 | |
|             @"application/vnd.google-earth.kmz" : @"kmz",
 | |
|             @"application/vnd.grafeq" : @"gqf",
 | |
|             @"application/vnd.groove-account" : @"gac",
 | |
|             @"application/vnd.groove-help" : @"ghf",
 | |
|             @"application/vnd.groove-identity-message" : @"gim",
 | |
|             @"application/vnd.groove-injector" : @"grv",
 | |
|             @"application/vnd.groove-tool-message" : @"gtm",
 | |
|             @"application/vnd.groove-tool-template" : @"tpl",
 | |
|             @"application/vnd.groove-vcard" : @"vcg",
 | |
|             @"application/vnd.hal+xml" : @"hal",
 | |
|             @"application/vnd.handheld-entertainment+xml" : @"zmm",
 | |
|             @"application/vnd.hbci" : @"hbci",
 | |
|             @"application/vnd.hhe.lesson-player" : @"les",
 | |
|             @"application/vnd.hp-hpgl" : @"hpgl",
 | |
|             @"application/vnd.hp-hpid" : @"hpid",
 | |
|             @"application/vnd.hp-hps" : @"hps",
 | |
|             @"application/vnd.hp-jlyt" : @"jlt",
 | |
|             @"application/vnd.hp-pcl" : @"pcl",
 | |
|             @"application/vnd.hp-pclxl" : @"pclxl",
 | |
|             @"application/vnd.hydrostatix.sof-data" : @"sfd-hdstx",
 | |
|             @"application/vnd.ibm.minipay" : @"mpy",
 | |
|             @"application/vnd.ibm.modcap" : @"afp",
 | |
|             @"application/vnd.ibm.rights-management" : @"irm",
 | |
|             @"application/vnd.ibm.secure-container" : @"sc",
 | |
|             @"application/vnd.iccprofile" : @"icc",
 | |
|             @"application/vnd.igloader" : @"igl",
 | |
|             @"application/vnd.immervision-ivp" : @"ivp",
 | |
|             @"application/vnd.immervision-ivu" : @"ivu",
 | |
|             @"application/vnd.insors.igm" : @"igm",
 | |
|             @"application/vnd.intercon.formnet" : @"xpw",
 | |
|             @"application/vnd.intergeo" : @"i2g",
 | |
|             @"application/vnd.intu.qbo" : @"qbo",
 | |
|             @"application/vnd.intu.qfx" : @"qfx",
 | |
|             @"application/vnd.ipunplugged.rcprofile" : @"rcprofile",
 | |
|             @"application/vnd.irepository.package+xml" : @"irp",
 | |
|             @"application/vnd.is-xpr" : @"xpr",
 | |
|             @"application/vnd.isac.fcs" : @"fcs",
 | |
|             @"application/vnd.jam" : @"jam",
 | |
|             @"application/vnd.jcp.javame.midlet-rms" : @"rms",
 | |
|             @"application/vnd.jisp" : @"jisp",
 | |
|             @"application/vnd.joost.joda-archive" : @"joda",
 | |
|             @"application/vnd.kahootz" : @"ktz",
 | |
|             @"application/vnd.kde.karbon" : @"karbon",
 | |
|             @"application/vnd.kde.kchart" : @"chrt",
 | |
|             @"application/vnd.kde.kformula" : @"kfo",
 | |
|             @"application/vnd.kde.kivio" : @"flw",
 | |
|             @"application/vnd.kde.kontour" : @"kon",
 | |
|             @"application/vnd.kde.kpresenter" : @"kpr",
 | |
|             @"application/vnd.kde.kspread" : @"ksp",
 | |
|             @"application/vnd.kde.kword" : @"kwd",
 | |
|             @"application/vnd.kenameaapp" : @"htke",
 | |
|             @"application/vnd.kidspiration" : @"kia",
 | |
|             @"application/vnd.kinar" : @"kne",
 | |
|             @"application/vnd.koan" : @"skp",
 | |
|             @"application/vnd.kodak-descriptor" : @"sse",
 | |
|             @"application/vnd.las.las+xml" : @"lasxml",
 | |
|             @"application/vnd.llamagraphics.life-balance.desktop" : @"lbd",
 | |
|             @"application/vnd.llamagraphics.life-balance.exchange+xml" : @"lbe",
 | |
|             @"application/vnd.lotus-1-2-3" : @"123",
 | |
|             @"application/vnd.lotus-approach" : @"apr",
 | |
|             @"application/vnd.lotus-freelance" : @"pre",
 | |
|             @"application/vnd.lotus-notes" : @"nsf",
 | |
|             @"application/vnd.lotus-organizer" : @"org",
 | |
|             @"application/vnd.lotus-screencam" : @"scm",
 | |
|             @"application/vnd.lotus-wordpro" : @"lwp",
 | |
|             @"application/vnd.macports.portpkg" : @"portpkg",
 | |
|             @"application/vnd.mcd" : @"mcd",
 | |
|             @"application/vnd.medcalcdata" : @"mc1",
 | |
|             @"application/vnd.mediastation.cdkey" : @"cdkey",
 | |
|             @"application/vnd.mfer" : @"mwf",
 | |
|             @"application/vnd.mfmp" : @"mfm",
 | |
|             @"application/vnd.micrografx.flo" : @"flo",
 | |
|             @"application/vnd.micrografx.igx" : @"igx",
 | |
|             @"application/vnd.mif" : @"mif",
 | |
|             @"application/vnd.mobius.daf" : @"daf",
 | |
|             @"application/vnd.mobius.dis" : @"dis",
 | |
|             @"application/vnd.mobius.mbk" : @"mbk",
 | |
|             @"application/vnd.mobius.mqy" : @"mqy",
 | |
|             @"application/vnd.mobius.msl" : @"msl",
 | |
|             @"application/vnd.mobius.plc" : @"plc",
 | |
|             @"application/vnd.mobius.txf" : @"txf",
 | |
|             @"application/vnd.mophun.application" : @"mpn",
 | |
|             @"application/vnd.mophun.certificate" : @"mpc",
 | |
|             @"application/vnd.mozilla.xul+xml" : @"xul",
 | |
|             @"application/vnd.ms-artgalry" : @"cil",
 | |
|             @"application/vnd.ms-cab-compressed" : @"cab",
 | |
|             @"application/vnd.ms-excel" : @"xls",
 | |
|             @"application/vnd.ms-excel.addin.macroenabled.12" : @"xlam",
 | |
|             @"application/vnd.ms-excel.sheet.binary.macroenabled.12" : @"xlsb",
 | |
|             @"application/vnd.ms-excel.sheet.macroenabled.12" : @"xlsm",
 | |
|             @"application/vnd.ms-excel.template.macroenabled.12" : @"xltm",
 | |
|             @"application/vnd.ms-fontobject" : @"eot",
 | |
|             @"application/vnd.ms-htmlhelp" : @"chm",
 | |
|             @"application/vnd.ms-ims" : @"ims",
 | |
|             @"application/vnd.ms-lrm" : @"lrm",
 | |
|             @"application/vnd.ms-officetheme" : @"thmx",
 | |
|             @"application/vnd.ms-outlook" : @"msg",
 | |
|             @"application/vnd.ms-pki.certstore" : @"sst",
 | |
|             @"application/vnd.ms-pki.pko" : @"pko",
 | |
|             @"application/vnd.ms-pki.seccat" : @"cat",
 | |
|             @"application/vnd.ms-pki.stl" : @"stl",
 | |
|             @"application/vnd.ms-pkicertstore" : @"sst",
 | |
|             @"application/vnd.ms-pkiseccat" : @"cat",
 | |
|             @"application/vnd.ms-pkistl" : @"stl",
 | |
|             @"application/vnd.ms-powerpoint" : @"ppt",
 | |
|             @"application/vnd.ms-powerpoint.addin.macroenabled.12" : @"ppam",
 | |
|             @"application/vnd.ms-powerpoint.presentation.macroenabled.12" : @"pptm",
 | |
|             @"application/vnd.ms-powerpoint.slide.macroenabled.12" : @"sldm",
 | |
|             @"application/vnd.ms-powerpoint.slideshow.macroenabled.12" : @"ppsm",
 | |
|             @"application/vnd.ms-powerpoint.template.macroenabled.12" : @"potm",
 | |
|             @"application/vnd.ms-project" : @"mpp",
 | |
|             @"application/vnd.ms-word.document.macroenabled.12" : @"docm",
 | |
|             @"application/vnd.ms-word.template.macroenabled.12" : @"dotm",
 | |
|             @"application/vnd.ms-works" : @"wps",
 | |
|             @"application/vnd.ms-wpl" : @"wpl",
 | |
|             @"application/vnd.ms-xpsdocument" : @"xps",
 | |
|             @"application/vnd.mseq" : @"mseq",
 | |
|             @"application/vnd.musician" : @"mus",
 | |
|             @"application/vnd.muvee.style" : @"msty",
 | |
|             @"application/vnd.mynfc" : @"taglet",
 | |
|             @"application/vnd.neurolanguage.nlu" : @"nlu",
 | |
|             @"application/vnd.nitf" : @"ntf",
 | |
|             @"application/vnd.noblenet-directory" : @"nnd",
 | |
|             @"application/vnd.noblenet-sealer" : @"nns",
 | |
|             @"application/vnd.noblenet-web" : @"nnw",
 | |
|             @"application/vnd.nokia.configuration-message" : @"ncm",
 | |
|             @"application/vnd.nokia.n-gage.data" : @"ngdat",
 | |
|             @"application/vnd.nokia.n-gage.symbian.install" : @"n-gage",
 | |
|             @"application/vnd.nokia.radio-preset" : @"rpst",
 | |
|             @"application/vnd.nokia.radio-presets" : @"rpss",
 | |
|             @"application/vnd.nokia.ringing-tone" : @"rng",
 | |
|             @"application/vnd.novadigm.edm" : @"edm",
 | |
|             @"application/vnd.novadigm.edx" : @"edx",
 | |
|             @"application/vnd.novadigm.ext" : @"ext",
 | |
|             @"application/vnd.oasis.opendocument.chart" : @"odc",
 | |
|             @"application/vnd.oasis.opendocument.chart-template" : @"otc",
 | |
|             @"application/vnd.oasis.opendocument.database" : @"odb",
 | |
|             @"application/vnd.oasis.opendocument.formula" : @"odf",
 | |
|             @"application/vnd.oasis.opendocument.formula-template" : @"odft",
 | |
|             @"application/vnd.oasis.opendocument.graphics" : @"odg",
 | |
|             @"application/vnd.oasis.opendocument.graphics-template" : @"otg",
 | |
|             @"application/vnd.oasis.opendocument.image" : @"odi",
 | |
|             @"application/vnd.oasis.opendocument.image-template" : @"oti",
 | |
|             @"application/vnd.oasis.opendocument.presentation" : @"odp",
 | |
|             @"application/vnd.oasis.opendocument.presentation-template" : @"otp",
 | |
|             @"application/vnd.oasis.opendocument.spreadsheet" : @"ods",
 | |
|             @"application/vnd.oasis.opendocument.spreadsheet-template" : @"ots",
 | |
|             @"application/vnd.oasis.opendocument.text" : @"odt",
 | |
|             @"application/vnd.oasis.opendocument.text-master" : @"odm",
 | |
|             @"application/vnd.oasis.opendocument.text-template" : @"ott",
 | |
|             @"application/vnd.oasis.opendocument.text-web" : @"oth",
 | |
|             @"application/vnd.olpc-sugar" : @"xo",
 | |
|             @"application/vnd.oma.dd2+xml" : @"dd2",
 | |
|             @"application/vnd.openofficeorg.extension" : @"oxt",
 | |
|             @"application/vnd.openxmlformats-officedocument.presentationml.presentation" : @"pptx",
 | |
|             @"application/vnd.openxmlformats-officedocument.presentationml.slide" : @"sldx",
 | |
|             @"application/vnd.openxmlformats-officedocument.presentationml.slideshow" : @"ppsx",
 | |
|             @"application/vnd.openxmlformats-officedocument.presentationml.template" : @"potx",
 | |
|             @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" : @"xlsx",
 | |
|             @"application/vnd.openxmlformats-officedocument.spreadsheetml.template" : @"xltx",
 | |
|             @"application/vnd.openxmlformats-officedocument.wordprocessingml.document" : @"docx",
 | |
|             @"application/vnd.openxmlformats-officedocument.wordprocessingml.template" : @"dotx",
 | |
|             @"application/vnd.osgeo.mapguide.package" : @"mgp",
 | |
|             @"application/vnd.osgi.dp" : @"dp",
 | |
|             @"application/vnd.osgi.subsystem" : @"esa",
 | |
|             @"application/vnd.palm" : @"pdb",
 | |
|             @"application/vnd.pawaafile" : @"paw",
 | |
|             @"application/vnd.pg.format" : @"str",
 | |
|             @"application/vnd.pg.osasli" : @"ei6",
 | |
|             @"application/vnd.picsel" : @"efif",
 | |
|             @"application/vnd.pmi.widget" : @"wg",
 | |
|             @"application/vnd.pocketlearn" : @"plf",
 | |
|             @"application/vnd.powerbuilder6" : @"pbd",
 | |
|             @"application/vnd.previewsystems.box" : @"box",
 | |
|             @"application/vnd.proteus.magazine" : @"mgz",
 | |
|             @"application/vnd.publishare-delta-tree" : @"qps",
 | |
|             @"application/vnd.pvi.ptid1" : @"ptid",
 | |
|             @"application/vnd.quark.quarkxpress" : @"qxd",
 | |
|             @"application/vnd.realvnc.bed" : @"bed",
 | |
|             @"application/vnd.recordare.musicxml" : @"mxl",
 | |
|             @"application/vnd.recordare.musicxml+xml" : @"musicxml",
 | |
|             @"application/vnd.rig.cryptonote" : @"cryptonote",
 | |
|             @"application/vnd.rim.cod" : @"cod",
 | |
|             @"application/vnd.rn-realmedia" : @"rm",
 | |
|             @"application/vnd.rn-realmedia-vbr" : @"rmvb",
 | |
|             @"application/vnd.rn-realplayer" : @"rnx",
 | |
|             @"application/vnd.route66.link66+xml" : @"link66",
 | |
|             @"application/vnd.sailingtracker.track" : @"st",
 | |
|             @"application/vnd.seemail" : @"see",
 | |
|             @"application/vnd.sema" : @"sema",
 | |
|             @"application/vnd.semd" : @"semd",
 | |
|             @"application/vnd.semf" : @"semf",
 | |
|             @"application/vnd.shana.informed.formdata" : @"ifm",
 | |
|             @"application/vnd.shana.informed.formtemplate" : @"itp",
 | |
|             @"application/vnd.shana.informed.interchange" : @"iif",
 | |
|             @"application/vnd.shana.informed.package" : @"ipk",
 | |
|             @"application/vnd.simtech-mindmapper" : @"twd",
 | |
|             @"application/vnd.smaf" : @"mmf",
 | |
|             @"application/vnd.smart.teacher" : @"teacher",
 | |
|             @"application/vnd.solent.sdkm+xml" : @"sdkm",
 | |
|             @"application/vnd.spotfire.dxp" : @"dxp",
 | |
|             @"application/vnd.spotfire.sfs" : @"sfs",
 | |
|             @"application/vnd.stardivision.calc" : @"sdc",
 | |
|             @"application/vnd.stardivision.draw" : @"sda",
 | |
|             @"application/vnd.stardivision.impress" : @"sdd",
 | |
|             @"application/vnd.stardivision.math" : @"smf",
 | |
|             @"application/vnd.stardivision.writer" : @"sdw",
 | |
|             @"application/vnd.stardivision.writer-global" : @"sgl",
 | |
|             @"application/vnd.stepmania.package" : @"smzip",
 | |
|             @"application/vnd.stepmania.stepchart" : @"sm",
 | |
|             @"application/vnd.sun.xml.calc" : @"sxc",
 | |
|             @"application/vnd.sun.xml.calc.template" : @"stc",
 | |
|             @"application/vnd.sun.xml.draw" : @"sxd",
 | |
|             @"application/vnd.sun.xml.draw.template" : @"std",
 | |
|             @"application/vnd.sun.xml.impress" : @"sxi",
 | |
|             @"application/vnd.sun.xml.impress.template" : @"sti",
 | |
|             @"application/vnd.sun.xml.math" : @"sxm",
 | |
|             @"application/vnd.sun.xml.writer" : @"sxw",
 | |
|             @"application/vnd.sun.xml.writer.global" : @"sxg",
 | |
|             @"application/vnd.sun.xml.writer.template" : @"stw",
 | |
|             @"application/vnd.sus-calendar" : @"sus",
 | |
|             @"application/vnd.svd" : @"svd",
 | |
|             @"application/vnd.symbian.install" : @"sis",
 | |
|             @"application/vnd.syncml+xml" : @"xsm",
 | |
|             @"application/vnd.syncml.dm+wbxml" : @"bdm",
 | |
|             @"application/vnd.syncml.dm+xml" : @"xdm",
 | |
|             @"application/vnd.tao.intent-module-archive" : @"tao",
 | |
|             @"application/vnd.tcpdump.pcap" : @"pcap",
 | |
|             @"application/vnd.tmobile-livetv" : @"tmo",
 | |
|             @"application/vnd.trid.tpt" : @"tpt",
 | |
|             @"application/vnd.triscape.mxs" : @"mxs",
 | |
|             @"application/vnd.trueapp" : @"tra",
 | |
|             @"application/vnd.ufdl" : @"ufd",
 | |
|             @"application/vnd.uiq.theme" : @"utz",
 | |
|             @"application/vnd.umajin" : @"umj",
 | |
|             @"application/vnd.unity" : @"unityweb",
 | |
|             @"application/vnd.uoml+xml" : @"uoml",
 | |
|             @"application/vnd.vcx" : @"vcx",
 | |
|             @"application/vnd.visio" : @"vsd",
 | |
|             @"application/vnd.visio2013" : @"vsdx",
 | |
|             @"application/vnd.visionary" : @"vis",
 | |
|             @"application/vnd.vsf" : @"vsf",
 | |
|             @"application/vnd.wap.wbxml" : @"wbxml",
 | |
|             @"application/vnd.wap.wmlc" : @"wmlc",
 | |
|             @"application/vnd.wap.wmlscriptc" : @"wmlsc",
 | |
|             @"application/vnd.webturbo" : @"wtb",
 | |
|             @"application/vnd.wolfram.player" : @"nbp",
 | |
|             @"application/vnd.wordperfect" : @"wpd",
 | |
|             @"application/vnd.wqd" : @"wqd",
 | |
|             @"application/vnd.wt.stf" : @"stf",
 | |
|             @"application/vnd.xara" : @"xar",
 | |
|             @"application/vnd.xfdl" : @"xfdl",
 | |
|             @"application/vnd.yamaha.hv-dic" : @"hvd",
 | |
|             @"application/vnd.yamaha.hv-script" : @"hvs",
 | |
|             @"application/vnd.yamaha.hv-voice" : @"hvp",
 | |
|             @"application/vnd.yamaha.openscoreformat" : @"osf",
 | |
|             @"application/vnd.yamaha.openscoreformat.osfpvg+xml" : @"osfpvg",
 | |
|             @"application/vnd.yamaha.smaf-audio" : @"saf",
 | |
|             @"application/vnd.yamaha.smaf-phrase" : @"spf",
 | |
|             @"application/vnd.yellowriver-custom-menu" : @"cmp",
 | |
|             @"application/vnd.zul" : @"zir",
 | |
|             @"application/vnd.zzazz.deck+xml" : @"zaz",
 | |
|             @"application/vocaltec-media-desc" : @"vmd",
 | |
|             @"application/vocaltec-media-file" : @"vmf",
 | |
|             @"application/voicexml+xml" : @"vxml",
 | |
|             @"application/widget" : @"wgt",
 | |
|             @"application/winhlp" : @"hlp",
 | |
|             @"application/wordperfect" : @"wp",
 | |
|             @"application/wordperfect6.0" : @"w60",
 | |
|             @"application/wordperfect6.1" : @"w61",
 | |
|             @"application/wsdl+xml" : @"wsdl",
 | |
|             @"application/wspolicy+xml" : @"wspolicy",
 | |
|             @"application/x-123" : @"wk1",
 | |
|             @"application/x-7z-compressed" : @"7z",
 | |
|             @"application/x-abiword" : @"abw",
 | |
|             @"application/x-ace-compressed" : @"ace",
 | |
|             @"application/x-aim" : @"aim",
 | |
|             @"application/x-apple-diskimage" : @"dmg",
 | |
|             @"application/x-authorware-bin" : @"aab",
 | |
|             @"application/x-authorware-map" : @"aam",
 | |
|             @"application/x-authorware-seg" : @"aas",
 | |
|             @"application/x-bcpio" : @"bcpio",
 | |
|             @"application/x-binary" : @"bin",
 | |
|             @"application/x-binhex40" : @"hqx",
 | |
|             @"application/x-bittorrent" : @"torrent",
 | |
|             @"application/x-blorb" : @"blb",
 | |
|             @"application/x-bsh" : @"sh",
 | |
|             @"application/x-bytecode.elisp" : @"elc",
 | |
|             @"application/x-bytecode.python" : @"pyc",
 | |
|             @"application/x-bzip" : @"bz",
 | |
|             @"application/x-bzip2" : @"bz2",
 | |
|             @"application/x-cbr" : @"cbr",
 | |
|             @"application/x-cdf" : @"cdf",
 | |
|             @"application/x-cdlink" : @"vcd",
 | |
|             @"application/x-cfs-compressed" : @"cfs",
 | |
|             @"application/x-chat" : @"chat",
 | |
|             @"application/x-chess-pgn" : @"pgn",
 | |
|             @"application/x-cmu-raster" : @"ras",
 | |
|             @"application/x-cocoa" : @"cco",
 | |
|             @"application/x-compactpro" : @"cpt",
 | |
|             @"application/x-compress" : @"z",
 | |
|             @"application/x-conference" : @"nsc",
 | |
|             @"application/x-cpio" : @"cpio",
 | |
|             @"application/x-cpt" : @"cpt",
 | |
|             @"application/x-csh" : @"csh",
 | |
|             @"application/x-debian-package" : @"deb",
 | |
|             @"application/x-deepv" : @"deepv",
 | |
|             @"application/x-dgc-compressed" : @"dgc",
 | |
|             @"application/x-director" : @"dir",
 | |
|             @"application/x-doom" : @"wad",
 | |
|             @"application/x-dtbncx+xml" : @"ncx",
 | |
|             @"application/x-dtbook+xml" : @"dtb",
 | |
|             @"application/x-dtbresource+xml" : @"res",
 | |
|             @"application/x-dvi" : @"dvi",
 | |
|             @"application/x-elc" : @"elc",
 | |
|             @"application/x-envoy" : @"evy",
 | |
|             @"application/x-esrehber" : @"es",
 | |
|             @"application/x-eva" : @"eva",
 | |
|             @"application/x-excel" : @"xls",
 | |
|             @"application/x-font-bdf" : @"bdf",
 | |
|             @"application/x-font-ghostscript" : @"gsf",
 | |
|             @"application/x-font-linux-psf" : @"psf",
 | |
|             @"application/x-font-otf" : @"otf",
 | |
|             @"application/x-font-pcf" : @"pcf",
 | |
|             @"application/x-font-snf" : @"snf",
 | |
|             @"application/x-font-ttf" : @"ttf",
 | |
|             @"application/x-font-type1" : @"pfa",
 | |
|             @"application/x-font-woff" : @"woff",
 | |
|             @"application/x-frame" : @"mif",
 | |
|             @"application/x-freearc" : @"arc",
 | |
|             @"application/x-freelance" : @"pre",
 | |
|             @"application/x-futuresplash" : @"spl",
 | |
|             @"application/x-gca-compressed" : @"gca",
 | |
|             @"application/x-glulx" : @"ulx",
 | |
|             @"application/x-gnumeric" : @"gnumeric",
 | |
|             @"application/x-gramps-xml" : @"gramps",
 | |
|             @"application/x-gsp" : @"gsp",
 | |
|             @"application/x-gss" : @"gss",
 | |
|             @"application/x-gtar" : @"gtar",
 | |
|             @"application/x-gzip" : @"gz",
 | |
|             @"application/x-hdf" : @"hdf",
 | |
|             @"application/x-httpd-imap" : @"imap",
 | |
|             @"application/x-ima" : @"ima",
 | |
|             @"application/x-install-instructions" : @"install",
 | |
|             @"application/x-internett-signup" : @"ins",
 | |
|             @"application/x-inventor" : @"iv",
 | |
|             @"application/x-ip2" : @"ip",
 | |
|             @"application/x-iphone" : @"iii",
 | |
|             @"application/x-iso9660-image" : @"iso",
 | |
|             @"application/x-java-class" : @"class",
 | |
|             @"application/x-java-commerce" : @"jcm",
 | |
|             @"application/x-java-jnlp-file" : @"jnlp",
 | |
|             @"application/x-javascript" : @"js",
 | |
|             @"application/x-ksh" : @"ksh",
 | |
|             @"application/x-latex" : @"ltx",
 | |
|             @"application/x-lha" : @"lha",
 | |
|             @"application/x-lisp" : @"lsp",
 | |
|             @"application/x-livescreen" : @"ivy",
 | |
|             @"application/x-lotus" : @"wq1",
 | |
|             @"application/x-lotusscreencam" : @"scm",
 | |
|             @"application/x-lzh" : @"lzh",
 | |
|             @"application/x-lzh-compressed" : @"lzh",
 | |
|             @"application/x-lzx" : @"lzx",
 | |
|             @"application/x-mac-binhex40" : @"hqx",
 | |
|             @"application/x-macbinary" : @"bin",
 | |
|             @"application/x-magic-cap-package-1.0" : @"mc$",
 | |
|             @"application/x-mathcad" : @"mcd",
 | |
|             @"application/x-meme" : @"mm",
 | |
|             @"application/x-midi" : @"midi",
 | |
|             @"application/x-mie" : @"mie",
 | |
|             @"application/x-mif" : @"mif",
 | |
|             @"application/x-mix-transfer" : @"nix",
 | |
|             @"application/x-mobipocket-ebook" : @"prc",
 | |
|             @"application/x-mplayer2" : @"asx",
 | |
|             @"application/x-ms-application" : @"application",
 | |
|             @"application/x-ms-shortcut" : @"lnk",
 | |
|             @"application/x-ms-wmd" : @"wmd",
 | |
|             @"application/x-ms-wmz" : @"wmz",
 | |
|             @"application/x-ms-xbap" : @"xbap",
 | |
|             @"application/x-msaccess" : @"mdb",
 | |
|             @"application/x-msbinder" : @"obd",
 | |
|             @"application/x-mscardfile" : @"crd",
 | |
|             @"application/x-msclip" : @"clp",
 | |
|             @"application/x-msdownload" : @"exe",
 | |
|             @"application/x-msexcel" : @"xls",
 | |
|             @"application/x-msmediaview" : @"mvb",
 | |
|             @"application/x-msmetafile" : @"wmf",
 | |
|             @"application/x-msmoney" : @"mny",
 | |
|             @"application/x-mspowerpoint" : @"ppt",
 | |
|             @"application/x-mspublisher" : @"pub",
 | |
|             @"application/x-msschedule" : @"scd",
 | |
|             @"application/x-msterminal" : @"trm",
 | |
|             @"application/x-mswrite" : @"wri",
 | |
|             @"application/x-navi-animation" : @"ani",
 | |
|             @"application/x-navidoc" : @"nvd",
 | |
|             @"application/x-navimap" : @"map",
 | |
|             @"application/x-navistyle" : @"stl",
 | |
|             @"application/x-netcdf" : @"nc",
 | |
|             @"application/x-newton-compatible-pkg" : @"pkg",
 | |
|             @"application/x-nokia-9000-communicator-add-on-software" : @"aos",
 | |
|             @"application/x-nzb" : @"nzb",
 | |
|             @"application/x-omc" : @"omc",
 | |
|             @"application/x-omcdatamaker" : @"omcd",
 | |
|             @"application/x-omcregerator" : @"omcr",
 | |
|             @"application/x-pcl" : @"pcl",
 | |
|             @"application/x-pixclscript" : @"plx",
 | |
|             @"application/x-pkcs10" : @"p10",
 | |
|             @"application/x-pkcs12" : @"p12",
 | |
|             @"application/x-pkcs7-certificates" : @"p7b",
 | |
|             @"application/x-pkcs7-certreqresp" : @"p7r",
 | |
|             @"application/x-pkcs7-mime" : @"p7m",
 | |
|             @"application/x-pkcs7-signature" : @"p7s",
 | |
|             @"application/x-pointplus" : @"css",
 | |
|             @"application/x-portable-anymap" : @"pnm",
 | |
|             @"application/x-qpro" : @"wb1",
 | |
|             @"application/x-rar-compressed" : @"rar",
 | |
|             @"application/x-research-info-systems" : @"ris",
 | |
|             @"application/x-rtf" : @"rtf",
 | |
|             @"application/x-sdp" : @"sdp",
 | |
|             @"application/x-sea" : @"sea",
 | |
|             @"application/x-seelogo" : @"sl",
 | |
|             @"application/x-sh" : @"sh",
 | |
|             @"application/x-shar" : @"shar",
 | |
|             @"application/x-shockwave-flash" : @"swf",
 | |
|             @"application/x-silverlight-app" : @"xap",
 | |
|             @"application/x-sit" : @"sit",
 | |
|             @"application/x-sprite" : @"spr",
 | |
|             @"application/x-sql" : @"sql",
 | |
|             @"application/x-stuffit" : @"sit",
 | |
|             @"application/x-stuffitx" : @"sitx",
 | |
|             @"application/x-subrip" : @"srt",
 | |
|             @"application/x-sv4cpio" : @"sv4cpio",
 | |
|             @"application/x-sv4crc" : @"sv4crc",
 | |
|             @"application/x-t3vm-image" : @"t3",
 | |
|             @"application/x-tads" : @"gam",
 | |
|             @"application/x-tar" : @"tar",
 | |
|             @"application/x-tbook" : @"tbk",
 | |
|             @"application/x-tcl" : @"tcl",
 | |
|             @"application/x-tex" : @"tex",
 | |
|             @"application/x-tex-tfm" : @"tfm",
 | |
|             @"application/x-texinfo" : @"texinfo",
 | |
|             @"application/x-tgif" : @"obj",
 | |
|             @"application/x-troff-man" : @"man",
 | |
|             @"application/x-troff-me" : @"me",
 | |
|             @"application/x-troff-ms" : @"ms",
 | |
|             @"application/x-troff-msvideo" : @"avi",
 | |
|             @"application/x-ustar" : @"ustar",
 | |
|             @"application/x-visio" : @"vsd",
 | |
|             @"application/x-vnd.audioexplosion.mzz" : @"mzz",
 | |
|             @"application/x-vnd.ls-xpix" : @"xpix",
 | |
|             @"application/x-vrml" : @"vrml",
 | |
|             @"application/x-wais-source" : @"src",
 | |
|             @"application/x-winhelp" : @"hlp",
 | |
|             @"application/x-wintalk" : @"wtk",
 | |
|             @"application/x-wpwin" : @"wpd",
 | |
|             @"application/x-wri" : @"wri",
 | |
|             @"application/x-x509-ca-cert" : @"crt",
 | |
|             @"application/x-x509-user-cert" : @"crt",
 | |
|             @"application/x-xfig" : @"fig",
 | |
|             @"application/x-xliff+xml" : @"xlf",
 | |
|             @"application/x-xpinstall" : @"xpi",
 | |
|             @"application/x-xz" : @"xz",
 | |
|             @"application/x-zip-compressed" : @"zip",
 | |
|             @"application/x-zmachine" : @"z1",
 | |
|             @"application/xaml+xml" : @"xaml",
 | |
|             @"application/xcap-diff+xml" : @"xdf",
 | |
|             @"application/xenc+xml" : @"xenc",
 | |
|             @"application/xhtml+xml" : @"xhtml",
 | |
|             @"application/xml" : @"xml",
 | |
|             @"application/xml-dtd" : @"dtd",
 | |
|             @"application/xop+xml" : @"xop",
 | |
|             @"application/xproc+xml" : @"xpl",
 | |
|             @"application/xslt+xml" : @"xslt",
 | |
|             @"application/xspf+xml" : @"xspf",
 | |
|             @"application/xv+xml" : @"mxml",
 | |
|             @"application/yang" : @"yang",
 | |
|             @"application/yin+xml" : @"yin",
 | |
|             @"application/ynd.ms-pkipko" : @"pko",
 | |
|             OWSMimeTypeApplicationZip : @"zip",
 | |
|             @"audio/aac" : @"aac",
 | |
|             @"audio/adpcm" : @"adp",
 | |
|             @"audio/aiff" : @"aiff",
 | |
|             @"audio/basic" : @"au",
 | |
|             @"audio/it" : @"it",
 | |
|             @"audio/mid" : @"rmi",
 | |
|             @"audio/midi" : @"midi",
 | |
|             @"audio/mod" : @"mod",
 | |
|             @"audio/mp4" : @"m4a",
 | |
|             @"audio/mpeg" : @"mpg",
 | |
|             @"audio/mpeg3" : @"mp3",
 | |
|             @"audio/ogg" : @"oga",
 | |
|             @"audio/s3m" : @"s3m",
 | |
|             @"audio/silk" : @"sil",
 | |
|             @"audio/tsp-audio" : @"tsi",
 | |
|             @"audio/tsplayer" : @"tsp",
 | |
|             @"audio/vnd.dece.audio" : @"uva",
 | |
|             @"audio/vnd.digital-winds" : @"eol",
 | |
|             @"audio/vnd.dra" : @"dra",
 | |
|             @"audio/vnd.dts" : @"dts",
 | |
|             @"audio/vnd.dts.hd" : @"dtshd",
 | |
|             @"audio/vnd.lucent.voice" : @"lvp",
 | |
|             @"audio/vnd.ms-playready.media.pya" : @"pya",
 | |
|             @"audio/vnd.nuera.ecelp4800" : @"ecelp4800",
 | |
|             @"audio/vnd.nuera.ecelp7470" : @"ecelp7470",
 | |
|             @"audio/vnd.nuera.ecelp9600" : @"ecelp9600",
 | |
|             @"audio/vnd.qcelp" : @"qcp",
 | |
|             @"audio/vnd.rip" : @"rip",
 | |
|             @"audio/voc" : @"voc",
 | |
|             @"audio/voxware" : @"vox",
 | |
|             @"audio/wav" : @"wav",
 | |
|             @"audio/webm" : @"weba",
 | |
|             @"audio/x-aac" : @"aac",
 | |
|             @"audio/x-adpcm" : @"snd",
 | |
|             @"audio/x-aiff" : @"aiff",
 | |
|             @"audio/x-au" : @"au",
 | |
|             @"audio/x-caf" : @"caf",
 | |
|             @"audio/x-flac" : @"flac",
 | |
|             @"audio/x-gsm" : @"gsm",
 | |
|             @"audio/x-jam" : @"jam",
 | |
|             @"audio/x-liveaudio" : @"lam",
 | |
|             @"audio/x-matroska" : @"mka",
 | |
|             @"audio/x-mid" : @"midi",
 | |
|             @"audio/x-midi" : @"midi",
 | |
|             @"audio/x-mod" : @"mod",
 | |
|             @"audio/x-mpeg" : @"mp2",
 | |
|             @"audio/x-mpeg-3" : @"mp3",
 | |
|             @"audio/x-mpegurl" : @"m3u",
 | |
|             @"audio/x-mpequrl" : @"m3u",
 | |
|             @"audio/x-ms-wax" : @"wax",
 | |
|             @"audio/x-ms-wma" : @"wma",
 | |
|             @"audio/x-pn-realaudio" : @"ram",
 | |
|             @"audio/x-pn-realaudio-plugin" : @"rmp",
 | |
|             @"audio/x-psid" : @"sid",
 | |
|             @"audio/x-realaudio" : @"ra",
 | |
|             @"audio/x-twinvq" : @"vqf",
 | |
|             @"audio/x-vnd.audioexplosion.mjuicemediafile" : @"mjf",
 | |
|             @"audio/x-voc" : @"voc",
 | |
|             @"audio/x-wav" : @"wav",
 | |
|             @"audio/xm" : @"xm",
 | |
|             @"chemical/x-cdx" : @"cdx",
 | |
|             @"chemical/x-cif" : @"cif",
 | |
|             @"chemical/x-cmdf" : @"cmdf",
 | |
|             @"chemical/x-cml" : @"cml",
 | |
|             @"chemical/x-csml" : @"csml",
 | |
|             @"chemical/x-pdb" : @"pdb",
 | |
|             @"chemical/x-xyz" : @"xyz",
 | |
|             @"drawing/x-dwf" : @"dwf",
 | |
|             @"font/ttf" : @"ttf",
 | |
|             @"font/woff" : @"woff",
 | |
|             @"font/woff2" : @"woff2",
 | |
|             @"i-world/i-vrml" : @"ivr",
 | |
|             @"image/bmp" : @"bmp",
 | |
|             @"image/cgm" : @"cgm",
 | |
|             @"image/cis-cod" : @"cod",
 | |
|             @"image/fif" : @"fif",
 | |
|             @"image/g3fax" : @"g3",
 | |
|             @"image/gif" : @"gif",
 | |
|             @"image/heic" : @"heic",
 | |
|             @"image/heif" : @"heif",
 | |
|             @"image/ief" : @"ief",
 | |
|             @"image/jpeg" : @"jpg",
 | |
|             @"image/jutvision" : @"jut",
 | |
|             @"image/ktx" : @"ktx",
 | |
|             @"image/pict" : @"pict",
 | |
|             @"image/pjpeg" : @"jpg",
 | |
|             @"image/png" : @"png",
 | |
|             @"image/prs.btif" : @"btif",
 | |
|             @"image/sgi" : @"sgi",
 | |
|             @"image/svg+xml" : @"svg",
 | |
|             @"image/tiff" : @"tiff",
 | |
|             @"image/vasa" : @"mcf",
 | |
|             @"image/vnd.adobe.photoshop" : @"psd",
 | |
|             @"image/vnd.dece.graphic" : @"uvi",
 | |
|             @"image/vnd.djvu" : @"djvu",
 | |
|             @"image/vnd.dvb.subtitle" : @"sub",
 | |
|             @"image/vnd.dwg" : @"dwg",
 | |
|             @"image/vnd.dxf" : @"dxf",
 | |
|             @"image/vnd.fastbidsheet" : @"fbs",
 | |
|             @"image/vnd.fpx" : @"fpx",
 | |
|             @"image/vnd.fst" : @"fst",
 | |
|             @"image/vnd.fujixerox.edmics-mmr" : @"mmr",
 | |
|             @"image/vnd.fujixerox.edmics-rlc" : @"rlc",
 | |
|             @"image/vnd.ms-modi" : @"mdi",
 | |
|             @"image/vnd.ms-photo" : @"wdp",
 | |
|             @"image/vnd.net-fpx" : @"fpx",
 | |
|             @"image/vnd.rn-realflash" : @"rf",
 | |
|             @"image/vnd.rn-realpix" : @"rp",
 | |
|             @"image/vnd.wap.wbmp" : @"wbmp",
 | |
|             @"image/vnd.xiff" : @"xif",
 | |
|             @"image/webp" : @"webp",
 | |
|             @"image/x-3ds" : @"3ds",
 | |
|             @"image/x-citrix-jpeg" : @"jpg",
 | |
|             @"image/x-citrix-png" : @"png",
 | |
|             @"image/x-cmu-raster" : @"ras",
 | |
|             @"image/x-cmx" : @"cmx",
 | |
|             @"image/x-dwg" : @"dwg",
 | |
|             @"image/x-freehand" : @"fh",
 | |
|             @"image/x-icon" : @"ico",
 | |
|             @"image/x-jg" : @"art",
 | |
|             @"image/x-jps" : @"jps",
 | |
|             @"image/x-mrsid-image" : @"sid",
 | |
|             @"image/x-niff" : @"niff",
 | |
|             @"image/x-pcx" : @"pcx",
 | |
|             @"image/x-pict" : @"pic",
 | |
|             @"image/x-png" : @"png",
 | |
|             @"image/x-portable-anymap" : @"pnm",
 | |
|             @"image/x-portable-bitmap" : @"pbm",
 | |
|             @"image/x-portable-graymap" : @"pgm",
 | |
|             @"image/x-portable-greymap" : @"pgm",
 | |
|             @"image/x-portable-pixmap" : @"ppm",
 | |
|             @"image/x-rgb" : @"rgb",
 | |
|             @"image/x-tga" : @"tga",
 | |
|             @"image/x-tiff" : @"tiff",
 | |
|             @"image/x-windows-bmp" : @"bmp",
 | |
|             @"image/x-xbitmap" : @"xbm",
 | |
|             @"image/x-xbm" : @"xbm",
 | |
|             @"image/x-xpixmap" : @"xpm",
 | |
|             @"image/x-xwd" : @"xwd",
 | |
|             @"image/x-xwindowdump" : @"xwd",
 | |
|             @"image/xbm" : @"xbm",
 | |
|             @"image/xpm" : @"xpm",
 | |
|             @"message/rfc822" : @"eml",
 | |
|             @"model/iges" : @"iges",
 | |
|             @"model/mesh" : @"msh",
 | |
|             @"model/vnd.collada+xml" : @"dae",
 | |
|             @"model/vnd.dwf" : @"dwf",
 | |
|             @"model/vnd.gdl" : @"gdl",
 | |
|             @"model/vnd.gtw" : @"gtw",
 | |
|             @"model/vnd.mts" : @"mts",
 | |
|             @"model/vnd.vtu" : @"vtu",
 | |
|             @"model/vrml" : @"vrml",
 | |
|             @"model/x-pov" : @"pov",
 | |
|             @"model/x3d+binary" : @"x3db",
 | |
|             @"model/x3d+vrml" : @"x3dv",
 | |
|             @"model/x3d+xml" : @"x3d",
 | |
|             @"multipart/x-gzip" : @"gzip",
 | |
|             @"multipart/x-ustar" : @"ustar",
 | |
|             @"multipart/x-zip" : @"zip",
 | |
|             @"music/x-karaoke" : @"kar",
 | |
|             @"paleovu/x-pv" : @"pvu",
 | |
|             @"text/asp" : @"asp",
 | |
|             @"text/cache-manifest" : @"appcache",
 | |
|             @"text/calendar" : @"ics",
 | |
|             @"text/css" : @"css",
 | |
|             @"text/csv" : @"csv",
 | |
|             @"text/ecmascript" : @"js",
 | |
|             @"text/h323" : @"323",
 | |
|             @"text/html" : @"html",
 | |
|             @"text/iuls" : @"uls",
 | |
|             @"text/java" : @"java",
 | |
|             @"text/javascript" : @"js",
 | |
|             @"text/mcf" : @"mcf",
 | |
|             @"text/n3" : @"n3",
 | |
|             @"text/pascal" : @"pas",
 | |
|             @"text/plain" : @"txt",
 | |
|             @"text/plain-bas" : @"par",
 | |
|             @"text/prs.lines.logTag" : @"dsc",
 | |
|             @"text/richtext" : @"rtf",
 | |
|             @"text/scriplet" : @"wsc",
 | |
|             @"text/scriptlet" : @"sct",
 | |
|             @"text/sgml" : @"sgml",
 | |
|             @"text/tab-separated-values" : @"tsv",
 | |
|             @"text/troff" : @"t",
 | |
|             @"text/turtle" : @"ttl",
 | |
|             @"text/uri-list" : @"uri",
 | |
|             @"text/vcard" : @"vcard",
 | |
|             @"text/vnd.abc" : @"abc",
 | |
|             @"text/vnd.curl" : @"curl",
 | |
|             @"text/vnd.curl.dcurl" : @"dcurl",
 | |
|             @"text/vnd.curl.mcurl" : @"mcurl",
 | |
|             @"text/vnd.curl.scurl" : @"scurl",
 | |
|             @"text/vnd.dvb.subtitle" : @"sub",
 | |
|             @"text/vnd.fly" : @"fly",
 | |
|             @"text/vnd.fmi.flexstor" : @"flx",
 | |
|             @"text/vnd.graphviz" : @"gv",
 | |
|             @"text/vnd.in3d.3dml" : @"3dml",
 | |
|             @"text/vnd.in3d.spot" : @"spot",
 | |
|             @"text/vnd.rn-realtext" : @"rt",
 | |
|             @"text/vnd.sun.j2me.app-descriptor" : @"jad",
 | |
|             @"text/vnd.wap.wml" : @"wml",
 | |
|             @"text/vnd.wap.wmlscript" : @"wmls",
 | |
|             @"text/webviewhtml" : @"htt",
 | |
|             @"text/x-asm" : @"asm",
 | |
|             @"text/x-audiosoft-intra" : @"aip",
 | |
|             @"text/x-c" : @"c",
 | |
|             @"text/x-component" : @"htc",
 | |
|             @"text/x-fortran" : @"f",
 | |
|             @"text/x-h" : @"h",
 | |
|             @"text/x-java-source" : @"java",
 | |
|             @"text/x-la-asf" : @"lsx",
 | |
|             @"text/x-m" : @"m",
 | |
|             @"text/x-nfo" : @"nfo",
 | |
|             @"text/x-opml" : @"opml",
 | |
|             @"text/x-pascal" : @"p",
 | |
|             @"text/x-script" : @"hlb",
 | |
|             @"text/x-script.csh" : @"csh",
 | |
|             @"text/x-script.elisp" : @"el",
 | |
|             @"text/x-script.guile" : @"scm",
 | |
|             @"text/x-script.ksh" : @"ksh",
 | |
|             @"text/x-script.lisp" : @"lsp",
 | |
|             @"text/x-script.perl" : @"pl",
 | |
|             @"text/x-script.perl-module" : @"pm",
 | |
|             @"text/x-script.phyton" : @"py",
 | |
|             @"text/x-script.rexx" : @"rexx",
 | |
|             @"text/x-script.scheme" : @"scm",
 | |
|             @"text/x-script.sh" : @"sh",
 | |
|             @"text/x-script.tcl" : @"tcl",
 | |
|             @"text/x-script.tcsh" : @"tcsh",
 | |
|             @"text/x-script.zsh" : @"zsh",
 | |
|             @"text/x-setext" : @"etx",
 | |
|             @"text/x-sfv" : @"sfv",
 | |
|             @"text/x-sgml" : @"sgml",
 | |
|             @"text/x-uil" : @"uil",
 | |
|             @"text/x-uuencode" : @"uu",
 | |
|             @"text/x-vcalendar" : @"vcs",
 | |
|             @"text/x-vcard" : @"vcf",
 | |
|             @"text/xml" : @"xml",
 | |
|             @"text/yaml" : @"yaml",
 | |
|             @"video/3gpp" : @"3gp",
 | |
|             @"video/3gpp2" : @"3g2",
 | |
|             @"video/animaflex" : @"afl",
 | |
|             @"video/avi" : @"avi",
 | |
|             @"video/avs-video" : @"avs",
 | |
|             @"video/dl" : @"dl",
 | |
|             @"video/fli" : @"fli",
 | |
|             @"video/gl" : @"gl",
 | |
|             @"video/h261" : @"h261",
 | |
|             @"video/h263" : @"h263",
 | |
|             @"video/h264" : @"h264",
 | |
|             @"video/jpeg" : @"jpgv",
 | |
|             @"video/jpm" : @"jpm",
 | |
|             @"video/mj2" : @"mj2",
 | |
|             @"video/mp4" : @"mp4",
 | |
|             @"video/mpeg" : @"mpg",
 | |
|             @"video/msvideo" : @"avi",
 | |
|             @"video/ogg" : @"ogv",
 | |
|             @"video/quicktime" : @"mov",
 | |
|             @"video/vdo" : @"vdo",
 | |
|             @"video/vnd.dece.hd" : @"uvh",
 | |
|             @"video/vnd.dece.mobile" : @"uvm",
 | |
|             @"video/vnd.dece.pd" : @"uvp",
 | |
|             @"video/vnd.dece.sd" : @"uvs",
 | |
|             @"video/vnd.dece.video" : @"uvv",
 | |
|             @"video/vnd.dvb.file" : @"dvb",
 | |
|             @"video/vnd.fvt" : @"fvt",
 | |
|             @"video/vnd.mpegurl" : @"mxu",
 | |
|             @"video/vnd.ms-playready.media.pyv" : @"pyv",
 | |
|             @"video/vnd.rn-realvideo" : @"rv",
 | |
|             @"video/vnd.uvvu.mp4" : @"uvu",
 | |
|             @"video/vnd.vivo" : @"viv",
 | |
|             @"video/vosaic" : @"vos",
 | |
|             @"video/webm" : @"webm",
 | |
|             @"video/x-amt-demorun" : @"xdr",
 | |
|             @"video/x-amt-showrun" : @"xsr",
 | |
|             @"video/x-atomic3d-feature" : @"fmf",
 | |
|             @"video/x-dl" : @"dl",
 | |
|             @"video/x-dv" : @"dv",
 | |
|             @"video/x-f4v" : @"f4v",
 | |
|             @"video/x-fli" : @"fli",
 | |
|             @"video/x-flv" : @"flv",
 | |
|             @"video/x-gl" : @"gl",
 | |
|             @"video/x-isvideo" : @"isu",
 | |
|             @"video/x-la-asf" : @"lsf",
 | |
|             @"video/x-m4v" : @"m4v",
 | |
|             @"video/x-matroska" : @"mkv",
 | |
|             @"video/x-mng" : @"mng",
 | |
|             @"video/x-motion-jpeg" : @"mjpg",
 | |
|             @"video/x-mpeg" : @"mpg",
 | |
|             @"video/x-mpeq2a" : @"mp2",
 | |
|             @"video/x-ms-asf" : @"asf",
 | |
|             @"video/x-ms-asf-plugin" : @"asx",
 | |
|             @"video/x-ms-vob" : @"vob",
 | |
|             @"video/x-ms-wm" : @"wm",
 | |
|             @"video/x-ms-wmv" : @"wmv",
 | |
|             @"video/x-ms-wmx" : @"wmx",
 | |
|             @"video/x-ms-wvx" : @"wvx",
 | |
|             @"video/x-msvideo" : @"avi",
 | |
|             @"video/x-qtc" : @"qtc",
 | |
|             @"video/x-scm" : @"scm",
 | |
|             @"video/x-sgi-movie" : @"movie",
 | |
|             @"video/x-smv" : @"smv",
 | |
|             @"windows/metafile" : @"wmf",
 | |
|             @"www/mime" : @"mime",
 | |
|             @"x-conference/x-cooltalk" : @"ice",
 | |
|             @"x-music/x-midi" : @"midi",
 | |
|             @"x-world/x-3dmf" : @"3dmf",
 | |
|             @"x-world/x-svr" : @"svr",
 | |
|             @"x-world/x-vrml" : @"vrml",
 | |
|             @"x-world/x-vrt" : @"vrt",
 | |
|             @"xgl/drawing" : @"xgz",
 | |
|             @"xgl/movie" : @"xmz",
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)mimeTypeForFileExtension:(NSString *)fileExtension
 | |
| {
 | |
|     return [self genericExtensionTypesToMIMETypes][fileExtension];
 | |
| }
 | |
| 
 | |
| + (NSDictionary *)genericExtensionTypesToMIMETypes
 | |
| {
 | |
|     static NSDictionary *result = nil;
 | |
|     static dispatch_once_t onceToken;
 | |
|     dispatch_once(&onceToken, ^{
 | |
|         result = @{
 | |
|             @"123" : @"application/vnd.lotus-1-2-3",
 | |
|             @"3dml" : @"text/vnd.in3d.3dml",
 | |
|             @"3ds" : @"image/x-3ds",
 | |
|             @"3g2" : @"video/3gpp2",
 | |
|             @"3gp" : @"video/3gpp",
 | |
|             @"7z" : @"application/x-7z-compressed",
 | |
|             @"aab" : @"application/x-authorware-bin",
 | |
|             @"aac" : @"audio/x-aac",
 | |
|             @"aam" : @"application/x-authorware-map",
 | |
|             @"aas" : @"application/x-authorware-seg",
 | |
|             @"abw" : @"application/x-abiword",
 | |
|             @"ac" : @"application/pkix-attr-cert",
 | |
|             @"acc" : @"application/vnd.americandynamics.acc",
 | |
|             @"ace" : @"application/x-ace-compressed",
 | |
|             @"acu" : @"application/vnd.acucobol",
 | |
|             @"acutc" : @"application/vnd.acucorp",
 | |
|             @"adp" : @"audio/adpcm",
 | |
|             @"aep" : @"application/vnd.audiograph",
 | |
|             @"afm" : @"application/x-font-type1",
 | |
|             @"afp" : @"application/vnd.ibm.modcap",
 | |
|             @"ahead" : @"application/vnd.ahead.space",
 | |
|             @"ai" : @"application/postscript",
 | |
|             @"aif" : @"audio/x-aiff",
 | |
|             @"aifc" : @"audio/x-aiff",
 | |
|             @"aiff" : @"audio/x-aiff",
 | |
|             @"air" : @"application/vnd.adobe.air-application-installer-package+zip",
 | |
|             @"ait" : @"application/vnd.dvb.ait",
 | |
|             @"ami" : @"application/vnd.amiga.ami",
 | |
|             @"apk" : @"application/vnd.android.package-archive",
 | |
|             @"appcache" : @"text/cache-manifest",
 | |
|             @"application" : @"application/x-ms-application",
 | |
|             @"apr" : @"application/vnd.lotus-approach",
 | |
|             @"arc" : @"application/x-freearc",
 | |
|             @"asc" : @"application/pgp-signature",
 | |
|             @"asf" : @"video/x-ms-asf",
 | |
|             @"asm" : @"text/x-asm",
 | |
|             @"aso" : @"application/vnd.accpac.simply.aso",
 | |
|             @"asx" : @"video/x-ms-asf",
 | |
|             @"atc" : @"application/vnd.acucorp",
 | |
|             @"atom" : @"application/atom+xml",
 | |
|             @"atomcat" : @"application/atomcat+xml",
 | |
|             @"atomsvc" : @"application/atomsvc+xml",
 | |
|             @"atx" : @"application/vnd.antix.game-component",
 | |
|             @"au" : @"audio/basic",
 | |
|             @"avi" : @"video/x-msvideo",
 | |
|             @"aw" : @"application/applixware",
 | |
|             @"azf" : @"application/vnd.airzip.filesecure.azf",
 | |
|             @"azs" : @"application/vnd.airzip.filesecure.azs",
 | |
|             @"azw" : @"application/vnd.amazon.ebook",
 | |
|             @"bat" : @"application/x-msdownload",
 | |
|             @"bcpio" : @"application/x-bcpio",
 | |
|             @"bdf" : @"application/x-font-bdf",
 | |
|             @"bdm" : @"application/vnd.syncml.dm+wbxml",
 | |
|             @"bed" : @"application/vnd.realvnc.bed",
 | |
|             @"bh2" : @"application/vnd.fujitsu.oasysprs",
 | |
|             @"bin" : @"application/octet-stream",
 | |
|             @"blb" : @"application/x-blorb",
 | |
|             @"blorb" : @"application/x-blorb",
 | |
|             @"bmi" : @"application/vnd.bmi",
 | |
|             @"bmp" : @"image/bmp",
 | |
|             @"book" : @"application/vnd.framemaker",
 | |
|             @"box" : @"application/vnd.previewsystems.box",
 | |
|             @"boz" : @"application/x-bzip2",
 | |
|             @"bpk" : @"application/octet-stream",
 | |
|             @"btif" : @"image/prs.btif",
 | |
|             @"bz" : @"application/x-bzip",
 | |
|             @"bz2" : @"application/x-bzip2",
 | |
|             @"c" : @"text/x-c",
 | |
|             @"c11amc" : @"application/vnd.cluetrust.cartomobile-config",
 | |
|             @"c11amz" : @"application/vnd.cluetrust.cartomobile-config-pkg",
 | |
|             @"c4d" : @"application/vnd.clonk.c4group",
 | |
|             @"c4f" : @"application/vnd.clonk.c4group",
 | |
|             @"c4g" : @"application/vnd.clonk.c4group",
 | |
|             @"c4p" : @"application/vnd.clonk.c4group",
 | |
|             @"c4u" : @"application/vnd.clonk.c4group",
 | |
|             @"cab" : @"application/vnd.ms-cab-compressed",
 | |
|             @"caf" : @"audio/x-caf",
 | |
|             @"cap" : @"application/vnd.tcpdump.pcap",
 | |
|             @"car" : @"application/vnd.curl.car",
 | |
|             @"cat" : @"application/vnd.ms-pki.seccat",
 | |
|             @"cb7" : @"application/x-cbr",
 | |
|             @"cba" : @"application/x-cbr",
 | |
|             @"cbr" : @"application/x-cbr",
 | |
|             @"cbt" : @"application/x-cbr",
 | |
|             @"cbz" : @"application/x-cbr",
 | |
|             @"cc" : @"text/x-c",
 | |
|             @"cct" : @"application/x-director",
 | |
|             @"ccxml" : @"application/ccxml+xml",
 | |
|             @"cdbcmsg" : @"application/vnd.contact.cmsg",
 | |
|             @"cdf" : @"application/x-netcdf",
 | |
|             @"cdkey" : @"application/vnd.mediastation.cdkey",
 | |
|             @"cdmia" : @"application/cdmi-capability",
 | |
|             @"cdmic" : @"application/cdmi-container",
 | |
|             @"cdmid" : @"application/cdmi-domain",
 | |
|             @"cdmio" : @"application/cdmi-object",
 | |
|             @"cdmiq" : @"application/cdmi-queue",
 | |
|             @"cdx" : @"chemical/x-cdx",
 | |
|             @"cdxml" : @"application/vnd.chemdraw+xml",
 | |
|             @"cdy" : @"application/vnd.cinderella",
 | |
|             @"cer" : @"application/pkix-cert",
 | |
|             @"cfs" : @"application/x-cfs-compressed",
 | |
|             @"cgm" : @"image/cgm",
 | |
|             @"chat" : @"application/x-chat",
 | |
|             @"chm" : @"application/vnd.ms-htmlhelp",
 | |
|             @"chrt" : @"application/vnd.kde.kchart",
 | |
|             @"cif" : @"chemical/x-cif",
 | |
|             @"cii" : @"application/vnd.anser-web-certificate-issue-initiation",
 | |
|             @"cil" : @"application/vnd.ms-artgalry",
 | |
|             @"cla" : @"application/vnd.claymore",
 | |
|             @"class" : @"application/java-vm",
 | |
|             @"clkk" : @"application/vnd.crick.clicker.keyboard",
 | |
|             @"clkp" : @"application/vnd.crick.clicker.palette",
 | |
|             @"clkt" : @"application/vnd.crick.clicker.template",
 | |
|             @"clkw" : @"application/vnd.crick.clicker.wordbank",
 | |
|             @"clkx" : @"application/vnd.crick.clicker",
 | |
|             @"clp" : @"application/x-msclip",
 | |
|             @"cmc" : @"application/vnd.cosmocaller",
 | |
|             @"cmdf" : @"chemical/x-cmdf",
 | |
|             @"cml" : @"chemical/x-cml",
 | |
|             @"cmp" : @"application/vnd.yellowriver-custom-menu",
 | |
|             @"cmx" : @"image/x-cmx",
 | |
|             @"cod" : @"application/vnd.rim.cod",
 | |
|             @"com" : @"application/x-msdownload",
 | |
|             @"conf" : @"text/plain",
 | |
|             @"cpio" : @"application/x-cpio",
 | |
|             @"cpp" : @"text/x-c",
 | |
|             @"cpt" : @"application/mac-compactpro",
 | |
|             @"crd" : @"application/x-mscardfile",
 | |
|             @"crl" : @"application/pkix-crl",
 | |
|             @"crt" : @"application/x-x509-ca-cert",
 | |
|             @"cryptonote" : @"application/vnd.rig.cryptonote",
 | |
|             @"csh" : @"application/x-csh",
 | |
|             @"csml" : @"chemical/x-csml",
 | |
|             @"csp" : @"application/vnd.commonspace",
 | |
|             @"css" : @"text/css",
 | |
|             @"cst" : @"application/x-director",
 | |
|             @"csv" : @"text/csv",
 | |
|             @"cu" : @"application/cu-seeme",
 | |
|             @"curl" : @"text/vnd.curl",
 | |
|             @"cww" : @"application/prs.cww",
 | |
|             @"cxt" : @"application/x-director",
 | |
|             @"cxx" : @"text/x-c",
 | |
|             @"dae" : @"model/vnd.collada+xml",
 | |
|             @"daf" : @"application/vnd.mobius.daf",
 | |
|             @"dart" : @"application/vnd.dart",
 | |
|             @"dataless" : @"application/vnd.fdsn.seed",
 | |
|             @"davmount" : @"application/davmount+xml",
 | |
|             @"dbk" : @"application/docbook+xml",
 | |
|             @"dcr" : @"application/x-director",
 | |
|             @"dcurl" : @"text/vnd.curl.dcurl",
 | |
|             @"dd2" : @"application/vnd.oma.dd2+xml",
 | |
|             @"ddd" : @"application/vnd.fujixerox.ddd",
 | |
|             @"deb" : @"application/x-debian-package",
 | |
|             @"def" : @"text/plain",
 | |
|             @"deploy" : @"application/octet-stream",
 | |
|             @"der" : @"application/x-x509-ca-cert",
 | |
|             @"dfac" : @"application/vnd.dreamfactory",
 | |
|             @"dgc" : @"application/x-dgc-compressed",
 | |
|             @"dic" : @"text/x-c",
 | |
|             @"dir" : @"application/x-director",
 | |
|             @"dis" : @"application/vnd.mobius.dis",
 | |
|             @"dist" : @"application/octet-stream",
 | |
|             @"distz" : @"application/octet-stream",
 | |
|             @"djv" : @"image/vnd.djvu",
 | |
|             @"djvu" : @"image/vnd.djvu",
 | |
|             @"dll" : @"application/x-msdownload",
 | |
|             @"dmg" : @"application/x-apple-diskimage",
 | |
|             @"dmp" : @"application/vnd.tcpdump.pcap",
 | |
|             @"dms" : @"application/octet-stream",
 | |
|             @"dna" : @"application/vnd.dna",
 | |
|             @"doc" : @"application/msword",
 | |
|             @"docm" : @"application/vnd.ms-word.document.macroenabled.12",
 | |
|             @"docx" : @"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
 | |
|             @"dot" : @"application/msword",
 | |
|             @"dotm" : @"application/vnd.ms-word.template.macroenabled.12",
 | |
|             @"dotx" : @"application/vnd.openxmlformats-officedocument.wordprocessingml.template",
 | |
|             @"dp" : @"application/vnd.osgi.dp",
 | |
|             @"dpg" : @"application/vnd.dpgraph",
 | |
|             @"dra" : @"audio/vnd.dra",
 | |
|             @"dsc" : @"text/prs.lines.logTag",
 | |
|             @"dssc" : @"application/dssc+der",
 | |
|             @"dtb" : @"application/x-dtbook+xml",
 | |
|             @"dtd" : @"application/xml-dtd",
 | |
|             @"dts" : @"audio/vnd.dts",
 | |
|             @"dtshd" : @"audio/vnd.dts.hd",
 | |
|             @"dump" : @"application/octet-stream",
 | |
|             @"dvb" : @"video/vnd.dvb.file",
 | |
|             @"dvi" : @"application/x-dvi",
 | |
|             @"dwf" : @"model/vnd.dwf",
 | |
|             @"dwg" : @"image/vnd.dwg",
 | |
|             @"dxf" : @"image/vnd.dxf",
 | |
|             @"dxp" : @"application/vnd.spotfire.dxp",
 | |
|             @"dxr" : @"application/x-director",
 | |
|             @"ecelp4800" : @"audio/vnd.nuera.ecelp4800",
 | |
|             @"ecelp7470" : @"audio/vnd.nuera.ecelp7470",
 | |
|             @"ecelp9600" : @"audio/vnd.nuera.ecelp9600",
 | |
|             @"ecma" : @"application/ecmascript",
 | |
|             @"edm" : @"application/vnd.novadigm.edm",
 | |
|             @"edx" : @"application/vnd.novadigm.edx",
 | |
|             @"efif" : @"application/vnd.picsel",
 | |
|             @"ei6" : @"application/vnd.pg.osasli",
 | |
|             @"elc" : @"application/octet-stream",
 | |
|             @"emf" : @"application/x-msmetafile",
 | |
|             @"eml" : @"message/rfc822",
 | |
|             @"emma" : @"application/emma+xml",
 | |
|             @"emz" : @"application/x-msmetafile",
 | |
|             @"eol" : @"audio/vnd.digital-winds",
 | |
|             @"eot" : @"application/vnd.ms-fontobject",
 | |
|             @"eps" : @"application/postscript",
 | |
|             @"epub" : @"application/epub+zip",
 | |
|             @"es3" : @"application/vnd.eszigno3+xml",
 | |
|             @"esa" : @"application/vnd.osgi.subsystem",
 | |
|             @"esf" : @"application/vnd.epson.esf",
 | |
|             @"et3" : @"application/vnd.eszigno3+xml",
 | |
|             @"etx" : @"text/x-setext",
 | |
|             @"eva" : @"application/x-eva",
 | |
|             @"evy" : @"application/x-envoy",
 | |
|             @"exe" : @"application/x-msdownload",
 | |
|             @"exi" : @"application/exi",
 | |
|             @"ext" : @"application/vnd.novadigm.ext",
 | |
|             @"ez" : @"application/andrew-inset",
 | |
|             @"ez2" : @"application/vnd.ezpix-album",
 | |
|             @"ez3" : @"application/vnd.ezpix-package",
 | |
|             @"f" : @"text/x-fortran",
 | |
|             @"f4v" : @"video/x-f4v",
 | |
|             @"f77" : @"text/x-fortran",
 | |
|             @"f90" : @"text/x-fortran",
 | |
|             @"fbs" : @"image/vnd.fastbidsheet",
 | |
|             @"fcdt" : @"application/vnd.adobe.formscentral.fcdt",
 | |
|             @"fcs" : @"application/vnd.isac.fcs",
 | |
|             @"fdf" : @"application/vnd.fdf",
 | |
|             @"fe_launch" : @"application/vnd.denovo.fcselayout-link",
 | |
|             @"fg5" : @"application/vnd.fujitsu.oasysgp",
 | |
|             @"fgd" : @"application/x-director",
 | |
|             @"fh" : @"image/x-freehand",
 | |
|             @"fh4" : @"image/x-freehand",
 | |
|             @"fh5" : @"image/x-freehand",
 | |
|             @"fh7" : @"image/x-freehand",
 | |
|             @"fhc" : @"image/x-freehand",
 | |
|             @"fig" : @"application/x-xfig",
 | |
|             @"flac" : @"audio/x-flac",
 | |
|             @"fli" : @"video/x-fli",
 | |
|             @"flo" : @"application/vnd.micrografx.flo",
 | |
|             @"flv" : @"video/x-flv",
 | |
|             @"flw" : @"application/vnd.kde.kivio",
 | |
|             @"flx" : @"text/vnd.fmi.flexstor",
 | |
|             @"fly" : @"text/vnd.fly",
 | |
|             @"fm" : @"application/vnd.framemaker",
 | |
|             @"fnc" : @"application/vnd.frogans.fnc",
 | |
|             @"for" : @"text/x-fortran",
 | |
|             @"fpx" : @"image/vnd.fpx",
 | |
|             @"frame" : @"application/vnd.framemaker",
 | |
|             @"fsc" : @"application/vnd.fsc.weblaunch",
 | |
|             @"fst" : @"image/vnd.fst",
 | |
|             @"ftc" : @"application/vnd.fluxtime.clip",
 | |
|             @"fti" : @"application/vnd.anser-web-funds-transfer-initiation",
 | |
|             @"fvt" : @"video/vnd.fvt",
 | |
|             @"fxp" : @"application/vnd.adobe.fxp",
 | |
|             @"fxpl" : @"application/vnd.adobe.fxp",
 | |
|             @"fzs" : @"application/vnd.fuzzysheet",
 | |
|             @"g2w" : @"application/vnd.geoplan",
 | |
|             @"g3" : @"image/g3fax",
 | |
|             @"g3w" : @"application/vnd.geospace",
 | |
|             @"gac" : @"application/vnd.groove-account",
 | |
|             @"gam" : @"application/x-tads",
 | |
|             @"gbr" : @"application/rpki-ghostbusters",
 | |
|             @"gca" : @"application/x-gca-compressed",
 | |
|             @"gdl" : @"model/vnd.gdl",
 | |
|             @"geo" : @"application/vnd.dynageo",
 | |
|             @"gex" : @"application/vnd.geometry-explorer",
 | |
|             @"ggb" : @"application/vnd.geogebra.file",
 | |
|             @"ggt" : @"application/vnd.geogebra.tool",
 | |
|             @"ghf" : @"application/vnd.groove-help",
 | |
|             @"gif" : @"image/gif",
 | |
|             @"gim" : @"application/vnd.groove-identity-message",
 | |
|             @"gml" : @"application/gml+xml",
 | |
|             @"gmx" : @"application/vnd.gmx",
 | |
|             @"gnumeric" : @"application/x-gnumeric",
 | |
|             @"gph" : @"application/vnd.flographit",
 | |
|             @"gpx" : @"application/gpx+xml",
 | |
|             @"gqf" : @"application/vnd.grafeq",
 | |
|             @"gqs" : @"application/vnd.grafeq",
 | |
|             @"gram" : @"application/srgs",
 | |
|             @"gramps" : @"application/x-gramps-xml",
 | |
|             @"gre" : @"application/vnd.geometry-explorer",
 | |
|             @"grv" : @"application/vnd.groove-injector",
 | |
|             @"grxml" : @"application/srgs+xml",
 | |
|             @"gsf" : @"application/x-font-ghostscript",
 | |
|             @"gtar" : @"application/x-gtar",
 | |
|             @"gtm" : @"application/vnd.groove-tool-message",
 | |
|             @"gtw" : @"model/vnd.gtw",
 | |
|             @"gv" : @"text/vnd.graphviz",
 | |
|             @"gxf" : @"application/gxf",
 | |
|             @"gxt" : @"application/vnd.geonext",
 | |
|             @"h" : @"text/x-c",
 | |
|             @"h261" : @"video/h261",
 | |
|             @"h263" : @"video/h263",
 | |
|             @"h264" : @"video/h264",
 | |
|             @"hal" : @"application/vnd.hal+xml",
 | |
|             @"hbci" : @"application/vnd.hbci",
 | |
|             @"hdf" : @"application/x-hdf",
 | |
|             @"heic" : @"image/heic",
 | |
|             @"heif" : @"image/heif",
 | |
|             @"hh" : @"text/x-c",
 | |
|             @"hlp" : @"application/winhlp",
 | |
|             @"hpgl" : @"application/vnd.hp-hpgl",
 | |
|             @"hpid" : @"application/vnd.hp-hpid",
 | |
|             @"hps" : @"application/vnd.hp-hps",
 | |
|             @"hqx" : @"application/mac-binhex40",
 | |
|             @"htke" : @"application/vnd.kenameaapp",
 | |
|             @"htm" : @"text/html",
 | |
|             @"html" : @"text/html",
 | |
|             @"hvd" : @"application/vnd.yamaha.hv-dic",
 | |
|             @"hvp" : @"application/vnd.yamaha.hv-voice",
 | |
|             @"hvs" : @"application/vnd.yamaha.hv-script",
 | |
|             @"i2g" : @"application/vnd.intergeo",
 | |
|             @"icc" : @"application/vnd.iccprofile",
 | |
|             @"ice" : @"x-conference/x-cooltalk",
 | |
|             @"icm" : @"application/vnd.iccprofile",
 | |
|             @"ico" : @"image/x-icon",
 | |
|             @"ics" : @"text/calendar",
 | |
|             @"ief" : @"image/ief",
 | |
|             @"ifb" : @"text/calendar",
 | |
|             @"ifm" : @"application/vnd.shana.informed.formdata",
 | |
|             @"iges" : @"model/iges",
 | |
|             @"igl" : @"application/vnd.igloader",
 | |
|             @"igm" : @"application/vnd.insors.igm",
 | |
|             @"igs" : @"model/iges",
 | |
|             @"igx" : @"application/vnd.micrografx.igx",
 | |
|             @"iif" : @"application/vnd.shana.informed.interchange",
 | |
|             @"imp" : @"application/vnd.accpac.simply.imp",
 | |
|             @"ims" : @"application/vnd.ms-ims",
 | |
|             @"in" : @"text/plain",
 | |
|             @"ink" : @"application/inkml+xml",
 | |
|             @"inkml" : @"application/inkml+xml",
 | |
|             @"install" : @"application/x-install-instructions",
 | |
|             @"iota" : @"application/vnd.astraea-software.iota",
 | |
|             @"ipfix" : @"application/ipfix",
 | |
|             @"ipk" : @"application/vnd.shana.informed.package",
 | |
|             @"irm" : @"application/vnd.ibm.rights-management",
 | |
|             @"irp" : @"application/vnd.irepository.package+xml",
 | |
|             @"iso" : @"application/x-iso9660-image",
 | |
|             @"itp" : @"application/vnd.shana.informed.formtemplate",
 | |
|             @"ivp" : @"application/vnd.immervision-ivp",
 | |
|             @"ivu" : @"application/vnd.immervision-ivu",
 | |
|             @"jad" : @"text/vnd.sun.j2me.app-descriptor",
 | |
|             @"jam" : @"application/vnd.jam",
 | |
|             @"jar" : @"application/java-archive",
 | |
|             @"java" : @"text/x-java-source",
 | |
|             @"jisp" : @"application/vnd.jisp",
 | |
|             @"jlt" : @"application/vnd.hp-jlyt",
 | |
|             @"jnlp" : @"application/x-java-jnlp-file",
 | |
|             @"joda" : @"application/vnd.joost.joda-archive",
 | |
|             @"jpe" : @"image/jpeg",
 | |
|             @"jpeg" : @"image/jpeg",
 | |
|             @"jpg" : @"image/jpeg",
 | |
|             @"jpgm" : @"video/jpm",
 | |
|             @"jpgv" : @"video/jpeg",
 | |
|             @"jpm" : @"video/jpm",
 | |
|             @"js" : @"application/javascript",
 | |
|             @"json" : @"application/json",
 | |
|             @"jsonml" : @"application/jsonml+json",
 | |
|             @"kar" : @"audio/midi",
 | |
|             @"karbon" : @"application/vnd.kde.karbon",
 | |
|             @"kfo" : @"application/vnd.kde.kformula",
 | |
|             @"kia" : @"application/vnd.kidspiration",
 | |
|             @"kml" : @"application/vnd.google-earth.kml+xml",
 | |
|             @"kmz" : @"application/vnd.google-earth.kmz",
 | |
|             @"kne" : @"application/vnd.kinar",
 | |
|             @"knp" : @"application/vnd.kinar",
 | |
|             @"kon" : @"application/vnd.kde.kontour",
 | |
|             @"kpr" : @"application/vnd.kde.kpresenter",
 | |
|             @"kpt" : @"application/vnd.kde.kpresenter",
 | |
|             @"kpxx" : @"application/vnd.ds-keypoint",
 | |
|             @"ksp" : @"application/vnd.kde.kspread",
 | |
|             @"ktr" : @"application/vnd.kahootz",
 | |
|             @"ktx" : @"image/ktx",
 | |
|             @"ktz" : @"application/vnd.kahootz",
 | |
|             @"kwd" : @"application/vnd.kde.kword",
 | |
|             @"kwt" : @"application/vnd.kde.kword",
 | |
|             @"lasxml" : @"application/vnd.las.las+xml",
 | |
|             @"latex" : @"application/x-latex",
 | |
|             @"lbd" : @"application/vnd.llamagraphics.life-balance.desktop",
 | |
|             @"lbe" : @"application/vnd.llamagraphics.life-balance.exchange+xml",
 | |
|             @"les" : @"application/vnd.hhe.lesson-player",
 | |
|             @"lha" : @"application/x-lzh-compressed",
 | |
|             @"link66" : @"application/vnd.route66.link66+xml",
 | |
|             @"list" : @"text/plain",
 | |
|             @"list3820" : @"application/vnd.ibm.modcap",
 | |
|             @"listafp" : @"application/vnd.ibm.modcap",
 | |
|             @"lnk" : @"application/x-ms-shortcut",
 | |
|             @"log" : @"text/plain",
 | |
|             @"lostxml" : @"application/lost+xml",
 | |
|             @"lrf" : @"application/octet-stream",
 | |
|             @"lrm" : @"application/vnd.ms-lrm",
 | |
|             @"ltf" : @"application/vnd.frogans.ltf",
 | |
|             @"lvp" : @"audio/vnd.lucent.voice",
 | |
|             @"lwp" : @"application/vnd.lotus-wordpro",
 | |
|             @"lzh" : @"application/x-lzh-compressed",
 | |
|             @"m13" : @"application/x-msmediaview",
 | |
|             @"m14" : @"application/x-msmediaview",
 | |
|             @"m1v" : @"video/mpeg",
 | |
|             @"m21" : @"application/mp21",
 | |
|             @"m2a" : @"audio/mpeg",
 | |
|             @"m2v" : @"video/mpeg",
 | |
|             @"m3a" : @"audio/mpeg",
 | |
|             @"m3u" : @"audio/x-mpegurl",
 | |
|             @"m3u8" : @"application/vnd.apple.mpegurl",
 | |
|             @"m4a" : @"audio/mp4",
 | |
|             @"m4u" : @"video/vnd.mpegurl",
 | |
|             @"m4v" : @"video/x-m4v",
 | |
|             @"ma" : @"application/mathematica",
 | |
|             @"mads" : @"application/mads+xml",
 | |
|             @"mag" : @"application/vnd.ecowin.chart",
 | |
|             @"maker" : @"application/vnd.framemaker",
 | |
|             @"man" : @"text/troff",
 | |
|             @"mar" : @"application/octet-stream",
 | |
|             @"mathml" : @"application/mathml+xml",
 | |
|             @"mb" : @"application/mathematica",
 | |
|             @"mbk" : @"application/vnd.mobius.mbk",
 | |
|             @"mbox" : @"application/mbox",
 | |
|             @"mc1" : @"application/vnd.medcalcdata",
 | |
|             @"mcd" : @"application/vnd.mcd",
 | |
|             @"mcurl" : @"text/vnd.curl.mcurl",
 | |
|             @"mdb" : @"application/x-msaccess",
 | |
|             @"mdi" : @"image/vnd.ms-modi",
 | |
|             @"me" : @"text/troff",
 | |
|             @"mesh" : @"model/mesh",
 | |
|             @"meta4" : @"application/metalink4+xml",
 | |
|             @"metalink" : @"application/metalink+xml",
 | |
|             @"mets" : @"application/mets+xml",
 | |
|             @"mfm" : @"application/vnd.mfmp",
 | |
|             @"mft" : @"application/rpki-manifest",
 | |
|             @"mgp" : @"application/vnd.osgeo.mapguide.package",
 | |
|             @"mgz" : @"application/vnd.proteus.magazine",
 | |
|             @"mid" : @"audio/midi",
 | |
|             @"midi" : @"audio/midi",
 | |
|             @"mie" : @"application/x-mie",
 | |
|             @"mif" : @"application/vnd.mif",
 | |
|             @"mime" : @"message/rfc822",
 | |
|             @"mj2" : @"video/mj2",
 | |
|             @"mjp2" : @"video/mj2",
 | |
|             @"mk3d" : @"video/x-matroska",
 | |
|             @"mka" : @"audio/x-matroska",
 | |
|             @"mks" : @"video/x-matroska",
 | |
|             @"mkv" : @"video/x-matroska",
 | |
|             @"mlp" : @"application/vnd.dolby.mlp",
 | |
|             @"mmd" : @"application/vnd.chipnuts.karaoke-mmd",
 | |
|             @"mmf" : @"application/vnd.smaf",
 | |
|             @"mmr" : @"image/vnd.fujixerox.edmics-mmr",
 | |
|             @"mng" : @"video/x-mng",
 | |
|             @"mny" : @"application/x-msmoney",
 | |
|             @"mobi" : @"application/x-mobipocket-ebook",
 | |
|             @"mods" : @"application/mods+xml",
 | |
|             @"mov" : @"video/quicktime",
 | |
|             @"movie" : @"video/x-sgi-movie",
 | |
|             @"mp2" : @"audio/mpeg",
 | |
|             @"mp21" : @"application/mp21",
 | |
|             @"mp2a" : @"audio/mpeg",
 | |
|             @"mp3" : @"audio/mpeg",
 | |
|             @"mp4" : @"video/mp4",
 | |
|             @"mp4a" : @"audio/mp4",
 | |
|             @"mp4s" : @"application/mp4",
 | |
|             @"mp4v" : @"video/mp4",
 | |
|             @"mpc" : @"application/vnd.mophun.certificate",
 | |
|             @"mpe" : @"video/mpeg",
 | |
|             @"mpeg" : @"video/mpeg",
 | |
|             @"mpg" : @"video/mpeg",
 | |
|             @"mpg4" : @"video/mp4",
 | |
|             @"mpga" : @"audio/mpeg",
 | |
|             @"mpkg" : @"application/vnd.apple.installer+xml",
 | |
|             @"mpm" : @"application/vnd.blueice.multipass",
 | |
|             @"mpn" : @"application/vnd.mophun.application",
 | |
|             @"mpp" : @"application/vnd.ms-project",
 | |
|             @"mpt" : @"application/vnd.ms-project",
 | |
|             @"mpy" : @"application/vnd.ibm.minipay",
 | |
|             @"mqy" : @"application/vnd.mobius.mqy",
 | |
|             @"mrc" : @"application/marc",
 | |
|             @"mrcx" : @"application/marcxml+xml",
 | |
|             @"ms" : @"text/troff",
 | |
|             @"mscml" : @"application/mediaservercontrol+xml",
 | |
|             @"mseed" : @"application/vnd.fdsn.mseed",
 | |
|             @"mseq" : @"application/vnd.mseq",
 | |
|             @"msf" : @"application/vnd.epson.msf",
 | |
|             @"msh" : @"model/mesh",
 | |
|             @"msi" : @"application/x-msdownload",
 | |
|             @"msl" : @"application/vnd.mobius.msl",
 | |
|             @"msty" : @"application/vnd.muvee.style",
 | |
|             @"mts" : @"model/vnd.mts",
 | |
|             @"mus" : @"application/vnd.musician",
 | |
|             @"musicxml" : @"application/vnd.recordare.musicxml+xml",
 | |
|             @"mvb" : @"application/x-msmediaview",
 | |
|             @"mwf" : @"application/vnd.mfer",
 | |
|             @"mxf" : @"application/mxf",
 | |
|             @"mxl" : @"application/vnd.recordare.musicxml",
 | |
|             @"mxml" : @"application/xv+xml",
 | |
|             @"mxs" : @"application/vnd.triscape.mxs",
 | |
|             @"mxu" : @"video/vnd.mpegurl",
 | |
|             @"n-gage" : @"application/vnd.nokia.n-gage.symbian.install",
 | |
|             @"n3" : @"text/n3",
 | |
|             @"nb" : @"application/mathematica",
 | |
|             @"nbp" : @"application/vnd.wolfram.player",
 | |
|             @"nc" : @"application/x-netcdf",
 | |
|             @"ncx" : @"application/x-dtbncx+xml",
 | |
|             @"nfo" : @"text/x-nfo",
 | |
|             @"ngdat" : @"application/vnd.nokia.n-gage.data",
 | |
|             @"nitf" : @"application/vnd.nitf",
 | |
|             @"nlu" : @"application/vnd.neurolanguage.nlu",
 | |
|             @"nml" : @"application/vnd.enliven",
 | |
|             @"nnd" : @"application/vnd.noblenet-directory",
 | |
|             @"nns" : @"application/vnd.noblenet-sealer",
 | |
|             @"nnw" : @"application/vnd.noblenet-web",
 | |
|             @"npx" : @"image/vnd.net-fpx",
 | |
|             @"nsc" : @"application/x-conference",
 | |
|             @"nsf" : @"application/vnd.lotus-notes",
 | |
|             @"ntf" : @"application/vnd.nitf",
 | |
|             @"nzb" : @"application/x-nzb",
 | |
|             @"oa2" : @"application/vnd.fujitsu.oasys2",
 | |
|             @"oa3" : @"application/vnd.fujitsu.oasys3",
 | |
|             @"oas" : @"application/vnd.fujitsu.oasys",
 | |
|             @"obd" : @"application/x-msbinder",
 | |
|             @"obj" : @"application/x-tgif",
 | |
|             @"oda" : @"application/oda",
 | |
|             @"odb" : @"application/vnd.oasis.opendocument.database",
 | |
|             @"odc" : @"application/vnd.oasis.opendocument.chart",
 | |
|             @"odf" : @"application/vnd.oasis.opendocument.formula",
 | |
|             @"odft" : @"application/vnd.oasis.opendocument.formula-template",
 | |
|             @"odg" : @"application/vnd.oasis.opendocument.graphics",
 | |
|             @"odi" : @"application/vnd.oasis.opendocument.image",
 | |
|             @"odm" : @"application/vnd.oasis.opendocument.text-master",
 | |
|             @"odp" : @"application/vnd.oasis.opendocument.presentation",
 | |
|             @"ods" : @"application/vnd.oasis.opendocument.spreadsheet",
 | |
|             @"odt" : @"application/vnd.oasis.opendocument.text",
 | |
|             @"oga" : @"audio/ogg",
 | |
|             @"ogg" : @"audio/ogg",
 | |
|             @"ogv" : @"video/ogg",
 | |
|             @"ogx" : @"application/ogg",
 | |
|             @"omdoc" : @"application/omdoc+xml",
 | |
|             @"onepkg" : @"application/onenote",
 | |
|             @"onetmp" : @"application/onenote",
 | |
|             @"onetoc" : @"application/onenote",
 | |
|             @"onetoc2" : @"application/onenote",
 | |
|             @"opf" : @"application/oebps-package+xml",
 | |
|             @"opml" : @"text/x-opml",
 | |
|             @"oprc" : @"application/vnd.palm",
 | |
|             @"org" : @"application/vnd.lotus-organizer",
 | |
|             @"osf" : @"application/vnd.yamaha.openscoreformat",
 | |
|             @"osfpvg" : @"application/vnd.yamaha.openscoreformat.osfpvg+xml",
 | |
|             @"otc" : @"application/vnd.oasis.opendocument.chart-template",
 | |
|             @"otf" : @"application/x-font-otf",
 | |
|             @"otg" : @"application/vnd.oasis.opendocument.graphics-template",
 | |
|             @"oth" : @"application/vnd.oasis.opendocument.text-web",
 | |
|             @"oti" : @"application/vnd.oasis.opendocument.image-template",
 | |
|             @"otp" : @"application/vnd.oasis.opendocument.presentation-template",
 | |
|             @"ots" : @"application/vnd.oasis.opendocument.spreadsheet-template",
 | |
|             @"ott" : @"application/vnd.oasis.opendocument.text-template",
 | |
|             @"oxps" : @"application/oxps",
 | |
|             @"oxt" : @"application/vnd.openofficeorg.extension",
 | |
|             @"p" : @"text/x-pascal",
 | |
|             @"p10" : @"application/pkcs10",
 | |
|             @"p12" : @"application/x-pkcs12",
 | |
|             @"p7b" : @"application/x-pkcs7-certificates",
 | |
|             @"p7c" : @"application/pkcs7-mime",
 | |
|             @"p7m" : @"application/pkcs7-mime",
 | |
|             @"p7r" : @"application/x-pkcs7-certreqresp",
 | |
|             @"p7s" : @"application/pkcs7-signature",
 | |
|             @"p8" : @"application/pkcs8",
 | |
|             @"pas" : @"text/x-pascal",
 | |
|             @"paw" : @"application/vnd.pawaafile",
 | |
|             @"pbd" : @"application/vnd.powerbuilder6",
 | |
|             @"pbm" : @"image/x-portable-bitmap",
 | |
|             @"pcap" : @"application/vnd.tcpdump.pcap",
 | |
|             @"pcf" : @"application/x-font-pcf",
 | |
|             @"pcl" : @"application/vnd.hp-pcl",
 | |
|             @"pclxl" : @"application/vnd.hp-pclxl",
 | |
|             @"pct" : @"image/x-pict",
 | |
|             @"pcurl" : @"application/vnd.curl.pcurl",
 | |
|             @"pcx" : @"image/x-pcx",
 | |
|             @"pdb" : @"application/vnd.palm",
 | |
|             @"pdf" : @"application/pdf",
 | |
|             @"pfa" : @"application/x-font-type1",
 | |
|             @"pfb" : @"application/x-font-type1",
 | |
|             @"pfm" : @"application/x-font-type1",
 | |
|             @"pfr" : @"application/font-tdpfr",
 | |
|             @"pfx" : @"application/x-pkcs12",
 | |
|             @"pgm" : @"image/x-portable-graymap",
 | |
|             @"pgn" : @"application/x-chess-pgn",
 | |
|             @"pgp" : @"application/pgp-encrypted",
 | |
|             @"pic" : @"image/x-pict",
 | |
|             @"pkg" : @"application/octet-stream",
 | |
|             @"pki" : @"application/pkixcmp",
 | |
|             @"pkipath" : @"application/pkix-pkipath",
 | |
|             @"plb" : @"application/vnd.3gpp.pic-bw-large",
 | |
|             @"plc" : @"application/vnd.mobius.plc",
 | |
|             @"plf" : @"application/vnd.pocketlearn",
 | |
|             @"pls" : @"application/pls+xml",
 | |
|             @"pml" : @"application/vnd.ctc-posml",
 | |
|             @"png" : @"image/png",
 | |
|             @"pnm" : @"image/x-portable-anymap",
 | |
|             @"portpkg" : @"application/vnd.macports.portpkg",
 | |
|             @"pot" : @"application/vnd.ms-powerpoint",
 | |
|             @"potm" : @"application/vnd.ms-powerpoint.template.macroenabled.12",
 | |
|             @"potx" : @"application/vnd.openxmlformats-officedocument.presentationml.template",
 | |
|             @"ppam" : @"application/vnd.ms-powerpoint.addin.macroenabled.12",
 | |
|             @"ppd" : @"application/vnd.cups-ppd",
 | |
|             @"ppm" : @"image/x-portable-pixmap",
 | |
|             @"pps" : @"application/vnd.ms-powerpoint",
 | |
|             @"ppsm" : @"application/vnd.ms-powerpoint.slideshow.macroenabled.12",
 | |
|             @"ppsx" : @"application/vnd.openxmlformats-officedocument.presentationml.slideshow",
 | |
|             @"ppt" : @"application/vnd.ms-powerpoint",
 | |
|             @"pptm" : @"application/vnd.ms-powerpoint.presentation.macroenabled.12",
 | |
|             @"pptx" : @"application/vnd.openxmlformats-officedocument.presentationml.presentation",
 | |
|             @"pqa" : @"application/vnd.palm",
 | |
|             @"prc" : @"application/x-mobipocket-ebook",
 | |
|             @"pre" : @"application/vnd.lotus-freelance",
 | |
|             @"prf" : @"application/pics-rules",
 | |
|             @"ps" : @"application/postscript",
 | |
|             @"psb" : @"application/vnd.3gpp.pic-bw-small",
 | |
|             @"psd" : @"image/vnd.adobe.photoshop",
 | |
|             @"psf" : @"application/x-font-linux-psf",
 | |
|             @"pskcxml" : @"application/pskc+xml",
 | |
|             @"ptid" : @"application/vnd.pvi.ptid1",
 | |
|             @"pub" : @"application/x-mspublisher",
 | |
|             @"pvb" : @"application/vnd.3gpp.pic-bw-var",
 | |
|             @"pwn" : @"application/vnd.3m.post-it-notes",
 | |
|             @"pya" : @"audio/vnd.ms-playready.media.pya",
 | |
|             @"pyv" : @"video/vnd.ms-playready.media.pyv",
 | |
|             @"qam" : @"application/vnd.epson.quickanime",
 | |
|             @"qbo" : @"application/vnd.intu.qbo",
 | |
|             @"qfx" : @"application/vnd.intu.qfx",
 | |
|             @"qps" : @"application/vnd.publishare-delta-tree",
 | |
|             @"qt" : @"video/quicktime",
 | |
|             @"qwd" : @"application/vnd.quark.quarkxpress",
 | |
|             @"qwt" : @"application/vnd.quark.quarkxpress",
 | |
|             @"qxb" : @"application/vnd.quark.quarkxpress",
 | |
|             @"qxd" : @"application/vnd.quark.quarkxpress",
 | |
|             @"qxl" : @"application/vnd.quark.quarkxpress",
 | |
|             @"qxt" : @"application/vnd.quark.quarkxpress",
 | |
|             @"ra" : @"audio/x-pn-realaudio",
 | |
|             @"ram" : @"audio/x-pn-realaudio",
 | |
|             @"rar" : @"application/x-rar-compressed",
 | |
|             @"ras" : @"image/x-cmu-raster",
 | |
|             @"rcprofile" : @"application/vnd.ipunplugged.rcprofile",
 | |
|             @"rdf" : @"application/rdf+xml",
 | |
|             @"rdz" : @"application/vnd.data-vision.rdz",
 | |
|             @"rep" : @"application/vnd.businessobjects",
 | |
|             @"res" : @"application/x-dtbresource+xml",
 | |
|             @"rgb" : @"image/x-rgb",
 | |
|             @"rif" : @"application/reginfo+xml",
 | |
|             @"rip" : @"audio/vnd.rip",
 | |
|             @"ris" : @"application/x-research-info-systems",
 | |
|             @"rl" : @"application/resource-lists+xml",
 | |
|             @"rlc" : @"image/vnd.fujixerox.edmics-rlc",
 | |
|             @"rld" : @"application/resource-lists-diff+xml",
 | |
|             @"rm" : @"application/vnd.rn-realmedia",
 | |
|             @"rmi" : @"audio/midi",
 | |
|             @"rmp" : @"audio/x-pn-realaudio-plugin",
 | |
|             @"rms" : @"application/vnd.jcp.javame.midlet-rms",
 | |
|             @"rmvb" : @"application/vnd.rn-realmedia-vbr",
 | |
|             @"rnc" : @"application/relax-ng-compact-syntax",
 | |
|             @"roa" : @"application/rpki-roa",
 | |
|             @"roff" : @"text/troff",
 | |
|             @"rp9" : @"application/vnd.cloanto.rp9",
 | |
|             @"rpss" : @"application/vnd.nokia.radio-presets",
 | |
|             @"rpst" : @"application/vnd.nokia.radio-preset",
 | |
|             @"rq" : @"application/sparql-query",
 | |
|             @"rs" : @"application/rls-services+xml",
 | |
|             @"rsd" : @"application/rsd+xml",
 | |
|             @"rss" : @"application/rss+xml",
 | |
|             @"rtf" : @"application/rtf",
 | |
|             @"rtx" : @"text/richtext",
 | |
|             @"s" : @"text/x-asm",
 | |
|             @"s3m" : @"audio/s3m",
 | |
|             @"saf" : @"application/vnd.yamaha.smaf-audio",
 | |
|             @"sbml" : @"application/sbml+xml",
 | |
|             @"sc" : @"application/vnd.ibm.secure-container",
 | |
|             @"scd" : @"application/x-msschedule",
 | |
|             @"scm" : @"application/vnd.lotus-screencam",
 | |
|             @"scq" : @"application/scvp-cv-request",
 | |
|             @"scs" : @"application/scvp-cv-response",
 | |
|             @"scurl" : @"text/vnd.curl.scurl",
 | |
|             @"sda" : @"application/vnd.stardivision.draw",
 | |
|             @"sdc" : @"application/vnd.stardivision.calc",
 | |
|             @"sdd" : @"application/vnd.stardivision.impress",
 | |
|             @"sdkd" : @"application/vnd.solent.sdkm+xml",
 | |
|             @"sdkm" : @"application/vnd.solent.sdkm+xml",
 | |
|             @"sdp" : @"application/sdp",
 | |
|             @"sdw" : @"application/vnd.stardivision.writer",
 | |
|             @"see" : @"application/vnd.seemail",
 | |
|             @"seed" : @"application/vnd.fdsn.seed",
 | |
|             @"sema" : @"application/vnd.sema",
 | |
|             @"semd" : @"application/vnd.semd",
 | |
|             @"semf" : @"application/vnd.semf",
 | |
|             @"ser" : @"application/java-serialized-object",
 | |
|             @"setpay" : @"application/set-payment-initiation",
 | |
|             @"setreg" : @"application/set-registration-initiation",
 | |
|             @"sfd-hdstx" : @"application/vnd.hydrostatix.sof-data",
 | |
|             @"sfs" : @"application/vnd.spotfire.sfs",
 | |
|             @"sfv" : @"text/x-sfv",
 | |
|             @"sgi" : @"image/sgi",
 | |
|             @"sgl" : @"application/vnd.stardivision.writer-global",
 | |
|             @"sgm" : @"text/sgml",
 | |
|             @"sgml" : @"text/sgml",
 | |
|             @"sh" : @"application/x-sh",
 | |
|             @"shar" : @"application/x-shar",
 | |
|             @"shf" : @"application/shf+xml",
 | |
|             @"sid" : @"image/x-mrsid-image",
 | |
|             @"sig" : @"application/pgp-signature",
 | |
|             @"sil" : @"audio/silk",
 | |
|             @"silo" : @"model/mesh",
 | |
|             @"sis" : @"application/vnd.symbian.install",
 | |
|             @"sisx" : @"application/vnd.symbian.install",
 | |
|             @"sit" : @"application/x-stuffit",
 | |
|             @"sitx" : @"application/x-stuffitx",
 | |
|             @"skd" : @"application/vnd.koan",
 | |
|             @"skm" : @"application/vnd.koan",
 | |
|             @"skp" : @"application/vnd.koan",
 | |
|             @"skt" : @"application/vnd.koan",
 | |
|             @"sldm" : @"application/vnd.ms-powerpoint.slide.macroenabled.12",
 | |
|             @"sldx" : @"application/vnd.openxmlformats-officedocument.presentationml.slide",
 | |
|             @"slt" : @"application/vnd.epson.salt",
 | |
|             @"sm" : @"application/vnd.stepmania.stepchart",
 | |
|             @"smf" : @"application/vnd.stardivision.math",
 | |
|             @"smi" : @"application/smil+xml",
 | |
|             @"smil" : @"application/smil+xml",
 | |
|             @"smv" : @"video/x-smv",
 | |
|             @"smzip" : @"application/vnd.stepmania.package",
 | |
|             @"snd" : @"audio/basic",
 | |
|             @"snf" : @"application/x-font-snf",
 | |
|             @"so" : @"application/octet-stream",
 | |
|             @"spc" : @"application/x-pkcs7-certificates",
 | |
|             @"spf" : @"application/vnd.yamaha.smaf-phrase",
 | |
|             @"spl" : @"application/x-futuresplash",
 | |
|             @"spot" : @"text/vnd.in3d.spot",
 | |
|             @"spp" : @"application/scvp-vp-response",
 | |
|             @"spq" : @"application/scvp-vp-request",
 | |
|             @"spx" : @"audio/ogg",
 | |
|             @"sql" : @"application/x-sql",
 | |
|             @"src" : @"application/x-wais-source",
 | |
|             @"srt" : @"application/x-subrip",
 | |
|             @"sru" : @"application/sru+xml",
 | |
|             @"srx" : @"application/sparql-results+xml",
 | |
|             @"ssdl" : @"application/ssdl+xml",
 | |
|             @"sse" : @"application/vnd.kodak-descriptor",
 | |
|             @"ssf" : @"application/vnd.epson.ssf",
 | |
|             @"ssml" : @"application/ssml+xml",
 | |
|             @"st" : @"application/vnd.sailingtracker.track",
 | |
|             @"stc" : @"application/vnd.sun.xml.calc.template",
 | |
|             @"std" : @"application/vnd.sun.xml.draw.template",
 | |
|             @"stf" : @"application/vnd.wt.stf",
 | |
|             @"sti" : @"application/vnd.sun.xml.impress.template",
 | |
|             @"stk" : @"application/hyperstudio",
 | |
|             @"stl" : @"application/vnd.ms-pki.stl",
 | |
|             @"str" : @"application/vnd.pg.format",
 | |
|             @"stw" : @"application/vnd.sun.xml.writer.template",
 | |
|             @"sub" : @"text/vnd.dvb.subtitle",
 | |
|             @"sus" : @"application/vnd.sus-calendar",
 | |
|             @"susp" : @"application/vnd.sus-calendar",
 | |
|             @"sv4cpio" : @"application/x-sv4cpio",
 | |
|             @"sv4crc" : @"application/x-sv4crc",
 | |
|             @"svc" : @"application/vnd.dvb.service",
 | |
|             @"svd" : @"application/vnd.svd",
 | |
|             @"svg" : @"image/svg+xml",
 | |
|             @"svgz" : @"image/svg+xml",
 | |
|             @"swa" : @"application/x-director",
 | |
|             @"swf" : @"application/x-shockwave-flash",
 | |
|             @"swi" : @"application/vnd.aristanetworks.swi",
 | |
|             @"sxc" : @"application/vnd.sun.xml.calc",
 | |
|             @"sxd" : @"application/vnd.sun.xml.draw",
 | |
|             @"sxg" : @"application/vnd.sun.xml.writer.global",
 | |
|             @"sxi" : @"application/vnd.sun.xml.impress",
 | |
|             @"sxm" : @"application/vnd.sun.xml.math",
 | |
|             @"sxw" : @"application/vnd.sun.xml.writer",
 | |
|             @"t" : @"text/troff",
 | |
|             @"t3" : @"application/x-t3vm-image",
 | |
|             @"taglet" : @"application/vnd.mynfc",
 | |
|             @"tao" : @"application/vnd.tao.intent-module-archive",
 | |
|             @"tar" : @"application/x-tar",
 | |
|             @"tcap" : @"application/vnd.3gpp2.tcap",
 | |
|             @"tcl" : @"application/x-tcl",
 | |
|             @"teacher" : @"application/vnd.smart.teacher",
 | |
|             @"tei" : @"application/tei+xml",
 | |
|             @"teicorpus" : @"application/tei+xml",
 | |
|             @"tex" : @"application/x-tex",
 | |
|             @"texi" : @"application/x-texinfo",
 | |
|             @"texinfo" : @"application/x-texinfo",
 | |
|             @"text" : @"text/plain",
 | |
|             @"tfi" : @"application/thraud+xml",
 | |
|             @"tfm" : @"application/x-tex-tfm",
 | |
|             @"tga" : @"image/x-tga",
 | |
|             @"thmx" : @"application/vnd.ms-officetheme",
 | |
|             @"tif" : @"image/tiff",
 | |
|             @"tiff" : @"image/tiff",
 | |
|             @"tmo" : @"application/vnd.tmobile-livetv",
 | |
|             @"torrent" : @"application/x-bittorrent",
 | |
|             @"tpl" : @"application/vnd.groove-tool-template",
 | |
|             @"tpt" : @"application/vnd.trid.tpt",
 | |
|             @"tr" : @"text/troff",
 | |
|             @"tra" : @"application/vnd.trueapp",
 | |
|             @"trm" : @"application/x-msterminal",
 | |
|             @"tsd" : @"application/timestamped-data",
 | |
|             @"tsv" : @"text/tab-separated-values",
 | |
|             @"ttc" : @"application/x-font-ttf",
 | |
|             @"ttf" : @"application/x-font-ttf",
 | |
|             @"ttl" : @"text/turtle",
 | |
|             @"twd" : @"application/vnd.simtech-mindmapper",
 | |
|             @"twds" : @"application/vnd.simtech-mindmapper",
 | |
|             @"txd" : @"application/vnd.genomatix.tuxedo",
 | |
|             @"txf" : @"application/vnd.mobius.txf",
 | |
|             @"txt" : @"text/plain",
 | |
|             @"u32" : @"application/x-authorware-bin",
 | |
|             @"udeb" : @"application/x-debian-package",
 | |
|             @"ufd" : @"application/vnd.ufdl",
 | |
|             @"ufdl" : @"application/vnd.ufdl",
 | |
|             @"ulx" : @"application/x-glulx",
 | |
|             @"umj" : @"application/vnd.umajin",
 | |
|             @"unityweb" : @"application/vnd.unity",
 | |
|             @"uoml" : @"application/vnd.uoml+xml",
 | |
|             @"uri" : @"text/uri-list",
 | |
|             @"uris" : @"text/uri-list",
 | |
|             @"urls" : @"text/uri-list",
 | |
|             @"ustar" : @"application/x-ustar",
 | |
|             @"utz" : @"application/vnd.uiq.theme",
 | |
|             @"uu" : @"text/x-uuencode",
 | |
|             @"uva" : @"audio/vnd.dece.audio",
 | |
|             @"uvd" : @"application/vnd.dece.data",
 | |
|             @"uvf" : @"application/vnd.dece.data",
 | |
|             @"uvg" : @"image/vnd.dece.graphic",
 | |
|             @"uvh" : @"video/vnd.dece.hd",
 | |
|             @"uvi" : @"image/vnd.dece.graphic",
 | |
|             @"uvm" : @"video/vnd.dece.mobile",
 | |
|             @"uvp" : @"video/vnd.dece.pd",
 | |
|             @"uvs" : @"video/vnd.dece.sd",
 | |
|             @"uvt" : @"application/vnd.dece.ttml+xml",
 | |
|             @"uvu" : @"video/vnd.uvvu.mp4",
 | |
|             @"uvv" : @"video/vnd.dece.video",
 | |
|             @"uvva" : @"audio/vnd.dece.audio",
 | |
|             @"uvvd" : @"application/vnd.dece.data",
 | |
|             @"uvvf" : @"application/vnd.dece.data",
 | |
|             @"uvvg" : @"image/vnd.dece.graphic",
 | |
|             @"uvvh" : @"video/vnd.dece.hd",
 | |
|             @"uvvi" : @"image/vnd.dece.graphic",
 | |
|             @"uvvm" : @"video/vnd.dece.mobile",
 | |
|             @"uvvp" : @"video/vnd.dece.pd",
 | |
|             @"uvvs" : @"video/vnd.dece.sd",
 | |
|             @"uvvt" : @"application/vnd.dece.ttml+xml",
 | |
|             @"uvvu" : @"video/vnd.uvvu.mp4",
 | |
|             @"uvvv" : @"video/vnd.dece.video",
 | |
|             @"uvvx" : @"application/vnd.dece.unspecified",
 | |
|             @"uvvz" : @"application/vnd.dece.zip",
 | |
|             @"uvx" : @"application/vnd.dece.unspecified",
 | |
|             @"uvz" : @"application/vnd.dece.zip",
 | |
|             @"vcard" : @"text/vcard",
 | |
|             @"vcd" : @"application/x-cdlink",
 | |
|             @"vcf" : @"text/x-vcard",
 | |
|             @"vcg" : @"application/vnd.groove-vcard",
 | |
|             @"vcs" : @"text/x-vcalendar",
 | |
|             @"vcx" : @"application/vnd.vcx",
 | |
|             @"vis" : @"application/vnd.visionary",
 | |
|             @"viv" : @"video/vnd.vivo",
 | |
|             @"vob" : @"video/x-ms-vob",
 | |
|             @"vor" : @"application/vnd.stardivision.writer",
 | |
|             @"vox" : @"application/x-authorware-bin",
 | |
|             @"vrml" : @"model/vrml",
 | |
|             @"vsd" : @"application/vnd.visio",
 | |
|             @"vsf" : @"application/vnd.vsf",
 | |
|             @"vss" : @"application/vnd.visio",
 | |
|             @"vst" : @"application/vnd.visio",
 | |
|             @"vsw" : @"application/vnd.visio",
 | |
|             @"vtu" : @"model/vnd.vtu",
 | |
|             @"vxml" : @"application/voicexml+xml",
 | |
|             @"w3d" : @"application/x-director",
 | |
|             @"wad" : @"application/x-doom",
 | |
|             @"wav" : @"audio/x-wav",
 | |
|             @"wax" : @"audio/x-ms-wax",
 | |
|             @"wbmp" : @"image/vnd.wap.wbmp",
 | |
|             @"wbs" : @"application/vnd.criticaltools.wbs+xml",
 | |
|             @"wbxml" : @"application/vnd.wap.wbxml",
 | |
|             @"wcm" : @"application/vnd.ms-works",
 | |
|             @"wdb" : @"application/vnd.ms-works",
 | |
|             @"wdp" : @"image/vnd.ms-photo",
 | |
|             @"weba" : @"audio/webm",
 | |
|             @"webm" : @"video/webm",
 | |
|             @"webp" : @"image/webp",
 | |
|             @"wg" : @"application/vnd.pmi.widget",
 | |
|             @"wgt" : @"application/widget",
 | |
|             @"wks" : @"application/vnd.ms-works",
 | |
|             @"wm" : @"video/x-ms-wm",
 | |
|             @"wma" : @"audio/x-ms-wma",
 | |
|             @"wmd" : @"application/x-ms-wmd",
 | |
|             @"wmf" : @"application/x-msmetafile",
 | |
|             @"wml" : @"text/vnd.wap.wml",
 | |
|             @"wmlc" : @"application/vnd.wap.wmlc",
 | |
|             @"wmls" : @"text/vnd.wap.wmlscript",
 | |
|             @"wmlsc" : @"application/vnd.wap.wmlscriptc",
 | |
|             @"wmv" : @"video/x-ms-wmv",
 | |
|             @"wmx" : @"video/x-ms-wmx",
 | |
|             @"wmz" : @"application/x-msmetafile",
 | |
|             @"woff" : @"application/font-woff",
 | |
|             @"wpd" : @"application/vnd.wordperfect",
 | |
|             @"wpl" : @"application/vnd.ms-wpl",
 | |
|             @"wps" : @"application/vnd.ms-works",
 | |
|             @"wqd" : @"application/vnd.wqd",
 | |
|             @"wri" : @"application/x-mswrite",
 | |
|             @"wrl" : @"model/vrml",
 | |
|             @"wsdl" : @"application/wsdl+xml",
 | |
|             @"wspolicy" : @"application/wspolicy+xml",
 | |
|             @"wtb" : @"application/vnd.webturbo",
 | |
|             @"wvx" : @"video/x-ms-wvx",
 | |
|             @"x32" : @"application/x-authorware-bin",
 | |
|             @"x3d" : @"model/x3d+xml",
 | |
|             @"x3db" : @"model/x3d+binary",
 | |
|             @"x3dbz" : @"model/x3d+binary",
 | |
|             @"x3dv" : @"model/x3d+vrml",
 | |
|             @"x3dvz" : @"model/x3d+vrml",
 | |
|             @"x3dz" : @"model/x3d+xml",
 | |
|             @"xaml" : @"application/xaml+xml",
 | |
|             @"xap" : @"application/x-silverlight-app",
 | |
|             @"xar" : @"application/vnd.xara",
 | |
|             @"xbap" : @"application/x-ms-xbap",
 | |
|             @"xbd" : @"application/vnd.fujixerox.docuworks.binder",
 | |
|             @"xbm" : @"image/x-xbitmap",
 | |
|             @"xdf" : @"application/xcap-diff+xml",
 | |
|             @"xdm" : @"application/vnd.syncml.dm+xml",
 | |
|             @"xdp" : @"application/vnd.adobe.xdp+xml",
 | |
|             @"xdssc" : @"application/dssc+xml",
 | |
|             @"xdw" : @"application/vnd.fujixerox.docuworks",
 | |
|             @"xenc" : @"application/xenc+xml",
 | |
|             @"xer" : @"application/patch-ops-error+xml",
 | |
|             @"xfdf" : @"application/vnd.adobe.xfdf",
 | |
|             @"xfdl" : @"application/vnd.xfdl",
 | |
|             @"xht" : @"application/xhtml+xml",
 | |
|             @"xhtml" : @"application/xhtml+xml",
 | |
|             @"xhvml" : @"application/xv+xml",
 | |
|             @"xif" : @"image/vnd.xiff",
 | |
|             @"xla" : @"application/vnd.ms-excel",
 | |
|             @"xlam" : @"application/vnd.ms-excel.addin.macroenabled.12",
 | |
|             @"xlc" : @"application/vnd.ms-excel",
 | |
|             @"xlf" : @"application/x-xliff+xml",
 | |
|             @"xlm" : @"application/vnd.ms-excel",
 | |
|             @"xls" : @"application/vnd.ms-excel",
 | |
|             @"xlsb" : @"application/vnd.ms-excel.sheet.binary.macroenabled.12",
 | |
|             @"xlsm" : @"application/vnd.ms-excel.sheet.macroenabled.12",
 | |
|             @"xlsx" : @"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
 | |
|             @"xlt" : @"application/vnd.ms-excel",
 | |
|             @"xltm" : @"application/vnd.ms-excel.template.macroenabled.12",
 | |
|             @"xltx" : @"application/vnd.openxmlformats-officedocument.spreadsheetml.template",
 | |
|             @"xlw" : @"application/vnd.ms-excel",
 | |
|             @"xm" : @"audio/xm",
 | |
|             @"xml" : @"application/xml",
 | |
|             @"xo" : @"application/vnd.olpc-sugar",
 | |
|             @"xop" : @"application/xop+xml",
 | |
|             @"xpi" : @"application/x-xpinstall",
 | |
|             @"xpl" : @"application/xproc+xml",
 | |
|             @"xpm" : @"image/x-xpixmap",
 | |
|             @"xpr" : @"application/vnd.is-xpr",
 | |
|             @"xps" : @"application/vnd.ms-xpsdocument",
 | |
|             @"xpw" : @"application/vnd.intercon.formnet",
 | |
|             @"xpx" : @"application/vnd.intercon.formnet",
 | |
|             @"xsl" : @"application/xml",
 | |
|             @"xslt" : @"application/xslt+xml",
 | |
|             @"xsm" : @"application/vnd.syncml+xml",
 | |
|             @"xspf" : @"application/xspf+xml",
 | |
|             @"xul" : @"application/vnd.mozilla.xul+xml",
 | |
|             @"xvm" : @"application/xv+xml",
 | |
|             @"xvml" : @"application/xv+xml",
 | |
|             @"xwd" : @"image/x-xwindowdump",
 | |
|             @"xyz" : @"chemical/x-xyz",
 | |
|             @"xz" : @"application/x-xz",
 | |
|             @"yang" : @"application/yang",
 | |
|             @"yin" : @"application/yin+xml",
 | |
|             @"z1" : @"application/x-zmachine",
 | |
|             @"z2" : @"application/x-zmachine",
 | |
|             @"z3" : @"application/x-zmachine",
 | |
|             @"z4" : @"application/x-zmachine",
 | |
|             @"z5" : @"application/x-zmachine",
 | |
|             @"z6" : @"application/x-zmachine",
 | |
|             @"z7" : @"application/x-zmachine",
 | |
|             @"z8" : @"application/x-zmachine",
 | |
|             @"zaz" : @"application/vnd.zzazz.deck+xml",
 | |
|             @"zip" : OWSMimeTypeApplicationZip,
 | |
|             @"zir" : @"application/vnd.zul",
 | |
|             @"zirz" : @"application/vnd.zul",
 | |
|             @"zmm" : @"application/vnd.handheld-entertainment+xml",
 | |
|         };
 | |
|     });
 | |
|     return result;
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)fileExtensionForMIMETypeViaLookup:(NSString *)mimeType
 | |
| {
 | |
|     return [[self genericMIMETypesToExtensionTypes] objectForKey:mimeType];
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)fileExtensionForMIMEType:(NSString *)mimeType
 | |
| {
 | |
|     // Try to deduce the file extension by using a lookup table.
 | |
|     //
 | |
|     // This should be more accurate than deducing the file extension by
 | |
|     // converting to a UTI type.  For example, .m4a files will have a
 | |
|     // UTI type of kUTTypeMPEG4Audio which incorrectly yields the file
 | |
|     // extension .mp4 instead of .m4a.
 | |
|     NSString *_Nullable fileExtension = [self fileExtensionForMIMETypeViaLookup:mimeType];
 | |
|     if (!fileExtension) {
 | |
|         // Try to deduce the file extension by converting to a UTI type.
 | |
|         fileExtension = [self fileExtensionForMIMETypeViaUTIType:mimeType];
 | |
|     }
 | |
|     return fileExtension;
 | |
| }
 | |
| 
 | |
| + (nullable NSString *)utiTypeForFileExtension:(NSString *)fileExtension
 | |
| {
 | |
|     NSString *_Nullable utiType = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(
 | |
|         kUTTagClassFilenameExtension, (__bridge CFStringRef)fileExtension, NULL);
 | |
|     return utiType;
 | |
| }
 | |
| 
 | |
| @end
 | |
| 
 | |
| NS_ASSUME_NONNULL_END
 |