text: // Copyright 2000-2021 Mark H. P. Lord
  
  #include "MIMETypes.h"
  #include "StringUtils.h"
  
  namespace {
  
  using namespace Prime;
  
  const struct MIMETypeItem {
      const char* extension;
      const char* mimeType;
  } standardMIMETypes[] = {
      { "3dm", "x-world/x-3dmf" },
      { "3dmf", "x-world/x-3dmf" },
      { "a", "application/octet-stream" },
      { "aab", "application/x-authorware-bin" },
      { "aam", "application/x-authorware-map" },
      { "aas", "application/x-authorware-seg" },
      { "abc", "text/vnd.abc" },
      { "acgi", "text/html" },
      { "afl", "video/animaflex" },
      { "ai", "application/postscript" },
      { "aif", "audio/aiff" },
      { "aif", "audio/x-aiff" },
      { "aifc", "audio/aiff" },
      { "aifc", "audio/x-aiff" },
      { "aiff", "audio/aiff" },
      { "aiff", "audio/x-aiff" },
      { "aim", "application/x-aim" },
      { "aip", "text/x-audiosoft-intra" },
      { "ani", "application/x-navi-animation" },
      { "aos", "application/x-nokia-9000-communicator-add-on-software" },
      { "aps", "application/mime" },
      { "arc", "application/octet-stream" },
      { "arj", "application/arj" },
      { "arj", "application/octet-stream" },
      { "art", "image/x-jg" },
      { "asc", "text/plain" },
      { "asf", "video/x-ms-asf" },
      { "asm", "text/x-asm" },
      { "asp", "text/asp" },
      { "asx", "video/x-ms-asf" },
      { "asx", "application/x-mplayer2" },
      { "asx", "video/x-ms-asf-plugin" },
      { "atom", "application/atom+xml" },
      { "au", "audio/basic" },
      { "au", "audio/x-au" },
      { "avi", "video/x-msvideo" },
      { "avi", "video/avi" },
      { "avi", "video/msvideo" },
      { "avi", "application/x-troff-msvideo" },
      { "avs", "video/avs-video" },
      { "bcpio", "application/x-bcpio" },
      { "bin", "application/octet-stream" },
      { "bin", "application/mac-binary" },
      { "bin", "application/macbinary" },
      { "bin", "application/x-binary" },
      { "bin", "application/x-macbinary" },
      { "bm", "image/bmp" },
      { "bmp", "image/bmp" },
      { "bmp", "image/x-windows-bmp" },
      { "boo", "application/book" },
      { "book", "application/book" },
      { "boz", "application/x-bzip2" },
      { "bsh", "application/x-bsh" },
      { "bz", "application/x-bzip" },
      { "bz2", "application/x-bzip2" },
      { "c", "text/x-c" },
      { "c", "text/plain" },
      { "c++", "text/x-c" },
      { "c++", "text/plain" },
      { "cat", "application/vnd.ms-pki.seccat" },
      { "cc", "text/x-c" },
      { "cc", "text/plain" },
      { "ccad", "application/clariscad" },
      { "cco", "application/x-cocoa" },
      { "cdf", "application/cdf" },
      { "cdf", "application/x-cdf" },
      { "cdf", "application/x-netcdf" },
      { "cer", "application/pkix-cert" },
      { "cer", "application/x-x509-ca-cert" },
      { "cgm", "image/cgm" },
      { "cha", "application/x-chat" },
      { "chat", "application/x-chat" },
      { "class", "application/java" },
      { "class", "application/java-byte-code" },
      { "class", "application/octet-stream" },
      { "class", "application/x-java-class" },
      { "com", "application/octet-stream" },
      { "com", "text/plain" },
      { "conf", "text/plain" },
      { "cpio", "application/x-cpio" },
      { "cpp", "text/x-c" },
      { "cpp", "text/plain" },
      { "cpt", "application/mac-compactpro" },
      { "cpt", "application/x-compactpro" },
      { "cpt", "application/x-cpt" },
      { "crl", "application/pkcs-crl" },
      { "crl", "application/pkix-crl" },
      { "crt", "application/pkix-cert" },
      { "crt", "application/x-x509-ca-cert" },
      { "crt", "application/x-x509-user-cert" },
      { "csh", "text/x-script.csh" },
      { "csh", "application/x-csh" },
      { "css", "text/css" },
      { "css", "application/x-pointplus" },
      { "cxx", "text/plain" },
      { "dcr", "application/x-director" },
      { "deepv", "application/x-deepv" },
      { "def", "text/plain" },
      { "der", "application/x-x509-ca-cert" },
      { "dif", "video/x-dv" },
      { "dir", "application/x-director" },
      { "djv", "image/vnd.djvu" },
      { "djvu", "image/vnd.djvu" },
      { "dl", "video/dl" },
      { "dl", "video/x-dl" },
      { "dll", "application/octet-stream" },
      { "dmg", "application/octet-stream" },
      { "dms", "application/octet-stream" },
      { "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/commonground" },
      { "drw", "application/drafting" },
      { "dtd", "application/xml-dtd" },
      { "dump", "application/octet-stream" },
      { "dv", "video/x-dv" },
      { "dvi", "application/x-dvi" },
      { "dwf", "model/vnd.dwf" },
      { "dwf", "drawing/x-dwf" },
      { "dwg", "application/acad" },
      { "dwg", "image/vnd.dwg" },
      { "dwg", "image/x-dwg" },
      { "dxf", "application/dxf" },
      { "dxf", "image/vnd.dwg" },
      { "dxf", "image/x-dwg" },
      { "dxr", "application/x-director" },
      { "el", "text/x-script.elisp" },
      { "elc", "application/x-bytecode.elisp (compiled elisp)" },
      { "elc", "application/x-elc" },
      { "env", "application/x-envoy" },
      { "eps", "application/postscript" },
      { "es", "application/x-esrehber" },
      { "etx", "text/x-setext" },
      { "evy", "application/envoy" },
      { "evy", "application/x-envoy" },
      { "exe", "application/octet-stream" },
      { "ez", "application/andrew-inset" },
      { "f", "text/x-fortran" },
      { "f", "text/plain" },
      { "f77", "text/x-fortran" },
      { "f90", "text/x-fortran" },
      { "f90", "text/plain" },
      { "fdf", "application/vnd.fdf" },
      { "fif", "application/fractals" },
      { "fif", "image/fif" },
      { "fli", "video/fli" },
      { "fli", "video/x-fli" },
      { "flo", "image/florian" },
      { "flx", "text/vnd.fmi.flexstor" },
      { "fmf", "video/x-atomic3d-feature" },
      { "for", "text/x-fortran" },
      { "for", "text/plain" },
      { "fpx", "image/vnd.fpx" },
      { "fpx", "image/vnd.net-fpx" },
      { "frl", "application/freeloader" },
      { "funk", "audio/make" },
      { "g", "text/plain" },
      { "g3", "image/g3fax" },
      { "gif", "image/gif" },
      { "gl", "video/gl" },
      { "gl", "video/x-gl" },
      { "gram", "application/srgs" },
      { "grxml", "application/srgs+xml" },
      { "gsd", "audio/x-gsm" },
      { "gsm", "audio/x-gsm" },
      { "gsp", "application/x-gsp" },
      { "gss", "application/x-gss" },
      { "gtar", "application/x-gtar" },
      { "gz", "application/gzip" },
      { "gz", "application/x-gzip" },
      { "gz", "application/x-compressed" },
      { "gzip", "application/gzip" },
      { "gzip", "application/x-gzip" },
      { "gzip", "multipart/x-gzip" },
      { "h", "text/x-chdr" },
      { "h", "text/x-h" },
      { "h", "text/plain" },
      { "h++", "text/x-chdr" },
      { "h++", "text/x-h" },
      { "h++", "text/plain" },
      { "hdf", "application/x-hdf" },
      { "help", "application/x-helpfile" },
      { "hgl", "application/vnd.hp-hpgl" },
      { "hh", "text/x-chdr" },
      { "hh", "text/plain" },
      { "hh", "text/x-h" },
      { "hlb", "text/x-script" },
      { "hlp", "application/x-winhelp" },
      { "hlp", "application/hlp" },
      { "hlp", "application/x-helpfile" },
      { "hpg", "application/vnd.hp-hpgl" },
      { "hpgl", "application/vnd.hp-hpgl" },
      { "hpp", "text/x-chdr" },
      { "hpp", "text/x-h" },
      { "hpp", "text/plain" },
      { "hqx", "application/binhex" },
      { "hqx", "application/binhex4" },
      { "hqx", "application/mac-binhex" },
      { "hqx", "application/mac-binhex40" },
      { "hqx", "application/x-binhex40" },
      { "hqx", "application/x-mac-binhex40" },
      { "hta", "application/hta" },
      { "htc", "text/x-component" },
      { "htm", "text/html" },
      { "html", "text/html" },
      { "htmls", "text/html" },
      { "htt", "text/webviewhtml" },
      { "htx", "text/html" },
      { "ice", "x-conference/x-cooltalk" },
      { "ico", "image/x-icon" },
      { "ics", "text/calendar" },
      { "idc", "text/plain" },
      { "ief", "image/ief" },
      { "iefs", "image/ief" },
      { "ifb", "text/calendar" },
      { "iges", "application/iges" },
      { "iges", "model/iges" },
      { "igs", "application/iges" },
      { "igs", "model/iges" },
      { "ima", "application/x-ima" },
      { "imap", "application/x-httpd-imap" },
      { "inf", "application/inf" },
      { "ins", "application/x-internett-signup" },
      { "ip", "application/x-ip2" },
      { "isu", "video/x-isvideo" },
      { "it", "audio/it" },
      { "iv", "application/x-inventor" },
      { "ivr", "i-world/i-vrml" },
      { "ivy", "application/x-livescreen" },
      { "jam", "audio/x-jam" },
      { "jav", "text/x-java-source" },
      { "jav", "text/plain" },
      { "java", "text/x-java-source" },
      { "java", "text/plain" },
      { "jcm", "application/x-java-commerce" },
      { "jfif", "image/jpeg" },
      { "jfif", "image/pjpeg" },
      { "jfif-tbnl", "image/jpeg" },
      { "jnlp", "application/x-java-jnlp-file" },
      { "jp2", "image/jp2" },
      { "jpe", "image/jpeg" },
      { "jpe", "image/pjpeg" },
      { "jpeg", "image/jpeg" },
      { "jpeg", "image/pjpeg" },
      { "jpg", "image/jpeg" },
      { "jpg", "image/pjpeg" },
      { "jps", "image/x-jps" },
      { "js", "application/ecmascript" },
      { "js", "application/javascript" },
      { "js", "application/x-javascript" },
      { "js", "text/ecmascript" },
      { "js", "text/javascript" },
      { "json", "application/json" },
      { "json", "text/json" },
      { "jut", "image/jutvision" },
      { "kar", "audio/midi" },
      { "kar", "music/x-karaoke" },
      { "ksh", "text/x-script.ksh" },
      { "ksh", "application/x-ksh" },
      { "la", "audio/nspaudio" },
      { "la", "audio/x-nspaudio" },
      { "lam", "audio/x-liveaudio" },
      { "latex", "application/x-latex" },
      { "lha", "application/lha" },
      { "lha", "application/octet-stream" },
      { "lha", "application/x-lha" },
      { "lhx", "application/octet-stream" },
      { "list", "text/plain" },
      { "lma", "audio/nspaudio" },
      { "lma", "audio/x-nspaudio" },
      { "log", "text/plain" },
      { "lsp", "text/x-script.lisp" },
      { "lsp", "application/x-lisp" },
      { "lst", "text/plain" },
      { "lsx", "text/x-la-asf" },
      { "ltx", "application/x-latex" },
      { "lzh", "application/x-lzh" },
      { "lzh", "application/octet-stream" },
      { "lzx", "application/x-lzx" },
      { "lzx", "application/lzx" },
      { "lzx", "application/octet-stream" },
      { "m", "text/x-c" },
      { "m", "text/plain" },
      { "m1v", "video/mpeg" },
      { "m2a", "audio/mpeg" },
      { "m2v", "video/mpeg" },
      { "m3u", "audio/x-mpegurl" },
      { "m3u", "audio/x-mpequrl" },
      { "m4a", "audio/mp4a-latm" },
      { "m4b", "audio/mp4a-latm" },
      { "m4p", "audio/mp4a-latm" },
      { "m4u", "video/vnd.mpegurl" },
      { "m4v", "video/x-m4v" },
      { "mac", "image/x-macpaint" },
      { "man", "application/x-troff-man" },
      { "map", "application/x-navimap" },
      { "mar", "text/plain" },
      { "mathml", "application/mathml+xml" },
      { "mbd", "application/mbedlet" },
      { "mc$", "application/x-magic-cap-package-1.0" },
      { "mcd", "application/mcad" },
      { "mcd", "application/x-mathcad" },
      { "mcf", "image/vasa" },
      { "mcf", "text/mcf" },
      { "mcp", "application/netmc" },
      { "me", "application/x-troff-me" },
      { "mesh", "model/mesh" },
      { "mht", "message/rfc822" },
      { "mhtml", "message/rfc822" },
      { "mid", "audio/midi" },
      { "mid", "application/x-midi" },
      { "mid", "audio/x-mid" },
      { "mid", "audio/x-midi" },
      { "mid", "music/crescendo" },
      { "mid", "x-music/x-midi" },
      { "midi", "audio/midi" },
      { "midi", "application/x-midi" },
      { "midi", "audio/x-mid" },
      { "midi", "audio/x-midi" },
      { "midi", "music/crescendo" },
      { "midi", "x-music/x-midi" },
      { "mif", "application/vnd.mif" },
      { "mif", "application/x-frame" },
      { "mif", "application/x-mif" },
      { "mime", "message/rfc822" },
      { "mime", "www/mime" },
      { "mjf", "audio/x-vnd.audioexplosion.mjuicemediafile" },
      { "mjpg", "video/x-motion-jpeg" },
      { "mm", "text/x-c" },
      { "mm", "text/plain" },
      // { "mm", "application/base64" },
      // { "mm", "application/x-meme" },
      // { "mme", "application/base64" },
      { "mod", "audio/mod" },
      { "mod", "audio/x-mod" },
      { "moov", "video/quicktime" },
      { "mov", "video/quicktime" },
      { "movie", "video/x-sgi-movie" },
      { "mp2", "audio/mpeg" },
      { "mp2", "audio/x-mpeg" },
      { "mp2", "video/mpeg" },
      { "mp2", "video/x-mpeg" },
      { "mp2", "video/x-mpeq2a" },
      { "mp3", "audio/mpeg" },
      { "mp3", "audio/mpeg3" },
      { "mp3", "audio/x-mpeg-3" },
      { "mp3", "video/mpeg" },
      { "mp3", "video/x-mpeg" },
      { "mp4", "video/mp4" },
      { "mpa", "audio/mpeg" },
      { "mpa", "video/mpeg" },
      { "mpc", "application/x-project" },
      { "mpe", "video/mpeg" },
      { "mpeg", "video/mpeg" },
      { "mpg", "audio/mpeg" },
      { "mpg", "video/mpeg" },
      { "mpga", "audio/mpeg" },
      { "mpp", "application/vnd.ms-project" },
      { "mpt", "application/x-project" },
      { "mpv", "application/x-project" },
      { "mpx", "application/x-project" },
      { "mrc", "application/marc" },
      { "ms", "application/x-troff-ms" },
      { "msh", "model/mesh" },
      { "mv", "video/x-sgi-movie" },
      { "mxu", "video/vnd.mpegurl" },
      { "my", "audio/make" },
      { "mzz", "application/x-vnd.audioexplosion.mzz" },
      { "nap", "image/naplps" },
      { "naplps", "image/naplps" },
      { "nc", "application/x-netcdf" },
      { "ncm", "application/vnd.nokia.configuration-message" },
      { "nif", "image/x-niff" },
      { "niff", "image/x-niff" },
      { "nix", "application/x-mix-transfer" },
      { "nsc", "application/x-conference" },
      { "nvd", "application/x-navidoc" },
      { "o", "application/octet-stream" },
      { "oda", "application/oda" },
      { "ogg", "application/ogg" },
      { "omc", "application/x-omc" },
      { "omcd", "application/x-omcdatamaker" },
      { "omcr", "application/x-omcregerator" },
      { "p", "text/x-pascal" },
      { "p10", "application/pkcs10" },
      { "p10", "application/x-pkcs10" },
      { "p12", "application/pkcs-12" },
      { "p12", "application/x-pkcs12" },
      { "p7a", "application/x-pkcs7-signature" },
      { "p7c", "application/pkcs7-mime" },
      { "p7c", "application/x-pkcs7-mime" },
      { "p7m", "application/pkcs7-mime" },
      { "p7m", "application/x-pkcs7-mime" },
      { "p7r", "application/x-pkcs7-certreqresp" },
      { "p7s", "application/pkcs7-signature" },
      { "part", "application/pro_eng" },
      { "pas", "text/pascal" },
      { "pbm", "image/x-portable-bitmap" },
      { "pcl", "application/vnd.hp-pcl" },
      { "pcl", "application/x-pcl" },
      { "pct", "image/pict" },
      { "pct", "image/x-pict" },
      { "pcx", "image/x-pcx" },
      { "pdb", "chemical/x-pdb" },
      { "pdf", "application/pdf" },
      { "pfunk", "audio/make" },
      { "pfunk", "audio/make.my.funk" },
      { "pgm", "image/x-portable-graymap" },
      { "pgm", "image/x-portable-greymap" },
      { "pgn", "application/x-chess-pgn" },
      { "pic", "image/pict" },
      { "pict", "image/pict" },
      { "pkg", "application/x-newton-compatible-pkg" },
      { "pko", "application/vnd.ms-pki.pko" },
      { "pl", "text/x-script.perl" },
      { "pl", "text/plain" },
      { "plx", "application/x-pixclscript" },
      { "pm", "text/x-script.perl-module" },
      { "pm", "image/x-xpixmap" },
      { "pm4", "application/x-pagemaker" },
      { "pm5", "application/x-pagemaker" },
      { "png", "image/png" },
      { "pnm", "application/x-portable-anymap" },
      { "pnm", "image/x-portable-anymap" },
      { "pnt", "image/x-macpaint" },
      { "pntg", "image/x-macpaint" },
      { "pot", "application/vnd.ms-powerpoint" },
      { "pot", "application/mspowerpoint" },
      { "potm", "application/vnd.ms-powerpoint.template.macroEnabled.12" },
      { "potx", "application/vnd.openxmlformats-officedocument.presentationml.template" },
      { "pov", "model/x-pov" },
      { "ppa", "application/vnd.ms-powerpoint" },
      { "ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12" },
      { "ppm", "image/x-portable-pixmap" },
      { "pps", "application/vnd.ms-powerpoint" },
      { "pps", "application/mspowerpoint" },
      { "ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12" },
      { "ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow" },
      { "ppt", "application/vnd.ms-powerpoint" },
      { "ppt", "application/mspowerpoint" },
      { "ppt", "application/powerpoint" },
      { "ppt", "application/x-mspowerpoint" },
      { "pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12" },
      { "pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation" },
      { "ppz", "application/mspowerpoint" },
      { "pre", "application/x-freelance" },
      { "prt", "application/pro_eng" },
      { "ps", "application/postscript" },
      { "psd", "application/octet-stream" },
      { "pvu", "paleovu/x-pv" },
      { "pwz", "application/vnd.ms-powerpoint" },
      { "py", "text/x-script.phyton" },
      { "pyc", "applicaiton/x-bytecode.python" },
      { "qcp", "audio/vnd.qcelp" },
      { "qd3", "x-world/x-3dmf" },
      { "qd3d", "x-world/x-3dmf" },
      { "qif", "image/x-quicktime" },
      { "qt", "video/quicktime" },
      { "qtc", "video/x-qtc" },
      { "qti", "image/x-quicktime" },
      { "qtif", "image/x-quicktime" },
      { "ra", "audio/x-pn-realaudio" },
      { "ra", "audio/x-pn-realaudio-plugin" },
      { "ra", "audio/x-realaudio" },
      { "ram", "audio/x-pn-realaudio" },
      { "rar", "application/x-rar-compressed" },
      { "rar", "application/octet-stream" },
      { "ras", "application/x-cmu-raster" },
      { "ras", "image/cmu-raster" },
      { "ras", "image/x-cmu-raster" },
      { "rast", "image/cmu-raster" },
      { "rdf", "application/rdf+xml" },
      { "rexx", "text/x-script.rexx" },
      { "rf", "image/vnd.rn-realflash" },
      { "rgb", "image/x-rgb" },
      { "rm", "application/vnd.rn-realmedia" },
      { "rm", "audio/x-pn-realaudio" },
      { "rmi", "audio/mid" },
      { "rmm", "audio/x-pn-realaudio" },
      { "rmp", "audio/x-pn-realaudio" },
      { "rmp", "audio/x-pn-realaudio-plugin" },
      { "rng", "application/ringing-tones" },
      { "rng", "application/vnd.nokia.ringing-tone" },
      { "rnx", "application/vnd.rn-realplayer" },
      { "roff", "application/x-troff" },
      { "rp", "image/vnd.rn-realpix" },
      { "rpm", "audio/x-pn-realaudio-plugin" },
      { "rt", "text/richtext" },
      { "rt", "text/vnd.rn-realtext" },
      { "rtf", "text/richtext" },
      { "rtf", "text/rtf" },
      { "rtf", "application/rtf" },
      { "rtf", "application/x-rtf" },
      { "rtx", "text/richtext" },
      { "rtx", "application/rtf" },
      { "rv", "video/vnd.rn-realvideo" },
      { "s", "text/x-asm" },
      { "s3m", "audio/s3m" },
      { "saveme", "application/octet-stream" },
      { "sbk", "application/x-tbook" },
      { "scm", "text/x-script.scheme" },
      { "scm", "text/x-script.guile" },
      { "scm", "application/x-lotusscreencam" },
      { "scm", "video/x-scm" },
      { "sdml", "text/plain" },
      { "sdp", "application/sdp" },
      { "sdp", "application/x-sdp" },
      { "sdr", "application/sounder" },
      { "sea", "application/sea" },
      { "sea", "application/x-sea" },
      { "set", "application/set" },
      { "sgm", "application/sgml" },
      { "sgm", "text/sgml" },
      { "sgm", "text/x-sgml" },
      { "sgml", "application/sgml" },
      { "sgml", "text/sgml" },
      { "sgml", "text/x-sgml" },
      { "sh", "text/x-script.sh" },
      { "sh", "application/x-bsh" },
      { "sh", "application/x-sh" },
      { "sh", "application/x-shar" },
      { "shar", "application/x-shar" },
      { "shar", "application/x-bsh" },
      { "shtml", "text/html" },
      { "shtml", "text/x-server-parsed-html" },
      { "sid", "audio/x-psid" },
      { "silo", "model/mesh" },
      { "sit", "application/x-sit" },
      { "sit", "application/x-stuffit" },
      { "skd", "application/x-koan" },
      { "skm", "application/x-koan" },
      { "skp", "application/x-koan" },
      { "skt", "application/x-koan" },
      { "sl", "application/x-seelogo" },
      { "smi", "application/smil" },
      { "smil", "application/smil" },
      { "snd", "audio/basic" },
      { "snd", "audio/x-adpcm" },
      { "so", "application/octet-stream" },
      { "sol", "application/solids" },
      { "spc", "application/x-pkcs7-certificates" },
      { "spc", "text/x-speech" },
      { "spl", "application/futuresplash" },
      { "spl", "application/x-futuresplash" },
      { "spr", "application/x-sprite" },
      { "sprite", "application/x-sprite" },
      { "src", "application/x-wais-source" },
      { "ssi", "text/x-server-parsed-html" },
      { "ssm", "application/streamingmedia" },
      { "sst", "application/vnd.ms-pki.certstore" },
      { "step", "application/step" },
      { "stl", "application/sla" },
      { "stl", "application/vnd.ms-pki.stl" },
      { "stl", "application/x-navistyle" },
      { "stp", "application/step" },
      { "sv4cpio", "application/x-sv4cpio" },
      { "sv4crc", "application/x-sv4crc" },
      { "svf", "image/vnd.dwg" },
      { "svf", "image/x-dwg" },
      { "svg", "image/svg+xml" },
      { "svr", "application/x-world" },
      { "svr", "x-world/x-svr" },
      { "swf", "application/x-shockwave-flash" },
      { "t", "application/x-troff" },
      { "talk", "text/x-speech" },
      { "tar", "application/x-tar" },
      { "tbk", "application/toolbook" },
      { "tbk", "application/x-tbook" },
      { "tcl", "text/x-script.tcl" },
      { "tcl", "application/x-tcl" },
      { "tcsh", "text/x-script.tcsh" },
      { "tex", "application/x-tex" },
      { "texi", "application/x-texinfo" },
      { "texinfo", "application/x-texinfo" },
      { "text", "text/plain" },
      { "text", "application/plain" },
      { "tgz", "application/gnutar" },
      { "tgz", "application/x-compressed" },
      { "tif", "image/tiff" },
      { "tif", "image/x-tiff" },
      { "tiff", "image/tiff" },
      { "tiff", "image/x-tiff" },
      { "tr", "application/x-troff" },
      { "tsi", "audio/tsp-audio" },
      { "tsp", "application/dsptype" },
      { "tsp", "audio/tsplayer" },
      { "tsv", "text/tab-separated-values" },
      { "turbot", "image/florian" },
      { "txt", "text/plain" },
      { "uil", "text/x-uil" },
      { "uni", "text/uri-list" },
      { "unis", "text/uri-list" },
      { "unv", "application/i-deas" },
      { "uri", "text/uri-list" },
      { "uris", "text/uri-list" },
      { "ustar", "application/x-ustar" },
      { "ustar", "multipart/x-ustar" },
      { "uu", "text/x-uuencode" },
      { "uu", "application/octet-stream" },
      { "uue", "text/x-uuencode" },
      { "vcd", "application/x-cdlink" },
      { "vcs", "text/x-vcalendar" },
      { "vda", "application/vda" },
      { "vdo", "video/vdo" },
      { "vew", "application/groupwise" },
      { "viv", "video/vivo" },
      { "viv", "video/vnd.vivo" },
      { "vivo", "video/vivo" },
      { "vivo", "video/vnd.vivo" },
      { "vmd", "application/vocaltec-media-desc" },
      { "vmf", "application/vocaltec-media-file" },
      { "voc", "audio/voc" },
      { "voc", "audio/x-voc" },
      { "vos", "video/vosaic" },
      { "vox", "audio/voxware" },
      { "vqe", "audio/x-twinvq-plugin" },
      { "vqf", "audio/x-twinvq" },
      { "vql", "audio/x-twinvq-plugin" },
      { "vrml", "application/x-vrml" },
      { "vrml", "model/vrml" },
      { "vrml", "x-world/x-vrml" },
      { "vrt", "x-world/x-vrt" },
      { "vsd", "application/x-visio" },
      { "vst", "application/x-visio" },
      { "vsw", "application/x-visio" },
      { "vxml", "application/voicexml+xml" },
      { "w60", "application/wordperfect6.0" },
      { "w61", "application/wordperfect6.1" },
      { "w6w", "application/msword" },
      { "wav", "audio/wav" },
      { "wav", "audio/x-wav" },
      { "wax", "audio/x-ms-wax" },
      { "wb1", "application/x-qpro" },
      { "wbmp", "image/vnd.wap.wbmp" },
      { "wbmxl", "application/vnd.wap.wbxml" },
      { "web", "application/vnd.xara" },
      { "wiz", "application/msword" },
      { "wk1", "application/x-123" },
      { "wm", "video/x-ms-wm" },
      { "wma", "audio/x-ms-wma" },
      { "wmd", "application/x-ms-wmd" },
      { "wmf", "windows/metafile" },
      { "wml", "text/vnd.wap.wml" },
      { "wmlc", "application/vnd.wap.wmlc" },
      { "wmls", "text/vnd.wap.wmlscript" },
      { "wmlsc", "application/vnd.wap.wmlscriptc" },
      { "wmv", "audio/x-ms-wmv" },
      { "wmx", "video/x-ms-wmx" },
      { "wmz", "application/x-ms-wmz" },
      { "word", "application/msword" },
      { "wp", "application/wordperfect" },
      { "wp5", "application/wordperfect" },
      { "wp5", "application/wordperfect6.0" },
      { "wp6", "application/wordperfect" },
      { "wpd", "application/wordperfect" },
      { "wpd", "application/x-wpwin" },
      { "wq1", "application/x-lotus" },
      { "wri", "application/mswrite" },
      { "wri", "application/x-wri" },
      { "wrl", "application/x-world" },
      { "wrl", "model/vrml" },
      { "wrl", "x-world/x-vrml" },
      { "wrz", "model/vrml" },
      { "wrz", "x-world/x-vrml" },
      { "wsc", "text/scriplet" },
      { "wsrc", "application/x-wais-source" },
      { "wtk", "application/x-wintalk" },
      { "wvx", "video/x-ms-wvx" },
      { "x-png", "image/png" },
      { "xbm", "image/x-xbitmap" },
      { "xbm", "image/x-xbm" },
      { "xbm", "image/xbm" },
      { "xdr", "video/x-amt-demorun" },
      { "xgz", "xgl/drawing" },
      { "xht", "application/xhtml+xml" },
      { "xhtml", "application/xhtml+xml" },
      { "xif", "image/vnd.xiff" },
      { "xl", "application/excel" },
      { "xla", "application/vnd.ms-excel" },
      { "xla", "application/excel" },
      { "xla", "application/x-excel" },
      { "xla", "application/x-msexcel" },
      { "xlam", "application/vnd.ms-excel.addin.macroEnabled.12" },
      { "xlb", "application/excel" },
      { "xlb", "application/vnd.ms-excel" },
      { "xlb", "application/x-excel" },
      { "xlc", "application/excel" },
      { "xlc", "application/vnd.ms-excel" },
      { "xlc", "application/x-excel" },
      { "xld", "application/excel" },
      { "xld", "application/x-excel" },
      { "xlk", "application/excel" },
      { "xlk", "application/x-excel" },
      { "xll", "application/excel" },
      { "xll", "application/vnd.ms-excel" },
      { "xll", "application/x-excel" },
      { "xlm", "application/excel" },
      { "xlm", "application/vnd.ms-excel" },
      { "xlm", "application/x-excel" },
      { "xls", "application/vnd.ms-excel" },
      { "xls", "application/excel" },
      { "xls", "application/x-excel" },
      { "xls", "application/x-msexcel" },
      { "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" },
      { "xlt", "application/excel" },
      { "xlt", "application/x-excel" },
      { "xltm", "application/vnd.ms-excel.template.macroEnabled.12" },
      { "xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template" },
      { "xlv", "application/excel" },
      { "xlv", "application/x-excel" },
      { "xlw", "application/excel" },
      { "xlw", "application/vnd.ms-excel" },
      { "xlw", "application/x-excel" },
      { "xlw", "application/x-msexcel" },
      { "xm", "audio/xm" },
      { "xml", "application/xml" },
      { "xml", "text/xml" },
      { "xmz", "xgl/movie" },
      { "xpix", "application/x-vnd.ls-xpix" },
      { "xpm", "image/x-xpixmap" },
      { "xpm", "image/xpm" },
      { "xsl", "application/xml" },
      { "xslt", "application/xslt+xml" },
      { "xsr", "video/x-amt-showrun" },
      { "xul", "application/vnd.mozilla.xul+xml" },
      { "xwd", "image/x-xwd" },
      { "xwd", "image/x-xwindowdump" },
      { "xyz", "chemical/x-pdb" },
      { "xyz", "chemical/x-xyz" },
      { "z", "application/x-compress" },
      { "z", "application/x-compressed" },
      { "zip", "application/zip" },
      { "zip", "application/x-compressed" },
      { "zip", "application/x-zip-compressed" },
      { "zip", "multipart/x-zip" },
      { "zoo", "application/octet-stream" },
      { "zsh", "text/x-script.zsh" },
  };
  
  const MIMETypeItem* standardMIMETypesEnd = standardMIMETypes + PRIME_COUNTOF(standardMIMETypes);
  
  std::string FixExtension(StringView extension)
  {
      if (StringStartsWith(extension, '.')) {
          extension.remove_prefix(1);
      }
  
      return ASCIIToLower(extension);
  }
  }
  
  namespace Prime {
  
  MIMETypes::MIMETypes()
  {
      for (const MIMETypeItem* ptr = standardMIMETypes; ptr != standardMIMETypesEnd; ++ptr) {
          _map[ptr->extension].mimeTypes.push_back(ptr->mimeType);
      }
  }
  
  void MIMETypes::load(const Value::Dictionary& dict)
  {
      for (size_t i = 0; i != dict.size(); ++i) {
          const Value::Dictionary::value_type& pair = dict.pair(i);
  
          const std::string& extension = pair.first;
  
          // TODO: if extension starts with a -, remove some entries.
          // TODO: if extension starts with a +, add entries to the end.
  
          std::string ext = FixExtension(extension);
          std::vector<std::string>& array = _map[ext].mimeTypes;
  
          std::vector<std::string> second = ToStringVector(pair.second, ",");
          array.insert(array.begin(), second.begin(), second.end());
      }
  }
  
  StringView MIMETypes::getMIMETypeForExtension(StringView extension) const
  {
      // We need a std::string for the map search
      std::string ext = FixExtension(extension);
  
      Map::const_iterator i = _map.find(ext);
  
      if (i != _map.end()) {
          return i->second.mimeTypes.front();
      }
  
      return "application/octet-stream";
  }
  
  void MIMETypes::setCompressedExtension(StringView extension, bool compressed)
  {
      std::string ext = FixExtension(extension);
  
      _map[ext].compressed = compressed;
  }
  
  void MIMETypes::setCompressedExtensions(const std::vector<std::string>& extensions)
  {
      for (size_t i = 0; i != extensions.size(); ++i) {
          setCompressedExtension(extensions[i], true);
      }
  }
  
  bool MIMETypes::isCompressedExtension(StringView extension) const
  {
      std::string ext = FixExtension(extension);
  
      Map::const_iterator iter = _map.find(ext);
      return (iter == _map.end()) ? false : iter->second.compressed;
  }
  }
  