diff --git a/DESCRIPTION b/DESCRIPTION index a3aafe6..c3d08a3 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,42 +1,26 @@ Package: wand Type: Package Title: Retrieve 'Magic' Attributes from Files and Directories -Version: 0.2.1 -Date: 2017-10-20 +Version: 0.3.0 +Date: 2018-09-16 Authors@R: c( person("Bob", "Rudis", email = "bob@rud.is", role = c("aut", "cre"), - comment = c(ORCID = "0000-0001-5670-2640")), - person("Christos", "Zoulas", role=("ctb"), comment="libmagic"), - person("Mans", "Rullgard", role=("ctb"), comment="file"), - person("Jonathan", "Ong", role=("ctb"), comment="mime-db") + comment = c(ORCID = "0000-0001-5670-2640")) ) Maintainer: Bob Rudis -Description: The 'libmagic' library provides functions to determine - 'MIME' type and other metadata from files through their "magic" - attributes. This is useful when you do not wish to rely solely on - the honesty of a user or the extension on a file name. It also - incorporates other metadata from the 'mime-db' database - . -URL: http://github.com/hrbrmstr/wand -BugReports: https://github.com/hrbrmstr/wand/issues -NeedsCompilation: yes -LazyData: true -SystemRequirements: libmagic (>= 5.14) for Unix/Linux/macOS; Rtools 3.3+ for Windows +Description: 'MIME' types are shorthand descriptors for file contents and can be + determined from "magic" bytes in file headers, file contents or intuited from + file extensions. Tools are provided to perform curated "magic" tests as well + as mapping 'MIME' types from a database of over 1,500 extension mappings. +URL: http://gitlab.com/hrbrmstr/wand +BugReports: https://gitlab.com/hrbrmstr/wand/issues +Encoding: UTF-8 License: AGPL Suggests: - testthat + testthat, + covr +Imports: + tools Depends: R (>= 3.2.0) -Imports: - dplyr, - purrr, - rappdirs, - stats, - stringi, - tibble, - tidyr, - utils, - Rcpp -Encoding: UTF-8 -LinkingTo: Rcpp RoxygenNote: 6.0.1.9000 diff --git a/INSTALL b/INSTALL deleted file mode 100644 index a01a56f..0000000 --- a/INSTALL +++ /dev/null @@ -1,13 +0,0 @@ -For Linux/UNIX/macOS you need 'libmagic' installed which is a component of the -'file' utility: . You can find out more information -on 'libmagic' and 'file' at this URL: . - -Here are the incantations you must use to get magic for your environment: - -- `apt-get install libmagic-dev` on Ubuntu/Debian-ish systems -- `brew install libmagic` on macOS -- `yum install file-devel` on RHEL/CentOS/Fedora - -For Windows you will need Rtools -version 3.3 or higher (it may work with older ones, but it's only been tested on -Rtools version 3.3 & 3.4). \ No newline at end of file diff --git a/NAMESPACE b/NAMESPACE index c01e076..34f8347 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,16 +1,6 @@ # Generated by roxygen2: do not edit by hand -export(incant) -export(magic_wand_file) -import(purrr) -import(stats) -import(stringi) -import(tibble) -import(tidyr) -importFrom(Rcpp,sourceCpp) -importFrom(dplyr,left_join) -importFrom(dplyr,mutate) -importFrom(dplyr,mutate_all) -importFrom(rappdirs,user_cache_dir) -importFrom(utils,unzip) -useDynLib(wand, .registration=TRUE) +export(get_content_type) +export(guess_content_type) +export(simplemagic_mime_db) +importFrom(tools,file_ext) diff --git a/R/RcppExports.R b/R/RcppExports.R deleted file mode 100644 index 96faac7..0000000 --- a/R/RcppExports.R +++ /dev/null @@ -1,11 +0,0 @@ -# Generated by using Rcpp::compileAttributes() -> do not edit by hand -# Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 - -incant_ <- function(path, magic_db = "system") { - .Call(`_wand_incant_`, path, magic_db) -} - -lib_version <- function() { - .Call(`_wand_lib_version`) -} - diff --git a/R/aaa.r b/R/aaa.r index cbd2465..2264c17 100644 --- a/R/aaa.r +++ b/R/aaa.r @@ -1 +1,820 @@ -globalVariables(c("extensions", "mime_type", "response", "encoding")) +#' File extension-to-MIME mapping data frame +#' +#' @docType data +#' @export +structure(list(extension = c("pyc", "dwg", "ez", "aw", "arj", +"atom", "xml", "atomcat", "atomsvc", "mm", "mme", "hqx", "hqx", +"boo", "book", "ccxml", "cdf", "cdmia", "cdmic", "cdmid", "cdmio", +"cdmiq", "ccad", "dp", "cu", "csm", "davmount", "dbk", "drw", +"tsp", "dssc", "xdssc", "dxf", "es", "ecma", "js", "emma", "evy", +"epub", "xl", "xla", "xlb", "xlc", "xld", "xlk", "xll", "xlm", +"xls", "xlt", "xlv", "xlw", "exi", "pfr", "woff", "fif", "frl", +"spl", "gml", "tgz", "gpx", "vew", "gxf", "hlp", "hta", "stk", +"unv", "iges", "igs", "inf", "ink", "inkml", "acx", "ipfix", +"class", "jar", "class", "ser", "class", "js", "json", "jsonml", +"lha", "lostxml", "lzx", "bin", "hqx", "hqx", "cpt", "bin", "mads", +"mrc", "mrcx", "ma", "nb", "mb", "mathml", "mbd", "mbox", "mcd", +"mscml", "metalink", "meta4", "mets", "aps", "mods", "m21", "mp21", +"mp4", "m4p", "mp4s", "mdb", "one", "onetoc2", "onetmp", "onepkg", +"pot", "pps", "ppt", "ppz", "doc", "dot", "w6w", "wiz", "word", +"wri", "mxf", "mcp", "bin", "dms", "lrf", "mar", "so", "dist", +"distz", "pkg", "bpk", "dump", "elc", "a", "arc", "arj", "com", +"exe", "lha", "lhx", "lzh", "lzx", "o", "psd", "saveme", "uu", +"zoo", "class", "buffer", "deploy", "hqx", "obj", "lib", "zip", +"gz", "dmg", "iso", "oda", "opf", "ogx", "ogg", "axs", "omdoc", +"onetoc", "onetoc2", "onetmp", "onepkg", "oxps", "xer", "pdf", +"pgp", "key", "asc", "pgp", "sig", "prf", "p12", "crl", "p10", +"p7m", "p7c", "p7s", "p8", "ac", "cer", "crt", "crl", "pkipath", +"pki", "text", "pls", "ai", "eps", "ps", "ppt", "part", "prt", +"cww", "pskcxml", "rar", "rdf", "rif", "rnc", "rl", "rld", "rng", +"rs", "gbr", "mft", "roa", "rsd", "rss", "xml", "rtf", "rtx", +"sbml", "scq", "scs", "spq", "spp", "sdp", "sea", "set", "setpay", +"setreg", "shf", "stl", "smi", "smil", "smi", "smil", "sol", +"sdr", "rq", "srx", "gram", "grxml", "sru", "ssdl", "ssml", "step", +"stp", "ssm", "tei", "teicorpus", "tfi", "tsd", "tbk", "vda", +"plb", "psb", "pvb", "tcap", "pwn", "aso", "imp", "acu", "atc", +"acutc", "air", "fcdt", "fxp", "fxpl", "xdp", "xfdf", "ahead", +"azf", "azs", "azw", "acc", "ami", "apk", "cii", "fti", "atx", +"mpkg", "m3u8", "swi", "swi", "iota", "aep", "mpm", "bmi", "rep", +"cdxml", "mmd", "cdy", "cla", "rp9", "c4g", "c4d", "c4f", "c4p", +"c4u", "c11amc", "c11amz", "csp", "cdbcmsg", "cmc", "clkx", "clkk", +"clkp", "clkt", "clkw", "wbs", "pml", "ppd", "car", "pcurl", +"dart", "rdz", "uvf", "uvvf", "uvd", "uvvd", "uvt", "uvvt", "uvx", +"uvvx", "uvz", "uvvz", "fe_launch", "dna", "mlp", "dpg", "dfac", +"kpxx", "ait", "svc", "geo", "mag", "nml", "esf", "msf", "qam", +"slt", "ssf", "es3", "et3", "ez2", "ez3", "fdf", "mseed", "seed", +"dataless", "gph", "ftc", "fm", "frame", "maker", "book", "fnc", +"ltf", "fsc", "oas", "oa2", "oa3", "fg5", "bh2", "ddd", "xdw", +"xbd", "fzs", "txd", "ggb", "ggt", "gex", "gre", "gxt", "g2w", +"g3w", "gmx", "kml", "kmz", "gqf", "gqs", "gac", "ghf", "gim", +"grv", "gtm", "tpl", "vcg", "hal", "zmm", "hbci", "les", "hgl", +"hpg", "hpgl", "hpid", "hps", "jlt", "pcl", "pclxl", "sfd-hdstx", +"x3d", "mpy", "afp", "listafp", "list3820", "irm", "sc", "icc", +"icm", "igl", "ivp", "ivu", "igm", "xpw", "xpx", "i2g", "qbo", +"qfx", "rcprofile", "irp", "xpr", "fcs", "jam", "rms", "jisp", +"joda", "ktz", "ktr", "karbon", "chrt", "kfo", "flw", "kon", +"kpr", "kpt", "ksp", "kwd", "kwt", "htke", "kia", "kne", "knp", +"skp", "skd", "skt", "skm", "sse", "lasxml", "lbd", "lbe", "123", +"apr", "pre", "nsf", "org", "scm", "lwp", "portpkg", "mcd", "mc1", +"cdkey", "mwf", "mfm", "flo", "igx", "mif", "daf", "dis", "mbk", +"mqy", "msl", "plc", "txf", "mpn", "mpc", "xul", "cil", "cab", +"xls", "xlm", "xla", "xlc", "xlt", "xlb", "xll", "xlw", "xlam", +"xlam", "xlsb", "xlsb", "xlsm", "xlsm", "xltm", "xltm", "eot", +"chm", "ims", "lrm", "thmx", "msg", "sst", "pko", "cat", "stl", +"sst", "cat", "stl", "ppt", "pps", "pot", "ppa", "pwz", "ppam", +"ppam", "pptm", "potm", "pptm", "potm", "sldm", "sldm", "ppsm", +"ppsm", "potm", "potm", "mpp", "mpt", "docm", "docm", "dotm", +"dotm", "wps", "wks", "wcm", "wdb", "wpl", "xps", "mseq", "mus", +"msty", "taglet", "nlu", "ntf", "nitf", "nnd", "nns", "nnw", +"ncm", "ngdat", "n-gage", "rpst", "rpss", "rng", "edm", "edx", +"ext", "edm", "edx", "ext", "odc", "otc", "odb", "odf", "odft", +"odg", "otg", "odi", "oti", "odp", "otp", "ods", "ots", "odt", +"odm", "otm", "ott", "oth", "xo", "dd2", "oxt", "pptx", "sldx", +"ppsx", "potx", "xlsx", "xltx", "docx", "dotx", "mgp", "dp", +"esa", "pdb", "pqa", "oprc", "paw", "str", "ei6", "efif", "wg", +"plf", "pbd", "box", "mgz", "qps", "ptid", "qxd", "qxt", "qwd", +"qwt", "qxl", "qxb", "bed", "mxl", "musicxml", "cryptonote", +"cod", "rm", "rmvb", "rnx", "link66", "st", "see", "sema", "semd", +"semf", "ifm", "itp", "iif", "ipk", "twd", "twds", "mmf", "teacher", +"sdkm", "sdkd", "dxp", "sfs", "sdc", "sda", "sdd", "sdp", "smf", +"sdw", "vor", "sgl", "smzip", "sm", "sxc", "stc", "sxd", "std", +"sxi", "sti", "sxm", "sxw", "sxg", "stw", "sus", "susp", "svd", +"sis", "sisx", "xsm", "bdm", "xdm", "tao", "pcap", "cap", "dmp", +"tmo", "tpt", "mxs", "tra", "ufd", "ufdl", "utz", "umj", "unityweb", +"uoml", "vcx", "vsd", "vst", "vss", "vsw", "vis", "vsf", "sic", +"slc", "wbxml", "wmlc", "wmlsc", "wtb", "nbp", "wpd", "wqd", +"stf", "xar", "web", "xfdl", "hvd", "hvs", "hvp", "osf", "osfpvg", +"saf", "spf", "cmp", "zir", "zirz", "zaz", "vmd", "vmf", "vxml", +"wgt", "hlp", "wp", "wp5", "wp6", "wpd", "wp5", "w60", "wp5", +"w61", "wsdl", "wspolicy", "wk1", "wk", "7z", "abw", "ace", "aim", +"dmg", "aab", "x32", "u32", "vox", "aam", "aas", "bcpio", "bin", +"hqx", "torrent", "blb", "blorb", "bsh", "sh", "shar", "elc", +"elc", "bz", "bz2", "boz", "cbr", "cba", "cbt", "cbz", "cb7", +"cdf", "vcd", "cfs", "chat", "cha", "pgn", "chm", "crx", "ras", +"cco", "cpt", "z", "gz", "tgz", "z", "zip", "nsc", "cpio", "cpt", +"csh", "deb", "udeb", "deepv", "dgc", "dir", "dcr", "dxr", "cst", +"cct", "cxt", "w3d", "fgd", "swa", "dms", "wad", "ncx", "dtb", +"res", "dvi", "elc", "env", "evy", "es", "eva", "xla", "xlb", +"xlc", "xld", "xlk", "xll", "xlm", "xls", "xlt", "xlv", "xlw", +"flac", "pfa", "pfb", "gsf", "pcf", "pcf.Z", "bdf", "gsf", "psf", +"otf", "pcf", "snf", "ttf", "ttc", "pfa", "pfb", "pfm", "afm", +"woff", "mif", "arc", "pre", "spl", "gca", "ulx", "gnumeric", +"sgf", "gramps", "gcf", "gsp", "gss", "gtar", "tgz", "taz", "gz", +"gzip", "tgz", "hdf", "help", "hlp", "imap", "phtml", "pht", +"php", "phps", "php3", "php3p", "php4", "ica", "ima", "install", +"ins", "isp", "ins", "iv", "ip", "iii", "iso", "jar", "class", +"jcm", "jnlp", "ser", "class", "js", "chrt", "kil", "skd", "skm", +"skp", "skt", "kpr", "kpt", "ksh", "ksp", "kwd", "kwt", "latex", +"ltx", "lha", "lsp", "ivy", "wq1", "scm", "luac", "lzh", "lzh", +"lha", "lzx", "hqx", "bin", "mc$", "frm", "maker", "frame", "fm", +"fb", "book", "fbdoc", "mcd", "mm", "mid", "midi", "mie", "mif", +"nix", "prc", "mobi", "m3u8", "asx", "application", "lnk", "wmd", +"wmz", "xbap", "mdb", "obd", "crd", "clp", "com", "exe", "bat", +"dll", "exe", "dll", "com", "bat", "msi", "xla", "xls", "xlw", +"msi", "mvb", "m13", "m14", "wmf", "wmz", "emf", "emz", "mny", +"ppt", "pub", "scd", "trm", "wri", "ani", "nvd", "map", "stl", +"nc", "cdf", "pkg", "aos", "pac", "nwc", "nzb", "o", "omc", "omcd", +"omcr", "oza", "pm4", "pm5", "pcl", "pma", "pmc", "pml", "pmr", +"pmw", "plx", "p10", "p12", "pfx", "p7b", "spc", "p7r", "crl", +"p7c", "p7m", "p7a", "p7s", "css", "pnm", "mpc", "mpt", "mpv", +"mpx", "pyc", "pyo", "wb1", "qtl", "rar", "rpm", "ris", "rpm", +"rtf", "sdp", "sea", "sl", "sh", "shar", "sh", "swf", "swfl", +"xap", "sit", "spr", "sprite", "sql", "sit", "sitx", "srt", "sv4cpio", +"sv4crc", "t3", "gam", "tar", "sbk", "tbk", "tcl", "tex", "gf", +"pk", "tfm", "texinfo", "texi", "obj", "~", "%", "bak", "old", +"sik", "roff", "t", "tr", "man", "me", "ms", "avi", "ustar", +"vsd", "vst", "vsw", "mzz", "xpix", "vrml", "src", "wsrc", "webapp", +"wz", "hlp", "wtk", "svr", "wrl", "wpd", "wri", "der", "cer", +"crt", "crt", "xcf", "fig", "xlf", "xpi", "xz", "zip", "z1", +"z2", "z3", "z4", "z5", "z6", "z7", "z8", "xaml", "xdf", "xenc", +"xhtml", "xht", "xml", "xsl", "xpdl", "dtd", "xop", "xpl", "xslt", +"xspf", "mxml", "xhvml", "xvml", "xvm", "yang", "yin", "pko", +"zip", "adp", "aif", "aifc", "aiff", "au", "snd", "flac", "it", +"funk", "my", "pfunk", "pfunk", "rmi", "mid", "mid", "midi", +"kar", "rmi", "mod", "mp4a", "m4a", "mpga", "mp2", "mp2a", "mp3", +"m2a", "mpa", "mpg", "m3a", "mpega", "m4a", "mp3", "m3u", "la", +"lma", "oga", "ogg", "spx", "sid", "s3m", "sil", "tsi", "tsp", +"uva", "uvva", "eol", "dra", "dts", "dtshd", "lvp", "pya", "ecelp4800", +"ecelp7470", "ecelp9600", "qcp", "rip", "voc", "vox", "wav", +"weba", "aac", "snd", "aif", "aiff", "aifc", "au", "caf", "flac", +"gsd", "gsm", "jam", "lam", "mka", "mid", "midi", "mid", "midi", +"mod", "mp2", "mp3", "m3u", "m3u", "wax", "wma", "la", "lma", +"ram", "ra", "rm", "rmm", "rmp", "rmp", "ra", "rpm", "sid", "ra", +"pls", "sd2", "vqf", "vqe", "vql", "mjf", "voc", "wav", "xm", +"cdx", "cif", "cmdf", "cml", "csml", "pdb", "xyz", "xyz", "dwf", +"dwf", "otf", "ivr", "bmp", "bm", "cgm", "cod", "ras", "rast", +"fif", "flo", "turbot", "g3", "gif", "ief", "iefs", "jpeg", "jpg", +"jfif", "jfif-tbnl", "jpe", "jut", "ktx", "nap", "naplps", "pcx", +"pic", "pict", "jfif", "jfif", "jpe", "jpeg", "jpg", "png", "x-png", +"btif", "sgi", "svg", "svgz", "tiff", "tif", "mcf", "psd", "uvi", +"uvvi", "uvg", "uvvg", "djvu", "djv", "sub", "dwg", "dxf", "svf", +"dxf", "fbs", "fpx", "fpix", "fst", "mmr", "rlc", "mdi", "wdp", +"npx", "fpx", "rf", "rp", "wbmp", "xif", "webp", "3ds", "ras", +"ras", "cmx", "cdr", "pat", "cdt", "cpt", "dwg", "dxf", "svf", +"fh", "fhc", "fh4", "fh5", "fh7", "ico", "art", "jng", "jps", +"sid", "bmp", "nif", "niff", "pcx", "psd", "pic", "pct", "pnm", +"pbm", "pgm", "pgm", "ppm", "qif", "qti", "qtif", "rgb", "tga", +"tif", "tiff", "bmp", "xbm", "xpm", "xbm", "xpm", "pm", "xwd", +"xwd", "xbm", "xpm", "eml", "mht", "mhtml", "mime", "nws", "igs", +"iges", "msh", "mesh", "silo", "dae", "dwf", "gdl", "gtw", "mts", +"vtu", "wrl", "vrml", "wrz", "pov", "x3db", "x3dbz", "x3dv", +"x3dvz", "x3d", "x3dz", "gzip", "ustar", "zip", "mid", "midi", +"kar", "pvu", "asp", "appcache", "manifest", "ics", "ifb", "icz", +"csv", "css", "csv", "js", "event-stream", "323", "html", "acgi", +"htm", "htmls", "htx", "shtml", "stm", "uls", "js", "mml", "mcf", +"n3", "pas", "txt", "text", "conf", "def", "list", "log", "c", +"c++", "cc", "com", "cxx", "f", "f90", "for", "g", "h", "hh", +"idc", "jav", "java", "lst", "m", "mar", "pl", "sdml", "bas", +"in", "asc", "diff", "pot", "el", "ksh", "par", "dsc", "rtx", +"rt", "rtf", "rtf", "wsc", "sct", "wsc", "sgml", "sgm", "tsv", +"tm", "ts", "t", "tr", "roff", "man", "me", "ms", "ttl", "uri", +"uris", "uni", "unis", "urls", "vcard", "abc", "curl", "dcurl", +"mcurl", "scurl", "sub", "fly", "flx", "gv", "3dml", "spot", +"rt", "jad", "si", "sl", "wml", "wmls", "vtt", "htt", "s", "asm", +"aip", "c", "cc", "cxx", "cpp", "h", "hh", "dic", "h++", "hpp", +"hxx", "hh", "c++", "cpp", "cxx", "cc", "h", "htc", "csh", "c", +"f", "for", "f77", "f90", "h", "hh", "java", "java", "jav", "lsx", +"lua", "m", "markdown", "md", "mkd", "moc", "nfo", "opml", "p", +"pas", "gcd", "pl", "pm", "py", "hlb", "csh", "el", "scm", "ksh", +"lsp", "pl", "pm", "py", "rexx", "scm", "sh", "tcl", "tcsh", +"zsh", "shtml", "ssi", "etx", "sfv", "sgm", "sgml", "sh", "spc", +"talk", "tcl", "tk", "tex", "ltx", "sty", "cls", "uil", "uu", +"uue", "vcs", "vcf", "xml", "3gp", "3g2", "ts", "afl", "avi", +"avs", "dl", "flc", "fli", "flc", "fli", "gl", "h261", "h263", +"h264", "jpgv", "jpm", "jpgm", "mj2", "mjp2", "mp4", "mp4v", +"mpg4", "mpeg", "mpg", "mpe", "m1v", "m2v", "mp2", "mp3", "mpa", +"mpv2", "avi", "ogv", "qt", "moov", "mov", "vdo", "viv", "vivo", +"uvh", "uvvh", "uvm", "uvvm", "uvp", "uvvp", "uvs", "uvvs", "uvv", +"uvvv", "dvb", "fvt", "mxu", "m4u", "pyv", "rv", "uvu", "uvvu", +"viv", "vivo", "vos", "webm", "xdr", "xsr", "fmf", "dl", "dif", +"dv", "f4v", "fli", "flv", "gl", "isu", "lsf", "lsx", "m4v", +"mkv", "mk3d", "mks", "mng", "mjpg", "mp2", "mp3", "mp2", "asf", +"asx", "asr", "asx", "vob", "wm", "wmv", "wmx", "wvx", "avi", +"qtc", "scm", "movie", "mv", "smv", "wmf", "mime", "ice", "mid", +"midi", "3dm", "3dmf", "qd3", "qd3d", "svr", "vrml", "wrl", "wrz", +"flr", "xaf", "xof", "vrm", "vrt", "xgz", "xmz", "ma nb mb", +"doc dot", "bin dms lha lrf lzh so iso dmg dist distz pkg bpk dump elc deploy", +"onetoc onetoc2 onetmp onepkg", "asc sig", "p7m p7c", "ai eps ps", +"smi smil", "atc acutc", "c4g c4d c4f c4p c4u", "es3 et3", "seed dataless", +"fm frame maker book", "gex gre", "gqf gqs", "afp listafp list3820", +"icc icm", "xpw xpx", "ktz ktr", "kpr kpt", "kwd kwt", "kne knp", +"skp skd skt skm", "xls xlm xla xlc xlt xlw", "ppt pps pot", +"mpp mpt", "wps wks wcm wdb", "pdb pqa oprc", "qxd qxt qwd qwt qxl qxb", +"twd twds", "sdkm sdkd", "sus susp", "sis sisx", "ufd ufdl", +"vsd vst vss vsw", "zir zirz", "aab x32 u32 vox", "bz2 boz", +"deb udeb", "dir dcr dxr cst cct cxt w3d fgd swa", "ttf ttc", +"pfa pfb pfm afm", "prc mobi", "exe dll com bat msi", "mvb m13 m14", +"nc cdf", "p12 pfx", "p7b spc", "texinfo texi", "der crt", "xhtml xht", +"xml xsl", "mxml xhvml xvml xvm", "au snd", "mid midi kar rmi", +"mpga mp2 mp2a mp3 m2a m3a", "oga ogg spx", "aif aiff aifc", +"ram ra", "jpeg jpg jpe", "svg svgz", "tiff tif", "djvu djv", +"fh fhc fh4 fh5 fh7", "pic pct", "eml mime", "igs iges", "msh mesh silo", +"wrl vrml", "ics ifb", "html htm", "txt text conf def list log in", +"sgml sgm", "t tr roff man me ms", "uri uris urls", "s asm", +"c cc cxx cpp h hh dic", "f for f77 f90", "p pas", "jpm jpgm", +"mj2 mjp2", "mp4 mp4v mpg4", "mpeg mpg mpe m1v m2v", "qt mov", +"mxu m4u", "asf asx"), mime_type = c("application/x-bytecode.python", +"application/acad", "application/andrew-inset", "application/applixware", +"application/arj", "application/atom+xml", "application/atom+xml", +"application/atomcat+xml", "application/atomsvc+xml", "application/base64", +"application/base64", "application/binhex", "application/binhex4", +"application/book", "application/book", "application/ccxml+xml", +"application/cdf", "application/cdmi-capability", "application/cdmi-container", +"application/cdmi-domain", "application/cdmi-object", "application/cdmi-queue", +"application/clariscad", "application/commonground", "application/cu-seeme", +"application/cu-seeme", "application/davmount+xml", "application/docbook+xml", +"application/drafting", "application/dsptype", "application/dssc+der", +"application/dssc+xml", "application/dxf", "application/ecmascript", +"application/ecmascript", "application/ecmascript", "application/emma+xml", +"application/envoy", "application/epub+zip", "application/excel", +"application/excel", "application/excel", "application/excel", +"application/excel", "application/excel", "application/excel", +"application/excel", "application/excel", "application/excel", +"application/excel", "application/excel", "application/exi", +"application/font-tdpfr", "application/font-woff", "application/fractals", +"application/freeloader", "application/futuresplash", "application/gml+xml", +"application/gnutar", "application/gpx+xml", "application/groupwise", +"application/gxf", "application/hlp", "application/hta", "application/hyperstudio", +"application/i-deas", "application/iges", "application/iges", +"application/inf", "application/inkml+xml", "application/inkml+xml", +"application/internet-property-stream", "application/ipfix", +"application/java", "application/java-archive", "application/java-byte-code", +"application/java-serialized-object", "application/java-vm", +"application/javascript", "application/json", "application/jsonml+json", +"application/lha", "application/lost+xml", "application/lzx", +"application/mac-binary", "application/mac-binhex", "application/mac-binhex40", +"application/mac-compactpro", "application/macbinary", "application/mads+xml", +"application/marc", "application/marcxml+xml", "application/mathematica", +"application/mathematica", "application/mathematica", "application/mathml+xml", +"application/mbedlet", "application/mbox", "application/mcad", +"application/mediaservercontrol+xml", "application/metalink+xml", +"application/metalink4+xml", "application/mets+xml", "application/mime", +"application/mods+xml", "application/mp21", "application/mp21", +"application/mp4", "application/mp4", "application/mp4", "application/msaccess", +"application/msonenote", "application/msonenote", "application/msonenote", +"application/msonenote", "application/mspowerpoint", "application/mspowerpoint", +"application/mspowerpoint", "application/mspowerpoint", "application/msword", +"application/msword", "application/msword", "application/msword", +"application/msword", "application/mswrite", "application/mxf", +"application/netmc", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/octet-stream", "application/octet-stream", "application/octet-stream", +"application/oda", "application/oebps-package+xml", "application/ogg", +"application/ogg", "application/olescript", "application/omdoc+xml", +"application/onenote", "application/onenote", "application/onenote", +"application/onenote", "application/oxps", "application/patch-ops-error+xml", +"application/pdf", "application/pgp-encrypted", "application/pgp-keys", +"application/pgp-signature", "application/pgp-signature", "application/pgp-signature", +"application/pics-rules", "application/pkcs-12", "application/pkcs-crl", +"application/pkcs10", "application/pkcs7-mime", "application/pkcs7-mime", +"application/pkcs7-signature", "application/pkcs8", "application/pkix-attr-cert", +"application/pkix-cert", "application/pkix-cert", "application/pkix-crl", +"application/pkix-pkipath", "application/pkixcmp", "application/plain", +"application/pls+xml", "application/postscript", "application/postscript", +"application/postscript", "application/powerpoint", "application/pro_eng", +"application/pro_eng", "application/prs.cww", "application/pskc+xml", +"application/rar", "application/rdf+xml", "application/reginfo+xml", +"application/relax-ng-compact-syntax", "application/resource-lists+xml", +"application/resource-lists-diff+xml", "application/ringing-tones", +"application/rls-services+xml", "application/rpki-ghostbusters", +"application/rpki-manifest", "application/rpki-roa", "application/rsd+xml", +"application/rss+xml", "application/rss+xml", "application/rtf", +"application/rtf", "application/sbml+xml", "application/scvp-cv-request", +"application/scvp-cv-response", "application/scvp-vp-request", +"application/scvp-vp-response", "application/sdp", "application/sea", +"application/set", "application/set-payment-initiation", "application/set-registration-initiation", +"application/shf+xml", "application/sla", "application/smil", +"application/smil", "application/smil+xml", "application/smil+xml", +"application/solids", "application/sounder", "application/sparql-query", +"application/sparql-results+xml", "application/srgs", "application/srgs+xml", +"application/sru+xml", "application/ssdl+xml", "application/ssml+xml", +"application/step", "application/step", "application/streamingmedia", +"application/tei+xml", "application/tei+xml", "application/thraud+xml", +"application/timestamped-data", "application/toolbook", "application/vda", +"application/vnd.3gpp.pic-bw-large", "application/vnd.3gpp.pic-bw-small", +"application/vnd.3gpp.pic-bw-var", "application/vnd.3gpp2.tcap", +"application/vnd.3m.post-it-notes", "application/vnd.accpac.simply.aso", +"application/vnd.accpac.simply.imp", "application/vnd.acucobol", +"application/vnd.acucorp", "application/vnd.acucorp", "application/vnd.adobe.air-application-installer-package+zip", +"application/vnd.adobe.formscentral.fcdt", "application/vnd.adobe.fxp", +"application/vnd.adobe.fxp", "application/vnd.adobe.xdp+xml", +"application/vnd.adobe.xfdf", "application/vnd.ahead.space", +"application/vnd.airzip.filesecure.azf", "application/vnd.airzip.filesecure.azs", +"application/vnd.amazon.ebook", "application/vnd.americandynamics.acc", +"application/vnd.amiga.ami", "application/vnd.android.package-archive", +"application/vnd.anser-web-certificate-issue-initiation", "application/vnd.anser-web-funds-transfer-initiation", +"application/vnd.antix.game-component", "application/vnd.apple.installer+xml", +"application/vnd.apple.mpegurl", "application/vnd.arastra.swi", +"application/vnd.aristanetworks.swi", "application/vnd.astraea-software.iota", +"application/vnd.audiograph", "application/vnd.blueice.multipass", +"application/vnd.bmi", "application/vnd.businessobjects", "application/vnd.chemdraw+xml", +"application/vnd.chipnuts.karaoke-mmd", "application/vnd.cinderella", +"application/vnd.claymore", "application/vnd.cloanto.rp9", "application/vnd.clonk.c4group", +"application/vnd.clonk.c4group", "application/vnd.clonk.c4group", +"application/vnd.clonk.c4group", "application/vnd.clonk.c4group", +"application/vnd.cluetrust.cartomobile-config", "application/vnd.cluetrust.cartomobile-config-pkg", +"application/vnd.commonspace", "application/vnd.contact.cmsg", +"application/vnd.cosmocaller", "application/vnd.crick.clicker", +"application/vnd.crick.clicker.keyboard", "application/vnd.crick.clicker.palette", +"application/vnd.crick.clicker.template", "application/vnd.crick.clicker.wordbank", +"application/vnd.criticaltools.wbs+xml", "application/vnd.ctc-posml", +"application/vnd.cups-ppd", "application/vnd.curl.car", "application/vnd.curl.pcurl", +"application/vnd.dart", "application/vnd.data-vision.rdz", "application/vnd.dece.data", +"application/vnd.dece.data", "application/vnd.dece.data", "application/vnd.dece.data", +"application/vnd.dece.ttml+xml", "application/vnd.dece.ttml+xml", +"application/vnd.dece.unspecified", "application/vnd.dece.unspecified", +"application/vnd.dece.zip", "application/vnd.dece.zip", "application/vnd.denovo.fcselayout-link", +"application/vnd.dna", "application/vnd.dolby.mlp", "application/vnd.dpgraph", +"application/vnd.dreamfactory", "application/vnd.ds-keypoint", +"application/vnd.dvb.ait", "application/vnd.dvb.service", "application/vnd.dynageo", +"application/vnd.ecowin.chart", "application/vnd.enliven", "application/vnd.epson.esf", +"application/vnd.epson.msf", "application/vnd.epson.quickanime", +"application/vnd.epson.salt", "application/vnd.epson.ssf", "application/vnd.eszigno3+xml", +"application/vnd.eszigno3+xml", "application/vnd.ezpix-album", +"application/vnd.ezpix-package", "application/vnd.fdf", "application/vnd.fdsn.mseed", +"application/vnd.fdsn.seed", "application/vnd.fdsn.seed", "application/vnd.flographit", +"application/vnd.fluxtime.clip", "application/vnd.framemaker", +"application/vnd.framemaker", "application/vnd.framemaker", "application/vnd.framemaker", +"application/vnd.frogans.fnc", "application/vnd.frogans.ltf", +"application/vnd.fsc.weblaunch", "application/vnd.fujitsu.oasys", +"application/vnd.fujitsu.oasys2", "application/vnd.fujitsu.oasys3", +"application/vnd.fujitsu.oasysgp", "application/vnd.fujitsu.oasysprs", +"application/vnd.fujixerox.ddd", "application/vnd.fujixerox.docuworks", +"application/vnd.fujixerox.docuworks.binder", "application/vnd.fuzzysheet", +"application/vnd.genomatix.tuxedo", "application/vnd.geogebra.file", +"application/vnd.geogebra.tool", "application/vnd.geometry-explorer", +"application/vnd.geometry-explorer", "application/vnd.geonext", +"application/vnd.geoplan", "application/vnd.geospace", "application/vnd.gmx", +"application/vnd.google-earth.kml+xml", "application/vnd.google-earth.kmz", +"application/vnd.grafeq", "application/vnd.grafeq", "application/vnd.groove-account", +"application/vnd.groove-help", "application/vnd.groove-identity-message", +"application/vnd.groove-injector", "application/vnd.groove-tool-message", +"application/vnd.groove-tool-template", "application/vnd.groove-vcard", +"application/vnd.hal+xml", "application/vnd.handheld-entertainment+xml", +"application/vnd.hbci", "application/vnd.hhe.lesson-player", +"application/vnd.hp-hpgl", "application/vnd.hp-hpgl", "application/vnd.hp-hpgl", +"application/vnd.hp-hpid", "application/vnd.hp-hps", "application/vnd.hp-jlyt", +"application/vnd.hp-pcl", "application/vnd.hp-pclxl", "application/vnd.hydrostatix.sof-data", +"application/vnd.hzn-3d-crossword", "application/vnd.ibm.minipay", +"application/vnd.ibm.modcap", "application/vnd.ibm.modcap", "application/vnd.ibm.modcap", +"application/vnd.ibm.rights-management", "application/vnd.ibm.secure-container", +"application/vnd.iccprofile", "application/vnd.iccprofile", "application/vnd.igloader", +"application/vnd.immervision-ivp", "application/vnd.immervision-ivu", +"application/vnd.insors.igm", "application/vnd.intercon.formnet", +"application/vnd.intercon.formnet", "application/vnd.intergeo", +"application/vnd.intu.qbo", "application/vnd.intu.qfx", "application/vnd.ipunplugged.rcprofile", +"application/vnd.irepository.package+xml", "application/vnd.is-xpr", +"application/vnd.isac.fcs", "application/vnd.jam", "application/vnd.jcp.javame.midlet-rms", +"application/vnd.jisp", "application/vnd.joost.joda-archive", +"application/vnd.kahootz", "application/vnd.kahootz", "application/vnd.kde.karbon", +"application/vnd.kde.kchart", "application/vnd.kde.kformula", +"application/vnd.kde.kivio", "application/vnd.kde.kontour", "application/vnd.kde.kpresenter", +"application/vnd.kde.kpresenter", "application/vnd.kde.kspread", +"application/vnd.kde.kword", "application/vnd.kde.kword", "application/vnd.kenameaapp", +"application/vnd.kidspiration", "application/vnd.kinar", "application/vnd.kinar", +"application/vnd.koan", "application/vnd.koan", "application/vnd.koan", +"application/vnd.koan", "application/vnd.kodak-descriptor", "application/vnd.las.las+xml", +"application/vnd.llamagraphics.life-balance.desktop", "application/vnd.llamagraphics.life-balance.exchange+xml", +"application/vnd.lotus-1-2-3", "application/vnd.lotus-approach", +"application/vnd.lotus-freelance", "application/vnd.lotus-notes", +"application/vnd.lotus-organizer", "application/vnd.lotus-screencam", +"application/vnd.lotus-wordpro", "application/vnd.macports.portpkg", +"application/vnd.mcd", "application/vnd.medcalcdata", "application/vnd.mediastation.cdkey", +"application/vnd.mfer", "application/vnd.mfmp", "application/vnd.micrografx.flo", +"application/vnd.micrografx.igx", "application/vnd.mif", "application/vnd.mobius.daf", +"application/vnd.mobius.dis", "application/vnd.mobius.mbk", "application/vnd.mobius.mqy", +"application/vnd.mobius.msl", "application/vnd.mobius.plc", "application/vnd.mobius.txf", +"application/vnd.mophun.application", "application/vnd.mophun.certificate", +"application/vnd.mozilla.xul+xml", "application/vnd.ms-artgalry", +"application/vnd.ms-cab-compressed", "application/vnd.ms-excel", +"application/vnd.ms-excel", "application/vnd.ms-excel", "application/vnd.ms-excel", +"application/vnd.ms-excel", "application/vnd.ms-excel", "application/vnd.ms-excel", +"application/vnd.ms-excel", "application/vnd.ms-excel.addin.macroEnabled.12", +"application/vnd.ms-excel.addin.macroenabled.12", "application/vnd.ms-excel.sheet.binary.macroEnabled.12", +"application/vnd.ms-excel.sheet.binary.macroenabled.12", "application/vnd.ms-excel.sheet.macroEnabled.12", +"application/vnd.ms-excel.sheet.macroenabled.12", "application/vnd.ms-excel.template.macroEnabled.12", +"application/vnd.ms-excel.template.macroenabled.12", "application/vnd.ms-fontobject", +"application/vnd.ms-htmlhelp", "application/vnd.ms-ims", "application/vnd.ms-lrm", +"application/vnd.ms-officetheme", "application/vnd.ms-outlook", +"application/vnd.ms-pki.certstore", "application/vnd.ms-pki.pko", +"application/vnd.ms-pki.seccat", "application/vnd.ms-pki.stl", +"application/vnd.ms-pkicertstore", "application/vnd.ms-pkiseccat", +"application/vnd.ms-pkistl", "application/vnd.ms-powerpoint", +"application/vnd.ms-powerpoint", "application/vnd.ms-powerpoint", +"application/vnd.ms-powerpoint", "application/vnd.ms-powerpoint", +"application/vnd.ms-powerpoint.addin.macroEnabled.12", "application/vnd.ms-powerpoint.addin.macroenabled.12", +"application/vnd.ms-powerpoint.presentation.macroEnabled.12", +"application/vnd.ms-powerpoint.presentation.macroEnabled.12", +"application/vnd.ms-powerpoint.presentation.macroenabled.12", +"application/vnd.ms-powerpoint.presentation.macroenabled.12", +"application/vnd.ms-powerpoint.slide.macroEnabled.12", "application/vnd.ms-powerpoint.slide.macroenabled.12", +"application/vnd.ms-powerpoint.slideshow.macroEnabled.12", "application/vnd.ms-powerpoint.slideshow.macroenabled.12", +"application/vnd.ms-powerpoint.template.macroEnabled.12", "application/vnd.ms-powerpoint.template.macroenabled.12", +"application/vnd.ms-project", "application/vnd.ms-project", "application/vnd.ms-word.document.macroEnabled.12", +"application/vnd.ms-word.document.macroenabled.12", "application/vnd.ms-word.template.macroEnabled.12", +"application/vnd.ms-word.template.macroenabled.12", "application/vnd.ms-works", +"application/vnd.ms-works", "application/vnd.ms-works", "application/vnd.ms-works", +"application/vnd.ms-wpl", "application/vnd.ms-xpsdocument", "application/vnd.mseq", +"application/vnd.musician", "application/vnd.muvee.style", "application/vnd.mynfc", +"application/vnd.neurolanguage.nlu", "application/vnd.nitf", +"application/vnd.nitf", "application/vnd.noblenet-directory", +"application/vnd.noblenet-sealer", "application/vnd.noblenet-web", +"application/vnd.nokia.configuration-message", "application/vnd.nokia.n-gage.data", +"application/vnd.nokia.n-gage.symbian.install", "application/vnd.nokia.radio-preset", +"application/vnd.nokia.radio-presets", "application/vnd.nokia.ringing-tone", +"application/vnd.novadigm.EDM", "application/vnd.novadigm.EDX", +"application/vnd.novadigm.EXT", "application/vnd.novadigm.edm", +"application/vnd.novadigm.edx", "application/vnd.novadigm.ext", +"application/vnd.oasis.opendocument.chart", "application/vnd.oasis.opendocument.chart-template", +"application/vnd.oasis.opendocument.database", "application/vnd.oasis.opendocument.formula", +"application/vnd.oasis.opendocument.formula-template", "application/vnd.oasis.opendocument.graphics", +"application/vnd.oasis.opendocument.graphics-template", "application/vnd.oasis.opendocument.image", +"application/vnd.oasis.opendocument.image-template", "application/vnd.oasis.opendocument.presentation", +"application/vnd.oasis.opendocument.presentation-template", "application/vnd.oasis.opendocument.spreadsheet", +"application/vnd.oasis.opendocument.spreadsheet-template", "application/vnd.oasis.opendocument.text", +"application/vnd.oasis.opendocument.text-master", "application/vnd.oasis.opendocument.text-master", +"application/vnd.oasis.opendocument.text-template", "application/vnd.oasis.opendocument.text-web", +"application/vnd.olpc-sugar", "application/vnd.oma.dd2+xml", +"application/vnd.openofficeorg.extension", "application/vnd.openxmlformats-officedocument.presentationml.presentation", +"application/vnd.openxmlformats-officedocument.presentationml.slide", +"application/vnd.openxmlformats-officedocument.presentationml.slideshow", +"application/vnd.openxmlformats-officedocument.presentationml.template", +"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", +"application/vnd.openxmlformats-officedocument.spreadsheetml.template", +"application/vnd.openxmlformats-officedocument.wordprocessingml.document", +"application/vnd.openxmlformats-officedocument.wordprocessingml.template", +"application/vnd.osgeo.mapguide.package", "application/vnd.osgi.dp", +"application/vnd.osgi.subsystem", "application/vnd.palm", "application/vnd.palm", +"application/vnd.palm", "application/vnd.pawaafile", "application/vnd.pg.format", +"application/vnd.pg.osasli", "application/vnd.picsel", "application/vnd.pmi.widget", +"application/vnd.pocketlearn", "application/vnd.powerbuilder6", +"application/vnd.previewsystems.box", "application/vnd.proteus.magazine", +"application/vnd.publishare-delta-tree", "application/vnd.pvi.ptid1", +"application/vnd.quark.quarkxpress", "application/vnd.quark.quarkxpress", +"application/vnd.quark.quarkxpress", "application/vnd.quark.quarkxpress", +"application/vnd.quark.quarkxpress", "application/vnd.quark.quarkxpress", +"application/vnd.realvnc.bed", "application/vnd.recordare.musicxml", +"application/vnd.recordare.musicxml+xml", "application/vnd.rig.cryptonote", +"application/vnd.rim.cod", "application/vnd.rn-realmedia", "application/vnd.rn-realmedia-vbr", +"application/vnd.rn-realplayer", "application/vnd.route66.link66+xml", +"application/vnd.sailingtracker.track", "application/vnd.seemail", +"application/vnd.sema", "application/vnd.semd", "application/vnd.semf", +"application/vnd.shana.informed.formdata", "application/vnd.shana.informed.formtemplate", +"application/vnd.shana.informed.interchange", "application/vnd.shana.informed.package", +"application/vnd.simtech-mindmapper", "application/vnd.simtech-mindmapper", +"application/vnd.smaf", "application/vnd.smart.teacher", "application/vnd.solent.sdkm+xml", +"application/vnd.solent.sdkm+xml", "application/vnd.spotfire.dxp", +"application/vnd.spotfire.sfs", "application/vnd.stardivision.calc", +"application/vnd.stardivision.draw", "application/vnd.stardivision.impress", +"application/vnd.stardivision.impress", "application/vnd.stardivision.math", +"application/vnd.stardivision.writer", "application/vnd.stardivision.writer", +"application/vnd.stardivision.writer-global", "application/vnd.stepmania.package", +"application/vnd.stepmania.stepchart", "application/vnd.sun.xml.calc", +"application/vnd.sun.xml.calc.template", "application/vnd.sun.xml.draw", +"application/vnd.sun.xml.draw.template", "application/vnd.sun.xml.impress", +"application/vnd.sun.xml.impress.template", "application/vnd.sun.xml.math", +"application/vnd.sun.xml.writer", "application/vnd.sun.xml.writer.global", +"application/vnd.sun.xml.writer.template", "application/vnd.sus-calendar", +"application/vnd.sus-calendar", "application/vnd.svd", "application/vnd.symbian.install", +"application/vnd.symbian.install", "application/vnd.syncml+xml", +"application/vnd.syncml.dm+wbxml", "application/vnd.syncml.dm+xml", +"application/vnd.tao.intent-module-archive", "application/vnd.tcpdump.pcap", +"application/vnd.tcpdump.pcap", "application/vnd.tcpdump.pcap", +"application/vnd.tmobile-livetv", "application/vnd.trid.tpt", +"application/vnd.triscape.mxs", "application/vnd.trueapp", "application/vnd.ufdl", +"application/vnd.ufdl", "application/vnd.uiq.theme", "application/vnd.umajin", +"application/vnd.unity", "application/vnd.uoml+xml", "application/vnd.vcx", +"application/vnd.visio", "application/vnd.visio", "application/vnd.visio", +"application/vnd.visio", "application/vnd.visionary", "application/vnd.vsf", +"application/vnd.wap.sic", "application/vnd.wap.slc", "application/vnd.wap.wbxml", +"application/vnd.wap.wmlc", "application/vnd.wap.wmlscriptc", +"application/vnd.webturbo", "application/vnd.wolfram.player", +"application/vnd.wordperfect", "application/vnd.wqd", "application/vnd.wt.stf", +"application/vnd.xara", "application/vnd.xara", "application/vnd.xfdl", +"application/vnd.yamaha.hv-dic", "application/vnd.yamaha.hv-script", +"application/vnd.yamaha.hv-voice", "application/vnd.yamaha.openscoreformat", +"application/vnd.yamaha.openscoreformat.osfpvg+xml", "application/vnd.yamaha.smaf-audio", +"application/vnd.yamaha.smaf-phrase", "application/vnd.yellowriver-custom-menu", +"application/vnd.zul", "application/vnd.zul", "application/vnd.zzazz.deck+xml", +"application/vocaltec-media-desc", "application/vocaltec-media-file", +"application/voicexml+xml", "application/widget", "application/winhlp", +"application/wordperfect", "application/wordperfect", "application/wordperfect", +"application/wordperfect", "application/wordperfect5.1", "application/wordperfect6.0", +"application/wordperfect6.0", "application/wordperfect6.1", "application/wsdl+xml", +"application/wspolicy+xml", "application/x-123", "application/x-123", +"application/x-7z-compressed", "application/x-abiword", "application/x-ace-compressed", +"application/x-aim", "application/x-apple-diskimage", "application/x-authorware-bin", +"application/x-authorware-bin", "application/x-authorware-bin", +"application/x-authorware-bin", "application/x-authorware-map", +"application/x-authorware-seg", "application/x-bcpio", "application/x-binary", +"application/x-binhex40", "application/x-bittorrent", "application/x-blorb", +"application/x-blorb", "application/x-bsh", "application/x-bsh", +"application/x-bsh", "application/x-bytecode.elisp", "application/x-bytecode.elisp(compiledelisp)", +"application/x-bzip", "application/x-bzip2", "application/x-bzip2", +"application/x-cbr", "application/x-cbr", "application/x-cbr", +"application/x-cbr", "application/x-cbr", "application/x-cdf", +"application/x-cdlink", "application/x-cfs-compressed", "application/x-chat", +"application/x-chat", "application/x-chess-pgn", "application/x-chm", +"application/x-chrome-extension", "application/x-cmu-raster", +"application/x-cocoa", "application/x-compactpro", "application/x-compress", +"application/x-compressed", "application/x-compressed", "application/x-compressed", +"application/x-compressed", "application/x-conference", "application/x-cpio", +"application/x-cpt", "application/x-csh", "application/x-debian-package", +"application/x-debian-package", "application/x-deepv", "application/x-dgc-compressed", +"application/x-director", "application/x-director", "application/x-director", +"application/x-director", "application/x-director", "application/x-director", +"application/x-director", "application/x-director", "application/x-director", +"application/x-dms", "application/x-doom", "application/x-dtbncx+xml", +"application/x-dtbook+xml", "application/x-dtbresource+xml", +"application/x-dvi", "application/x-elc", "application/x-envoy", +"application/x-envoy", "application/x-esrehber", "application/x-eva", +"application/x-excel", "application/x-excel", "application/x-excel", +"application/x-excel", "application/x-excel", "application/x-excel", +"application/x-excel", "application/x-excel", "application/x-excel", +"application/x-excel", "application/x-excel", "application/x-flac", +"application/x-font", "application/x-font", "application/x-font", +"application/x-font", "application/x-font", "application/x-font-bdf", +"application/x-font-ghostscript", "application/x-font-linux-psf", +"application/x-font-otf", "application/x-font-pcf", "application/x-font-snf", +"application/x-font-ttf", "application/x-font-ttf", "application/x-font-type1", +"application/x-font-type1", "application/x-font-type1", "application/x-font-type1", +"application/x-font-woff", "application/x-frame", "application/x-freearc", +"application/x-freelance", "application/x-futuresplash", "application/x-gca-compressed", +"application/x-glulx", "application/x-gnumeric", "application/x-go-sgf", +"application/x-gramps-xml", "application/x-graphing-calculator", +"application/x-gsp", "application/x-gss", "application/x-gtar", +"application/x-gtar", "application/x-gtar", "application/x-gzip", +"application/x-gzip", "application/x-gzip", "application/x-hdf", +"application/x-helpfile", "application/x-helpfile", "application/x-httpd-imap", +"application/x-httpd-php", "application/x-httpd-php", "application/x-httpd-php", +"application/x-httpd-php-source", "application/x-httpd-php3", +"application/x-httpd-php3-preprocessed", "application/x-httpd-php4", +"application/x-ica", "application/x-ima", "application/x-install-instructions", +"application/x-internet-signup", "application/x-internet-signup", +"application/x-internett-signup", "application/x-inventor", "application/x-ip2", +"application/x-iphone", "application/x-iso9660-image", "application/x-java-archive", +"application/x-java-class", "application/x-java-commerce", "application/x-java-jnlp-file", +"application/x-java-serialized-object", "application/x-java-vm", +"application/x-javascript", "application/x-kchart", "application/x-killustrator", +"application/x-koan", "application/x-koan", "application/x-koan", +"application/x-koan", "application/x-kpresenter", "application/x-kpresenter", +"application/x-ksh", "application/x-kspread", "application/x-kword", +"application/x-kword", "application/x-latex", "application/x-latex", +"application/x-lha", "application/x-lisp", "application/x-livescreen", +"application/x-lotus", "application/x-lotusscreencam", "application/x-lua-bytecode", +"application/x-lzh", "application/x-lzh-compressed", "application/x-lzh-compressed", +"application/x-lzx", "application/x-mac-binhex40", "application/x-macbinary", +"application/x-magic-cap-package-1.0", "application/x-maker", +"application/x-maker", "application/x-maker", "application/x-maker", +"application/x-maker", "application/x-maker", "application/x-maker", +"application/x-mathcad", "application/x-meme", "application/x-midi", +"application/x-midi", "application/x-mie", "application/x-mif", +"application/x-mix-transfer", "application/x-mobipocket-ebook", +"application/x-mobipocket-ebook", "application/x-mpegURL", "application/x-mplayer2", +"application/x-ms-application", "application/x-ms-shortcut", +"application/x-ms-wmd", "application/x-ms-wmz", "application/x-ms-xbap", +"application/x-msaccess", "application/x-msbinder", "application/x-mscardfile", +"application/x-msclip", "application/x-msdos-program", "application/x-msdos-program", +"application/x-msdos-program", "application/x-msdos-program", +"application/x-msdownload", "application/x-msdownload", "application/x-msdownload", +"application/x-msdownload", "application/x-msdownload", "application/x-msexcel", +"application/x-msexcel", "application/x-msexcel", "application/x-msi", +"application/x-msmediaview", "application/x-msmediaview", "application/x-msmediaview", +"application/x-msmetafile", "application/x-msmetafile", "application/x-msmetafile", +"application/x-msmetafile", "application/x-msmoney", "application/x-mspowerpoint", +"application/x-mspublisher", "application/x-msschedule", "application/x-msterminal", +"application/x-mswrite", "application/x-navi-animation", "application/x-navidoc", +"application/x-navimap", "application/x-navistyle", "application/x-netcdf", +"application/x-netcdf", "application/x-newton-compatible-pkg", +"application/x-nokia-9000-communicator-add-on-software", "application/x-ns-proxy-autoconfig", +"application/x-nwc", "application/x-nzb", "application/x-object", +"application/x-omc", "application/x-omcdatamaker", "application/x-omcregerator", +"application/x-oz-application", "application/x-pagemaker", "application/x-pagemaker", +"application/x-pcl", "application/x-perfmon", "application/x-perfmon", +"application/x-perfmon", "application/x-perfmon", "application/x-perfmon", +"application/x-pixclscript", "application/x-pkcs10", "application/x-pkcs12", +"application/x-pkcs12", "application/x-pkcs7-certificates", "application/x-pkcs7-certificates", +"application/x-pkcs7-certreqresp", "application/x-pkcs7-crl", +"application/x-pkcs7-mime", "application/x-pkcs7-mime", "application/x-pkcs7-signature", +"application/x-pkcs7-signature", "application/x-pointplus", "application/x-portable-anymap", +"application/x-project", "application/x-project", "application/x-project", +"application/x-project", "application/x-python-code", "application/x-python-code", +"application/x-qpro", "application/x-quicktimeplayer", "application/x-rar-compressed", +"application/x-redhat-package-manager", "application/x-research-info-systems", +"application/x-rpm", "application/x-rtf", "application/x-sdp", +"application/x-sea", "application/x-seelogo", "application/x-sh", +"application/x-shar", "application/x-shar", "application/x-shockwave-flash", +"application/x-shockwave-flash", "application/x-silverlight-app", +"application/x-sit", "application/x-sprite", "application/x-sprite", +"application/x-sql", "application/x-stuffit", "application/x-stuffitx", +"application/x-subrip", "application/x-sv4cpio", "application/x-sv4crc", +"application/x-t3vm-image", "application/x-tads", "application/x-tar", +"application/x-tbook", "application/x-tbook", "application/x-tcl", +"application/x-tex", "application/x-tex-gf", "application/x-tex-pk", +"application/x-tex-tfm", "application/x-texinfo", "application/x-texinfo", +"application/x-tgif", "application/x-trash", "application/x-trash", +"application/x-trash", "application/x-trash", "application/x-trash", +"application/x-troff", "application/x-troff", "application/x-troff", +"application/x-troff-man", "application/x-troff-me", "application/x-troff-ms", +"application/x-troff-msvideo", "application/x-ustar", "application/x-visio", +"application/x-visio", "application/x-visio", "application/x-vnd.audioexplosion.mzz", +"application/x-vnd.ls-xpix", "application/x-vrml", "application/x-wais-source", +"application/x-wais-source", "application/x-web-app-manifest+json", +"application/x-wingz", "application/x-winhelp", "application/x-wintalk", +"application/x-world", "application/x-world", "application/x-wpwin", +"application/x-wri", "application/x-x509-ca-cert", "application/x-x509-ca-cert", +"application/x-x509-ca-cert", "application/x-x509-user-cert", +"application/x-xcf", "application/x-xfig", "application/x-xliff+xml", +"application/x-xpinstall", "application/x-xz", "application/x-zip-compressed", +"application/x-zmachine", "application/x-zmachine", "application/x-zmachine", +"application/x-zmachine", "application/x-zmachine", "application/x-zmachine", +"application/x-zmachine", "application/x-zmachine", "application/xaml+xml", +"application/xcap-diff+xml", "application/xenc+xml", "application/xhtml+xml", +"application/xhtml+xml", "application/xml", "application/xml", +"application/xml", "application/xml-dtd", "application/xop+xml", +"application/xproc+xml", "application/xslt+xml", "application/xspf+xml", +"application/xv+xml", "application/xv+xml", "application/xv+xml", +"application/xv+xml", "application/yang", "application/yin+xml", +"application/ynd.ms-pkipko", "application/zip", "audio/adpcm", +"audio/aiff", "audio/aiff", "audio/aiff", "audio/basic", "audio/basic", +"audio/flac", "audio/it", "audio/make", "audio/make", "audio/make", +"audio/make.my.funk", "audio/mid", "audio/mid", "audio/midi", +"audio/midi", "audio/midi", "audio/midi", "audio/mod", "audio/mp4", +"audio/mp4", "audio/mpeg", "audio/mpeg", "audio/mpeg", "audio/mpeg", +"audio/mpeg", "audio/mpeg", "audio/mpeg", "audio/mpeg", "audio/mpeg", +"audio/mpeg", "audio/mpeg3", "audio/mpegurl", "audio/nspaudio", +"audio/nspaudio", "audio/ogg", "audio/ogg", "audio/ogg", "audio/prs.sid", +"audio/s3m", "audio/silk", "audio/tsp-audio", "audio/tsplayer", +"audio/vnd.dece.audio", "audio/vnd.dece.audio", "audio/vnd.digital-winds", +"audio/vnd.dra", "audio/vnd.dts", "audio/vnd.dts.hd", "audio/vnd.lucent.voice", +"audio/vnd.ms-playready.media.pya", "audio/vnd.nuera.ecelp4800", +"audio/vnd.nuera.ecelp7470", "audio/vnd.nuera.ecelp9600", "audio/vnd.qcelp", +"audio/vnd.rip", "audio/voc", "audio/voxware", "audio/wav", "audio/webm", +"audio/x-aac", "audio/x-adpcm", "audio/x-aiff", "audio/x-aiff", +"audio/x-aiff", "audio/x-au", "audio/x-caf", "audio/x-flac", +"audio/x-gsm", "audio/x-gsm", "audio/x-jam", "audio/x-liveaudio", +"audio/x-matroska", "audio/x-mid", "audio/x-mid", "audio/x-midi", +"audio/x-midi", "audio/x-mod", "audio/x-mpeg", "audio/x-mpeg-3", +"audio/x-mpegurl", "audio/x-mpequrl", "audio/x-ms-wax", "audio/x-ms-wma", +"audio/x-nspaudio", "audio/x-nspaudio", "audio/x-pn-realaudio", +"audio/x-pn-realaudio", "audio/x-pn-realaudio", "audio/x-pn-realaudio", +"audio/x-pn-realaudio", "audio/x-pn-realaudio-plugin", "audio/x-pn-realaudio-plugin", +"audio/x-pn-realaudio-plugin", "audio/x-psid", "audio/x-realaudio", +"audio/x-scpls", "audio/x-sd2", "audio/x-twinvq", "audio/x-twinvq-plugin", +"audio/x-twinvq-plugin", "audio/x-vnd.audioexplosion.mjuicemediafile", +"audio/x-voc", "audio/x-wav", "audio/xm", "chemical/x-cdx", "chemical/x-cif", +"chemical/x-cmdf", "chemical/x-cml", "chemical/x-csml", "chemical/x-pdb", +"chemical/x-pdb", "chemical/x-xyz", "drawing/x-dwf", "drawing/x-dwf(old)", +"font/opentype", "i-world/i-vrml", "image/bmp", "image/bmp", +"image/cgm", "image/cis-cod", "image/cmu-raster", "image/cmu-raster", +"image/fif", "image/florian", "image/florian", "image/g3fax", +"image/gif", "image/ief", "image/ief", "image/jpeg", "image/jpeg", +"image/jpeg", "image/jpeg", "image/jpeg", "image/jutvision", +"image/ktx", "image/naplps", "image/naplps", "image/pcx", "image/pict", +"image/pict", "image/pipeg", "image/pjpeg", "image/pjpeg", "image/pjpeg", +"image/pjpeg", "image/png", "image/png", "image/prs.btif", "image/sgi", +"image/svg+xml", "image/svg+xml", "image/tiff", "image/tiff", +"image/vasa", "image/vnd.adobe.photoshop", "image/vnd.dece.graphic", +"image/vnd.dece.graphic", "image/vnd.dece.graphic", "image/vnd.dece.graphic", +"image/vnd.djvu", "image/vnd.djvu", "image/vnd.dvb.subtitle", +"image/vnd.dwg", "image/vnd.dwg", "image/vnd.dwg", "image/vnd.dxf", +"image/vnd.fastbidsheet", "image/vnd.fpx", "image/vnd.fpx", "image/vnd.fst", +"image/vnd.fujixerox.edmics-mmr", "image/vnd.fujixerox.edmics-rlc", +"image/vnd.ms-modi", "image/vnd.ms-photo", "image/vnd.net-fpx", +"image/vnd.net-fpx", "image/vnd.rn-realflash", "image/vnd.rn-realpix", +"image/vnd.wap.wbmp", "image/vnd.xiff", "image/webp", "image/x-3ds", +"image/x-cmu-rast", "image/x-cmu-raster", "image/x-cmx", "image/x-coreldraw", +"image/x-coreldrawpattern", "image/x-coreldrawtemplate", "image/x-corelphotopaint", +"image/x-dwg", "image/x-dwg", "image/x-dwg", "image/x-freehand", +"image/x-freehand", "image/x-freehand", "image/x-freehand", "image/x-freehand", +"image/x-icon", "image/x-jg", "image/x-jng", "image/x-jps", "image/x-mrsid-image", +"image/x-ms-bmp", "image/x-niff", "image/x-niff", "image/x-pcx", +"image/x-photoshop", "image/x-pict", "image/x-pict", "image/x-portable-anymap", +"image/x-portable-bitmap", "image/x-portable-graymap", "image/x-portable-greymap", +"image/x-portable-pixmap", "image/x-quicktime", "image/x-quicktime", +"image/x-quicktime", "image/x-rgb", "image/x-tga", "image/x-tiff", +"image/x-tiff", "image/x-windows-bmp", "image/x-xbitmap", "image/x-xbitmap", +"image/x-xbm", "image/x-xpixmap", "image/x-xpixmap", "image/x-xwd", +"image/x-xwindowdump", "image/xbm", "image/xpm", "message/rfc822", +"message/rfc822", "message/rfc822", "message/rfc822", "message/rfc822", +"model/iges", "model/iges", "model/mesh", "model/mesh", "model/mesh", +"model/vnd.collada+xml", "model/vnd.dwf", "model/vnd.gdl", "model/vnd.gtw", +"model/vnd.mts", "model/vnd.vtu", "model/vrml", "model/vrml", +"model/vrml", "model/x-pov", "model/x3d+binary", "model/x3d+binary", +"model/x3d+vrml", "model/x3d+vrml", "model/x3d+xml", "model/x3d+xml", +"multipart/x-gzip", "multipart/x-ustar", "multipart/x-zip", "music/crescendo", +"music/crescendo", "music/x-karaoke", "paleovu/x-pv", "text/asp", +"text/cache-manifest", "text/cache-manifest", "text/calendar", +"text/calendar", "text/calendar", "text/comma-separated-values", +"text/css", "text/csv", "text/ecmascript", "text/event-stream", +"text/h323", "text/html", "text/html", "text/html", "text/html", +"text/html", "text/html", "text/html", "text/iuls", "text/javascript", +"text/mathml", "text/mcf", "text/n3", "text/pascal", "text/plain", +"text/plain", "text/plain", "text/plain", "text/plain", "text/plain", +"text/plain", "text/plain", "text/plain", "text/plain", "text/plain", +"text/plain", "text/plain", "text/plain", "text/plain", "text/plain", +"text/plain", "text/plain", "text/plain", "text/plain", "text/plain", +"text/plain", "text/plain", "text/plain", "text/plain", "text/plain", +"text/plain", "text/plain", "text/plain", "text/plain", "text/plain", +"text/plain", "text/plain-bas", "text/prs.lines.tag", "text/richtext", +"text/richtext", "text/richtext", "text/rtf", "text/scriplet", +"text/scriptlet", "text/scriptlet", "text/sgml", "text/sgml", +"text/tab-separated-values", "text/texmacs", "text/texmacs", +"text/troff", "text/troff", "text/troff", "text/troff", "text/troff", +"text/troff", "text/turtle", "text/uri-list", "text/uri-list", +"text/uri-list", "text/uri-list", "text/uri-list", "text/vcard", +"text/vnd.abc", "text/vnd.curl", "text/vnd.curl.dcurl", "text/vnd.curl.mcurl", +"text/vnd.curl.scurl", "text/vnd.dvb.subtitle", "text/vnd.fly", +"text/vnd.fmi.flexstor", "text/vnd.graphviz", "text/vnd.in3d.3dml", +"text/vnd.in3d.spot", "text/vnd.rn-realtext", "text/vnd.sun.j2me.app-descriptor", +"text/vnd.wap.si", "text/vnd.wap.sl", "text/vnd.wap.wml", "text/vnd.wap.wmlscript", +"text/vtt", "text/webviewhtml", "text/x-asm", "text/x-asm", "text/x-audiosoft-intra", +"text/x-c", "text/x-c", "text/x-c", "text/x-c", "text/x-c", "text/x-c", +"text/x-c", "text/x-c++hdr", "text/x-c++hdr", "text/x-c++hdr", +"text/x-c++hdr", "text/x-c++src", "text/x-c++src", "text/x-c++src", +"text/x-c++src", "text/x-chdr", "text/x-component", "text/x-csh", +"text/x-csrc", "text/x-fortran", "text/x-fortran", "text/x-fortran", +"text/x-fortran", "text/x-h", "text/x-h", "text/x-java", "text/x-java-source", +"text/x-java-source", "text/x-la-asf", "text/x-lua", "text/x-m", +"text/x-markdown", "text/x-markdown", "text/x-markdown", "text/x-moc", +"text/x-nfo", "text/x-opml", "text/x-pascal", "text/x-pascal", +"text/x-pcs-gcd", "text/x-perl", "text/x-perl", "text/x-python", +"text/x-script", "text/x-script.csh", "text/x-script.elisp", +"text/x-script.guile", "text/x-script.ksh", "text/x-script.lisp", +"text/x-script.perl", "text/x-script.perl-module", "text/x-script.phyton", +"text/x-script.rexx", "text/x-script.scheme", "text/x-script.sh", +"text/x-script.tcl", "text/x-script.tcsh", "text/x-script.zsh", +"text/x-server-parsed-html", "text/x-server-parsed-html", "text/x-setext", +"text/x-sfv", "text/x-sgml", "text/x-sgml", "text/x-sh", "text/x-speech", +"text/x-speech", "text/x-tcl", "text/x-tcl", "text/x-tex", "text/x-tex", +"text/x-tex", "text/x-tex", "text/x-uil", "text/x-uuencode", +"text/x-uuencode", "text/x-vcalendar", "text/x-vcard", "text/xml", +"video/3gpp", "video/3gpp2", "video/MP2T", "video/animaflex", +"video/avi", "video/avs-video", "video/dl", "video/flc", "video/flc", +"video/fli", "video/fli", "video/gl", "video/h261", "video/h263", +"video/h264", "video/jpeg", "video/jpm", "video/jpm", "video/mj2", +"video/mj2", "video/mp4", "video/mp4", "video/mp4", "video/mpeg", +"video/mpeg", "video/mpeg", "video/mpeg", "video/mpeg", "video/mpeg", +"video/mpeg", "video/mpeg", "video/mpeg", "video/msvideo", "video/ogg", +"video/quicktime", "video/quicktime", "video/quicktime", "video/vdo", +"video/vivo", "video/vivo", "video/vnd.dece.hd", "video/vnd.dece.hd", +"video/vnd.dece.mobile", "video/vnd.dece.mobile", "video/vnd.dece.pd", +"video/vnd.dece.pd", "video/vnd.dece.sd", "video/vnd.dece.sd", +"video/vnd.dece.video", "video/vnd.dece.video", "video/vnd.dvb.file", +"video/vnd.fvt", "video/vnd.mpegurl", "video/vnd.mpegurl", "video/vnd.ms-playready.media.pyv", +"video/vnd.rn-realvideo", "video/vnd.uvvu.mp4", "video/vnd.uvvu.mp4", +"video/vnd.vivo", "video/vnd.vivo", "video/vosaic", "video/webm", +"video/x-amt-demorun", "video/x-amt-showrun", "video/x-atomic3d-feature", +"video/x-dl", "video/x-dv", "video/x-dv", "video/x-f4v", "video/x-fli", +"video/x-flv", "video/x-gl", "video/x-isvideo", "video/x-la-asf", +"video/x-la-asf", "video/x-m4v", "video/x-matroska", "video/x-matroska", +"video/x-matroska", "video/x-mng", "video/x-motion-jpeg", "video/x-mpeg", +"video/x-mpeg", "video/x-mpeq2a", "video/x-ms-asf", "video/x-ms-asf", +"video/x-ms-asf", "video/x-ms-asf-plugin", "video/x-ms-vob", +"video/x-ms-wm", "video/x-ms-wmv", "video/x-ms-wmx", "video/x-ms-wvx", +"video/x-msvideo", "video/x-qtc", "video/x-scm", "video/x-sgi-movie", +"video/x-sgi-movie", "video/x-smv", "windows/metafile", "www/mime", +"x-conference/x-cooltalk", "x-music/x-midi", "x-music/x-midi", +"x-world/x-3dmf", "x-world/x-3dmf", "x-world/x-3dmf", "x-world/x-3dmf", +"x-world/x-svr", "x-world/x-vrml", "x-world/x-vrml", "x-world/x-vrml", +"x-world/x-vrml", "x-world/x-vrml", "x-world/x-vrml", "x-world/x-vrml", +"x-world/x-vrt", "xgl/drawing", "xgl/movie", "application/mathematica", +"application/msword", "application/octet-stream", "application/onenote", +"application/pgp-signature", "application/pkcs7-mime", "application/postscript", +"application/smil+xml", "application/vnd.acucorp", "application/vnd.clonk.c4group", +"application/vnd.eszigno3+xml", "application/vnd.fdsn.seed", +"application/vnd.framemaker", "application/vnd.geometry-explorer", +"application/vnd.grafeq", "application/vnd.ibm.modcap", "application/vnd.iccprofile", +"application/vnd.intercon.formnet", "application/vnd.kahootz", +"application/vnd.kde.kpresenter", "application/vnd.kde.kword", +"application/vnd.kinar", "application/vnd.koan", "application/vnd.ms-excel", +"application/vnd.ms-powerpoint", "application/vnd.ms-project", +"application/vnd.ms-works", "application/vnd.palm", "application/vnd.quark.quarkxpress", +"application/vnd.simtech-mindmapper", "application/vnd.solent.sdkm+xml", +"application/vnd.sus-calendar", "application/vnd.symbian.install", +"application/vnd.ufdl", "application/vnd.visio", "application/vnd.zul", +"application/x-authorware-bin", "application/x-bzip2", "application/x-debian-package", +"application/x-director", "application/x-font-ttf", "application/x-font-type1", +"application/x-mobipocket-ebook", "application/x-msdownload", +"application/x-msmediaview", "application/x-netcdf", "application/x-pkcs12", +"application/x-pkcs7-certificates", "application/x-texinfo", +"application/x-x509-ca-cert", "application/xhtml+xml", "application/xml", +"application/xv+xml", "audio/basic", "audio/midi", "audio/mpeg", +"audio/ogg", "audio/x-aiff", "audio/x-pn-realaudio", "image/jpeg", +"image/svg+xml", "image/tiff", "image/vnd.djvu", "image/x-freehand", +"image/x-pict", "message/rfc822", "model/iges", "model/mesh", +"model/vrml", "text/calendar", "text/html", "text/plain", "text/sgml", +"text/troff", "text/uri-list", "text/x-asm", "text/x-c", "text/x-fortran", +"text/x-pascal", "video/jpm", "video/mj2", "video/mp4", "video/mpeg", +"video/quicktime", "video/vnd.mpegurl", "video/x-ms-asf")), row.names = c(NA, +-1763L), class = c("tbl_df", "tbl", "data.frame"), .Names = c("extension", +"mime_type")) -> simplemagic_mime_db diff --git a/R/check-office.R b/R/check-office.R new file mode 100644 index 0000000..4b0bbed --- /dev/null +++ b/R/check-office.R @@ -0,0 +1,32 @@ +check_office <- function(hdr, path) { + + # [Content_Types.xml] || length 19 + c( + 0x5b,0x43,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x5f,0x54, + 0x79,0x70,0x65,0x73,0x5d,0x2e,0x78,0x6d,0x6c + ) -> pat_content_types + + # _rels/.rels || length 11 + pat_rels <- c(0x5f,0x72,0x65,0x6c,0x73,0x2f,0x2e,0x72,0x65,0x6c,0x73) + + if ((all(pat_content_types == hdr[31:49])) || (all(pat_rels == hdr[31:41]))) { + + hdr <- readBin(path, "raw", n=4096) + + pat_word <- c(0x77,0x6f,0x72,0x64,0x2f) + if (length(seq_in(hdr, pat_word)) > 0) + return("application/vnd.openxmlformats-officedocument.wordprocessingml.document") + + pat_ppt <- c(0x70,0x70,0x74,0x2f) + if (length(seq_in(hdr, pat_ppt)) > 0) + return("application/vnd.openxmlformats-officedocument.presentationml.presentation") + + pat_xl <- c(0x78,0x6c,0x2f) + if (length(seq_in(hdr, pat_xl)) > 0) + return("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") + + } + + return(NULL) + +} diff --git a/R/datasets.r b/R/datasets.r deleted file mode 100644 index ae41e2d..0000000 --- a/R/datasets.r +++ /dev/null @@ -1,31 +0,0 @@ -#' @title MIME Types Database -#' @description This is a dataset of all mime types. It aggregates data from the -#' following sources: -#' -#' \itemize{ -#' \item \url{http://www.iana.org/assignments/media-types/media-types.xhtml} -#' \item \url{http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types} -#' \item \url{http://hg.nginx.org/nginx/raw-file/default/conf/mime.types} -#' } -#' -#' There are a total of four possible fields per element: -#' -#' \itemize{ -#' \item \code{source}: where the mime type is defined. If not set, it's -#' probably a custom media type. One of \code{apache}, \code{iana} or \code{nginx}. -#' \item \code{extensions}: a character vector of known extensions associated with this mime type. -#' \item \code{compressible}: whether a file of this type can be "gzipped" (mostly -#' useful in the context of serving up web content). -#' \item \code{charset}: the default charset associated with this type, if any. -#' } -#' -#' @docType data -#' @keywords datasets -#' @name mime_db -#' -#' @references Ingested from \url{https://github.com/jshttp/mime-db}. -#' @usage data(mime_db) -#' @note Last updated 2016-08-14; the only guaranteed field is \code{source} -#' @format A list with 1,883 elements and four named fields: \code{source}, -#' \code{compressible}, \code{extensions} & \code{charset}. -NULL \ No newline at end of file diff --git a/R/get-content-type.R b/R/get-content-type.R new file mode 100644 index 0000000..cad1721 --- /dev/null +++ b/R/get-content-type.R @@ -0,0 +1,116 @@ +#' Discover MIME type of a file based on contents +#' +#' There are a limited number of header "magic" bytes checked directly by +#' this function but cover quite a bit of ground. After that, [guess_content_type()] is called which uses +#' file extension-to-MIME mappings. File an issue or PR if more magic-byte-level +#' comparisons are required/desired. If no match is found, `???` is returned. +#' +#' @details +#' Initial in-R header mapping logic borrowed from `MimeTypes.java` from +#' [`servoy-client`](https://github.com/Servoy/servoy-client) +#' +#' @md +#' @param path path to a file +#' @return character vector +#' @export +#' @examples +#' get_content_type(system.file("extdat", "test.pdf", package="simplemagic")) +get_content_type <- function(path) { + + path <- path.expand(path) + if (!file.exists(path)) stop("File not found.", call.=FALSE) + + hdr <- readBin(path, "raw", n=1024) + + if (all(c(0xCA,0xFE,0xBA,0xBE) == hdr[1:4])) return("application/java-vm") + + if (all(c(0xD0,0xCF,0x11,0xE0,0xA1,0xB1,0x1A,0xE1) == hdr[1:8])) { + guessed_name <- guess_content_type(path) + if ((length(guessed_name) == 1) && (guessed_name != "???")) return(guessed_name) + return("application/msword") + } + + if (all(c(0x25,0x50,0x44,0x46,0x2d,0x31,0x2e) == hdr[1:7])) return("application/pdf") + if (all(c(0x25,0x50,0x44,0x46) == hdr[1:4])) return("application/x-pdf") + + if (all(c(0x38,0x42,0x50,0x53,0x00,0x01) == hdr[1:6])) return("image/photoshop") + + if (all(c(0x25,0x21,0x50,0x53) == hdr[1:4])) return("application/postscript") + + if (all(c(0xff,0xfb,0x30) == hdr[1:3])) return("audio/mp3") + if (all(c(0xff,0xfb,0xd0) == hdr[1:3])) return("audio/mp3") + if (all(c(0xff,0xfb,0x90) == hdr[1:3])) return("audio/mp3") + if (all(c(0x49,0x44,0x33) == hdr[1:3])) return("audio/mp3") + if (all(c(0xAC,0xED) == hdr[1:2])) return("application/x-java-serialized-object") + + if (hdr[1] == 0x3c) { # "<" + if (all(c(0x68,0x74,0x6d,0x6c) == hdr[2:5])) return("text/html") # "html" + if (all(c(0x48,0x54,0x4d,0x4c) == hdr[2:5])) return("text/html") # "HTML" + if (all(c(0x48,0x45,0x41,0x44) == hdr[2:5])) return("text/html") # "HEAD" + if (all(c(0x68,0x65,0x61,0x64) == hdr[2:5])) return("text/html") # "head" + if (all(c(0x3f,0x78,0x6d,0x6c,0x20) == hdr[2:6])) return("application/xml") + } + + if (all(c(0xfe,0xff) == hdr[1:2])) { + if (all(c(0x00,0x3c,0x00,0x3f,0x00,0x78) == hdr[3:8])) return("application/xml") + } + + if (all(c(0x42,0x4d) == hdr[1:2])) return("image/bmp") + if (all(c(0x49,0x49,0x2a,0x00) == hdr[1:4])) return("image/tiff") + if (all(c(0x4D,0x4D,0x00,0x2a) == hdr[1:4])) return("image/tiff") + if (all(c(0x47,0x49,0x46,0x38) == hdr[1:4])) return("image/gif") + if (all(c(0x23,0x64,0x65,0x66) == hdr[1:4])) return("image/x-bitmap") + if (all(c(0x21,0x20,0x58,0x50,0x4d,0x32) == hdr[1:6])) return("image/x-pixmap") + if (all(c(137,80,78,71,13,10,26,10) == hdr[1:8])) return("image/png") + + if (all(c(0x23,0x21,0x2f,0x62,0x69,0x6e,0x2f,0x6e,0x6f,0x64,0x65) == hdr[1:11])) + return("application/javascript") + if (all(c(0x23,0x21,0x2f,0x62,0x69,0x6e,0x2f,0x6e,0x6f,0x64,0x65,0x6a,0x73) == hdr[1:13])) + return("application/javascript") + if (all(c(0x23,0x21,0x2f,0x75,0x73,0x72,0x2f,0x62,0x69,0x6e,0x2f,0x6e,0x6f,0x64,0x65) == hdr[1:15])) + return("application/javascript") + if (all(c(0x23,0x21,0x2f,0x75,0x73,0x72,0x2f,0x62,0x69,0x6e,0x2f,0x6e,0x6f,0x64,0x65,0x6a,0x73) == hdr[1:17])) + return("application/javascript") + if (all(c(0x23,0x21,0x2f,0x75,0x73,0x72,0x2f,0x62,0x69,0x6e,0x2f,0x65,0x6e,0x76,0x20,0x6e,0x6f,0x64,0x65) == hdr[1:19])) + return("application/javascript") + if (all(c(0x23,0x21,0x2f,0x75,0x73,0x72,0x2f,0x62,0x69,0x6e,0x2f,0x65,0x6e,0x76,0x20,0x6e,0x6f,0x64,0x65,0x6a,0x73) == hdr[1:21])) + return("application/javascript") + + if (all(c(0xFF,0xD8,0xFF) == hdr[1:3])) { + if (0xE0 == hdr[4]) return("image/jpeg") + if (0xE1 == hdr[4]) { + if (all(c(0x45,0x78,0x69,0x66,0x00) == hdr[7:11])) return("image/jpeg") # Exif + } + if (0xEE == hdr[4]) return("image/jpg") + } + + if (all(c(0x41,0x43) == hdr[1:2]) && all(c(0x00,0x00,0x00,0x00,0x00) == hdr[7:11])) + return("application/acad") + + if (all(c(0x2E,0x73,0x6E,0x64) == hdr[1:4])) return("audio/basic") + if (all(c(0x64,0x6E,0x73,0x2E) == hdr[1:4])) return("audio/basic") + if (all(c(0x52,0x49,0x46,0x46) == hdr[1:4])) return("audio/x-wav") # "RIFF" + + if (all(c(0x50, 0x4b) == hdr[1:2])) { # "PK" + + office_type <- check_office(hdr, path) + if (length(office_type) > 0) return(office_type) + + guessed_name <- guess_content_type(path) + if ((length(guessed_name) == 1) && (guessed_name != "???")) return(guessed_name) + + return("application/zip") + + } + + if (all(c(0x5a,0x4d) == hdr[1:2])) return("x-system/exe") + + if (all(c(0x75,0x73,0x74,0x61,0x72) == hdr[258:262])) return("application/pax") + + if (all(c(0x00,0x00,0x01,0xBA) == hdr[1:4])) return("video/mpeg") + if (all(c(0x00,0x00,0x01,0xB3) == hdr[1:4])) return("video/mpeg") + + + return(guess_content_type(path)) + +} diff --git a/R/guess-content-type.R b/R/guess-content-type.R new file mode 100644 index 0000000..ef58e2c --- /dev/null +++ b/R/guess-content-type.R @@ -0,0 +1,32 @@ +#' Guess MIME type from filename (extension) +#' +#' Uses an internal database of over 1,500 file extension-to-MIME mappings to +#' return one or more associated types for a given input path. If no match is +#' found, `???` is returned. +#' +#' @details +#' Incorporates standard IANA MIME extension mappings and those from +#' [`servoy-client`](https://github.com/Servoy/servoy-client) and +#' [stevenwdv](https://github.com/stevenwdv)'s +#' [`allMimeTypes.json`](https://s-randomfiles.s3.amazonaws.com/mime/allMimeTypes.json). +#' +#' @md +#' @param path path to file +#' @return character vector +#' @export +#' @examples +#' guess_content_type(system.file("extdat", "test.pdf", package="simplemagic")) +guess_content_type <- function(path) { + + path <- path.expand(path) + if (!file.exists(path)) stop("File not found.", call.=FALSE) + + extension <- trimws(tolower(tools::file_ext(path))) + + res <- simplemagic_mime_db[(simplemagic_mime_db$extension == extension),]$mime_type + + if (length(res) == 0) return("???") + + return(unique(res)) + +} diff --git a/R/util.R b/R/util.R new file mode 100644 index 0000000..a2dd573 --- /dev/null +++ b/R/util.R @@ -0,0 +1,15 @@ +seq_in <- function(source_vector, pattern_vector) { + + which( + Reduce( + '+', + lapply( + seq_along(y <- lapply(pattern_vector, '==', source_vector)), + function(x) { + y[[x]][x:(length(source_vector) - length(pattern_vector) + x)] + } + ) + ) == length(pattern_vector) + ) + +} diff --git a/R/wand-package.R b/R/wand-package.R index 882e1a5..b508126 100644 --- a/R/wand-package.R +++ b/R/wand-package.R @@ -6,19 +6,17 @@ #' file name. It also incorporates other metadata from the mime-db database #' #' -#' Based on \code{file} / \code{libmagic} - \url{https://github.com/file/file} +#' @section Some important details: #' +#' The header checking is minimal (i.e. nowhere near as comprehensive as `libmagic`) but +#' covers quite a bit of ground. If there are content-check types from +#' [`magic sources`](https://github.com/threatstack/libmagic/tree/master/magic/) +#' that you would like coded into the package, please file an issue and +#' _include the full line(s)_ from that linked `magic.tab` that you would like mapped. +#' +#' @md #' @name wand #' @docType package -#' @author Bob Rudis (@@hrbrmstr) -#' @import purrr -#' @import tibble -#' @import tidyr -#' @import stringi -#' @importFrom rappdirs user_cache_dir -#' @useDynLib wand, .registration=TRUE -#' @importFrom Rcpp sourceCpp -#' @importFrom utils unzip -#' @importFrom dplyr mutate left_join mutate_all -#' @import stats +#' @author Bob Rudis (bob@@rud.is) +#' @importFrom tools file_ext NULL diff --git a/R/wand.r b/R/wand.r deleted file mode 100644 index 855995a..0000000 --- a/R/wand.r +++ /dev/null @@ -1,118 +0,0 @@ -#' Retrieve 'magic' attributes from files and directories -#' -#' @param path character vector of files to use magic on -#' @param magic_db either "\code{system}" (the default) to use the system -#' \code{magic} database or an atomic character vector with a -#' colon-separated list of full paths to custom \code{magic} database(s). This parameter -#' is (for the moment) ignored on Windows. -#' @return a \code{tibble} / \code{data.frame} of file magic attributes. -#' Specifically, mime type, encoding, possible file extensions and -#' type description are returned as colums in the data frame along -#' with \code{path}. -#' @note Various fields might not be available depending on the version -#' of \code{libmagic} you have installed. -#' @references See \url{http://openpreservation.org/blog/2012/08/09/magic-editing-and-creation-primer/} -#' for information on how to create your own \code{magic} database -#' @export -#' @examples -#' library(dplyr) -#' -#' system.file("extdata/img", package="wand") %>% -#' list.files(full.names=TRUE) %>% -#' incant() %>% -#' glimpse() -incant <- function(path, magic_db="system") { - - if (get_os() == "win") { - - found_file <- FALSE - - file_exe <- Sys.which("file.exe") - found_file <- file_exe != "" - - if (found_file) { - file_version <- suppressWarnings(system2(file_exe, "--version", stdout=TRUE, stderr=TRUE)) - found_file <- any(grepl("magic file", file_version)) - } - - if (!found_file) { - stop(paste0("'file.exe' not found. Please install 'Rtools' and restart R. ", - "See 'https://github.com/stan-dev/rstan/wiki/Install-Rtools-for-Windows' ", - "for more information on how to install 'Rtools'", collapse=""), - call.=FALSE) - } - - magic_db <- normalizePath(magic_wand_file()) - - tf <- tempfile() - writeLines(path, tf) - - suppressMessages( - suppressWarnings( - system2(file_exe, - c("--mime-type", "--mime-encoding", "--no-buffer", "--preserve-date", - '--separator "||"', - sprintf('--files-from "%s"', tf)), - stdout=TRUE))) -> output_1 - - suppressMessages( - suppressWarnings(system2(file_exe, - c("--no-buffer", "--preserve-date", '--separator "||"', - sprintf('--files-from "%s"', tf)), - stdout=TRUE))) -> output_2 - - unlink(tf) - - stri_split_fixed(output_1, "||", n=2, simplify=TRUE) %>% - as_data_frame() %>% - setNames(c("file", "response")) %>% - separate(response, c("mime_type", "encoding"), sep=";", extra="drop", fill="right") %>% - mutate(encoding=stri_replace_first_regex(encoding, "charset=", "")) -> df1 - - stri_split_fixed(output_2, "||", n=2, simplify=TRUE) %>% - as_data_frame() %>% - setNames(c("file", "description")) -> df2 - - left_join(df1, df2, by="file") %>% - mutate_all(stri_trim_both) -> ret - - } else { - ret <- incant_(path, magic_db) - } - - if (!("extensions" %in% colnames(ret))) ret$extensions <- NA - - mutate(ret, extensions=ifelse(extensions=="???", NA, extensions)) %>% - mutate(extensions=map_exts(mime_type, extensions)) - -} - -map_exts <- function(mime_type, current_extensions) { - - exts <- stri_split_regex(current_extensions, "/") - - map2(mime_type, exts, function(mt, xt) { - - ret <- wand::mime_db[[mt]]$extensions %||% NA - ret <- sort(unique(c(xt, ret))) - ret <- ret[!is.na(ret)] - if (length(ret)==0) ret <- NA - ret - - }) - -} - - -#' ripped from rappdirs (ty Hadley!) -get_os <- function () { - if (.Platform$OS.type == "windows") { - "win" - } else if (Sys.info()["sysname"] == "Darwin") { - "mac" - } else if (.Platform$OS.type == "unix") { - "unix" - } else { - stop("Unknown OS") - } -} \ No newline at end of file diff --git a/R/zzz.r b/R/zzz.r deleted file mode 100644 index 45031c6..0000000 --- a/R/zzz.r +++ /dev/null @@ -1,41 +0,0 @@ -#' Use the "magic" file that comes with the package -#' -#' The \code{magic_load()} functon from \code{libmagic} can't take ZIP files -#' and the \code{magic.mgc} file that ships with the package is too large to -#' be shipped uncompressed. Using this function as the \code{magic_db} -#' parameter will copy and uncompress the database to a cache directory and -#' return the full path to the magic file. Subsequent calls will not have to -#' perform the decompression unless \code{force} is \code{TRUE} or the -#' cache directory has been cleared. -#' -#' @param refresh ensure the lastest copy of the pacakge "magic" -#' database is used. -#' @note 'magic' files are highly coupled with the version of the \code{file} -#' utility they were built with. This function is provided solely for the -#' off chance that a macOS or Linux/UNIX system's \code{libmagic} library -#' was not configured properly and cannot find the system 'magic' file. -#' @export -#' @examples -#' library(dplyr) -#' -#' system.file("extdata/img", package="wand") %>% -#' list.files(full.names=TRUE) %>% -#' incant(magic_wand_file()) %>% -#' glimpse() -magic_wand_file <- function(refresh=FALSE) { - - cache <- rappdirs::user_cache_dir("wandr") - - if (!dir.exists(cache)) dir.create(cache, recursive=TRUE, showWarnings=FALSE) - if (!dir.exists(cache)) return(NULL) - - if (lib_version() >= 528) vers <- "new" else vers <- "old" - - if (refresh | (!file.exists(file.path(rappdirs::user_cache_dir("wandr"), "magic.mgc")))) { - unzip(system.file("extdata", "db", vers, "magic.mgc.zip", package="wand"), - exdir=cache, overwrite=TRUE) - } - - file.path(rappdirs::user_cache_dir("wandr"), "magic.mgc") - -} \ No newline at end of file diff --git a/README.Rmd b/README.Rmd index 2f7494f..8c11c82 100644 --- a/README.Rmd +++ b/README.Rmd @@ -1,85 +1,70 @@ --- output: rmarkdown::github_document --- + [![Project Status: Active - The project has reached a stable, usable state and is being actively developed.](http://www.repostatus.org/badges/0.1.0/active.svg)](http://www.repostatus.org/#active) -[![Travis-CI Build Status](https://travis-ci.org/hrbrmstr/wand.svg?branch=master)](https://travis-ci.org/hrbrmstr/wand) +[![Travis-CIBuild Status](https://travis-ci.org/hrbrmstr/simplemagic.svg?branch=master)](https://travis-ci.org/hrbrmstr/simplemagic) +[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/hrbrmstr/simplemagic?branch=master&svg=true)](https://ci.appveyor.com/project/hrbrmstr/simplemagic) +[![Coverage Status](https://img.shields.io/codecov/c/github/hrbrmstr/simplemagic/master.svg)](https://codecov.io/github/hrbrmstr/simplemagic?branch=master) -`wand` : Retrieve 'Magic' Attributes from Files and Directories +# wand -The `libmagic` library must be installed on *nix/macOS and available to use this. +Lightweight File 'MIME' Type Detection Based On Contents or Extension -- `apt-get install libmagic-dev` on Ubuntu/Debian-ish systems -- `brew install libmagic` on macOS -- `yum install file-devel` on RHEL/CentOS/Fedora +## Description -While the package was developed using the 5.28 version of `libmagic` it has been configured to work with older versions. Note that some fields in the resultant data frame might not be available with older library versions. When using the function `magic_wand_file()` it checks for which version of `libmagic` is installed on your system and provides a suitable `magic.mgc` file for it. +'MIME' types are shorthand descriptors for file contents and can be +determined from "magic" bytes in file headers, file contents or intuited from +file extensions. Tools are provided to perform curated "magic" tests as well +as mapping 'MIME' types from a database of over 1,500 extension mappings. -The package also works on Windows but it's a bit of a hack because, well, _Windows_. The Windows version makes two `system2()` calls and relies on `Rtools` being installed and `file.exe` being available on the Windows `PATH`, so it's sub-optimal at best. Help to get it working in C would be greatly appreciated. Windows folk can go [here](https://github.com/stan-dev/rstan/wiki/Install-Rtools-for-Windows) to find out more info on `Rtools`. +Provides a more portable/ligtweight alternative to the `wand` package. -The following functions are implemented: +## SOME IMPORTANT DETAILS -- `incant` : returns the "magic" metadata of the files in the input vector (as a data frame) -- `magic_wand_file` : provides a full path to the package-provided `magic` file +The header checking is minimal (i.e. nowhere near as comprehensive as `libmagic`) but covers quite a bit of ground. If there are content-check types from [`magic sources`](https://github.com/threatstack/libmagic/tree/master/magic/) that you would like coded into the package, please file an issue and _include the full line(s)_ from that linked `magic.tab` that you would like mapped. -The following datasets are included: +## What's Inside The Tin -- `mime_db` : a database of all mime types from +- `get_content_type`: Discover MIME type of a file based on contents +- `guess_content_type`: Guess MIME type from filename (extension) +- `simplemagic_mime_db`: File extension-to-MIME mapping data frame + +The following functions are implemented: -### Installation +## Installation ```{r eval=FALSE} -devtools::install_github("hrbrmstr/wand") +devtools::install_git("https://gitlab.com/hrbrmstr/wand") ``` -```{r echo=FALSE, message=FALSE, warning=FALSE, error=FALSE} +```{r message=FALSE, warning=FALSE, error=FALSE, include=FALSE} options(width=120) ``` -### Usage +## Usage -```{r message=FALSE} +```{r message=FALSE, warning=FALSE, error=FALSE} library(wand) -library(dplyr) - -system.file("extdata", "img", package="wand") %>% - list.files(full.names=TRUE) %>% - incant() %>% - glimpse() -``` - -```{r message=FALSE} -# Use a non-system magic-file - -system.file("extdata", "img", package="wand") %>% - list.files(full.names=TRUE) %>% - incant(magic_wand_file()) %>% - select(description) %>% - unlist(use.names=FALSE) -``` - -```{r message=FALSE} -# what kinds of extensions are associated with these mime types -system.file("extdata", "img", package="wand") %>% - list.files(full.names=TRUE) %>% - incant(magic_wand_file()) %>% - select(extensions) %>% - as.data.frame() -``` +library(tidyverse) -```{r message=FALSE} # current verison packageVersion("wand") - ``` -### Test Results - -```{r message=FALSE} -library(wand) -library(testthat) +```{r} +list.files(system.file("extdat", package="wand"), full.names=TRUE) %>% + map_df(~{ + data_frame( + fil = basename(.x), + mime = list(get_content_type(.x)) + ) + }) %>% + unnest() %>% + print(n=100) +``` -date() +## Code of Conduct -test_dir("tests/") -``` +Please note that this project is released with a [Contributor Code of Conduct](CONDUCT.md). By participating in this project you agree to abide by its terms. diff --git a/README.md b/README.md index faa1371..014290a 100644 --- a/README.md +++ b/README.md @@ -1,118 +1,167 @@ -[![Project Status: Active - The project has reached a stable, usable state and is being actively developed.](http://www.repostatus.org/badges/0.1.0/active.svg)](http://www.repostatus.org/#active) [![Travis-CI Build Status](https://travis-ci.org/hrbrmstr/wand.svg?branch=master)](https://travis-ci.org/hrbrmstr/wand) +[![Project Status: Active - The project has reached a stable, usable +state and is being actively +developed.](http://www.repostatus.org/badges/0.1.0/active.svg)](http://www.repostatus.org/#active) +[![Travis-CIBuild +Status](https://travis-ci.org/hrbrmstr/simplemagic.svg?branch=master)](https://travis-ci.org/hrbrmstr/simplemagic) +[![AppVeyor Build +Status](https://ci.appveyor.com/api/projects/status/github/hrbrmstr/simplemagic?branch=master&svg=true)](https://ci.appveyor.com/project/hrbrmstr/simplemagic) +[![Coverage +Status](https://img.shields.io/codecov/c/github/hrbrmstr/simplemagic/master.svg)](https://codecov.io/github/hrbrmstr/simplemagic?branch=master) -`wand` : Retrieve 'Magic' Attributes from Files and Directories +# wand -The `libmagic` library must be installed on \*nix/macOS and available to use this. +Lightweight File ‘MIME’ Type Detection Based On Contents or Extension -- `apt-get install libmagic-dev` on Ubuntu/Debian-ish systems -- `brew install libmagic` on macOS -- `yum install file-devel` on RHEL/CentOS/Fedora +## Description -While the package was developed using the 5.28 version of `libmagic` it has been configured to work with older versions. Note that some fields in the resultant data frame might not be available with older library versions. When using the function `magic_wand_file()` it checks for which version of `libmagic` is installed on your system and provides a suitable `magic.mgc` file for it. +‘MIME’ types are shorthand descriptors for file contents and can be +determined from “magic†bytes in file headers, file contents or intuited +from file extensions. Tools are provided to perform curated “magic†+tests as well as mapping ‘MIME’ types from a database of over 1,500 +extension mappings. -The package also works on Windows but it's a bit of a hack because, well, *Windows*. The Windows version makes two `system2()` calls and relies on `Rtools` being installed and `file.exe` being available on the Windows `PATH`, so it's sub-optimal at best. Help to get it working in C would be greatly appreciated. Windows folk can go [here](https://github.com/stan-dev/rstan/wiki/Install-Rtools-for-Windows) to find out more info on `Rtools`. +Provides a more portable/ligtweight alternative to the `wand` package. -The following functions are implemented: - -- `incant` : returns the "magic" metadata of the files in the input vector (as a data frame) -- `magic_wand_file` : provides a full path to the package-provided `magic` file - -The following datasets are included: +## SOME IMPORTANT DETAILS -- `mime_db` : a database of all mime types from - -### Installation - -``` r -devtools::install_github("hrbrmstr/wand") -``` +The header checking is minimal (i.e. nowhere near as comprehensive as +`libmagic`) but covers quite a bit of ground. If there are content-check +types from [`magic +sources`](https://github.com/threatstack/libmagic/tree/master/magic/) +that you would like coded into the package, please file an issue and +*include the full line(s)* from that linked `magic.tab` that you would +like mapped. -### Usage +## What’s Inside The Tin -``` r -library(wand) -library(dplyr) + - `get_content_type`: Discover MIME type of a file based on contents + - `guess_content_type`: Guess MIME type from filename (extension) + - `simplemagic_mime_db`: File extension-to-MIME mapping data frame -system.file("extdata", "img", package="wand") %>% - list.files(full.names=TRUE) %>% - incant() %>% - glimpse() -``` +The following functions are implemented: - ## Observations: 10 - ## Variables: 5 - ## $ file "/Library/Frameworks/R.framework/Versions/3.3/Resources/library/wand/extdata/img/example_dir", ... - ## $ mime_type "inode/directory", "text/x-c", "text/html", "text/plain", "text/rtf", "image/jpeg", "applicatio... - ## $ encoding "binary", "us-ascii", "us-ascii", "us-ascii", "us-ascii", "binary", "binary", "binary", "us-asc... - ## $ extensions [NA, <"c", "cc", "cpp", "cxx", "dic", "h", "hh">, <"htm", "html", "shtml">, <"conf", "def", "i... - ## $ description "directory", "C source, ASCII text", "HTML document, ASCII text, with CRLF line terminators", "... +## Installation ``` r -# Use a non-system magic-file - -system.file("extdata", "img", package="wand") %>% - list.files(full.names=TRUE) %>% - incant(magic_wand_file()) %>% - select(description) %>% - unlist(use.names=FALSE) +devtools::install_git("https://gitlab.com/hrbrmstr/wand") ``` - ## [1] "directory" - ## [2] "C source, ASCII text" - ## [3] "HTML document, ASCII text, with CRLF line terminators" - ## [4] "ASCII text, with no line terminators" - ## [5] "Rich Text Format data, version 1, ANSI" - ## [6] "JPEG image data, JFIF standard 1.01, aspect ratio, density 72x72, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=2, orientation=upper-left], baseline, precision 8, 800x700, frames 3" - ## [7] "PDF document, version 1.3" - ## [8] "PNG image data, 800 x 700, 8-bit/color RGBA, non-interlaced" - ## [9] "ASCII text, with very long lines, with CRLF line terminators" - ## [10] "TIFF image data, big-endian" +## Usage ``` r -# what kinds of extensions are associated with these mime types -system.file("extdata", "img", package="wand") %>% - list.files(full.names=TRUE) %>% - incant(magic_wand_file()) %>% - select(extensions) %>% - as.data.frame() -``` - - ## extensions - ## 1 NA - ## 2 c, cc, cpp, cxx, dic, h, hh - ## 3 htm, html, shtml - ## 4 conf, def, in, ini, list, log, text, txt - ## 5 rtf - ## 6 jfif, jpe, jpeg, jpg - ## 7 pdf - ## 8 png - ## 9 conf, def, in, ini, list, log, text, txt - ## 10 tif, tiff +library(wand) +library(tidyverse) -``` r # current verison packageVersion("wand") ``` - ## [1] '0.2.0' - -### Test Results - -``` r -library(wand) -library(testthat) - -date() -``` - - ## [1] "Mon Aug 15 14:56:16 2016" + ## [1] '0.3.0' ``` r -test_dir("tests/") +list.files(system.file("extdat", package="wand"), full.names=TRUE) %>% + map_df(~{ + data_frame( + fil = basename(.x), + mime = list(get_content_type(.x)) + ) + }) %>% + unnest() %>% + print(n=100) ``` - ## testthat results ======================================================================================================== - ## OK: 1 SKIPPED: 0 FAILED: 0 - ## - ## DONE =================================================================================================================== + ## # A tibble: 85 x 2 + ## fil mime + ## + ## 1 actions.csv application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + ## 2 actions.txt application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + ## 3 actions.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + ## 4 test_1.2.class application/java-vm + ## 5 test_1.3.class application/java-vm + ## 6 test_1.4.class application/java-vm + ## 7 test_1.5.class application/java-vm + ## 8 test_128_44_jstereo.mp3 audio/mp3 + ## 9 test_excel_2000.xls application/msword + ## 10 test_excel_spreadsheet.xml application/xml + ## 11 test_excel_web_archive.mht message/rfc822 + ## 12 test_excel.xlsm application/zip + ## 13 test_excel.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet + ## 14 test_nocompress.tif image/tiff + ## 15 test_powerpoint.pptm application/zip + ## 16 test_powerpoint.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation + ## 17 test_word_2000.doc application/msword + ## 18 test_word_6.0_95.doc application/msword + ## 19 test_word.docm application/zip + ## 20 test_word.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document + ## 21 test.au audio/basic + ## 22 test.bin application/mac-binary + ## 23 test.bin application/macbinary + ## 24 test.bin application/octet-stream + ## 25 test.bin application/x-binary + ## 26 test.bin application/x-macbinary + ## 27 test.bmp image/bmp + ## 28 test.dtd application/xml-dtd + ## 29 test.emf application/x-msmetafile + ## 30 test.eps application/postscript + ## 31 test.fli video/flc + ## 32 test.fli video/fli + ## 33 test.fli video/x-fli + ## 34 test.gif image/gif + ## 35 test.ico image/x-icon + ## 36 test.java text/plain + ## 37 test.java text/x-java + ## 38 test.java text/x-java-source + ## 39 test.jpg image/jpeg + ## 40 test.mp3 audio/mp3 + ## 41 test.odt application/vnd.oasis.opendocument.text + ## 42 test.ogg application/ogg + ## 43 test.ogg audio/ogg + ## 44 test.pcx image/pcx + ## 45 test.pcx image/x-pcx + ## 46 test.pdf application/pdf + ## 47 test.pl text/plain + ## 48 test.pl text/x-perl + ## 49 test.pl text/x-script.perl + ## 50 test.png image/png + ## 51 test.pnm application/x-portable-anymap + ## 52 test.pnm image/x-portable-anymap + ## 53 test.ppm image/x-portable-pixmap + ## 54 test.ppt application/msword + ## 55 test.ps application/postscript + ## 56 test.psd image/photoshop + ## 57 test.py text/x-python + ## 58 test.py text/x-script.phyton + ## 59 test.rtf application/rtf + ## 60 test.rtf application/x-rtf + ## 61 test.rtf text/richtext + ## 62 test.rtf text/rtf + ## 63 test.sh application/x-bsh + ## 64 test.sh application/x-sh + ## 65 test.sh application/x-shar + ## 66 test.sh text/x-script.sh + ## 67 test.sh text/x-sh + ## 68 test.tar application/pax + ## 69 test.tar.gz application/octet-stream + ## 70 test.tar.gz application/x-compressed + ## 71 test.tar.gz application/x-gzip + ## 72 test.tga image/x-tga + ## 73 test.txt text/plain + ## 74 test.txt.gz application/octet-stream + ## 75 test.txt.gz application/x-compressed + ## 76 test.txt.gz application/x-gzip + ## 77 test.wav audio/x-wav + ## 78 test.wmf application/x-msmetafile + ## 79 test.wmf windows/metafile + ## 80 test.xcf application/x-xcf + ## 81 test.xml application/xml + ## 82 test.xpm image/x-xbitmap + ## 83 test.xpm image/x-xpixmap + ## 84 test.xpm image/xpm + ## 85 test.zip application/zip + +## Code of Conduct + +Please note that this project is released with a [Contributor Code of +Conduct](CONDUCT.md). By participating in this project you agree to +abide by its terms. diff --git a/builder/make_mime_db.r b/builder/make_mime_db.r deleted file mode 100644 index 40b0ba6..0000000 --- a/builder/make_mime_db.r +++ /dev/null @@ -1,4 +0,0 @@ -JSON_DB_URL <- "https://raw.githubusercontent.com/jshttp/mime-db/master/db.json" - -mime_db <- jsonlite::fromJSON(JSON_DB_URL, flatten=TRUE) -use_data(mime_db) diff --git a/cleanup b/cleanup deleted file mode 100755 index 8ff2b06..0000000 --- a/cleanup +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -rm -f src/Makevars \ No newline at end of file diff --git a/configure b/configure deleted file mode 100755 index 8f66523..0000000 --- a/configure +++ /dev/null @@ -1,61 +0,0 @@ -#!/bin/sh -echo "Checking to see if libmagic is available..." - -: ${R_HOME=`R RHOME`} -if test -z "${R_HOME}"; then - echo - echo "could not determine R_HOME" - echo - exit 1 -fi - -CC=`"${R_HOME}/bin/R" CMD config CC` -CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS` -CPPFLAGS=`"${R_HOME}/bin/R" CMD config CPPFLAGS` -CXXFLAGS=`"${R_HOME}/bin/R" CMD config CXXFLAGS` -LDFLAGS=`"${R_HOME}/bin/R" CMD config LDFLAGS` -DYLIB_LDFLAGS=`"${R_HOME}/bin/R" CMD config DYLIB_LDFLAGS` -SHLIB_LDFLAGS=`"${R_HOME}/bin/R" CMD config SHLIB_LDFLAGS` - -LIBDIRS="/usr/lib/x86_64-linux-gnu /usr/lib/i386-linux-gnu /usr/lib64 /usr/lib32 /usr/local/lib /opt/local/lib /usr/lib /lib" -PKG_LD_FLAGS="" -for DIR in ${LIBDIRS} ; do - if test -d ${DIR} ; then PKG_LD_FLAGS="${PKG_LD_FLAGS} -L$DIR" ; fi -done - -INCDIRS="/usr/include/x86_64-linux-gnu /usr/include/i386-linux-gnu /usr/include /usr/local/include /opt/local/include" -PKG_CPP_FLAGS="" -for DIR in ${INCDIRS} ; do - if test -d ${DIR} ; then PKG_CPP_FLAGS="${PKG_CPP_FLAGS} -L$DIR" ; fi -done - -temp_src=$(mktemp) -cat > ${temp_src} < /dev/null 2>&1 -ccerr=$? - -rm ${temp_src} ${temp_exe} - -if [ "$ccerr" = 1 ] ; then - echo - echo - echo "The libmagic library was not found." - echo - echo "Please install it before installing this package." - echo - echo - exit 1 -fi - -sed -e "s|@cflags@|$PKG_CPP_FLAGS|" -e "s|@libs@|$PKG_LD_FLAGS|" src/Makevars.in > src/Makevars - -exit 0 diff --git a/configure.win b/configure.win deleted file mode 100755 index e69de29..0000000 diff --git a/data/mime_db.rda b/data/mime_db.rda deleted file mode 100644 index dfb2c54..0000000 Binary files a/data/mime_db.rda and /dev/null differ diff --git a/inst/extdat/actions.csv b/inst/extdat/actions.csv new file mode 100644 index 0000000..98872b7 Binary files /dev/null and b/inst/extdat/actions.csv differ diff --git a/inst/extdat/actions.txt b/inst/extdat/actions.txt new file mode 100644 index 0000000..98872b7 Binary files /dev/null and b/inst/extdat/actions.txt differ diff --git a/inst/extdat/actions.xlsx b/inst/extdat/actions.xlsx new file mode 100644 index 0000000..98872b7 Binary files /dev/null and b/inst/extdat/actions.xlsx differ diff --git a/inst/extdat/test.au b/inst/extdat/test.au new file mode 100644 index 0000000..62def4a Binary files /dev/null and b/inst/extdat/test.au differ diff --git a/inst/extdat/test.bin b/inst/extdat/test.bin new file mode 100644 index 0000000..5ab3723 Binary files /dev/null and b/inst/extdat/test.bin differ diff --git a/inst/extdat/test.bmp b/inst/extdat/test.bmp new file mode 100644 index 0000000..3631d23 Binary files /dev/null and b/inst/extdat/test.bmp differ diff --git a/inst/extdat/test.dtd b/inst/extdat/test.dtd new file mode 100644 index 0000000..92a88d9 --- /dev/null +++ b/inst/extdat/test.dtd @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/inst/extdat/test.emf b/inst/extdat/test.emf new file mode 100644 index 0000000..e186134 Binary files /dev/null and b/inst/extdat/test.emf differ diff --git a/inst/extdat/test.eps b/inst/extdat/test.eps new file mode 100644 index 0000000..42500fd --- /dev/null +++ b/inst/extdat/test.eps @@ -0,0 +1,338 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: GIMP PostScript file plugin V 1.16 by Peter Kirchgessner +%%Title: /home/arimus/test.eps +%%CreationDate: Tue Jun 15 19:43:49 2004 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%Pages: 1 +%%BoundingBox: 14 14 115 115 +%%EndComments +%%BeginProlog +% Use own dictionary to avoid conflicts +10 dict begin +%%EndProlog +%%Page: 1 1 +% Translate for offset +14.173228346456694 14.173228346456694 translate +% Translate to begin of first scanline +0 99.999999999999986 translate +99.999999999999986 -99.999999999999986 scale +% Image geometry +100 100 8 +% Transformation matrix +[ 100 0 0 100 0 0 ] +% Strings to hold RGB-samples per scanline +/rstr 100 string def +/gstr 100 string def +/bstr 100 string def +{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop} +{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop} +true 3 +%%BeginData: 4976 ASCII Bytes +colorimage +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +p]'IX^]/f~> +p]'IX^]/f~> +p]'IX^]/f~> +p]'IXf`1mMm/MS~> +p]'IXf`1mMm/MS~> +p]'IXf`1mMm/MS~> +p]'IXf`1mMm/MS~> +p]'IXf`1mMm/MS~> +p]'IXf`1mMm/MS~> +mJm+bcN!hCm/MS~> +mJm+bcN!hCm/MS~> +mJm+bcN!hCm/MS~> +mJm+bcN!hCm/MS~> +mJm+bcN!hCm/MS~> +mJm+bcN!hCm/MS~> +mJm+bcN!hCm/MS~> +mJm+bcN!hCm/MS~> +mJm+bcN!hCm/MS~> +mJm+bp\tTsX'R7b!t-Pd[f6"#$/9nr)@?QZ2/^>,s8;ras*t~> +mJm+bp\tTsX'R7b!t-Pd[f6"#$/9nr)@?QZ2/^>,s8;ras*t~> +mJm+bp\tTsX'R7b!t-Pd[f6"#$/9nr)@?QZ2/^>,s8;ras*t~> +mJm+bq#:Aq*V]U81t2:#!qp@1p](=F[f-6t!;$5@~> +mJm+bq#:Aq*V]U81t2:#!qp@1p](=F[f-6t!;$5@~> +mJm+bq#:Aq*V]U81t2:#!qp@1p](=F[f-6t!;$5@~> +mJm+bqYpTqE:j23%)Dc?!W5@X!<)rh!;$5@~> +mJm+bqYpTqE:j23%)Dc?!W5@X!<)rh!;$5@~> +mJm+bqYpTqE:j23%)Dc?!W5@X!<)rh!;$5@~> +mJm+bqYpP=rW!0*?b5S"jeOC*!!*Yfr;Qbbr;[.#[HID]h5*jJ!<)rh!;$5@~> +mJm+bqYpP=rW!0*?b5S"jeOC*!!*Yfr;Qbbr;[.#[HID]h5*jJ!<)rh!;$5@~> +mJm+bqYpP=rW!0*?b5S"jeOC*!!*Yfr;Qbbr;[.#[HID]h5*jJ!<)rh!;$5@~> +mJm+bqu6Z-rVus1_Ya?6pJ(Ve!(m+g!'1#Y!-.i7!SgBFs8;ras*t~> +mJm+bqu6Z-rVus1_Ya?6pJ(Ve!(m+g!'1#Y!-.i7!SgBFs8;ras*t~> +mJm+bqu6Z-rVus1_Ya?6pJ(Ve!(m+g!'1#Y!-.i7!SgBFs8;ras*t~> +mJm+bqu6XJrVur,q>UKd*<#p +mJm+bqu6XJrVur,q>UKd*<#p +mJm+bqu6XJrVur,q>UKd*<#p +mJm+br;Qc5rVupdp\t5OrVuqDrVlj$rVurpnGiFem/MS~> +mJm+br;Qc5rVupdp\t5OrVuqDrVlj$rVurpnGiFem/MS~> +mJm+br;Qc5rVupdp\t5OrVuqDrVlj$rVurpnGiFem/MS~> +mJm+br;Qb:rVuqhp\t6ArVup]rVlj@rVur6nGiFem/MS~> +mJm+br;Qb:rVuqhp\t6ArVup]rVlj@rVur6nGiFem/MS~> +mJm+br;Qb:rVuqhp\t6ArVup]rVlj@rVur6nGiFem/MS~> +mJm+br;QaXrVurEp\t6brVup8rVlk5rVus?\af^u!:9`9~> +mJm+br;QaXrVurEp\t6brVup8rVlk5rVus?\af^u!:9`9~> +mJm+br;QaXrVurEp\t6brVup8rVlk5rVus?\af^u!:9`9~> +mJm+br;Qa5rW)m!rW<'"qu?^$rVloZ(&\+7+DIk?p&Fsjm/MS~> +mJm+br;Qa5rW)m!rW<'"qu?^$rVloZ(&\+7+DIk?p&Fsjm/MS~> +mJm+br;Qa5rW)m!rW<'"qu?^$rVloZ(&\+7+DIk?p&Fsjm/MS~> +mJm+br;Qa#mK!1b!RiOp!!4Zth"^pJ!:9`9~> +mJm+br;Qa#mK!1b!RiOp!!4Zth"^pJ!:9`9~> +mJm+br;Qa#mK!1b!RiOp!!4Zth"^pJ!:9`9~> +mJm+br;Q`umK!.a"8nua#5\B%!b1]rs8;ras*t~> +mJm+br;Q`umK!.a"8nua#5\B%!b1]rs8;ras*t~> +mJm+br;Q`umK!.a"8nua#5\B%!b1]rs8;ras*t~> +mJm+br;Qa-rVurdl2Ln[^4&-Gr;ZjSp&"df!:9`9~> +mJm+br;Qa-rVurdl2Ln[^4&-Gr;ZjSp&"df!:9`9~> +mJm+br;Qa-rVurdl2Ln[^4&-Gr;ZjSp&"df!:9`9~> +mJm+br;QaMrVur?jo5DHJdD>U!/(1Kr;c3aJ,~> +mJm+br;QaMrVur?jo5DHJdD>U!/(1Kr;c3aJ,~> +mJm+br;QaMrVur?jo5DHJdD>U!/(1Kr;c3aJ,~> +mJm+br;Qb-rVuqOj8T+NrVupKqu?Tpm/MS~> +mJm+br;Qb-rVuqOj8T+NrVupKqu?Tpm/MS~> +mJm+br;Qb-rVuqOj8T+NrVupKqu?Tpm/MS~> +mJm+br;Qc'rVusAq;hPUoDS^i#lFW%"o\K%r9aN7~> +mJm+br;Qc'rVusAq;hPUoDS^i#lFW%"o\K%r9aN7~> +mJm+br;Qc'rVusAq;hPUoDS^i#lFW%"o\K%r9aN7~> +mJm+br;Qfq,5qQBHK>)+l2CY_%/^&)'E.t3lL"V%~> +mJm+br;Qfq,5qQBHK>)+l2CY_%/^&)'E.t3lL"V%~> +mJm+br;Qfq,5qQBHK>)+l2CY_%/^&)'E.t3lL"V%~> +mJm+bqu6Z#r;ZkIr:p9m]L)Pr!^XEsq>UG:rVup]qu6XTrVur+mJh\~> +mJm+bqu6Z#r;ZkIr:p9m]L)Pr!^XEsq>UG:rVup]qu6XTrVur+mJh\~> +mJm+bqu6Z#r;ZkIr:p9m]L)Pr!^XEsq>UG:rVup]qu6XTrVur+mJh\~> +mJm+bqYpP8r;[3PNR%"in(Ojb,6.`As8N'),':6Oq>BHb:]17nW;HSpFoD@C-bJmInGe"~> +mJm+bqYpP8r;[3PNR%"in(Ojb,6.`As8N'),':6Oq>BHb:]17nW;HSpFoD@C-bJmInGe"~> +mJm+bqYpP8r;[3PNR%"in(Ojb,6.`As8N'),':6Oq>BHb:]17nW;HSpFoD@C-bJmInGe"~> +mJm+bqYpTqFn,P1s763j@J^!)g'7 +mJm+bqYpTqFn,P1s763j@J^!)g'7 +mJm+bqYpTqFn,P1s763j@J^!)g'7 +mJm+bq#:B(.e`oE"B!/9s7H?n%Z^ParrJo%q#L$dJ,~> +mJm+bq#:B(.e`oE"B!/9s7H?n%Z^ParrJo%q#L$dJ,~> +mJm+bq#:B(.e`oE"B!/9s7H?n%Z^ParrJo%q#L$dJ,~> +mJm+bp\tX#]l#bD"9T5g>b:46Q6C6rW)QiJ,~> +mJm+bp\tX#]l#bD"9T5g>b:46Q6C6rW)QiJ,~> +mJm+bp\tX#]l#bD"9T5g>b:46Q6C6rW)QiJ,~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +Sc=3~> +%%EndData +showpage +%%Trailer +end +%%EOF diff --git a/inst/extdat/test.fli b/inst/extdat/test.fli new file mode 100644 index 0000000..2c31823 Binary files /dev/null and b/inst/extdat/test.fli differ diff --git a/inst/extdat/test.gif b/inst/extdat/test.gif new file mode 100644 index 0000000..42ec8d3 Binary files /dev/null and b/inst/extdat/test.gif differ diff --git a/inst/extdat/test.ico b/inst/extdat/test.ico new file mode 100644 index 0000000..10a7d83 Binary files /dev/null and b/inst/extdat/test.ico differ diff --git a/inst/extdat/test.java b/inst/extdat/test.java new file mode 100644 index 0000000..384c337 --- /dev/null +++ b/inst/extdat/test.java @@ -0,0 +1,5 @@ +public class test { + public static void main(String[] args) { + System.out.println("this is a test java source file"); + } +} diff --git a/inst/extdat/test.jpg b/inst/extdat/test.jpg new file mode 100644 index 0000000..d51f3b0 Binary files /dev/null and b/inst/extdat/test.jpg differ diff --git a/inst/extdat/test.mp3 b/inst/extdat/test.mp3 new file mode 100644 index 0000000..154337d Binary files /dev/null and b/inst/extdat/test.mp3 differ diff --git a/inst/extdat/test.odt b/inst/extdat/test.odt new file mode 100644 index 0000000..13d6718 Binary files /dev/null and b/inst/extdat/test.odt differ diff --git a/inst/extdat/test.ogg b/inst/extdat/test.ogg new file mode 100644 index 0000000..57700e3 Binary files /dev/null and b/inst/extdat/test.ogg differ diff --git a/inst/extdat/test.pcx b/inst/extdat/test.pcx new file mode 100644 index 0000000..2a60bb8 Binary files /dev/null and b/inst/extdat/test.pcx differ diff --git a/inst/extdat/test.pdf b/inst/extdat/test.pdf new file mode 100644 index 0000000..cb33394 --- /dev/null +++ b/inst/extdat/test.pdf @@ -0,0 +1,84 @@ +%PDF-1.2 +%Çì¢ +6 0 obj +<> +stream +xœUŒ±‚@DûýŠ)µ9wW»ÖÄÀ\bMÈ™;"ÂÏ÷@-ÌL2¯x™ l¼æ»m¢‰×÷™êŒÊŒB…‘6¬œ2"©³ÿ¼)‘ºa¤ ²]þ¦M8û|êPšRŽâà{ÃÊj?TðI`¥4E•…D;?„¹ ž± #–îµ ±Ûû]> +/Contents 6 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +5 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +4 0 obj +<> +endobj +10 0 obj +<> +endobj +11 0 obj +<> +endobj +8 0 obj +<> +endobj +9 0 obj +<> +endobj +2 0 obj +<>endobj +xref +0 12 +0000000000 65535 f +0000000466 00000 n +0000001711 00000 n +0000000407 00000 n +0000000514 00000 n +0000000247 00000 n +0000000015 00000 n +0000000228 00000 n +0000000629 00000 n +0000000686 00000 n +0000000569 00000 n +0000000599 00000 n +trailer +<< /Size 12 /Root 1 0 R /Info 2 0 R +>> +startxref +1761 +%%EOF diff --git a/inst/extdat/test.pl b/inst/extdat/test.pl new file mode 100644 index 0000000..3b3bd97 --- /dev/null +++ b/inst/extdat/test.pl @@ -0,0 +1,5 @@ +#!/usr/bin/perl -w + +use strict; + +print "this is a test perl script\n"; diff --git a/inst/extdat/test.png b/inst/extdat/test.png new file mode 100644 index 0000000..c15de47 Binary files /dev/null and b/inst/extdat/test.png differ diff --git a/inst/extdat/test.pnm b/inst/extdat/test.pnm new file mode 100644 index 0000000..725a18c --- /dev/null +++ b/inst/extdat/test.pnm @@ -0,0 +1,7 @@ +P6 +100 100 +255 +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúú«««^^^***  )))aaa¶¶¶þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛ~~~CCC + + +555nnnÃÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««444ÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööjjj+++¶¶¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþppp ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvvv___ºººëëëúúúåå夤¤***ÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™™PPPµµµçççúúúøøøÝÝÝ¥¥¥NNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºººÂÂÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷MMMIIIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ999qqqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÜÜLLLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ---¶¶¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿ åååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹yyyÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqqqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÒÒ===ÿÿÿÿÿÿÿÿÿÿÿÿ!!!ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:::ÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿÿÿÿÿÿÿÿÿÿÿÿkkk¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäää iiiªªªéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓ***+++{{{ÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüü¥¥¥EEEbbbñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿööö¾¾¾~~~;;;333õõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ///ÉÉÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿééé‚‚‚ƒƒƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿddd„„„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžžž+++ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³ ùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüü"""zzzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿééé ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°°~~~üüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼BBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAAAºººþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿttt===ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ777µµµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqqq&&&ÎÎÎïïïûûûïïïÚÚÚ¬¬¬ttt###ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"""tttµµµáááùùùüüüèè趶¶OOO¨¨¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿuuu'''»»»ðððþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþuuuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ···***QQQÅÅÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽŽŽþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ½½½nnn777...\\\žžžìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãã㪪ªxxxNNN---&&&TTTšššîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿààà‚‚‚CCC ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/inst/extdat/test.ppm b/inst/extdat/test.ppm new file mode 100644 index 0000000..725a18c --- /dev/null +++ b/inst/extdat/test.ppm @@ -0,0 +1,7 @@ +P6 +100 100 +255 +ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿúúú«««^^^***  )))aaa¶¶¶þþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÛÛÛ~~~CCC + + +555nnnÃÃÃÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ«««444ÓÓÓÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿöööjjj+++¶¶¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþppp ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿvvv___ºººëëëúúúåå夤¤***ÞÞÞÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ™™™PPPµµµçççúúúøøøÝÝÝ¥¥¥NNNÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿºººÂÂÂÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷÷÷MMMIIIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ999qqqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÜÜÜLLLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ---¶¶¶ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿòòòÐÐÐÿÿÿÿÿÿÿÿÿÿÿÿ åååÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÁÁÁDDDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ‹‹‹yyyÿÿÿÿÿÿÿÿÿÿÿÿúúúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqqqÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÒÒÒ===ÿÿÿÿÿÿÿÿÿÿÿÿ!!!ÀÀÀÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:::ÏÏÏÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿÿÿÿÿÿÿÿÿÿÿÿkkk¹¹¹ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿäää iiiªªªéééÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÓÓÓ***+++{{{ÜÜÜÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüü¥¥¥EEEbbbñññÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿööö¾¾¾~~~;;;333õõõÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ///ÉÉÉÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿééé‚‚‚ƒƒƒÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿddd„„„ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿžžž+++ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ³³³ ùùùÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿóóóÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüüü"""zzzÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿééé ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿêêêÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ°°°~~~üüüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¼¼¼BBBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿAAAºººþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿttt===ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ777µµµÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿqqq&&&ÎÎÎïïïûûûïïïÚÚÚ¬¬¬ttt###ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"""tttµµµáááùùùüüüèè趶¶OOO¨¨¨ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿuuu'''»»»ðððþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþuuuÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaaaÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÚÚÚÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ···***QQQÅÅÅÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿŽŽŽþþþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¤¤¤ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþþþ½½½nnn777...\\\žžžìììÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿãã㪪ªxxxNNN---&&&TTTšššîîîÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿààà‚‚‚CCC ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ \ No newline at end of file diff --git a/inst/extdat/test.ppt b/inst/extdat/test.ppt new file mode 100644 index 0000000..671a413 Binary files /dev/null and b/inst/extdat/test.ppt differ diff --git a/inst/extdat/test.ps b/inst/extdat/test.ps new file mode 100644 index 0000000..3e10bcb --- /dev/null +++ b/inst/extdat/test.ps @@ -0,0 +1,280 @@ +%!PS-Adobe-2.0 +%%DocumentFonts: Courier Times-Bold +%%Title: (mpage) +%%Creator: mpage 2.5.1pre2 March 1998 +%%CreationDate: Tue Jun 15 20:04:08 2004 +%%Orientation: Portrait +%%DocumentMedia: A4 596 842 +%%BoundingBox: 20 20 576 822 +%%Pages: (atend) +%%EndComments + +%%BeginProlog + +/mp_stm usertime def +/mp_pgc statusdict begin pagecount end def +statusdict begin /jobname () def end +/reencsmalldict 12 dict def /ReEncodeSmall { reencsmalldict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq { exch dup length array copy newfont 3 1 roll put } { exch newfont 3 1 roll put } +ifelse } + { pop pop } + ifelse } forall +newfont /FontName newfontname put +newcodesandnames aload pop newcodesandnames length 2 idiv +{ newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/charvec [ +026 /Scaron +027 /Ydieresis +028 /Zcaron +029 /scaron +030 /trademark +031 /zcaron +032 /space +033 /exclam +034 /quotedbl +035 /numbersign +036 /dollar +037 /percent +038 /ampersand +039 /quoteright +040 /parenleft +041 /parenright +042 /asterisk +043 /plus +044 /comma +045 /minus +046 /period +047 /slash +048 /zero +049 /one +050 /two +051 /three +052 /four +053 /five +054 /six +055 /seven +056 /eight +057 /nine +058 /colon +059 /semicolon +060 /less +061 /equal +062 /greater +063 /question +064 /at +065 /A +066 /B +067 /C +068 /D +069 /E +070 /F +071 /G +072 /H +073 /I +074 /J +075 /K +076 /L +077 /M +078 /N +079 /O +080 /P +081 /Q +082 /R +083 /S +084 /T +085 /U +086 /V +087 /W +088 /X +089 /Y +090 /Z +091 /bracketleft +092 /backslash +093 /bracketright +094 /asciicircum +095 /underscore +096 /quoteleft +097 /a +098 /b +099 /c +100 /d +101 /e +102 /f +103 /g +104 /h +105 /i +106 /j +107 /k +108 /l +109 /m +110 /n +111 /o +112 /p +113 /q +114 /r +115 /s +116 /t +117 /u +118 /v +119 /w +120 /x +121 /y +122 /z +123 /braceleft +124 /bar +125 /braceright +126 /asciitilde +127 /.notdef +128 /fraction +129 /florin +130 /quotesingle +131 /quotedblleft +132 /guilsinglleft +133 /guilsinglright +134 /fi +135 /fl +136 /endash +137 /dagger +138 /daggerdbl +139 /bullet +140 /quotesinglbase +141 /quotedblbase +142 /quotedblright +143 /ellipsis +144 /dotlessi +145 /grave +146 /acute +147 /circumflex +148 /tilde +149 /oe +150 /breve +151 /dotaccent +152 /perthousand +153 /emdash +154 /ring +155 /Lslash +156 /OE +157 /hungarumlaut +158 /ogonek +159 /caron +160 /lslash +161 /exclamdown +162 /cent +163 /sterling +164 /currency +165 /yen +166 /brokenbar +167 /section +168 /dieresis +169 /copyright +170 /ordfeminine +171 /guillemotleft +172 /logicalnot +173 /hyphen +174 /registered +175 /macron +176 /degree +177 /plusminus +178 /twosuperior +179 /threesuperior +180 /acute +181 /mu +182 /paragraph +183 /periodcentered +184 /cedilla +185 /onesuperior +186 /ordmasculine +187 /guillemotright +188 /onequarter +189 /onehalf +190 /threequarters +191 /questiondown +192 /Agrave +193 /Aacute +194 /Acircumflex +195 /Atilde +196 /Adieresis +197 /Aring +198 /AE +199 /Ccedilla +200 /Egrave +201 /Eacute +202 /Ecircumflex +203 /Edieresis +204 /Igrave +205 /Iacute +206 /Icircumflex +207 /Idieresis +208 /Eth +209 /Ntilde +210 /Ograve +211 /Oacute +212 /Ocircumflex +213 /Otilde +214 /Odieresis +215 /multiply +216 /Oslash +217 /Ugrave +218 /Uacute +219 /Ucircumflex +220 /Udieresis +221 /Yacute +222 /Thorn +223 /germandbls +224 /agrave +225 /aacute +226 /acircumflex +227 /atilde +228 /adieresis +229 /aring +230 /ae +231 /ccedilla +232 /egrave +233 /eacute +234 /ecircumflex +235 /edieresis +236 /igrave +237 /iacute +238 /icircumflex +239 /idieresis +240 /eth +241 /ntilde +242 /ograve +243 /oacute +244 /ocircumflex +245 /otilde +246 /odieresis +247 /divide +248 /oslash +249 /ugrave +250 /uacute +251 /ucircumflex +252 /udieresis +253 /yacute +254 /thorn +255 /ydieresis +] def +/Courier /OurCharSet charvec ReEncodeSmall +/textfont /OurCharSet findfont 11 scalefont def +/fnamefont /Times-Bold findfont 14 scalefont def +/headerfont /Times-Bold findfont 12 scalefont def +textfont setfont +(a) stringwidth pop /mp_a_x exch def +%%EndProlog +%%Page: 1 1 +save +gsave +20 421 translate +0 0 moveto 0 401 rlineto 278 0 rlineto 0 -401 rlineto closepath clip +278 80 mp_a_x mul div 401 792 div scale +4 7 translate 270 278 div 784 792 div scale +textfont setfont +0 780 moveto (This is a plain text file) show +grestore +restore +showpage +%%Trailer +%%Pages: 1 diff --git a/inst/extdat/test.psd b/inst/extdat/test.psd new file mode 100644 index 0000000..b629f8b Binary files /dev/null and b/inst/extdat/test.psd differ diff --git a/inst/extdat/test.py b/inst/extdat/test.py new file mode 100644 index 0000000..46df3f2 --- /dev/null +++ b/inst/extdat/test.py @@ -0,0 +1,365 @@ +"""Append module search paths for third-party packages to sys.path. + +**************************************************************** +* This module is automatically imported during initialization. * +**************************************************************** + +In earlier versions of Python (up to 1.5a3), scripts or modules that +needed to use site-specific modules would place ``import site'' +somewhere near the top of their code. Because of the automatic +import, this is no longer necessary (but code that does it still +works). + +This will append site-specific paths to to the module search path. On +Unix, it starts with sys.prefix and sys.exec_prefix (if different) and +appends lib/python/site-packages as well as lib/site-python. +On other platforms (mainly Mac and Windows), it uses just sys.prefix +(and sys.exec_prefix, if different, but this is unlikely). The +resulting directories, if they exist, are appended to sys.path, and +also inspected for path configuration files. + +FOR DEBIAN, this sys.path is augmented with directories in /usr/local. +Local addons go into /usr/local/lib/python/site-packages +(resp. /usr/local/lib/site-python), Debian addons install into +/usr/{lib,share}/python/site-packages. + +A path configuration file is a file whose name has the form +.pth; its contents are additional directories (one per line) +to be added to sys.path. Non-existing directories (or +non-directories) are never added to sys.path; no directory is added to +sys.path more than once. Blank lines and lines beginning with +'#' are skipped. Lines starting with 'import' are executed. + +For example, suppose sys.prefix and sys.exec_prefix are set to +/usr/local and there is a directory /usr/local/lib/python2.3/site-packages +with three subdirectories, foo, bar and spam, and two path +configuration files, foo.pth and bar.pth. Assume foo.pth contains the +following: + + # foo package configuration + foo + bar + bletch + +and bar.pth contains: + + # bar package configuration + bar + +Then the following directories are added to sys.path, in this order: + + /usr/local/lib/python2.3/site-packages/bar + /usr/local/lib/python2.3/site-packages/foo + +Note that bletch is omitted because it doesn't exist; bar precedes foo +because bar.pth comes alphabetically before foo.pth; and spam is +omitted because it is not mentioned in either path configuration file. + +After these path manipulations, an attempt is made to import a module +named sitecustomize, which can perform arbitrary additional +site-specific customizations. If this import fails with an +ImportError exception, it is silently ignored. + +""" + +import sys, os + + +def makepath(*paths): + dir = os.path.abspath(os.path.join(*paths)) + return dir, os.path.normcase(dir) + +for m in sys.modules.values(): + if hasattr(m, "__file__") and m.__file__: + m.__file__ = os.path.abspath(m.__file__) +del m + +# This ensures that the initial path provided by the interpreter contains +# only absolute pathnames, even if we're running from the build directory. +L = [] +_dirs_in_sys_path = {} +dir = dircase = None # sys.path may be empty at this point +for dir in sys.path: + # Filter out duplicate paths (on case-insensitive file systems also + # if they only differ in case); turn relative paths into absolute + # paths. + dir, dircase = makepath(dir) + if not dircase in _dirs_in_sys_path: + L.append(dir) + _dirs_in_sys_path[dircase] = 1 +sys.path[:] = L +del dir, dircase, L + +# Append ./build/lib. in case we're running in the build dir +# (especially for Guido :-) +# XXX This should not be part of site.py, since it is needed even when +# using the -S option for Python. See http://www.python.org/sf/586680 +if (os.name == "posix" and sys.path and + os.path.basename(sys.path[-1]) == "Modules"): + from distutils.util import get_platform + s = "build/lib.%s-%.3s" % (get_platform(), sys.version) + s = os.path.join(os.path.dirname(sys.path[-1]), s) + sys.path.append(s) + del get_platform, s + +def _init_pathinfo(): + global _dirs_in_sys_path + _dirs_in_sys_path = d = {} + for dir in sys.path: + if dir and not os.path.isdir(dir): + continue + dir, dircase = makepath(dir) + d[dircase] = 1 + +def addsitedir(sitedir): + global _dirs_in_sys_path + if _dirs_in_sys_path is None: + _init_pathinfo() + reset = 1 + else: + reset = 0 + sitedir, sitedircase = makepath(sitedir) + if not sitedircase in _dirs_in_sys_path: + sys.path.append(sitedir) # Add path component + try: + names = os.listdir(sitedir) + except os.error: + return + names.sort() + for name in names: + if name[-4:] == os.extsep + "pth": + addpackage(sitedir, name) + if reset: + _dirs_in_sys_path = None + +def addpackage(sitedir, name): + global _dirs_in_sys_path + if _dirs_in_sys_path is None: + _init_pathinfo() + reset = 1 + else: + reset = 0 + fullname = os.path.join(sitedir, name) + try: + f = open(fullname) + except IOError: + return + while 1: + dir = f.readline() + if not dir: + break + if dir[0] == '#': + continue + if dir.startswith("import"): + exec dir + continue + if dir[-1] == '\n': + dir = dir[:-1] + dir, dircase = makepath(sitedir, dir) + if not dircase in _dirs_in_sys_path and os.path.exists(dir): + sys.path.append(dir) + _dirs_in_sys_path[dircase] = 1 + if reset: + _dirs_in_sys_path = None + +prefixes = [os.path.join(sys.prefix, "local"), sys.prefix] +sitedir = None # make sure sitedir is initialized because of later 'del' +if sys.exec_prefix != sys.prefix: + prefixes.append(os.path.join(sys.exec_prefix, "local")) +for prefix in prefixes: + if prefix: + if sys.platform in ('os2emx', 'riscos'): + sitedirs = [os.path.join(prefix, "Lib", "site-packages")] + elif os.sep == '/': + sitedirs = [os.path.join(prefix, + "lib", + "python" + sys.version[:3], + "site-packages"), + os.path.join(prefix, "lib", "site-python")] + else: + sitedirs = [prefix, os.path.join(prefix, "lib", "site-packages")] + if sys.platform == 'darwin': + # for framework builds *only* we add the standard Apple + # locations. Currently only per-user, but /Library and + # /Network/Library could be added too + if 'Python.framework' in prefix: + home = os.environ.get('HOME') + if home: + sitedirs.append( + os.path.join(home, + 'Library', + 'Python', + sys.version[:3], + 'site-packages')) + for sitedir in sitedirs: + if os.path.isdir(sitedir): + addsitedir(sitedir) +del prefix, sitedir + +_dirs_in_sys_path = None + + +# Define new built-ins 'quit' and 'exit'. +# These are simply strings that display a hint on how to exit. +if os.sep == ':': + exit = 'Use Cmd-Q to quit.' +elif os.sep == '\\': + exit = 'Use Ctrl-Z plus Return to exit.' +else: + exit = 'Use Ctrl-D (i.e. EOF) to exit.' +import __builtin__ +__builtin__.quit = __builtin__.exit = exit +del exit + +# interactive prompt objects for printing the license text, a list of +# contributors and the copyright notice. +class _Printer: + MAXLINES = 23 + + def __init__(self, name, data, files=(), dirs=()): + self.__name = name + self.__data = data + self.__files = files + self.__dirs = dirs + self.__lines = None + + def __setup(self): + if self.__lines: + return + data = None + for dir in self.__dirs: + for file in self.__files: + file = os.path.join(dir, file) + try: + fp = open(file) + data = fp.read() + fp.close() + break + except IOError: + pass + if data: + break + if not data: + data = self.__data + self.__lines = data.split('\n') + self.__linecnt = len(self.__lines) + + def __repr__(self): + self.__setup() + if len(self.__lines) <= self.MAXLINES: + return "\n".join(self.__lines) + else: + return "Type %s() to see the full %s text" % ((self.__name,)*2) + + def __call__(self): + self.__setup() + prompt = 'Hit Return for more, or q (and Return) to quit: ' + lineno = 0 + while 1: + try: + for i in range(lineno, lineno + self.MAXLINES): + print self.__lines[i] + except IndexError: + break + else: + lineno += self.MAXLINES + key = None + while key is None: + key = raw_input(prompt) + if key not in ('', 'q'): + key = None + if key == 'q': + break + +__builtin__.copyright = _Printer("copyright", sys.copyright) +if sys.platform[:4] == 'java': + __builtin__.credits = _Printer( + "credits", + "Jython is maintained by the Jython developers (www.jython.org).") +else: + __builtin__.credits = _Printer("credits", """\ +Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands +for supporting Python development. See www.python.org for more information.""") +here = os.path.dirname(os.__file__) +__builtin__.license = _Printer( + "license", "See http://www.python.org/%.3s/license.html" % sys.version, + ["LICENSE.txt", "LICENSE"], + [os.path.join(here, os.pardir), here, os.curdir]) + + +# Define new built-in 'help'. +# This is a wrapper around pydoc.help (with a twist). + +class _Helper: + def __repr__(self): + return "Type help() for interactive help, " \ + "or help(object) for help about object." + def __call__(self, *args, **kwds): + import pydoc + return pydoc.help(*args, **kwds) + +__builtin__.help = _Helper() + + +# On Windows, some default encodings are not provided +# by Python (e.g. "cp932" in Japanese locale), while they +# are always available as "mbcs" in each locale. +# Make them usable by aliasing to "mbcs" in such a case. + +if sys.platform == 'win32': + import locale, codecs + enc = locale.getdefaultlocale()[1] + if enc.startswith('cp'): # "cp***" ? + try: + codecs.lookup(enc) + except LookupError: + import encodings + encodings._cache[enc] = encodings._unknown + encodings.aliases.aliases[enc] = 'mbcs' + +# Set the string encoding used by the Unicode implementation. The +# default is 'ascii', but if you're willing to experiment, you can +# change this. + +encoding = "ascii" # Default value set by _PyUnicode_Init() + +if 0: + # Enable to support locale aware default string encodings. + import locale + loc = locale.getdefaultlocale() + if loc[1]: + encoding = loc[1] + +if 0: + # Enable to switch off string to Unicode coercion and implicit + # Unicode to string conversion. + encoding = "undefined" + +if encoding != "ascii": + # On Non-Unicode builds this will raise an AttributeError... + sys.setdefaultencoding(encoding) # Needs Python Unicode build ! + +# +# Run custom site specific code, if available. +# +try: + import sitecustomize +except ImportError: + pass + +# +# Remove sys.setdefaultencoding() so that users cannot change the +# encoding after initialization. The test for presence is needed when +# this module is run as a script, because this code is executed twice. +# +if hasattr(sys, "setdefaultencoding"): + del sys.setdefaultencoding + +def _test(): + print "sys.path = [" + for dir in sys.path: + print " %s," % `dir` + print "]" + +if __name__ == '__main__': + _test() diff --git a/inst/extdat/test.rtf b/inst/extdat/test.rtf new file mode 100644 index 0000000..c1f2b30 --- /dev/null +++ b/inst/extdat/test.rtf @@ -0,0 +1,16 @@ +{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f36\froman\fcharset238\fprq2 Times New Roman CE;} +{\f37\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f39\froman\fcharset161\fprq2 Times New Roman Greek;}{\f40\froman\fcharset162\fprq2 Times New Roman Tur;}{\f41\froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\f42\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f43\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f44\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255; +\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0; +\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden +Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}}{\*\rsidtbl \rsid5531693}{\*\generator Microsoft Word 10.0.2627;}{\info +{\title This is a test RTF document}{\author David Castro}{\operator David Castro}{\creatim\yr2004\mo6\dy17\hr19\min29}{\revtim\yr2004\mo6\dy17\hr19\min30}{\version1}{\edmins1}{\nofpages1}{\nofwords4}{\nofchars25}{\*\company Azusa Pacific University} +{\nofcharsws28}{\vern16437}}\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct\asianbrkrule\rsidroot5531693 \fet0\sectd +\linex0\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (} +{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 +\fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid5531693 This is a test RTF document +\par +\par }} \ No newline at end of file diff --git a/inst/extdat/test.sh b/inst/extdat/test.sh new file mode 100644 index 0000000..2392573 --- /dev/null +++ b/inst/extdat/test.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "this is a test bash script" diff --git a/inst/extdat/test.tar b/inst/extdat/test.tar new file mode 100644 index 0000000..eb84d26 Binary files /dev/null and b/inst/extdat/test.tar differ diff --git a/inst/extdat/test.tar.gz b/inst/extdat/test.tar.gz new file mode 100644 index 0000000..2bd3894 Binary files /dev/null and b/inst/extdat/test.tar.gz differ diff --git a/inst/extdat/test.tga b/inst/extdat/test.tga new file mode 100644 index 0000000..29bcd3b Binary files /dev/null and b/inst/extdat/test.tga differ diff --git a/inst/extdat/test.txt b/inst/extdat/test.txt new file mode 100644 index 0000000..74d74d1 --- /dev/null +++ b/inst/extdat/test.txt @@ -0,0 +1 @@ +This is a plain text file diff --git a/inst/extdat/test.txt.gz b/inst/extdat/test.txt.gz new file mode 100644 index 0000000..d81ad72 Binary files /dev/null and b/inst/extdat/test.txt.gz differ diff --git a/inst/extdat/test.wav b/inst/extdat/test.wav new file mode 100644 index 0000000..0794ee4 Binary files /dev/null and b/inst/extdat/test.wav differ diff --git a/inst/extdat/test.wmf b/inst/extdat/test.wmf new file mode 100644 index 0000000..3ec0141 Binary files /dev/null and b/inst/extdat/test.wmf differ diff --git a/inst/extdat/test.xcf b/inst/extdat/test.xcf new file mode 100644 index 0000000..51b452c Binary files /dev/null and b/inst/extdat/test.xcf differ diff --git a/inst/extdat/test.xml b/inst/extdat/test.xml new file mode 100644 index 0000000..247f749 --- /dev/null +++ b/inst/extdat/test.xml @@ -0,0 +1,47 @@ + + + + +0.1 +arimus@users.sourceforge.net +XML magic file + + + + application/x-tar + tar + POSIX tar archive + ustar\000 + + + application/x-tar + tar + tar archive + ustar \000GNU + + + application/zip + zip + archive data + PK\003\004 + + + application/x-gzip + gz + gzip compressed data + \037\213 + + + application/x-bzip2 + bz2 + bzip2 compressed data + BZh + + + ??? + bat + MS-DOS batch file text + @echo off + + + diff --git a/inst/extdat/test.xpm b/inst/extdat/test.xpm new file mode 100644 index 0000000..fcfa10e --- /dev/null +++ b/inst/extdat/test.xpm @@ -0,0 +1,255 @@ +/* XPM */ +static char * test_xpm[] = { +"100 100 152 2", +" c #FFFFFF", +". c #000000", +"+ c #FAFAFA", +"@ c #ABABAB", +"# c #5E5E5E", +"$ c #2A2A2A", +"% c #0D0D0D", +"& c #030303", +"* c #0B0B0B", +"= c #292929", +"- c #616161", +"; c #B6B6B6", +"> c #FEFEFE", +", c #DBDBDB", +"' c #7E7E7E", +") c #434343", +"! c #1A1A1A", +"~ c #0A0A0A", +"{ c #121212", +"] c #353535", +"^ c #6E6E6E", +"/ c #C3C3C3", +"( c #1D1D1D", +"_ c #343434", +": c #D3D3D3", +"< c #F6F6F6", +"[ c #6A6A6A", +"} c #020202", +"| c #2B2B2B", +"1 c #707070", +"2 c #0C0C0C", +"3 c #C0C0C0", +"4 c #FCFCFC", +"5 c #444444", +"6 c #767676", +"7 c #5F5F5F", +"8 c #BABABA", +"9 c #EBEBEB", +"0 c #E5E5E5", +"a c #A4A4A4", +"b c #101010", +"c c #DEDEDE", +"d c #999999", +"e c #505050", +"f c #B5B5B5", +"g c #E7E7E7", +"h c #F8F8F8", +"i c #DDDDDD", +"j c #A5A5A5", +"k c #4E4E4E", +"l c #C2C2C2", +"m c #F7F7F7", +"n c #4D4D4D", +"o c #494949", +"p c #393939", +"q c #717171", +"r c #DCDCDC", +"s c #4C4C4C", +"t c #2D2D2D", +"u c #F2F2F2", +"v c #1C1C1C", +"w c #D0D0D0", +"x c #C1C1C1", +"y c #8B8B8B", +"z c #797979", +"A c #050505", +"B c #9D9D9D", +"C c #D2D2D2", +"D c #3D3D3D", +"E c #212121", +"F c #3A3A3A", +"G c #CFCFCF", +"H c #F3F3F3", +"I c #181818", +"J c #6B6B6B", +"K c #1E1E1E", +"L c #B9B9B9", +"M c #171717", +"N c #010101", +"O c #060606", +"P c #E4E4E4", +"Q c #151515", +"R c #202020", +"S c #696969", +"T c #AAAAAA", +"U c #E9E9E9", +"V c #7B7B7B", +"W c #454545", +"X c #626262", +"Y c #F1F1F1", +"Z c #0F0F0F", +"` c #EEEEEE", +" . c #BEBEBE", +".. c #3B3B3B", +"+. c #333333", +"@. c #F5F5F5", +"#. c #2F2F2F", +"$. c #C9C9C9", +"%. c #828282", +"&. c #080808", +"*. c #838383", +"=. c #646464", +"-. c #848484", +";. c #9E9E9E", +">. c #B3B3B3", +",. c #F9F9F9", +"'. c #222222", +"). c #7A7A7A", +"!. c #131313", +"~. c #EAEAEA", +"{. c #B0B0B0", +"]. c #BCBCBC", +"^. c #424242", +"/. c #414141", +"(. c #747474", +"_. c #373737", +":. c #262626", +"<. c #8D8D8D", +"[. c #CECECE", +"}. c #EFEFEF", +"|. c #FBFBFB", +"1. c #DADADA", +"2. c #ACACAC", +"3. c #232323", +"4. c #E1E1E1", +"5. c #E8E8E8", +"6. c #4F4F4F", +"7. c #A8A8A8", +"8. c #757575", +"9. c #272727", +"0. c #BBBBBB", +"a. c #F0F0F0", +"b. c #B7B7B7", +"c. c #040404", +"d. c #515151", +"e. c #C5C5C5", +"f. c #0E0E0E", +"g. c #8E8E8E", +"h. c #090909", +"i. c #BDBDBD", +"j. c #111111", +"k. c #2E2E2E", +"l. c #5C5C5C", +"m. c #ECECEC", +"n. c #E3E3E3", +"o. c #787878", +"p. c #141414", +"q. c #070707", +"r. c #545454", +"s. c #9A9A9A", +"t. c #E0E0E0", +"u. c #1B1B1B", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . . . . . ", +" . . . . . . . . ", +" . . . . . . . . ", +" . . . . + @ # $ % & * = - ; > , ' ) ! ~ & { ] ^ / . . . . ", +" . . . . @ ( . . . . . . . . . _ : < [ } . . . . . . . . . | ; . . . . . . . . . . . . . . ", +" . . . . > 1 . . . . . . . . . . . . 2 3 4 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . ", +" . . . . 6 . . . & 7 8 9 + 0 a $ . . . b c d . . . . e f g + h i j k } . . . . . . . . . . . . . . . ", +" . . . . 8 . . . b l m n . . . o p . . . q r s . . . . ", +" . . . . t . . . ; u v . . . w * . . . 0 . . . . ", +" . . . . x . . . 5 y . . . z A . . . + . . . . ", +" . . . . q . . . B C . . . D E . . . 3 . . . . ", +" . . . . F . . . G H . . . I J . . . K L . . . . ", +" . . . . M . . . & & & & } } } N N N . . . . . O P Q . . . . R S T U . . . . ", +" . . . . A . . . . . . . . . . . . . . . . . . . : $ . . . . . . . | V r . . . . ", +" . . . . } . . . . . . . . . . . . . . . . . . . 4 j W O . . . . . . } X Y . . . . ", +" . . . . Z . . . ` < .' ..& . . . . +.@. . . . . ", +" . . . . #.. . . $. U %.&.. . . *. . . . . ", +" . . . . =.. . . -. ;.. . . | . . . . ", +" . . . . >.. . . R ,. H . . . &. A . . . 4 ", +" . . . . 4 '.. . . ). U . . . 2 !.. . . ~. ", +" . . . . {.. . . . ' 4 ].^. /.8 > (.. . . D _.. . . f ", +" . . . . q . . . . :.<.[.}.|.}.1.2.(.3.. . . . '.(.f 4.,.4 5.; 6.. . . . 7. 8.. . . 9.0.a.> ", +" . . . . > 8.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . - 1.O . . . . . . . . . ", +" . . . . b.$ . . . . . . . . . . c.d.e. . . . . . . . . . . . . f.g.> a h.. . . . . . . . ", +" . . . . > i.^ _.Q c.& j.k.l.;.m. n.T o.k t p.q.& f.:.r.s.` t.%.) u.* N . . . ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; diff --git a/inst/extdat/test.zip b/inst/extdat/test.zip new file mode 100644 index 0000000..6667f07 Binary files /dev/null and b/inst/extdat/test.zip differ diff --git a/inst/extdat/test_1.2.class b/inst/extdat/test_1.2.class new file mode 100644 index 0000000..f0e2a72 Binary files /dev/null and b/inst/extdat/test_1.2.class differ diff --git a/inst/extdat/test_1.3.class b/inst/extdat/test_1.3.class new file mode 100644 index 0000000..f657f62 Binary files /dev/null and b/inst/extdat/test_1.3.class differ diff --git a/inst/extdat/test_1.4.class b/inst/extdat/test_1.4.class new file mode 100644 index 0000000..8404a19 Binary files /dev/null and b/inst/extdat/test_1.4.class differ diff --git a/inst/extdat/test_1.5.class b/inst/extdat/test_1.5.class new file mode 100644 index 0000000..ede3110 Binary files /dev/null and b/inst/extdat/test_1.5.class differ diff --git a/inst/extdat/test_128_44_jstereo.mp3 b/inst/extdat/test_128_44_jstereo.mp3 new file mode 100644 index 0000000..154337d Binary files /dev/null and b/inst/extdat/test_128_44_jstereo.mp3 differ diff --git a/inst/extdat/test_excel.xlsm b/inst/extdat/test_excel.xlsm new file mode 100644 index 0000000..cf13af8 Binary files /dev/null and b/inst/extdat/test_excel.xlsm differ diff --git a/inst/extdat/test_excel.xlsx b/inst/extdat/test_excel.xlsx new file mode 100644 index 0000000..cf13af8 Binary files /dev/null and b/inst/extdat/test_excel.xlsx differ diff --git a/inst/extdat/test_excel_2000.xls b/inst/extdat/test_excel_2000.xls new file mode 100644 index 0000000..b674947 Binary files /dev/null and b/inst/extdat/test_excel_2000.xls differ diff --git a/inst/extdat/test_excel_spreadsheet.xml b/inst/extdat/test_excel_spreadsheet.xml new file mode 100644 index 0000000..f2ffda7 --- /dev/null +++ b/inst/extdat/test_excel_spreadsheet.xml @@ -0,0 +1,62 @@ + + + + David Castro + David Castro + 2004-06-16T02:29:05Z + 2004-06-16T02:29:24Z + Azusa Pacific University + 10.2625 + + + + + + + 12660 + 17100 + 360 + 60 + False + False + + + + + + + + Test excel 2000 spreadsheet + +
+ + + False + False + +
+ + + False + False + + + + + False + False + + +
diff --git a/inst/extdat/test_excel_web_archive.mht b/inst/extdat/test_excel_web_archive.mht new file mode 100644 index 0000000..7d3b4d1 --- /dev/null +++ b/inst/extdat/test_excel_web_archive.mht @@ -0,0 +1,155 @@ +MIME-Version: 1.0 +X-Document-Type: Worksheet +Content-Location: file:///C:/2A65B325/test_excel_web_archive.htm +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset="us-ascii" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Test excel 2000 spreadsheet
+ + + + diff --git a/inst/extdat/test_nocompress.tif b/inst/extdat/test_nocompress.tif new file mode 100644 index 0000000..ffb0385 Binary files /dev/null and b/inst/extdat/test_nocompress.tif differ diff --git a/inst/extdat/test_powerpoint.pptm b/inst/extdat/test_powerpoint.pptm new file mode 100644 index 0000000..b8101db Binary files /dev/null and b/inst/extdat/test_powerpoint.pptm differ diff --git a/inst/extdat/test_powerpoint.pptx b/inst/extdat/test_powerpoint.pptx new file mode 100644 index 0000000..b8101db Binary files /dev/null and b/inst/extdat/test_powerpoint.pptx differ diff --git a/inst/extdat/test_word.docm b/inst/extdat/test_word.docm new file mode 100644 index 0000000..dc3bb50 Binary files /dev/null and b/inst/extdat/test_word.docm differ diff --git a/inst/extdat/test_word.docx b/inst/extdat/test_word.docx new file mode 100644 index 0000000..dc3bb50 Binary files /dev/null and b/inst/extdat/test_word.docx differ diff --git a/inst/extdat/test_word_2000.doc b/inst/extdat/test_word_2000.doc new file mode 100644 index 0000000..06a013c Binary files /dev/null and b/inst/extdat/test_word_2000.doc differ diff --git a/inst/extdat/test_word_6.0_95.doc b/inst/extdat/test_word_6.0_95.doc new file mode 100644 index 0000000..f6aaf1e Binary files /dev/null and b/inst/extdat/test_word_6.0_95.doc differ diff --git a/inst/extdata/db/new/magic.mgc.zip b/inst/extdata/db/new/magic.mgc.zip deleted file mode 100644 index 968a793..0000000 Binary files a/inst/extdata/db/new/magic.mgc.zip and /dev/null differ diff --git a/inst/extdata/db/old/magic.mgc.zip b/inst/extdata/db/old/magic.mgc.zip deleted file mode 100644 index 7add8a4..0000000 Binary files a/inst/extdata/db/old/magic.mgc.zip and /dev/null differ diff --git a/inst/extdata/img/Rlogo.jpg b/inst/extdata/img/Rlogo.jpg deleted file mode 100644 index 6d33489..0000000 Binary files a/inst/extdata/img/Rlogo.jpg and /dev/null differ diff --git a/inst/extdata/img/Rlogo.pdf b/inst/extdata/img/Rlogo.pdf deleted file mode 100644 index 616dbaa..0000000 Binary files a/inst/extdata/img/Rlogo.pdf and /dev/null differ diff --git a/inst/extdata/img/Rlogo.png b/inst/extdata/img/Rlogo.png deleted file mode 100644 index fba5412..0000000 Binary files a/inst/extdata/img/Rlogo.png and /dev/null differ diff --git a/inst/extdata/img/Rlogo.svg b/inst/extdata/img/Rlogo.svg deleted file mode 100644 index 78281f7..0000000 --- a/inst/extdata/img/Rlogo.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/inst/extdata/img/Rlogo.tiff b/inst/extdata/img/Rlogo.tiff deleted file mode 100644 index b8d4c99..0000000 Binary files a/inst/extdata/img/Rlogo.tiff and /dev/null differ diff --git a/inst/extdata/img/example.c b/inst/extdata/img/example.c deleted file mode 100644 index aecf6ff..0000000 --- a/inst/extdata/img/example.c +++ /dev/null @@ -1,5 +0,0 @@ -#include - -void main() { - -} \ No newline at end of file diff --git a/inst/extdata/img/example.html b/inst/extdata/img/example.html deleted file mode 100644 index 2626429..0000000 --- a/inst/extdata/img/example.html +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/inst/extdata/img/example.r b/inst/extdata/img/example.r deleted file mode 100644 index bd5fe68..0000000 --- a/inst/extdata/img/example.r +++ /dev/null @@ -1 +0,0 @@ -print("examle") \ No newline at end of file diff --git a/inst/extdata/img/example.rtf b/inst/extdata/img/example.rtf deleted file mode 100644 index 40eb646..0000000 --- a/inst/extdata/img/example.rtf +++ /dev/null @@ -1,5 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470 -{\fonttbl} -{\colortbl;\red255\green255\blue255;} -\margl1440\margr1440\vieww12540\viewh14960\viewkind1 -} \ No newline at end of file diff --git a/inst/extdata/img/example_dir/test.txt b/inst/extdata/img/example_dir/test.txt deleted file mode 100644 index ae218d0..0000000 --- a/inst/extdata/img/example_dir/test.txt +++ /dev/null @@ -1 +0,0 @@ -Test text file since the dir can't be empty and I need to test out dir functionality. \ No newline at end of file diff --git a/man/get_content_type.Rd b/man/get_content_type.Rd new file mode 100644 index 0000000..ccef273 --- /dev/null +++ b/man/get_content_type.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get-content-type.R +\name{get_content_type} +\alias{get_content_type} +\title{Discover MIME type of a file based on contents} +\usage{ +get_content_type(path) +} +\arguments{ +\item{path}{path to a file} +} +\value{ +character vector +} +\description{ +There are a limited number of header "magic" bytes checked directly by +this function but cover quite a bit of ground. After that, \code{\link[=guess_content_type]{guess_content_type()}} is called which uses +file extension-to-MIME mappings. File an issue or PR if more magic-byte-level +comparisons are required/desired. If no match is found, \code{???} is returned. +} +\details{ +Initial in-R header mapping logic borrowed from \code{MimeTypes.java} from +\href{https://github.com/Servoy/servoy-client}{servoy-client} +} +\examples{ +get_content_type(system.file("extdat", "test.pdf", package="simplemagic")) +} diff --git a/man/get_os.Rd b/man/get_os.Rd deleted file mode 100644 index 25f0615..0000000 --- a/man/get_os.Rd +++ /dev/null @@ -1,11 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/wand.r -\name{get_os} -\alias{get_os} -\title{ripped from rappdirs (ty Hadley!)} -\usage{ -get_os() -} -\description{ -ripped from rappdirs (ty Hadley!) -} diff --git a/man/guess_content_type.Rd b/man/guess_content_type.Rd new file mode 100644 index 0000000..2193c9d --- /dev/null +++ b/man/guess_content_type.Rd @@ -0,0 +1,28 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/guess-content-type.R +\name{guess_content_type} +\alias{guess_content_type} +\title{Guess MIME type from filename (extension)} +\usage{ +guess_content_type(path) +} +\arguments{ +\item{path}{path to file} +} +\value{ +character vector +} +\description{ +Uses an internal database of over 1,500 file extension-to-MIME mappings to +return one or more associated types for a given input path. If no match is +found, \code{???} is returned. +} +\details{ +Incorporates standard IANA MIME extension mappings and those from +\href{https://github.com/Servoy/servoy-client}{servoy-client} and +\href{https://github.com/stevenwdv}{stevenwdv}'s +\href{https://s-randomfiles.s3.amazonaws.com/mime/allMimeTypes.json}{allMimeTypes.json}. +} +\examples{ +guess_content_type(system.file("extdat", "test.pdf", package="simplemagic")) +} diff --git a/man/incant.Rd b/man/incant.Rd deleted file mode 100644 index d686906..0000000 --- a/man/incant.Rd +++ /dev/null @@ -1,41 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/wand.r -\name{incant} -\alias{incant} -\title{Retrieve 'magic' attributes from files and directories} -\usage{ -incant(path, magic_db = "system") -} -\arguments{ -\item{path}{character vector of files to use magic on} - -\item{magic_db}{either "\code{system}" (the default) to use the system -\code{magic} database or an atomic character vector with a -colon-separated list of full paths to custom \code{magic} database(s). This parameter -is (for the moment) ignored on Windows.} -} -\value{ -a \code{tibble} / \code{data.frame} of file magic attributes. - Specifically, mime type, encoding, possible file extensions and - type description are returned as colums in the data frame along - with \code{path}. -} -\description{ -Retrieve 'magic' attributes from files and directories -} -\note{ -Various fields might not be available depending on the version - of \code{libmagic} you have installed. -} -\examples{ -library(dplyr) - -system.file("extdata/img", package="wand") \%>\% - list.files(full.names=TRUE) \%>\% - incant() \%>\% - glimpse() -} -\references{ -See \url{http://openpreservation.org/blog/2012/08/09/magic-editing-and-creation-primer/} - for information on how to create your own \code{magic} database -} diff --git a/man/magic_wand_file.Rd b/man/magic_wand_file.Rd deleted file mode 100644 index e5305ad..0000000 --- a/man/magic_wand_file.Rd +++ /dev/null @@ -1,35 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/zzz.r -\name{magic_wand_file} -\alias{magic_wand_file} -\title{Use the "magic" file that comes with the package} -\usage{ -magic_wand_file(refresh = FALSE) -} -\arguments{ -\item{refresh}{ensure the lastest copy of the pacakge "magic" -database is used.} -} -\description{ -The \code{magic_load()} functon from \code{libmagic} can't take ZIP files -and the \code{magic.mgc} file that ships with the package is too large to -be shipped uncompressed. Using this function as the \code{magic_db} -parameter will copy and uncompress the database to a cache directory and -return the full path to the magic file. Subsequent calls will not have to -perform the decompression unless \code{force} is \code{TRUE} or the -cache directory has been cleared. -} -\note{ -'magic' files are highly coupled with the version of the \code{file} - utility they were built with. This function is provided solely for the - off chance that a macOS or Linux/UNIX system's \code{libmagic} library - was not configured properly and cannot find the system 'magic' file. -} -\examples{ -library(dplyr) - -system.file("extdata/img", package="wand") \%>\% - list.files(full.names=TRUE) \%>\% - incant(magic_wand_file()) \%>\% - glimpse() -} diff --git a/man/mime_db.Rd b/man/mime_db.Rd deleted file mode 100644 index 65f4d21..0000000 --- a/man/mime_db.Rd +++ /dev/null @@ -1,39 +0,0 @@ -% Generated by roxygen2: do not edit by hand -% Please edit documentation in R/datasets.r -\docType{data} -\name{mime_db} -\alias{mime_db} -\title{MIME Types Database} -\format{A list with 1,883 elements and four named fields: \code{source}, - \code{compressible}, \code{extensions} & \code{charset}.} -\usage{ -data(mime_db) -} -\description{ -This is a dataset of all mime types. It aggregates data from the -following sources: - -\itemize{ - \item \url{http://www.iana.org/assignments/media-types/media-types.xhtml} - \item \url{http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types} - \item \url{http://hg.nginx.org/nginx/raw-file/default/conf/mime.types} -} - -There are a total of four possible fields per element: - -\itemize{ - \item \code{source}: where the mime type is defined. If not set, it's - probably a custom media type. One of \code{apache}, \code{iana} or \code{nginx}. - \item \code{extensions}: a character vector of known extensions associated with this mime type. - \item \code{compressible}: whether a file of this type can be "gzipped" (mostly - useful in the context of serving up web content). - \item \code{charset}: the default charset associated with this type, if any. -} -} -\note{ -Last updated 2016-08-14; the only guaranteed field is \code{source} -} -\references{ -Ingested from \url{https://github.com/jshttp/mime-db}. -} -\keyword{datasets} diff --git a/man/simplemagic_mime_db.Rd b/man/simplemagic_mime_db.Rd new file mode 100644 index 0000000..0b3353b --- /dev/null +++ b/man/simplemagic_mime_db.Rd @@ -0,0 +1,14 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/aaa.R +\docType{data} +\name{simplemagic_mime_db} +\alias{simplemagic_mime_db} +\title{File extension-to-MIME mapping data frame} +\format{An object of class \code{tbl_df} (inherits from \code{tbl}, \code{data.frame}) with 1763 rows and 2 columns.} +\usage{ +simplemagic_mime_db +} +\description{ +File extension-to-MIME mapping data frame +} +\keyword{datasets} diff --git a/man/wand.Rd b/man/wand.Rd index 29003a4..304ff00 100644 --- a/man/wand.Rd +++ b/man/wand.Rd @@ -10,11 +10,18 @@ The 'libmagic' library provides functions to determine 'MIME' type and other metadata from files through their "magic" attributes. This is useful when you do not wish to rely solely on the honesty of a user or the extension on a file name. It also incorporates other metadata from the mime-db database - +\url{https://github.com/jshttp/mime-db} } -\details{ -Based on \code{file} / \code{libmagic} - \url{https://github.com/file/file} +\section{Some important details}{ + + +The header checking is minimal (i.e. nowhere near as comprehensive as \code{libmagic}) but +covers quite a bit of ground. If there are content-check types from +\href{https://github.com/threatstack/libmagic/tree/master/magic/}{magic sources} +that you would like coded into the package, please file an issue and +\emph{include the full line(s)} from that linked \code{magic.tab} that you would like mapped. } + \author{ -Bob Rudis (@hrbrmstr) +Bob Rudis (bob@rud.is) } diff --git a/src/.gitignore b/src/.gitignore deleted file mode 100644 index 22034c4..0000000 --- a/src/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.o -*.so -*.dll diff --git a/src/Makevars b/src/Makevars deleted file mode 100644 index ca60114..0000000 --- a/src/Makevars +++ /dev/null @@ -1,2 +0,0 @@ -PKG_CPPFLAGS= -L/usr/include -L/usr/local/include -PKG_LIBS= -L/usr/local/lib -L/usr/lib -lmagic diff --git a/src/Makevars.in b/src/Makevars.in deleted file mode 100644 index 7b1840d..0000000 --- a/src/Makevars.in +++ /dev/null @@ -1,2 +0,0 @@ -PKG_CPPFLAGS=@cflags@ -PKG_LIBS=@libs@ -lmagic diff --git a/src/Makevars.win b/src/Makevars.win deleted file mode 100755 index 170ffab..0000000 --- a/src/Makevars.win +++ /dev/null @@ -1,6 +0,0 @@ -all: clean - -clean: - rm -f $(OBJECTS) wand.dll - -.PHONY: all clean \ No newline at end of file diff --git a/src/RcppExports.cpp b/src/RcppExports.cpp deleted file mode 100755 index 6660b2d..0000000 --- a/src/RcppExports.cpp +++ /dev/null @@ -1,40 +0,0 @@ -// Generated by using Rcpp::compileAttributes() -> do not edit by hand -// Generator token: 10BE3573-1514-4C36-9D1C-5A225CD40393 - -#include - -using namespace Rcpp; - -// incant_ -DataFrame incant_(CharacterVector path, std::string magic_db); -RcppExport SEXP _wand_incant_(SEXP pathSEXP, SEXP magic_dbSEXP) { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - Rcpp::traits::input_parameter< CharacterVector >::type path(pathSEXP); - Rcpp::traits::input_parameter< std::string >::type magic_db(magic_dbSEXP); - rcpp_result_gen = Rcpp::wrap(incant_(path, magic_db)); - return rcpp_result_gen; -END_RCPP -} -// lib_version -int lib_version(); -RcppExport SEXP _wand_lib_version() { -BEGIN_RCPP - Rcpp::RObject rcpp_result_gen; - Rcpp::RNGScope rcpp_rngScope_gen; - rcpp_result_gen = Rcpp::wrap(lib_version()); - return rcpp_result_gen; -END_RCPP -} - -static const R_CallMethodDef CallEntries[] = { - {"_wand_incant_", (DL_FUNC) &_wand_incant_, 2}, - {"_wand_lib_version", (DL_FUNC) &_wand_lib_version, 0}, - {NULL, NULL, 0} -}; - -RcppExport void R_init_wand(DllInfo *dll) { - R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); - R_useDynamicSymbols(dll, FALSE); -} diff --git a/src/magic.h b/src/magic.h deleted file mode 100644 index bf1e60b..0000000 --- a/src/magic.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (c) Christos Zoulas 2003. - * All Rights Reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice immediately at the beginning of the file, without modification, - * this list of conditions, and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR - * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#ifndef _MAGIC_H -#define _MAGIC_H - -#include - -#define MAGIC_NONE 0x0000000 /* No flags */ -#define MAGIC_DEBUG 0x0000001 /* Turn on debugging */ -#define MAGIC_SYMLINK 0x0000002 /* Follow symlinks */ -#define MAGIC_COMPRESS 0x0000004 /* Check inside compressed files */ -#define MAGIC_DEVICES 0x0000008 /* Look at the contents of devices */ -#define MAGIC_MIME_TYPE 0x0000010 /* Return the MIME type */ -#define MAGIC_CONTINUE 0x0000020 /* Return all matches */ -#define MAGIC_CHECK 0x0000040 /* Print warnings to stderr */ -#define MAGIC_PRESERVE_ATIME 0x0000080 /* Restore access time on exit */ -#define MAGIC_RAW 0x0000100 /* Don't convert unprintable chars */ -#define MAGIC_ERROR 0x0000200 /* Handle ENOENT etc as real errors */ -#define MAGIC_MIME_ENCODING 0x0000400 /* Return the MIME encoding */ -#define MAGIC_MIME (MAGIC_MIME_TYPE|MAGIC_MIME_ENCODING) -#define MAGIC_APPLE 0x0000800 /* Return the Apple creator/type */ -#define MAGIC_EXTENSION 0x1000000 /* Return a /-separated list of - * extensions */ -#define MAGIC_COMPRESS_TRANSP 0x2000000 /* Check inside compressed files - * but not report compression */ -#define MAGIC_NODESC (MAGIC_EXTENSION|MAGIC_MIME|MAGIC_APPLE) - -#define MAGIC_NO_CHECK_COMPRESS 0x0001000 /* Don't check for compressed files */ -#define MAGIC_NO_CHECK_TAR 0x0002000 /* Don't check for tar files */ -#define MAGIC_NO_CHECK_SOFT 0x0004000 /* Don't check magic entries */ -#define MAGIC_NO_CHECK_APPTYPE 0x0008000 /* Don't check application type */ -#define MAGIC_NO_CHECK_ELF 0x0010000 /* Don't check for elf details */ -#define MAGIC_NO_CHECK_TEXT 0x0020000 /* Don't check for text files */ -#define MAGIC_NO_CHECK_CDF 0x0040000 /* Don't check for cdf files */ -#define MAGIC_NO_CHECK_TOKENS 0x0100000 /* Don't check tokens */ -#define MAGIC_NO_CHECK_ENCODING 0x0200000 /* Don't check text encodings */ - -/* No built-in tests; only consult the magic file */ -#define MAGIC_NO_CHECK_BUILTIN ( \ - MAGIC_NO_CHECK_COMPRESS | \ - MAGIC_NO_CHECK_TAR | \ -/* MAGIC_NO_CHECK_SOFT | */ \ - MAGIC_NO_CHECK_APPTYPE | \ - MAGIC_NO_CHECK_ELF | \ - MAGIC_NO_CHECK_TEXT | \ - MAGIC_NO_CHECK_CDF | \ - MAGIC_NO_CHECK_TOKENS | \ - MAGIC_NO_CHECK_ENCODING | \ - 0 \ -) - -/* Defined for backwards compatibility (renamed) */ -#define MAGIC_NO_CHECK_ASCII MAGIC_NO_CHECK_TEXT - -/* Defined for backwards compatibility; do nothing */ -#define MAGIC_NO_CHECK_FORTRAN 0x000000 /* Don't check ascii/fortran */ -#define MAGIC_NO_CHECK_TROFF 0x000000 /* Don't check ascii/troff */ - -#define MAGIC_VERSION 528 /* This implementation */ - - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct magic_set *magic_t; -magic_t magic_open(int); -void magic_close(magic_t); - -const char *magic_getpath(const char *, int); -const char *magic_file(magic_t, const char *); -const char *magic_descriptor(magic_t, int); -const char *magic_buffer(magic_t, const void *, size_t); - -const char *magic_error(magic_t); -int magic_setflags(magic_t, int); - -int magic_version(void); -int magic_load(magic_t, const char *); -int magic_load_buffers(magic_t, void **, size_t *, size_t); - -int magic_compile(magic_t, const char *); -int magic_check(magic_t, const char *); -int magic_list(magic_t, const char *); -int magic_errno(magic_t); - -#define MAGIC_PARAM_INDIR_MAX 0 -#define MAGIC_PARAM_NAME_MAX 1 -#define MAGIC_PARAM_ELF_PHNUM_MAX 2 -#define MAGIC_PARAM_ELF_SHNUM_MAX 3 -#define MAGIC_PARAM_ELF_NOTES_MAX 4 -#define MAGIC_PARAM_REGEX_MAX 5 -#define MAGIC_PARAM_BYTES_MAX 6 - -int magic_setparam(magic_t, int, const void *); -int magic_getparam(magic_t, int, void *); - -#ifdef __cplusplus -}; -#endif - -#endif /* _MAGIC_H */ diff --git a/src/wand.cpp b/src/wand.cpp deleted file mode 100644 index 9c1ee0d..0000000 --- a/src/wand.cpp +++ /dev/null @@ -1,189 +0,0 @@ -#include -using namespace Rcpp; - -#ifdef _WIN32 -#define WINDOWS -#endif - -#ifdef _WIN64 -#define WINDOWS -#endif - -#ifndef WINDOWS -#include "magic.h" -#endif - -#ifndef WINDOWS -// [[Rcpp::export]] -DataFrame incant_(CharacterVector path, std::string magic_db="system") { - - unsigned int input_size = path.size(); - - StringVector mime_type(input_size); - StringVector encoding(input_size); - StringVector extensions(input_size); - StringVector description(input_size); - - const char *mdb; - std::string mdbcpp; - -#ifndef MAGIC_VERSION - int version = 500; -#else - int version = magic_version(); -#endif - - if (magic_db == "system") { - mdb = NULL; - } else { - mdbcpp = magic_db; - mdb = mdbcpp.c_str(); - } - - // This is "ugh" due to the fact that various versions of the libmagic - // library can't handle loading multiple "cookies" at the same time. - // So, we end up doing way too much extra work to get the individual - // bits of info. I may just switch this over to a single call (all the - // availabel flags) and do string parsing before pushing to CRAN. - - int flags = MAGIC_MIME_TYPE; - magic_t cookie = magic_open(flags); - - for (unsigned int i=0; i(path[i]); - std::string fullPath(R_ExpandFileName(path_str.c_str())); - - if (cookie == NULL) { - mime_type[i] = NA_STRING; - } else { - int val = magic_load(cookie, mdb); - if (val < 0) magic_load(cookie, NULL); - const char *magic_result = magic_file(cookie, fullPath.c_str()); - if (magic_result == NULL) { - mime_type[i] = NA_STRING; - } else { - std::string res = std::string(magic_result, strnlen(magic_result, 1024)); - mime_type(i) = res; - } - } - - } - - flags = MAGIC_MIME_ENCODING; - cookie = magic_open(flags); - - for (unsigned int i=0; i(path[i]); - std::string fullPath(R_ExpandFileName(path_str.c_str())); - - if (cookie == NULL) { - encoding[i] = NA_STRING; - } else { - int val = magic_load(cookie, mdb); - if (val < 0) magic_load(cookie, NULL); - const char *magic_result = magic_file(cookie, fullPath.c_str()); - if (magic_result == NULL) { - encoding[i] = NA_STRING; - } else { - std::string res = std::string(magic_result, strnlen(magic_result, 1024)); - encoding(i) = res; - } - } - - } - - if (version >= 528) { - - for (unsigned int i=0; i(path[i]); - std::string fullPath(R_ExpandFileName(path_str.c_str())); - - flags = MAGIC_EXTENSION; - cookie = magic_open(flags); - if (cookie == NULL) { - extensions[i] = NA_STRING; - } else { - int val = magic_load(cookie, mdb); - if (val < 0) magic_load(cookie, NULL); - const char *magic_result = magic_file(cookie, fullPath.c_str()); - if (magic_result == NULL) { - extensions[i] = NA_STRING; - } else { - std::string res = std::string(magic_result, strnlen(magic_result, 1024)); - extensions(i) = res; - } - } - } - - } - - flags = MAGIC_NONE; - cookie = magic_open(flags); - for (unsigned int i=0; i(path[i]); - std::string fullPath(R_ExpandFileName(path_str.c_str())); - - if (cookie == NULL) { - description[i] = NA_STRING; - } else { - int val = magic_load(cookie, mdb); - if (val < 0) magic_load(cookie, NULL); - const char *magic_result = magic_file(cookie, fullPath.c_str()); - if (magic_result == NULL) { - description[i] = NA_STRING; - } else { - std::string res = std::string(magic_result, strnlen(magic_result, 1024)); - description(i) = res; - } - } - - } - - DataFrame df; - - if (version >= 528) { - df = DataFrame::create(_["file"] = path, - _["mime_type"] = mime_type, - _["encoding"] = encoding, - _["extensions"] = extensions, - _["description"] = description, - _["stringsAsFactors"] = false); - } else { - df = DataFrame::create(_["file"] = path, - _["mime_type"] = mime_type, - _["encoding"] = encoding, - _["description"] = description, - _["stringsAsFactors"] = false); - } - - df.attr("class") = CharacterVector::create("tbl_df", "tbl", "data.frame"); - - return(df); - -} -#else -DataFrame incant_(CharacterVector path, std::string magic_db="system") { - return(DataFrame::create()); -} -#endif - -// [[Rcpp::export]] -int lib_version() { -#ifndef MAGIC_VERSION - return(500); -#else - return(magic_version()); -#endif -} diff --git a/tests/testthat/test-wand.R b/tests/testthat/test-wand.R index d21dcf6..befd353 100644 --- a/tests/testthat/test-wand.R +++ b/tests/testthat/test-wand.R @@ -1,13 +1,65 @@ -context("wand can correctly test files") -test_that("a sample image file is identified correctly", { +context("File types are recognized properly") +test_that("Basic file tests work", { - tmp <- incant(list.files(system.file("extdata", "img", package="wand"), - full.names=TRUE), - magic_wand_file()) - tmp <- tmp$description - tmp <- unlist(tmp, use.names=FALSE) - tmp <- sort(tmp) + list( + actions.csv = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + actions.txt = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + actions.xlsx = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + test_1.2.class = "application/java-vm", test_1.3.class = "application/java-vm", + test_1.4.class = "application/java-vm", test_1.5.class = "application/java-vm", + test_128_44_jstereo.mp3 = "audio/mp3", test_excel_2000.xls = "application/msword", + test_excel_spreadsheet.xml = "application/xml", test_excel_web_archive.mht = "message/rfc822", + test_excel.xlsm = "application/zip", test_excel.xlsx = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + test_nocompress.tif = "image/tiff", test_powerpoint.pptm = "application/zip", + test_powerpoint.pptx = "application/vnd.openxmlformats-officedocument.presentationml.presentation", + test_word_2000.doc = "application/msword", test_word_6.0_95.doc = "application/msword", + test_word.docm = "application/zip", test_word.docx = "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + test.au = "audio/basic", test.bin = c( + "application/mac-binary", + "application/macbinary", "application/octet-stream", "application/x-binary", + "application/x-macbinary" + ), test.bmp = "image/bmp", test.dtd = "application/xml-dtd", + test.emf = "application/x-msmetafile", test.eps = "application/postscript", + test.fli = c("video/flc", "video/fli", "video/x-fli"), test.gif = "image/gif", + test.ico = "image/x-icon", test.java = c( + "text/plain", "text/x-java", + "text/x-java-source" + ), test.jpg = "image/jpeg", test.mp3 = "audio/mp3", + test.odt = "application/vnd.oasis.opendocument.text", test.ogg = c( + "application/ogg", + "audio/ogg" + ), test.pcx = c("image/pcx", "image/x-pcx"), test.pdf = "application/pdf", + test.pl = c("text/plain", "text/x-perl", "text/x-script.perl"), test.png = "image/png", test.pnm = c( + "application/x-portable-anymap", + "image/x-portable-anymap" + ), test.ppm = "image/x-portable-pixmap", + test.ppt = "application/msword", test.ps = "application/postscript", + test.psd = "image/photoshop", test.py = c( + "text/x-python", + "text/x-script.phyton" + ), test.rtf = c( + "application/rtf", + "application/x-rtf", "text/richtext", "text/rtf" + ), test.sh = c( + "application/x-bsh", + "application/x-sh", "application/x-shar", "text/x-script.sh", + "text/x-sh" + ), test.tar = "application/pax", test.tar.gz = c( + "application/octet-stream", + "application/x-compressed", "application/x-gzip" + ), test.tga = "image/x-tga", + test.txt = "text/plain", test.txt.gz = c( + "application/octet-stream", + "application/x-compressed", "application/x-gzip" + ), test.wav = "audio/x-wav", + test.wmf = c("application/x-msmetafile", "windows/metafile"), test.xcf = "application/x-xcf", test.xml = "application/xml", + test.xpm = c("image/x-xbitmap", "image/x-xpixmap", "image/xpm"), test.zip = "application/zip" + ) -> results - expect_that(any(substr(tmp, 1, 3) == "PNG"), equals(TRUE)) + fils <- list.files(system.file("extdat", package="wand"), full.names=TRUE) + tst <- lapply(fils, get_content_type) + names(tst) <- basename(fils) + + for(n in names(tst)) expect_identical(results[[n]], tst[[n]]) })