text: // defaults, types, and shorthands.
  
  
  var path = require("path")
    , url = require("url")
    , Stream = require("stream").Stream
    , semver = require("semver")
    , stableFamily = semver.parse(process.version)
    , os = require("os")
    , nopt = require("nopt")
    , log = require("./log.js")
  
  function Octal () {}
  function validateOctal (data, k, val) {
    // must be either an integer or an octal string.
    if (typeof val === "number") {
      data[k] = "0" + val.toString(8)
    }
    if (typeof val === "string") {
      if (val.charAt(0) !== "0" || isNaN(val)) return false
      data[k] = "0" + parseInt(val, 8).toString(8)
    }
  }
  
  function validateSemver (data, k, val) {
    if (!semver.valid(val)) return false
    data[k] = semver.valid(val)
  }
  
  nopt.typeDefs.semver = { type: semver, validate: validateSemver }
  nopt.typeDefs.Octal = { type: Octal, validate: validateOctal }
  
  nopt.invalidHandler = function (k, val, type, data) {
    log.warn(k + "=" + JSON.stringify(val), "invalid config")
  
    if (Array.isArray(type)) {
      if (type.indexOf(url) !== -1) type = url
      else if (type.indexOf(path) !== -1) type = path
    }
  
    switch (type) {
      case Octal:
        log.warn("Must be octal number, starting with 0", "invalid config")
        break
      case url:
        log.warn("Must be a full url with 'http://'", "invalid config")
        break
      case path:
        log.warn("Must be a valid filesystem path", "invalid config")
        break
      case Number:
        log.warn("Must be a numeric value", "invalid config")
        break
    }
  }
  
  if (!stableFamily || (+stableFamily[2] % 2)) stableFamily = null
  else stableFamily = stableFamily[1] + "." + stableFamily[2]
  
  var httpsOk = semver.satisfies(process.version, ">=0.4.9")
  var winColor = semver.satisfies(process.version, ">=0.5.9")
  
  var defaults
  
  var temp = process.env.TMPDIR
           || process.env.TMP
           || process.env.TEMP
           || ( process.platform === "win32"
              ? "c:\\windows\\temp"
              : "/tmp" )
  
  var home = ( process.platform === "win32"
             ? process.env.USERPROFILE
             : process.env.HOME )
  
  if (home) process.env.HOME = home
  else home = temp
  
  var globalPrefix
  Object.defineProperty(exports, "defaults", {get: function () {
    if (defaults) return defaults
  
    if (process.env.PREFIX) {
      globalPrefix = process.env.PREFIX
    } else if (process.platform === "win32") {
      // c:\node\node.exe --> prefix=c:\node\
      globalPrefix = path.join(process.execPath, "..")
    } else {
      // /usr/local/bin/node --> prefix=/usr/local
      globalPrefix = path.join(process.execPath, "..", "..")
  
      // destdir only is respected on Unix
      if (process.env.DESTDIR) {
        globalPrefix = process.env.DESTDIR + "/" + globalPrefix
      }
    }
  
    return defaults =
      { "always-auth" : false
  
      // Disable bindist publishing for now.  Too problematic.
      // Revisit when we have a less crappy approach, or just make
      // bindist be a thing that only dedicated build-farms will enable.
      , "bin-publish" : false
  
      , bindist : stableFamily
          && ( stableFamily + "-"
             + "ares" + process.versions.ares + "-"
             + "ev" + process.versions.ev + "-"
             + "openssl" + process.versions.openssl + "-"
             + "v8" + process.versions.v8 + "-"
             + process.platform + "-"
             + (process.arch ? process.arch + "-" : "")
             + os.release() )
  
        // are there others?
      , browser : process.platform === "darwin" ? "open"
                : process.platform === "win32" ? "start"
                : "google-chrome"
  
      , ca : // the npm CA certificate.
        "-----BEGIN CERTIFICATE-----\n"+
        "MIIChzCCAfACCQDauvz/KHp8ejANBgkqhkiG9w0BAQUFADCBhzELMAkGA1UEBhMC\n"+
        "VVMxCzAJBgNVBAgTAkNBMRAwDgYDVQQHEwdPYWtsYW5kMQwwCgYDVQQKEwNucG0x\n"+
        "IjAgBgNVBAsTGW5wbSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkxDjAMBgNVBAMTBW5w\n"+
        "bUNBMRcwFQYJKoZIhvcNAQkBFghpQGl6cy5tZTAeFw0xMTA5MDUwMTQ3MTdaFw0y\n"+
        "MTA5MDIwMTQ3MTdaMIGHMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExEDAOBgNV\n"+
        "BAcTB09ha2xhbmQxDDAKBgNVBAoTA25wbTEiMCAGA1UECxMZbnBtIENlcnRpZmlj\n"+
        "YXRlIEF1dGhvcml0eTEOMAwGA1UEAxMFbnBtQ0ExFzAVBgkqhkiG9w0BCQEWCGlA\n"+
        "aXpzLm1lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLI4tIqPpRW+ACw9GE\n"+
        "OgBlJZwK5f8nnKCLK629Pv5yJpQKs3DENExAyOgDcyaF0HD0zk8zTp+ZsLaNdKOz\n"+
        "Gn2U181KGprGKAXP6DU6ByOJDWmTlY6+Ad1laYT0m64fERSpHw/hjD3D+iX4aMOl\n"+
        "y0HdbT5m1ZGh6SJz3ZqxavhHLQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAC4ySDbC\n"+
        "l7W1WpLmtLGEQ/yuMLUf6Jy/vr+CRp4h+UzL+IQpCv8FfxsYE7dhf/bmWTEupBkv\n"+
        "yNL18lipt2jSvR3v6oAHAReotvdjqhxddpe5Holns6EQd1/xEZ7sB1YhQKJtvUrl\n"+
        "ZNufy1Jf1r0ldEGeA+0ISck7s+xSh9rQD2Op\n"+
        "-----END CERTIFICATE-----\n"
  
      , cache : process.platform === "win32"
              ? path.resolve(process.env.APPDATA || home || temp, "npm-cache")
              : path.resolve( home || temp, ".npm")
  
      , color : process.platform !== "win32" || winColor
      , coverage: false
      , depth: Infinity
      , description : true
      , dev : false
      , editor : process.env.EDITOR ||
               ( process.platform === "win32" ? "notepad" : "vi" )
      , force : false
      , global : false
      , globalconfig : path.resolve(globalPrefix, "etc", "npmrc")
      , globalignorefile : path.resolve( globalPrefix, "etc", "npmignore")
      , group : process.platform === "win32" ? 0
              : process.env.SUDO_GID || (process.getgid && process.getgid())
      , ignore: ""
      , "init.version" : "0.0.0"
      , "init.author.name" : ""
      , "init.author.email" : ""
      , "init.author.url" : ""
      , link: false
      , logfd : 2
      , loglevel : "http"
      , logprefix : process.platform !== "win32" || winColor
      , long : false
      , message : "%s"
      , "node-version" : process.version
      , npaturl : "http://npat.npmjs.org/"
      , npat : false
      , "onload-script" : false
      , outfd : 1
      , parseable : false
      , pre: false
      , prefix : globalPrefix
      , production: false
      , "proprietary-attribs": true
      , proxy : process.env.HTTP_PROXY || process.env.http_proxy || null
      , "https-proxy" : process.env.HTTPS_PROXY || process.env.https_proxy ||
                        process.env.HTTP_PROXY || process.env.http_proxy || null
      , "rebuild-bundle" : true
      , registry : "http" + (httpsOk ? "s" : "") + "://registry.npmjs.org/"
      , rollback : true
      , save : false
      , searchopts: ""
      , searchexclude: null
      , searchsort: "name"
      , shell : process.platform === "win32"
              ? process.env.ComSpec || "cmd"
              : process.env.SHELL || "bash"
      , "strict-ssl": true
      , tag : "latest"
      , tmp : temp
      , unicode : true
      , "unsafe-perm" : process.platform === "win32"
                      || process.platform === "cygwin"
                      || !( process.getuid && process.setuid
                         && process.getgid && process.setgid )
                      || process.getuid() !== 0
      , usage : false
      , user : process.platform === "win32" ? 0 : "nobody"
      , username : ""
      , userconfig : path.resolve(home, ".npmrc")
      , userignorefile : path.resolve(home, ".npmignore")
      , umask: 022
      , version : false
      , viewer: process.platform === "win32" ? "browser" : "man"
      , yes: null
  
      , _exit : true
      }
  }})
  
  exports.types =
    { "always-auth" : Boolean
    , "bin-publish" : Boolean
    , bindist : [null, String]
    , browser : String
    , ca: [null, String]
    , cache : path
    , color : ["always", Boolean]
    , coverage: Boolean
    , depth : Number
    , description : Boolean
    , dev : Boolean
    , editor : String
    , force : Boolean
    , global : Boolean
    , globalconfig : path
    , globalignorefile: path
    , group : [Number, String]
    , "https-proxy" : [null, url]
    , ignore : String
    , "init.version" : [null, semver]
    , "init.author.name" : String
    , "init.author.email" : String
    , "init.author.url" : ["", url]
    , link: Boolean
    , logfd : [Number, Stream]
    , loglevel : ["silent","win","error","warn","http","info","verbose","silly"]
    , logprefix : Boolean
    , long : Boolean
    , message: String
    , "node-version" : [null, semver]
    , npaturl : url
    , npat : Boolean
    , "onload-script" : [null, String]
    , outfd : [Number, Stream]
    , parseable : Boolean
    , pre: Boolean
    , prefix: path
    , production: Boolean
    , "proprietary-attribs": Boolean
    , proxy : [null, url]
    , "rebuild-bundle" : Boolean
    , registry : [null, url]
    , rollback : Boolean
    , save : Boolean
    , searchopts : String
    , searchexclude: [null, String]
    , searchsort: [ "name", "-name"
                  , "description", "-description"
                  , "author", "-author"
                  , "date", "-date"
                  , "keywords", "-keywords" ]
    , shell : String
    , "strict-ssl": Boolean
    , tag : String
    , tmp : path
    , unicode : Boolean
    , "unsafe-perm" : Boolean
    , usage : Boolean
    , user : [Number, String]
    , username : String
    , userconfig : path
    , userignorefile : path
    , umask: Octal
    , version : Boolean
    , viewer: String
    , yes: [false, null, Boolean]
    , _exit : Boolean
    }
  
  exports.shorthands =
    { s : ["--loglevel", "silent"]
    , d : ["--loglevel", "info"]
    , dd : ["--loglevel", "verbose"]
    , ddd : ["--loglevel", "silly"]
    , noreg : ["--no-registry"]
    , reg : ["--registry"]
    , "no-reg" : ["--no-registry"]
    , silent : ["--loglevel", "silent"]
    , verbose : ["--loglevel", "verbose"]
    , h : ["--usage"]
    , H : ["--usage"]
    , "?" : ["--usage"]
    , help : ["--usage"]
    , v : ["--version"]
    , f : ["--force"]
    , gangster : ["--force"]
    , gangsta : ["--force"]
    , desc : ["--description"]
    , "no-desc" : ["--no-description"]
    , "local" : ["--no-global"]
    , l : ["--long"]
    , m : ["--message"]
    , p : ["--parseable"]
    , porcelain : ["--parseable"]
    , g : ["--global"]
    , S : ["--save"]
    , y : ["--yes"]
    , n : ["--no-yes"]
    }
  