http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/attributes_test/New
 folder/readonly.txt
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/attributes_test/New 
folder/readonly.txt b/node_modules/adm-zip/test/assets/attributes_test/New 
folder/readonly.txt
new file mode 100644
index 0000000..3c3ca55
--- /dev/null
+++ b/node_modules/adm-zip/test/assets/attributes_test/New folder/readonly.txt  
@@ -0,0 +1,17 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/attributes_test/New
 folder/somefile.txt
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/attributes_test/New 
folder/somefile.txt b/node_modules/adm-zip/test/assets/attributes_test/New 
folder/somefile.txt
new file mode 100644
index 0000000..3c3ca55
--- /dev/null
+++ b/node_modules/adm-zip/test/assets/attributes_test/New folder/somefile.txt  
@@ -0,0 +1,17 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/attributes_test/asd/New
 Text Document.txt
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/attributes_test/asd/New Text 
Document.txt b/node_modules/adm-zip/test/assets/attributes_test/asd/New Text 
Document.txt
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/attributes_test/blank
 file.txt
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/attributes_test/blank file.txt 
b/node_modules/adm-zip/test/assets/attributes_test/blank file.txt
new file mode 100644
index 0000000..e69de29

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/fast.zip
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/fast.zip 
b/node_modules/adm-zip/test/assets/fast.zip
new file mode 100644
index 0000000..f4ed17b
Binary files /dev/null and b/node_modules/adm-zip/test/assets/fast.zip differ

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/fastest.zip
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/fastest.zip 
b/node_modules/adm-zip/test/assets/fastest.zip
new file mode 100644
index 0000000..f4ed17b
Binary files /dev/null and b/node_modules/adm-zip/test/assets/fastest.zip differ

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/linux_arc.zip
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/linux_arc.zip 
b/node_modules/adm-zip/test/assets/linux_arc.zip
new file mode 100644
index 0000000..188eccb
Binary files /dev/null and b/node_modules/adm-zip/test/assets/linux_arc.zip 
differ

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/maximum.zip
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/maximum.zip 
b/node_modules/adm-zip/test/assets/maximum.zip
new file mode 100644
index 0000000..86a8ec7
Binary files /dev/null and b/node_modules/adm-zip/test/assets/maximum.zip differ

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/normal.zip
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/normal.zip 
b/node_modules/adm-zip/test/assets/normal.zip
new file mode 100644
index 0000000..b4602c9
Binary files /dev/null and b/node_modules/adm-zip/test/assets/normal.zip differ

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/store.zip
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/store.zip 
b/node_modules/adm-zip/test/assets/store.zip
new file mode 100644
index 0000000..e2add30
Binary files /dev/null and b/node_modules/adm-zip/test/assets/store.zip differ

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/assets/ultra.zip
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/assets/ultra.zip 
b/node_modules/adm-zip/test/assets/ultra.zip
new file mode 100644
index 0000000..86a8ec7
Binary files /dev/null and b/node_modules/adm-zip/test/assets/ultra.zip differ

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/test/index.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/test/index.js 
b/node_modules/adm-zip/test/index.js
new file mode 100644
index 0000000..70acb51
--- /dev/null
+++ b/node_modules/adm-zip/test/index.js
@@ -0,0 +1,5 @@
+var Attr = require("../util").FileAttr,
+    Zip = require("../adm-zip"),
+    fs = require("fs");
+
+//zip.addLocalFile("./test/readonly.txt");

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/util/constants.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/util/constants.js 
b/node_modules/adm-zip/util/constants.js
new file mode 100644
index 0000000..0548054
--- /dev/null
+++ b/node_modules/adm-zip/util/constants.js
@@ -0,0 +1,84 @@
+module.exports = {
+    /* The local file header */
+    LOCHDR           : 30, // LOC header size
+    LOCSIG           : 0x04034b50, // "PK\003\004"
+    LOCVER           : 4,      // version needed to extract
+    LOCFLG           : 6, // general purpose bit flag
+    LOCHOW           : 8, // compression method
+    LOCTIM           : 10, // modification time (2 bytes time, 2 bytes date)
+    LOCCRC           : 14, // uncompressed file crc-32 value
+    LOCSIZ           : 18, // compressed size
+    LOCLEN           : 22, // uncompressed size
+    LOCNAM           : 26, // filename length
+    LOCEXT           : 28, // extra field length
+
+    /* The Data descriptor */
+    EXTSIG           : 0x08074b50, // "PK\007\008"
+    EXTHDR           : 16, // EXT header size
+    EXTCRC           : 4, // uncompressed file crc-32 value
+    EXTSIZ           : 8, // compressed size
+    EXTLEN           : 12, // uncompressed size
+
+    /* The central directory file header */
+    CENHDR           : 46, // CEN header size
+    CENSIG           : 0x02014b50, // "PK\001\002"
+    CENVEM           : 4, // version made by
+    CENVER           : 6, // version needed to extract
+    CENFLG           : 8, // encrypt, decrypt flags
+    CENHOW           : 10, // compression method
+    CENTIM           : 12, // modification time (2 bytes time, 2 bytes date)
+    CENCRC           : 16, // uncompressed file crc-32 value
+    CENSIZ           : 20, // compressed size
+    CENLEN           : 24, // uncompressed size
+    CENNAM           : 28, // filename length
+    CENEXT           : 30, // extra field length
+    CENCOM           : 32, // file comment length
+    CENDSK           : 34, // volume number start
+    CENATT           : 36, // internal file attributes
+    CENATX           : 38, // external file attributes (host system dependent)
+    CENOFF           : 42, // LOC header offset
+
+    /* The entries in the end of central directory */
+    ENDHDR           : 22, // END header size
+    ENDSIG           : 0x06054b50, // "PK\005\006"
+    ENDSUB           : 8, // number of entries on this disk
+    ENDTOT           : 10, // total number of entries
+    ENDSIZ           : 12, // central directory size in bytes
+    ENDOFF           : 16, // offset of first CEN header
+    ENDCOM           : 20, // zip file comment length
+
+    /* Compression methods */
+    STORED           : 0, // no compression
+    SHRUNK           : 1, // shrunk
+    REDUCED1         : 2, // reduced with compression factor 1
+    REDUCED2         : 3, // reduced with compression factor 2
+    REDUCED3         : 4, // reduced with compression factor 3
+    REDUCED4         : 5, // reduced with compression factor 4
+    IMPLODED         : 6, // imploded
+    // 7 reserved
+    DEFLATED         : 8, // deflated
+    ENHANCED_DEFLATED: 9, // enhanced deflated
+    PKWARE           : 10,// PKWare DCL imploded
+    // 11 reserved
+    BZIP2            : 12, //  compressed using BZIP2
+    // 13 reserved
+    LZMA             : 14, // LZMA
+    // 15-17 reserved
+    IBM_TERSE        : 18, // compressed using IBM TERSE
+    IBM_LZ77         : 19, //IBM LZ77 z
+
+    /* General purpose bit flag */
+    FLG_ENC          : 0,  // encripted file
+    FLG_COMP1        : 1,  // compression option
+    FLG_COMP2        : 2,  // compression option
+    FLG_DESC         : 4,  // data descriptor
+    FLG_ENH          : 8,  // enhanced deflation
+    FLG_STR          : 16, // strong encryption
+    FLG_LNG          : 1024, // language encoding
+    FLG_MSK          : 4096, // mask header values
+
+    /* Load type */
+    FILE             : 0,
+    BUFFER           : 1,
+    NONE             : 2
+};

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/util/errors.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/util/errors.js 
b/node_modules/adm-zip/util/errors.js
new file mode 100644
index 0000000..db5d69e
--- /dev/null
+++ b/node_modules/adm-zip/util/errors.js
@@ -0,0 +1,35 @@
+module.exports = {
+    /* Header error messages */
+    "INVALID_LOC" : "Invalid LOC header (bad signature)",
+    "INVALID_CEN" : "Invalid CEN header (bad signature)",
+    "INVALID_END" : "Invalid END header (bad signature)",
+
+    /* ZipEntry error messages*/
+    "NO_DATA" : "Nothing to decompress",
+    "BAD_CRC" : "CRC32 checksum failed",
+    "FILE_IN_THE_WAY" : "There is a file in the way: %s",
+    "UNKNOWN_METHOD" : "Invalid/unsupported compression method",
+
+    /* Inflater error messages */
+    "AVAIL_DATA" : "inflate::Available inflate data did not terminate",
+    "INVALID_DISTANCE" : "inflate::Invalid literal/length or distance code in 
fixed or dynamic block",
+    "TO_MANY_CODES" : "inflate::Dynamic block code description: too many 
length or distance codes",
+    "INVALID_REPEAT_LEN" : "inflate::Dynamic block code description: repeat 
more than specified lengths",
+    "INVALID_REPEAT_FIRST" : "inflate::Dynamic block code description: repeat 
lengths with no first length",
+    "INCOMPLETE_CODES" : "inflate::Dynamic block code description: code 
lengths codes incomplete",
+    "INVALID_DYN_DISTANCE": "inflate::Dynamic block code description: invalid 
distance code lengths",
+    "INVALID_CODES_LEN": "inflate::Dynamic block code description: invalid 
literal/length code lengths",
+    "INVALID_STORE_BLOCK" : "inflate::Stored block length did not match one's 
complement",
+    "INVALID_BLOCK_TYPE" : "inflate::Invalid block type (type == 3)",
+
+    /* ADM-ZIP error messages */
+    "CANT_EXTRACT_FILE" : "Could not extract the file",
+    "CANT_OVERRIDE" : "Target file already exists",
+    "NO_ZIP" : "No zip file was loaded",
+    "NO_ENTRY" : "Entry doesn't exist",
+    "DIRECTORY_CONTENT_ERROR" : "A directory cannot have content",
+    "FILE_NOT_FOUND" : "File not found: %s",
+    "NOT_IMPLEMENTED" : "Not implemented",
+    "INVALID_FILENAME" : "Invalid filename",
+    "INVALID_FORMAT" : "Invalid or unsupported zip format. No END header found"
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/util/fattr.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/util/fattr.js 
b/node_modules/adm-zip/util/fattr.js
new file mode 100644
index 0000000..2191ec1
--- /dev/null
+++ b/node_modules/adm-zip/util/fattr.js
@@ -0,0 +1,84 @@
+var fs = require("fs"),
+    pth = require("path");
+       
+fs.existsSync = fs.existsSync || pth.existsSync;
+
+module.exports = function(/*String*/path) {
+
+    var _path = path || "",
+        _permissions = 0,
+        _obj = newAttr(),
+        _stat = null;
+
+    function newAttr() {
+        return {
+            directory : false,
+            readonly : false,
+            hidden : false,
+            executable : false,
+            mtime : 0,
+            atime : 0
+        }
+    }
+
+    if (_path && fs.existsSync(_path)) {
+        _stat = fs.statSync(_path);
+        _obj.directory = _stat.isDirectory();
+        _obj.mtime = _stat.mtime;
+        _obj.atime = _stat.atime;
+        _obj.executable = !!(1 & parseInt ((_stat.mode & parseInt ("777", 
8)).toString (8)[0]));
+        _obj.readonly = !!(2 & parseInt ((_stat.mode & parseInt ("777", 
8)).toString (8)[0]));
+        _obj.hidden = pth.basename(_path)[0] === ".";
+    } else {
+        console.warn("Invalid path: " + _path)
+    }
+
+    return {
+
+        get directory () {
+            return _obj.directory;
+        },
+
+        get readOnly () {
+            return _obj.readonly;
+        },
+
+        get hidden () {
+            return _obj.hidden;
+        },
+
+        get mtime () {
+            return _obj.mtime;
+        },
+
+        get atime () {
+           return _obj.atime;
+        },
+
+
+        get executable () {
+            return _obj.executable;
+        },
+
+        decodeAttributes : function(val) {
+
+        },
+
+        encodeAttributes : function (val) {
+
+        },
+
+        toString : function() {
+           return '{\n' +
+               '\t"path" : "' + _path + ",\n" +
+               '\t"isDirectory" : ' + _obj.directory + ",\n" +
+               '\t"isReadOnly" : ' + _obj.readonly + ",\n" +
+               '\t"isHidden" : ' + _obj.hidden + ",\n" +
+               '\t"isExecutable" : ' + _obj.executable + ",\n" +
+               '\t"mTime" : ' + _obj.mtime + "\n" +
+               '\t"aTime" : ' + _obj.atime + "\n" +
+           '}';
+        }
+    }
+
+};

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/util/index.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/util/index.js 
b/node_modules/adm-zip/util/index.js
new file mode 100644
index 0000000..935fc1a
--- /dev/null
+++ b/node_modules/adm-zip/util/index.js
@@ -0,0 +1,4 @@
+module.exports = require("./utils");
+module.exports.Constants = require("./constants");
+module.exports.Errors = require("./errors");
+module.exports.FileAttr = require("./fattr");
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/util/utils.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/util/utils.js 
b/node_modules/adm-zip/util/utils.js
new file mode 100644
index 0000000..b14db8c
--- /dev/null
+++ b/node_modules/adm-zip/util/utils.js
@@ -0,0 +1,145 @@
+var fs = require("fs"),
+    pth = require('path');
+
+fs.existsSync = fs.existsSync || pth.existsSync;
+       
+module.exports = (function() {
+
+    var crcTable = [],
+        Constants = require('./constants'),
+        Errors = require('./errors'),
+
+        PATH_SEPARATOR = pth.normalize("/");
+
+
+    function mkdirSync(/*String*/path) {
+        var resolvedPath = path.split(PATH_SEPARATOR)[0];
+        path.split(PATH_SEPARATOR).forEach(function(name) {
+            if (!name || name.substr(-1,1) == ":") return;
+            resolvedPath += PATH_SEPARATOR + name;
+            var stat;
+            try {
+                stat = fs.statSync(resolvedPath);
+            } catch (e) {
+                fs.mkdirSync(resolvedPath);
+            }
+            if (stat && stat.isFile())
+                throw Errors.FILE_IN_THE_WAY.replace("%s", resolvedPath);
+        });
+    }
+
+    function findSync(/*String*/root, /*RegExp*/pattern, 
/*Boolean*/recoursive) {
+        if (typeof pattern === 'boolean') {
+            recoursive = pattern;
+            pattern = undefined;
+        }
+        var files = [];
+        fs.readdirSync(root).forEach(function(file) {
+            var path = pth.join(root, file);
+
+            if (fs.statSync(path).isDirectory() && recoursive)
+                files = files.concat(findSync(path, pattern, recoursive));
+
+            if (!pattern || pattern.test(path)) {
+                files.push(pth.normalize(path) + 
(fs.statSync(path).isDirectory() ? PATH_SEPARATOR : ""));
+            }
+
+        });
+        return files;
+    }
+
+    return {
+        makeDir : function(/*String*/path) {
+            mkdirSync(path);
+        },
+
+        crc32 : function(buf) {
+            var b = new Buffer(4);
+            if (!crcTable.length) {
+                for (var n = 0; n < 256; n++) {
+                    var c = n;
+                    for (var k = 8; --k >= 0;)  //
+                        if ((c & 1) != 0)  { c = 0xedb88320 ^ (c >>> 1); } 
else { c = c >>> 1; }
+                    if (c < 0) {
+                        b.writeInt32LE(c, 0);
+                        c = b.readUInt32LE(0);
+                    }
+                    crcTable[n] = c;
+                }
+            }
+            var crc = 0, off = 0, len = buf.length, c1 = ~crc;
+            while(--len >= 0) c1 = crcTable[(c1 ^ buf[off++]) & 0xff] ^ (c1 
>>> 8);
+            crc = ~c1;
+            b.writeInt32LE(crc & 0xffffffff, 0);
+            return b.readUInt32LE(0);
+        },
+
+        methodToString : function(/*Number*/method) {
+            switch (method) {
+                case Constants.STORED:
+                    return 'STORED (' + method + ')';
+                case Constants.DEFLATED:
+                    return 'DEFLATED (' + method + ')';
+                default:
+                    return 'UNSUPPORTED (' + method + ')'
+            }
+
+        },
+
+        writeFileTo : function(/*String*/path, /*Buffer*/content, 
/*Boolean*/overwrite, /*Number*/attr) {
+            if (fs.existsSync(path)) {
+                if (!overwrite)
+                    return false; // cannot overwite
+
+                var stat = fs.statSync(path);
+                if (stat.isDirectory()) {
+                    return false;
+                }
+            }
+            var folder = pth.dirname(path);
+            if (!fs.existsSync(folder)) {
+                mkdirSync(folder);
+            }
+
+            var fd;
+            try {
+                fd = fs.openSync(path, 'w', 438); // 0666
+            } catch(e) {
+                fs.chmodSync(path, 438);
+                fd = fs.openSync(path, 'w', 438);
+            }
+            if (fd) {
+                fs.writeSync(fd, content, 0, content.length, 0);
+                fs.closeSync(fd);
+            }
+            fs.chmodSync(path, attr || 438);
+            return true;
+        },
+
+        findFiles : function(/*String*/path) {
+            return findSync(path, true);
+        },
+
+        getAttributes : function(/*String*/path) {
+
+        },
+
+        setAttributes : function(/*String*/path) {
+
+        },
+
+        toBuffer : function(input) {
+            if (Buffer.isBuffer(input)) {
+                return input;
+            } else {
+                if (input.length == 0) {
+                    return new Buffer(0)
+                }
+                return new Buffer(input, 'utf8');
+            }
+        },
+
+        Constants : Constants,
+        Errors : Errors
+    }
+})();

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/zipEntry.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/zipEntry.js b/node_modules/adm-zip/zipEntry.js
new file mode 100644
index 0000000..02c3172
--- /dev/null
+++ b/node_modules/adm-zip/zipEntry.js
@@ -0,0 +1,224 @@
+var Utils = require("./util"),
+    Headers = require("./headers"),
+    Constants = Utils.Constants,
+    Methods = require("./methods");
+
+module.exports = function (/*Buffer*/input) {
+
+    var _entryHeader = new Headers.EntryHeader(),
+        _entryName = new Buffer(0),
+        _comment = new Buffer(0),
+        _isDirectory = false,
+        uncompressedData = null,
+        _extra = new Buffer(0);
+
+    function getCompressedDataFromZip() {
+        if (!input || !Buffer.isBuffer(input)) {
+            return new Buffer(0);
+        }
+        _entryHeader.loadDataHeaderFromBinary(input);
+        return input.slice(_entryHeader.realDataOffset, 
_entryHeader.realDataOffset + _entryHeader.compressedSize)
+    }
+
+    function crc32OK(data) {
+        // if bit 3 (0x08) of the general-purpose flags field is set, then the 
CRC-32 and file sizes are not known when the header is written
+        if (_entryHeader.flags & 0x8 != 0x8) {
+           if (Utils.crc32(data) != _entryHeader.crc) {
+               return false;
+           }
+        } else {
+            // @TODO: load and check data descriptor header
+            // The fields in the local header are filled with zero, and the 
CRC-32 and size are appended in a 12-byte structure
+            // (optionally preceded by a 4-byte signature) immediately after 
the compressed data:
+        }
+        return true;
+    }
+
+    function decompress(/*Boolean*/async, /*Function*/callback) {
+        if (_isDirectory) {
+            if (async && callback) {
+                callback(new Buffer(0), Utils.Errors.DIRECTORY_CONTENT_ERROR); 
//si added error.
+            }
+            return new Buffer(0);
+        }
+
+        var compressedData = getCompressedDataFromZip();
+        if (compressedData.length == 0) {
+            if (async && callback) callback(compressedData, 
Utils.Errors.NO_DATA);//si added error.
+            return compressedData;
+        }
+
+        var data = new Buffer(_entryHeader.size);
+        data.fill(0);
+
+        switch (_entryHeader.method) {
+            case Utils.Constants.STORED:
+                compressedData.copy(data);
+                if (!crc32OK(data)) {
+                    if (async && callback) callback(data, 
Utils.Errors.BAD_CRC);//si added error
+                    return Utils.Errors.BAD_CRC;
+                } else {//si added otherwise did not seem to return data.
+                    if (async && callback) callback(data);
+                    return data;
+                }
+                break;
+            case Utils.Constants.DEFLATED:
+                var inflater = new Methods.Inflater(compressedData);
+                if (!async) {
+                    inflater.inflate(data);
+                    if (!crc32OK(data)) {
+                        console.warn(Utils.Errors.BAD_CRC + " " + 
_entryName.toString())
+                    }
+                    return data;
+                } else {
+                    inflater.inflateAsync(function(result) {
+                        result.copy(data, 0);
+                        if (crc32OK(data)) {
+                            if (callback) callback(data, 
Utils.Errors.BAD_CRC); //si added error
+                        } else { //si added otherwise did not seem to return 
data.
+                            if (callback) callback(data);
+                        }
+                    })
+                }
+                break;
+            default:
+                if (async && callback) callback(new Buffer(0), 
Utils.Errors.UNKNOWN_METHOD);
+                return Utils.Errors.UNKNOWN_METHOD;
+        }
+    }
+
+    function compress(/*Boolean*/async, /*Function*/callback) {
+        if ((!uncompressedData || !uncompressedData.length) && 
Buffer.isBuffer(input)) {
+            // no data set or the data wasn't changed to require recompression
+            if (async && callback) callback(getCompressedDataFromZip());
+            return getCompressedDataFromZip();
+        }
+
+        if (uncompressedData.length && !_isDirectory) {
+            var compressedData;
+            // Local file header
+            switch (_entryHeader.method) {
+                case Utils.Constants.STORED:
+                    _entryHeader.compressedSize = _entryHeader.size;
+
+                    compressedData = new Buffer(uncompressedData.length);
+                    uncompressedData.copy(compressedData);
+
+                    if (async && callback) callback(compressedData);
+                    return compressedData;
+
+                    break;
+                default:
+                case Utils.Constants.DEFLATED:
+
+                    var deflater = new Methods.Deflater(uncompressedData);
+                    if (!async) {
+                        var deflated = deflater.deflate();
+                        _entryHeader.compressedSize = deflated.length;
+                        return deflated;
+                    } else {
+                        deflater.deflateAsync(function(data) {
+                            compressedData = new Buffer(data.length);
+                            _entryHeader.compressedSize = data.length;
+                            data.copy(compressedData);
+                            callback && callback(compressedData);
+                        })
+                    }
+                    deflater = null;
+                    break;
+            }
+        } else {
+            if (async && callback) {
+                callback(new Buffer(0));
+            } else {
+                return new Buffer(0);
+            }
+        }
+    }
+
+    return {
+        get entryName () { return _entryName.toString(); },
+        get rawEntryName() { return _entryName; },
+        set entryName (val) {
+            _entryName = Utils.toBuffer(val);
+            var lastChar = _entryName[_entryName.length - 1];
+            _isDirectory = (lastChar == 47) || (lastChar == 92);
+            _entryHeader.fileNameLength = _entryName.length;
+        },
+
+        get extra () { return _extra; },
+        set extra (val) {
+            _extra = val;
+            _entryHeader.extraLength = val.length;
+        },
+
+        get comment () { return _comment.toString(); },
+        set comment (val) {
+            _comment = Utils.toBuffer(val);
+            _entryHeader.commentLength = _comment.length;
+        },
+
+        get name () { var n = _entryName.toString(); return _isDirectory ? 
n.substr(n.length - 1).split("/").pop() : n.split("/").pop(); },
+        get isDirectory () { return _isDirectory },
+
+        getCompressedData : function() {
+            return compress(false, null)
+        },
+
+        getCompressedDataAsync : function(/*Function*/callback) {
+            compress(true, callback)
+        },
+
+        setData : function(value) {
+            uncompressedData = Utils.toBuffer(value);
+            if (!_isDirectory && uncompressedData.length) {
+                _entryHeader.size = uncompressedData.length;
+                _entryHeader.method = Utils.Constants.DEFLATED;
+                _entryHeader.crc = Utils.crc32(value);
+            } else { // folders and blank files should be stored
+                _entryHeader.method = Utils.Constants.STORED;
+            }
+        },
+
+        getData : function() {
+            return decompress(false, null);
+        },
+
+        getDataAsync : function(/*Function*/callback) {
+            decompress(true, callback)
+        },
+
+        set header(/*Buffer*/data) {
+            _entryHeader.loadFromBinary(data);
+        },
+
+        get header() {
+            return _entryHeader;
+        },
+
+        packHeader : function() {
+            var header = _entryHeader.entryHeaderToBinary();
+            // add
+            _entryName.copy(header, Utils.Constants.CENHDR);
+            if (_entryHeader.extraLength) {
+                _extra.copy(header, Utils.Constants.CENHDR + _entryName.length)
+            }
+            if (_entryHeader.commentLength) {
+                _comment.copy(header, Utils.Constants.CENHDR + 
_entryName.length + _entryHeader.extraLength, _comment.length);
+            }
+            return header;
+        },
+
+        toString : function() {
+            return '{\n' +
+                '\t"entryName" : "' + _entryName.toString() + "\",\n" +
+                '\t"name" : "' + _entryName.toString().split("/").pop() + 
"\",\n" +
+                '\t"comment" : "' + _comment.toString() + "\",\n" +
+                '\t"isDirectory" : ' + _isDirectory + ",\n" +
+                '\t"header" : ' + _entryHeader.toString().replace(/\t/mg, 
"\t\t") + ",\n" +
+                '\t"compressedData" : <' + (input && input.length  + " bytes 
buffer" || "null") + ">\n" +
+                '\t"data" : <' + (uncompressedData && uncompressedData.length  
+ " bytes buffer" || "null") + ">\n" +
+                '}';
+        }
+    }
+};

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/adm-zip/zipFile.js
----------------------------------------------------------------------
diff --git a/node_modules/adm-zip/zipFile.js b/node_modules/adm-zip/zipFile.js
new file mode 100644
index 0000000..f066d7e
--- /dev/null
+++ b/node_modules/adm-zip/zipFile.js
@@ -0,0 +1,311 @@
+var ZipEntry = require("./zipEntry"),
+    Headers = require("./headers"),
+    Utils = require("./util");
+
+module.exports = function(/*String|Buffer*/input, /*Number*/inputType) {
+    var entryList = [],
+        entryTable = {},
+        _comment = new Buffer(0),
+        filename = "",
+        fs = require("fs"),
+        inBuffer = null,
+        mainHeader = new Headers.MainHeader();
+
+    if (inputType == Utils.Constants.FILE) {
+        // is a filename
+        filename = input;
+        inBuffer = fs.readFileSync(filename);
+        readMainHeader();
+    } else if (inputType == Utils.Constants.BUFFER) {
+        // is a memory buffer
+        inBuffer = input;
+        readMainHeader();
+    } else {
+        // none. is a new file
+    }
+
+    function readEntries() {
+        entryTable = {};
+        entryList = new Array(mainHeader.diskEntries);  // total number of 
entries
+        var index = mainHeader.offset;  // offset of first CEN header
+        for(var i = 0; i < entryList.length; i++) {
+
+            var tmp = index,
+                entry = new ZipEntry(inBuffer);
+            entry.header = inBuffer.slice(tmp, tmp += Utils.Constants.CENHDR);
+
+            entry.entryName = inBuffer.slice(tmp, tmp += 
entry.header.fileNameLength);
+
+            if (entry.header.extraLength) {
+                entry.extra = inBuffer.slice(tmp, tmp += 
entry.header.extraLength);
+            }
+
+            if (entry.header.commentLength)
+                entry.comment = inBuffer.slice(tmp, tmp + 
entry.header.commentLength);
+
+            index += entry.header.entryHeaderSize;
+
+            entryList[i] = entry;
+            entryTable[entry.entryName] = entry;
+        }
+    }
+
+    function readMainHeader() {
+        var i = inBuffer.length - Utils.Constants.ENDHDR, // END header size
+            n = Math.max(0, i - 0xFFFF), // 0xFFFF is the max zip file comment 
length
+            endOffset = 0; // Start offset of the END header
+
+        for (i; i >= n; i--) {
+            if (inBuffer[i] != 0x50) continue; // quick check that the byte is 
'P'
+            if (inBuffer.readUInt32LE(i) == Utils.Constants.ENDSIG) { // 
"PK\005\006"
+                endOffset = i;
+                break;
+            }
+        }
+        if (!endOffset)
+            throw Utils.Errors.INVALID_FORMAT;
+
+        mainHeader.loadFromBinary(inBuffer.slice(endOffset, endOffset + 
Utils.Constants.ENDHDR));
+        if (mainHeader.commentLength) {
+            _comment = inBuffer.slice(endOffset + Utils.Constants.ENDHDR);
+        }
+        readEntries();
+    }
+
+    return {
+        /**
+         * Returns an array of ZipEntry objects existent in the current opened 
archive
+         * @return Array
+         */
+        get entries () {
+            return entryList;
+        },
+
+        /**
+         * Archive comment
+         * @return {String}
+         */
+        get comment () { return _comment.toString(); },
+        set comment(val) {
+            mainHeader.commentLength = val.length;
+            _comment = val;
+        },
+
+        /**
+         * Returns a reference to the entry with the given name or null if 
entry is inexistent
+         *
+         * @param entryName
+         * @return ZipEntry
+         */
+        getEntry : function(/*String*/entryName) {
+            return entryTable[entryName] || null;
+        },
+
+        /**
+         * Adds the given entry to the entry list
+         *
+         * @param entry
+         */
+        setEntry : function(/*ZipEntry*/entry) {
+            entryList.push(entry);
+            entryTable[entry.entryName] = entry;
+            mainHeader.totalEntries = entryList.length;
+        },
+
+        /**
+         * Removes the entry with the given name from the entry list.
+         *
+         * If the entry is a directory, then all nested files and directories 
will be removed
+         * @param entryName
+         */
+        deleteEntry : function(/*String*/entryName) {
+            var entry = entryTable[entryName];
+            if (entry && entry.isDirectory) {
+                var _self = this;
+                this.getEntryChildren(entry).forEach(function(child) {
+                    if (child.entryName != entryName) {
+                        _self.deleteEntry(child.entryName)
+                    }
+                })
+            }
+            entryList.splice(entryList.indexOf(entry), 1);
+            delete(entryTable[entryName]);
+            mainHeader.totalEntries = entryList.length;
+        },
+
+        /**
+         *  Iterates and returns all nested files and directories of the given 
entry
+         *
+         * @param entry
+         * @return Array
+         */
+        getEntryChildren : function(/*ZipEntry*/entry) {
+            if (entry.isDirectory) {
+                var list = [],
+                    name = entry.entryName,
+                    len = name.length;
+
+                entryList.forEach(function(zipEntry) {
+                    if (zipEntry.entryName.substr(0, len) == name) {
+                        list.push(zipEntry);
+                    }
+                });
+                return list;
+            }
+            return []
+        },
+
+        /**
+         * Returns the zip file
+         *
+         * @return Buffer
+         */
+        compressToBuffer : function() {
+            if (entryList.length > 1) {
+                entryList.sort(function(a, b) {
+                    var nameA = a.entryName.toLowerCase();
+                    var nameB = b.entryName.toLowerCase();
+                    if (nameA < nameB) {return -1}
+                    if (nameA > nameB) {return 1}
+                    return 0;
+                });
+            }
+
+            var totalSize = 0,
+                dataBlock = [],
+                entryHeaders = [],
+                dindex = 0;
+
+            mainHeader.size = 0;
+            mainHeader.offset = 0;
+
+            entryList.forEach(function(entry) {
+                entry.header.offset = dindex;
+
+                // compress data and set local and entry header accordingly. 
Reason why is called first
+                var compressedData = entry.getCompressedData();
+                // data header
+                var dataHeader = entry.header.dataHeaderToBinary();
+                var postHeader = new Buffer(entry.entryName + 
entry.extra.toString());
+                var dataLength = dataHeader.length + postHeader.length + 
compressedData.length;
+
+                dindex += dataLength;
+
+                dataBlock.push(dataHeader);
+                dataBlock.push(postHeader);
+                dataBlock.push(compressedData);
+
+                var entryHeader = entry.packHeader();
+                entryHeaders.push(entryHeader);
+                mainHeader.size += entryHeader.length;
+                totalSize += (dataLength + entryHeader.length);
+            });
+
+            totalSize += mainHeader.mainHeaderSize; // also includes zip file 
comment length
+            // point to end of data and begining of central directory first 
record
+            mainHeader.offset = dindex;
+
+            dindex = 0;
+            var outBuffer = new Buffer(totalSize);
+            dataBlock.forEach(function(content) {
+                content.copy(outBuffer, dindex); // write data blocks
+                dindex += content.length;
+            });
+            entryHeaders.forEach(function(content) {
+                content.copy(outBuffer, dindex); // write central directory 
entries
+                dindex += content.length;
+            });
+
+            var mh = mainHeader.toBinary();
+            if (_comment) {
+                _comment.copy(mh, Utils.Constants.ENDHDR); // add zip file 
comment
+            }
+
+            mh.copy(outBuffer, dindex); // write main header
+
+            return outBuffer
+        },
+
+        toAsyncBuffer : 
function(/*Function*/onSuccess,/*Function*/onFail,/*Function*/onItemStart,/*Function*/onItemEnd)
 {
+            if (entryList.length > 1) {
+                entryList.sort(function(a, b) {
+                    var nameA = a.entryName.toLowerCase();
+                    var nameB = b.entryName.toLowerCase();
+                    if (nameA > nameB) {return -1}
+                    if (nameA < nameB) {return 1}
+                    return 0;
+                });
+            }
+
+            var totalSize = 0,
+                dataBlock = [],
+                entryHeaders = [],
+                dindex = 0;
+
+            mainHeader.size = 0;
+            mainHeader.offset = 0;
+
+            var compress=function(entryList){
+                var self=arguments.callee;
+                var entry;
+                if(entryList.length){
+                    var entry=entryList.pop();
+                    var name=entry.entryName + entry.extra.toString();
+                    if(onItemStart)onItemStart(name);
+                    entry.getCompressedDataAsync(function(compressedData){
+                        if(onItemEnd)onItemEnd(name);
+
+                        entry.header.offset = dindex;
+                        // data header
+                        var dataHeader = entry.header.dataHeaderToBinary();
+                        var postHeader = new Buffer(name);
+                        var dataLength = dataHeader.length + postHeader.length 
+ compressedData.length;
+
+                        dindex += dataLength;
+
+                        dataBlock.push(dataHeader);
+                        dataBlock.push(postHeader);
+                        dataBlock.push(compressedData);
+
+                        var entryHeader = entry.packHeader();
+                        entryHeaders.push(entryHeader);
+                        mainHeader.size += entryHeader.length;
+                        totalSize += (dataLength + entryHeader.length);
+
+                        if(entryList.length){
+                            self(entryList);
+                        }else{
+
+
+                            totalSize += mainHeader.mainHeaderSize; // also 
includes zip file comment length
+                            // point to end of data and begining of central 
directory first record
+                            mainHeader.offset = dindex;
+
+                            dindex = 0;
+                            var outBuffer = new Buffer(totalSize);
+                            dataBlock.forEach(function(content) {
+                                content.copy(outBuffer, dindex); // write data 
blocks
+                                dindex += content.length;
+                            });
+                            entryHeaders.forEach(function(content) {
+                                content.copy(outBuffer, dindex); // write 
central directory entries
+                                dindex += content.length;
+                            });
+
+                            var mh = mainHeader.toBinary();
+                            if (_comment) {
+                                _comment.copy(mh, Utils.Constants.ENDHDR); // 
add zip file comment
+                            }
+
+                            mh.copy(outBuffer, dindex); // write main header
+
+                            onSuccess(outBuffer);
+                        }
+                    });
+                }
+            };
+
+            compress(entryList);
+        }
+    }
+};

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/.documentup.json
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/.documentup.json 
b/node_modules/shelljs/.documentup.json
new file mode 100644
index 0000000..57fe301
--- /dev/null
+++ b/node_modules/shelljs/.documentup.json
@@ -0,0 +1,6 @@
+{
+  "name": "ShellJS",
+  "twitter": [
+    "r2r"
+  ]
+}

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/.npmignore
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/.npmignore b/node_modules/shelljs/.npmignore
new file mode 100644
index 0000000..c2658d7
--- /dev/null
+++ b/node_modules/shelljs/.npmignore
@@ -0,0 +1 @@
+node_modules/

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/.travis.yml
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/.travis.yml b/node_modules/shelljs/.travis.yml
new file mode 100644
index 0000000..5caf599
--- /dev/null
+++ b/node_modules/shelljs/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+  - 0.6
+  - 0.8
+

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/LICENSE
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/LICENSE b/node_modules/shelljs/LICENSE
new file mode 100644
index 0000000..1b35ee9
--- /dev/null
+++ b/node_modules/shelljs/LICENSE
@@ -0,0 +1,26 @@
+Copyright (c) 2012, Artur Adib <[email protected]>
+All rights reserved.
+
+You may use this project under the terms of the New BSD license as follows:
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * 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.
+    * Neither the name of Artur Adib nor the
+      names of the contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 ARTUR ADIB 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.

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/README.md
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/README.md b/node_modules/shelljs/README.md
new file mode 100644
index 0000000..8b45592
--- /dev/null
+++ b/node_modules/shelljs/README.md
@@ -0,0 +1,513 @@
+# ShellJS - Unix shell commands for Node.js [![Build 
Status](https://secure.travis-ci.org/arturadib/shelljs.png)](http://travis-ci.org/arturadib/shelljs)
+
+ShellJS is a portable **(Windows/Linux/OS X)** implementation of Unix shell 
commands on top of the Node.js API. You can use it to eliminate your shell 
script's dependency on Unix while still keeping its familiar and powerful 
commands. You can also install it globally so you can run it from outside Node 
projects - say goodbye to those gnarly Bash scripts!
+
+The project is [unit-tested](http://travis-ci.org/arturadib/shelljs) and 
battled-tested in projects like:
+
++ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's next-gen PDF reader
++ [Firebug](http://getfirebug.com/) - Firefox's infamous debugger
++ [JSHint](http://jshint.com) - Most popular JavaScript linter
++ [Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for 
modern browsers
++ [Yeoman](http://yeoman.io/) - Web application stack and development tool
++ [Deployd.com](http://deployd.com) - Open source PaaS for quick API backend 
generation
+
+and [many more](https://npmjs.org/browse/depended/shelljs).
+
+## Installing
+
+Via npm:
+
+```bash
+$ npm install [-g] shelljs
+```
+
+If the global option `-g` is specified, the binary `shjs` will be installed. 
This makes it possible to
+run ShellJS scripts much like any shell script from the command line, i.e. 
without requiring a `node_modules` folder:
+
+```bash
+$ shjs my_script
+```
+
+You can also just copy `shell.js` into your project's directory, and 
`require()` accordingly.
+
+
+## Examples
+
+### JavaScript
+
+```javascript
+require('shelljs/global');
+
+if (!which('git')) {
+  echo('Sorry, this script requires git');
+  exit(1);
+}
+
+// Copy files to release dir
+mkdir('-p', 'out/Release');
+cp('-R', 'stuff/*', 'out/Release');
+
+// Replace macros in each .js file
+cd('lib');
+ls('*.js').forEach(function(file) {
+  sed('-i', 'BUILD_VERSION', 'v0.1.2', file);
+  sed('-i', /.*REMOVE_THIS_LINE.*\n/, '', file);
+  sed('-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat('macro.js'), file);
+});
+cd('..');
+
+// Run external tool synchronously
+if (exec('git commit -am "Auto-commit"').code !== 0) {
+  echo('Error: Git commit failed');
+  exit(1);
+}
+```
+
+### CoffeeScript
+
+```coffeescript
+require 'shelljs/global'
+
+if not which 'git'
+  echo 'Sorry, this script requires git'
+  exit 1
+
+# Copy files to release dir
+mkdir '-p', 'out/Release'
+cp '-R', 'stuff/*', 'out/Release'
+
+# Replace macros in each .js file
+cd 'lib'
+for file in ls '*.js'
+  sed '-i', 'BUILD_VERSION', 'v0.1.2', file
+  sed '-i', /.*REMOVE_THIS_LINE.*\n/, '', file
+  sed '-i', /.*REPLACE_LINE_WITH_MACRO.*\n/, cat 'macro.js', file
+cd '..'
+
+# Run external tool synchronously
+if (exec 'git commit -am "Auto-commit"').code != 0
+  echo 'Error: Git commit failed'
+  exit 1
+```
+
+## Global vs. Local
+
+The example above uses the convenience script `shelljs/global` to reduce 
verbosity. If polluting your global namespace is not desirable, simply require 
`shelljs`.
+
+Example:
+
+```javascript
+var shell = require('shelljs');
+shell.echo('hello world');
+```
+
+## Make tool
+
+A convenience script `shelljs/make` is also provided to mimic the behavior of 
a Unix Makefile. In this case all shell objects are global, and command line 
arguments will cause the script to execute only the corresponding function in 
the global `target` object. To avoid redundant calls, target functions are 
executed only once per script.
+
+Example (CoffeeScript):
+
+```coffeescript
+require 'shelljs/make'
+
+target.all = ->
+  target.bundle()
+  target.docs()
+
+target.bundle = ->
+  cd __dirname
+  mkdir 'build'
+  cd 'lib'
+  (cat '*.js').to '../build/output.js'
+
+target.docs = ->
+  cd __dirname
+  mkdir 'docs'
+  cd 'lib'
+  for file in ls '*.js'
+    text = grep '//@', file     # extract special comments
+    text.replace '//@', ''      # remove comment tags
+    text.to 'docs/my_docs.md'
+```
+
+To run the target `all`, call the above script without arguments: `$ node 
make`. To run the target `docs`: `$ node make docs`, and so on.
+
+
+
+<!-- 
+
+  DO NOT MODIFY BEYOND THIS POINT - IT'S AUTOMATICALLY GENERATED
+
+-->
+
+
+## Command reference
+
+
+All commands run synchronously, unless otherwise stated.
+
+
+### cd('dir')
+Changes to directory `dir` for the duration of the script
+
+### pwd()
+Returns the current directory.
+
+### ls([options ,] path [,path ...])
+### ls([options ,] path_array)
+Available options:
+
++ `-R`: recursive
++ `-A`: all files (include files beginning with `.`, except for `.` and `..`)
+
+Examples:
+
+```javascript
+ls('projs/*.js');
+ls('-R', '/users/me', '/tmp');
+ls('-R', ['/users/me', '/tmp']); // same as above
+```
+
+Returns array of files in the given path, or in current directory if no path 
provided.
+
+### find(path [,path ...])
+### find(path_array)
+Examples:
+
+```javascript
+find('src', 'lib');
+find(['src', 'lib']); // same as above
+find('.').filter(function(file) { return file.match(/\.js$/); });
+```
+
+Returns array of all files (however deep) in the given paths.
+
+The main difference from `ls('-R', path)` is that the resulting file names
+include the base directories, e.g. `lib/resources/file1` instead of just 
`file1`.
+
+### cp([options ,] source [,source ...], dest)
+### cp([options ,] source_array, dest)
+Available options:
+
++ `-f`: force
++ `-r, -R`: recursive
+
+Examples:
+
+```javascript
+cp('file1', 'dir1');
+cp('-Rf', '/tmp/*', '/usr/local/*', '/home/tmp');
+cp('-Rf', ['/tmp/*', '/usr/local/*'], '/home/tmp'); // same as above
+```
+
+Copies files. The wildcard `*` is accepted.
+
+### rm([options ,] file [, file ...])
+### rm([options ,] file_array)
+Available options:
+
++ `-f`: force
++ `-r, -R`: recursive
+
+Examples:
+
+```javascript
+rm('-rf', '/tmp/*');
+rm('some_file.txt', 'another_file.txt');
+rm(['some_file.txt', 'another_file.txt']); // same as above
+```
+
+Removes files. The wildcard `*` is accepted.
+
+### mv(source [, source ...], dest')
+### mv(source_array, dest')
+Available options:
+
++ `f`: force
+
+Examples:
+
+```javascript
+mv('-f', 'file', 'dir/');
+mv('file1', 'file2', 'dir/');
+mv(['file1', 'file2'], 'dir/'); // same as above
+```
+
+Moves files. The wildcard `*` is accepted.
+
+### mkdir([options ,] dir [, dir ...])
+### mkdir([options ,] dir_array)
+Available options:
+
++ `p`: full path (will create intermediate dirs if necessary)
+
+Examples:
+
+```javascript
+mkdir('-p', '/tmp/a/b/c/d', '/tmp/e/f/g');
+mkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as above
+```
+
+Creates directories.
+
+### test(expression)
+Available expression primaries:
+
++ `'-b', 'path'`: true if path is a block device
++ `'-c', 'path'`: true if path is a character device
++ `'-d', 'path'`: true if path is a directory
++ `'-e', 'path'`: true if path exists
++ `'-f', 'path'`: true if path is a regular file
++ `'-L', 'path'`: true if path is a symboilc link
++ `'-p', 'path'`: true if path is a pipe (FIFO)
++ `'-S', 'path'`: true if path is a socket
+
+Examples:
+
+```javascript
+if (test('-d', path)) { /* do something with dir */ };
+if (!test('-f', path)) continue; // skip if it's a regular file
+```
+
+Evaluates expression using the available primaries and returns corresponding 
value.
+
+### cat(file [, file ...])
+### cat(file_array)
+
+Examples:
+
+```javascript
+var str = cat('file*.txt');
+var str = cat('file1', 'file2');
+var str = cat(['file1', 'file2']); // same as above
+```
+
+Returns a string containing the given file, or a concatenated string
+containing the files if more than one file is given (a new line character is
+introduced between each file). Wildcard `*` accepted.
+
+### 'string'.to(file)
+
+Examples:
+
+```javascript
+cat('input.txt').to('output.txt');
+```
+
+Analogous to the redirection operator `>` in Unix, but works with JavaScript 
strings (such as
+those returned by `cat`, `grep`, etc). _Like Unix redirections, `to()` will 
overwrite any existing file!_
+
+### sed([options ,] search_regex, replace_str, file)
+Available options:
+
++ `-i`: Replace contents of 'file' in-place. _Note that no backups will be 
created!_
+
+Examples:
+
+```javascript
+sed('-i', 'PROGRAM_VERSION', 'v0.1.3', 'source.js');
+sed(/.*DELETE_THIS_LINE.*\n/, '', 'source.js');
+```
+
+Reads an input string from `file` and performs a JavaScript `replace()` on the 
input
+using the given search regex and replacement string. Returns the new string 
after replacement.
+
+### grep([options ,] regex_filter, file [, file ...])
+### grep([options ,] regex_filter, file_array)
+Available options:
+
++ `-v`: Inverse the sense of the regex and print the lines not matching the 
criteria.
+
+Examples:
+
+```javascript
+grep('-v', 'GLOBAL_VARIABLE', '*.js');
+grep('GLOBAL_VARIABLE', '*.js');
+```
+
+Reads input string from given files and returns a string containing all lines 
of the
+file that match the given `regex_filter`. Wildcard `*` accepted.
+
+### which(command)
+
+Examples:
+
+```javascript
+var nodeExec = which('node');
+```
+
+Searches for `command` in the system's PATH. On Windows looks for `.exe`, 
`.cmd`, and `.bat` extensions.
+Returns string containing the absolute path to the command.
+
+### echo(string [,string ...])
+
+Examples:
+
+```javascript
+echo('hello world');
+var str = echo('hello world');
+```
+
+Prints string to stdout, and returns string with additional utility methods
+like `.to()`.
+
+### dirs([options | '+N' | '-N'])
+
+Available options:
+
++ `-c`: Clears the directory stack by deleting all of the elements.
+
+Arguments:
+
++ `+N`: Displays the Nth directory (counting from the left of the list printed 
by dirs when invoked without options), starting with zero.
++ `-N`: Displays the Nth directory (counting from the right of the list 
printed by dirs when invoked without options), starting with zero.
+
+Display the list of currently remembered directories. Returns an array of 
paths in the stack, or a single path if +N or -N was specified.
+
+See also: pushd, popd
+
+### pushd([options,] [dir | '-N' | '+N'])
+
+Available options:
+
++ `-n`: Suppresses the normal change of directory when adding directories to 
the stack, so that only the stack is manipulated.
+
+Arguments:
+
++ `dir`: Makes the current working directory be the top of the stack, and then 
executes the equivalent of `cd dir`.
++ `+N`: Brings the Nth directory (counting from the left of the list printed 
by dirs, starting with zero) to the top of the list by rotating the stack.
++ `-N`: Brings the Nth directory (counting from the right of the list printed 
by dirs, starting with zero) to the top of the list by rotating the stack.
+
+Examples:
+
+```javascript
+// process.cwd() === '/usr'
+pushd('/etc'); // Returns /etc /usr
+pushd('+1');   // Returns /usr /etc
+```
+
+Save the current directory on the top of the directory stack and then cd to 
`dir`. With no arguments, pushd exchanges the top two directories. Returns an 
array of paths in the stack.
+
+### popd([options,] ['-N' | '+N'])
+
+Available options:
+
++ `-n`: Suppresses the normal change of directory when removing directories 
from the stack, so that only the stack is manipulated.
+
+Arguments:
+
++ `+N`: Removes the Nth directory (counting from the left of the list printed 
by dirs), starting with zero.
++ `-N`: Removes the Nth directory (counting from the right of the list printed 
by dirs), starting with zero.
+
+Examples:
+
+```javascript
+echo(process.cwd()); // '/usr'
+pushd('/etc');       // '/etc /usr'
+echo(process.cwd()); // '/etc'
+popd();              // '/usr'
+echo(process.cwd()); // '/usr'
+```
+
+When no arguments are given, popd removes the top directory from the stack and 
performs a cd to the new top directory. The elements are numbered from 0 
starting at the first directory listed with dirs; i.e., popd is equivalent to 
popd +0. Returns an array of paths in the stack.
+
+### exit(code)
+Exits the current process with the given exit code.
+
+### env['VAR_NAME']
+Object containing environment variables (both getter and setter). Shortcut to 
process.env.
+
+### exec(command [, options] [, callback])
+Available options (all `false` by default):
+
++ `async`: Asynchronous execution. Defaults to true if a callback is provided.
++ `silent`: Do not echo program output to console.
+
+Examples:
+
+```javascript
+var version = exec('node --version', {silent:true}).output;
+
+var child = exec('some_long_running_process', {async:true});
+child.stdout.on('data', function(data) {
+  /* ... do something with data ... */
+});
+
+exec('some_long_running_process', function(code, output) {
+  console.log('Exit code:', code);
+  console.log('Program output:', output);
+});
+```
+
+Executes the given `command` _synchronously_, unless otherwise specified.
+When in synchronous mode returns the object `{ code:..., output:... }`, 
containing the program's
+`output` (stdout + stderr)  and its exit `code`. Otherwise returns the child 
process object, and
+the `callback` gets the arguments `(code, output)`.
+
+**Note:** For long-lived processes, it's best to run `exec()` asynchronously as
+the current synchronous implementation uses a lot of CPU. This should be 
getting
+fixed soon.
+
+### chmod(octal_mode || octal_string, file)
+### chmod(symbolic_mode, file)
+
+Available options:
+
++ `-v`: output a diagnostic for every file processed
++ `-c`: like verbose but report only when a change is made
++ `-R`: change files and directories recursively
+
+Examples:
+
+```javascript
+chmod(755, '/Users/brandon');
+chmod('755', '/Users/brandon'); // same as above 
+chmod('u+x', '/Users/brandon');
+```
+
+Alters the permissions of a file or directory by either specifying the
+absolute permissions in octal form or expressing the changes in symbols.
+This command tries to mimic the POSIX behavior as much as possible.
+Notable exceptions:
+
++ In symbolic modes, 'a-r' and '-r' are identical.  No consideration is
+  given to the umask.
++ There is no "quiet" option since default behavior is to run silent.
+
+## Configuration
+
+
+### config.silent
+Example:
+
+```javascript
+var silentState = config.silent; // save old silent state
+config.silent = true;
+/* ... */
+config.silent = silentState; // restore old silent state
+```
+
+Suppresses all command output if `true`, except for `echo()` calls.
+Default is `false`.
+
+### config.fatal
+Example:
+
+```javascript
+config.fatal = true;
+cp('this_file_does_not_exist', '/dev/null'); // dies here
+/* more commands... */
+```
+
+If `true` the script will die on errors. Default is `false`.
+
+## Non-Unix commands
+
+
+### tempdir()
+Searches and returns string containing a writeable, platform-dependent 
temporary directory.
+Follows Python's [tempfile 
algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir).
+
+### error()
+Tests if error occurred in the last command. Returns `null` if no error 
occurred,
+otherwise returns string explaining the error

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/bin/shjs
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/bin/shjs b/node_modules/shelljs/bin/shjs
new file mode 100755
index 0000000..d239a7a
--- /dev/null
+++ b/node_modules/shelljs/bin/shjs
@@ -0,0 +1,51 @@
+#!/usr/bin/env node
+require('../global');
+
+if (process.argv.length < 3) {
+  console.log('ShellJS: missing argument (script name)');
+  console.log();
+  process.exit(1);
+}
+
+var args,
+  scriptName = process.argv[2];
+env['NODE_PATH'] = __dirname + '/../..';
+
+if (!scriptName.match(/\.js/) && !scriptName.match(/\.coffee/)) {
+  if (test('-f', scriptName + '.js'))
+    scriptName += '.js';
+  if (test('-f', scriptName + '.coffee'))
+    scriptName += '.coffee';
+}
+
+if (!test('-f', scriptName)) {
+  console.log('ShellJS: script not found ('+scriptName+')');
+  console.log();
+  process.exit(1);
+}
+
+args = process.argv.slice(3);
+
+for (var i = 0, l = args.length; i < l; i++) {
+  if (args[i][0] !== "-"){
+    args[i] = '"' + args[i] + '"'; // fixes arguments with multiple words
+  }
+}
+
+if (scriptName.match(/\.coffee$/)) {
+  //
+  // CoffeeScript
+  //
+  if (which('coffee')) {
+    exec('coffee ' + scriptName + ' ' + args.join(' '), { async: true });
+  } else {
+    console.log('ShellJS: CoffeeScript interpreter not found');
+    console.log();
+    process.exit(1);
+  }
+} else {
+  //
+  // JavaScript
+  //
+  exec('node ' + scriptName + ' ' + args.join(' '), { async: true });
+}

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/global.js
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/global.js b/node_modules/shelljs/global.js
new file mode 100644
index 0000000..97f0033
--- /dev/null
+++ b/node_modules/shelljs/global.js
@@ -0,0 +1,3 @@
+var shell = require('./shell.js');
+for (var cmd in shell)
+  global[cmd] = shell[cmd];

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/jshint.json
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/jshint.json b/node_modules/shelljs/jshint.json
new file mode 100644
index 0000000..205ed9c
--- /dev/null
+++ b/node_modules/shelljs/jshint.json
@@ -0,0 +1,4 @@
+{
+  "loopfunc": true,
+  "sub": true
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/make.js
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/make.js b/node_modules/shelljs/make.js
new file mode 100644
index 0000000..b636447
--- /dev/null
+++ b/node_modules/shelljs/make.js
@@ -0,0 +1,48 @@
+require('./global');
+config.fatal = true;
+
+global.target = {};
+
+// This ensures we only execute the script targets after the entire script has
+// been evaluated
+var args = process.argv.slice(2);
+setTimeout(function() {
+  var t;
+
+  if (args.length === 1 && args[0] === '--help') {
+    console.log('Available targets:');
+    for (t in target)
+      console.log('  ' + t);
+    return;
+  }
+
+  // Wrap targets to prevent duplicate execution
+  for (t in target) {
+    (function(t, oldTarget){
+
+      // Wrap it
+      target[t] = function(force) {
+        if (oldTarget.done && !force)
+          return;
+        oldTarget.done = true;
+        return oldTarget.apply(oldTarget, arguments);
+      };
+
+    })(t, target[t]);
+  }
+
+  // Execute desired targets
+  if (args.length > 0) {
+    args.forEach(function(arg) {
+      if (arg in target)
+        target[arg]();
+      else {
+        console.log('no such target: ' + arg);
+        exit(1);
+      }
+    });
+  } else if ('all' in target) {
+    target.all();
+  }
+
+}, 0);

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/package.json
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/package.json 
b/node_modules/shelljs/package.json
new file mode 100644
index 0000000..56763f6
--- /dev/null
+++ b/node_modules/shelljs/package.json
@@ -0,0 +1,46 @@
+{
+  "name": "shelljs",
+  "version": "0.1.4",
+  "author": {
+    "name": "Artur Adib",
+    "email": "[email protected]"
+  },
+  "description": "Portable Unix shell commands for Node.js",
+  "keywords": [
+    "unix",
+    "shell",
+    "makefile",
+    "make",
+    "jake",
+    "synchronous"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/arturadib/shelljs.git"
+  },
+  "homepage": "http://github.com/arturadib/shelljs";,
+  "main": "./shell.js",
+  "scripts": {
+    "test": "node scripts/run-tests"
+  },
+  "bin": {
+    "shjs": "./bin/shjs"
+  },
+  "dependencies": {},
+  "devDependencies": {
+    "jshint": "~1.1.0"
+  },
+  "optionalDependencies": {},
+  "engines": {
+    "node": "*"
+  },
+  "readme": "# ShellJS - Unix shell commands for Node.js [![Build 
Status](https://secure.travis-ci.org/arturadib/shelljs.png)](http://travis-ci.org/arturadib/shelljs)\n\nShellJS
 is a portable **(Windows/Linux/OS X)** implementation of Unix shell commands 
on top of the Node.js API. You can use it to eliminate your shell script's 
dependency on Unix while still keeping its familiar and powerful commands. You 
can also install it globally so you can run it from outside Node projects - say 
goodbye to those gnarly Bash scripts!\n\nThe project is 
[unit-tested](http://travis-ci.org/arturadib/shelljs) and battled-tested in 
projects like:\n\n+ [PDF.js](http://github.com/mozilla/pdf.js) - Firefox's 
next-gen PDF reader\n+ [Firebug](http://getfirebug.com/) - Firefox's infamous 
debugger\n+ [JSHint](http://jshint.com) - Most popular JavaScript linter\n+ 
[Zepto](http://zeptojs.com) - jQuery-compatible JavaScript library for modern 
browsers\n+ [Yeoman](http://yeoman.io/) - Web application stack and d
 evelopment tool\n+ [Deployd.com](http://deployd.com) - Open source PaaS for 
quick API backend generation\n\nand [many 
more](https://npmjs.org/browse/depended/shelljs).\n\n## Installing\n\nVia 
npm:\n\n```bash\n$ npm install [-g] shelljs\n```\n\nIf the global option `-g` 
is specified, the binary `shjs` will be installed. This makes it possible 
to\nrun ShellJS scripts much like any shell script from the command line, i.e. 
without requiring a `node_modules` folder:\n\n```bash\n$ shjs 
my_script\n```\n\nYou can also just copy `shell.js` into your project's 
directory, and `require()` accordingly.\n\n\n## Examples\n\n### 
JavaScript\n\n```javascript\nrequire('shelljs/global');\n\nif (!which('git')) 
{\n  echo('Sorry, this script requires git');\n  exit(1);\n}\n\n// Copy files 
to release dir\nmkdir('-p', 'out/Release');\ncp('-R', 'stuff/*', 
'out/Release');\n\n// Replace macros in each .js 
file\ncd('lib');\nls('*.js').forEach(function(file) {\n  sed('-i', 
'BUILD_VERSION', 'v0.1.2', file);\n  se
 d('-i', /.*REMOVE_THIS_LINE.*\\n/, '', file);\n  sed('-i', 
/.*REPLACE_LINE_WITH_MACRO.*\\n/, cat('macro.js'), file);\n});\ncd('..');\n\n// 
Run external tool synchronously\nif (exec('git commit -am 
\"Auto-commit\"').code !== 0) {\n  echo('Error: Git commit failed');\n  
exit(1);\n}\n```\n\n### CoffeeScript\n\n```coffeescript\nrequire 
'shelljs/global'\n\nif not which 'git'\n  echo 'Sorry, this script requires 
git'\n  exit 1\n\n# Copy files to release dir\nmkdir '-p', 'out/Release'\ncp 
'-R', 'stuff/*', 'out/Release'\n\n# Replace macros in each .js file\ncd 
'lib'\nfor file in ls '*.js'\n  sed '-i', 'BUILD_VERSION', 'v0.1.2', file\n  
sed '-i', /.*REMOVE_THIS_LINE.*\\n/, '', file\n  sed '-i', 
/.*REPLACE_LINE_WITH_MACRO.*\\n/, cat 'macro.js', file\ncd '..'\n\n# Run 
external tool synchronously\nif (exec 'git commit -am \"Auto-commit\"').code != 
0\n  echo 'Error: Git commit failed'\n  exit 1\n```\n\n## Global vs. 
Local\n\nThe example above uses the convenience script `shelljs/global` to reduc
 e verbosity. If polluting your global namespace is not desirable, simply 
require `shelljs`.\n\nExample:\n\n```javascript\nvar shell = 
require('shelljs');\nshell.echo('hello world');\n```\n\n## Make tool\n\nA 
convenience script `shelljs/make` is also provided to mimic the behavior of a 
Unix Makefile. In this case all shell objects are global, and command line 
arguments will cause the script to execute only the corresponding function in 
the global `target` object. To avoid redundant calls, target functions are 
executed only once per script.\n\nExample 
(CoffeeScript):\n\n```coffeescript\nrequire 'shelljs/make'\n\ntarget.all = ->\n 
 target.bundle()\n  target.docs()\n\ntarget.bundle = ->\n  cd __dirname\n  
mkdir 'build'\n  cd 'lib'\n  (cat '*.js').to 
'../build/output.js'\n\ntarget.docs = ->\n  cd __dirname\n  mkdir 'docs'\n  cd 
'lib'\n  for file in ls '*.js'\n    text = grep '//@', file     # extract 
special comments\n    text.replace '//@', ''      # remove comment tags\n    
text.to 'do
 cs/my_docs.md'\n```\n\nTo run the target `all`, call the above script without 
arguments: `$ node make`. To run the target `docs`: `$ node make docs`, and so 
on.\n\n\n\n<!-- \n\n  DO NOT MODIFY BEYOND THIS POINT - IT'S AUTOMATICALLY 
GENERATED\n\n-->\n\n\n## Command reference\n\n\nAll commands run synchronously, 
unless otherwise stated.\n\n\n### cd('dir')\nChanges to directory `dir` for the 
duration of the script\n\n### pwd()\nReturns the current directory.\n\n### 
ls([options ,] path [,path ...])\n### ls([options ,] path_array)\nAvailable 
options:\n\n+ `-R`: recursive\n+ `-A`: all files (include files beginning with 
`.`, except for `.` and 
`..`)\n\nExamples:\n\n```javascript\nls('projs/*.js');\nls('-R', '/users/me', 
'/tmp');\nls('-R', ['/users/me', '/tmp']); // same as above\n```\n\nReturns 
array of files in the given path, or in current directory if no path 
provided.\n\n### find(path [,path ...])\n### 
find(path_array)\nExamples:\n\n```javascript\nfind('src', 'lib');\nfind(['src', 
'li
 b']); // same as above\nfind('.').filter(function(file) { return 
file.match(/\\.js$/); });\n```\n\nReturns array of all files (however deep) in 
the given paths.\n\nThe main difference from `ls('-R', path)` is that the 
resulting file names\ninclude the base directories, e.g. `lib/resources/file1` 
instead of just `file1`.\n\n### cp([options ,] source [,source ...], dest)\n### 
cp([options ,] source_array, dest)\nAvailable options:\n\n+ `-f`: force\n+ `-r, 
-R`: recursive\n\nExamples:\n\n```javascript\ncp('file1', 'dir1');\ncp('-Rf', 
'/tmp/*', '/usr/local/*', '/home/tmp');\ncp('-Rf', ['/tmp/*', '/usr/local/*'], 
'/home/tmp'); // same as above\n```\n\nCopies files. The wildcard `*` is 
accepted.\n\n### rm([options ,] file [, file ...])\n### rm([options ,] 
file_array)\nAvailable options:\n\n+ `-f`: force\n+ `-r, -R`: 
recursive\n\nExamples:\n\n```javascript\nrm('-rf', 
'/tmp/*');\nrm('some_file.txt', 'another_file.txt');\nrm(['some_file.txt', 
'another_file.txt']); // same as above\n```\n\nRemo
 ves files. The wildcard `*` is accepted.\n\n### mv(source [, source ...], 
dest')\n### mv(source_array, dest')\nAvailable options:\n\n+ `f`: 
force\n\nExamples:\n\n```javascript\nmv('-f', 'file', 'dir/');\nmv('file1', 
'file2', 'dir/');\nmv(['file1', 'file2'], 'dir/'); // same as 
above\n```\n\nMoves files. The wildcard `*` is accepted.\n\n### mkdir([options 
,] dir [, dir ...])\n### mkdir([options ,] dir_array)\nAvailable options:\n\n+ 
`p`: full path (will create intermediate dirs if 
necessary)\n\nExamples:\n\n```javascript\nmkdir('-p', '/tmp/a/b/c/d', 
'/tmp/e/f/g');\nmkdir('-p', ['/tmp/a/b/c/d', '/tmp/e/f/g']); // same as 
above\n```\n\nCreates directories.\n\n### test(expression)\nAvailable 
expression primaries:\n\n+ `'-b', 'path'`: true if path is a block device\n+ 
`'-c', 'path'`: true if path is a character device\n+ `'-d', 'path'`: true if 
path is a directory\n+ `'-e', 'path'`: true if path exists\n+ `'-f', 'path'`: 
true if path is a regular file\n+ `'-L', 'path'`: true if path is a
  symboilc link\n+ `'-p', 'path'`: true if path is a pipe (FIFO)\n+ `'-S', 
'path'`: true if path is a socket\n\nExamples:\n\n```javascript\nif (test('-d', 
path)) { /* do something with dir */ };\nif (!test('-f', path)) continue; // 
skip if it's a regular file\n```\n\nEvaluates expression using the available 
primaries and returns corresponding value.\n\n### cat(file [, file ...])\n### 
cat(file_array)\n\nExamples:\n\n```javascript\nvar str = cat('file*.txt');\nvar 
str = cat('file1', 'file2');\nvar str = cat(['file1', 'file2']); // same as 
above\n```\n\nReturns a string containing the given file, or a concatenated 
string\ncontaining the files if more than one file is given (a new line 
character is\nintroduced between each file). Wildcard `*` accepted.\n\n### 
'string'.to(file)\n\nExamples:\n\n```javascript\ncat('input.txt').to('output.txt');\n```\n\nAnalogous
 to the redirection operator `>` in Unix, but works with JavaScript strings 
(such as\nthose returned by `cat`, `grep`, etc). _Like 
 Unix redirections, `to()` will overwrite any existing file!_\n\n### 
sed([options ,] search_regex, replace_str, file)\nAvailable options:\n\n+ `-i`: 
Replace contents of 'file' in-place. _Note that no backups will be 
created!_\n\nExamples:\n\n```javascript\nsed('-i', 'PROGRAM_VERSION', 'v0.1.3', 
'source.js');\nsed(/.*DELETE_THIS_LINE.*\\n/, '', 'source.js');\n```\n\nReads 
an input string from `file` and performs a JavaScript `replace()` on the 
input\nusing the given search regex and replacement string. Returns the new 
string after replacement.\n\n### grep([options ,] regex_filter, file [, file 
...])\n### grep([options ,] regex_filter, file_array)\nAvailable options:\n\n+ 
`-v`: Inverse the sense of the regex and print the lines not matching the 
criteria.\n\nExamples:\n\n```javascript\ngrep('-v', 'GLOBAL_VARIABLE', 
'*.js');\ngrep('GLOBAL_VARIABLE', '*.js');\n```\n\nReads input string from 
given files and returns a string containing all lines of the\nfile that match 
the given `regex_filt
 er`. Wildcard `*` accepted.\n\n### 
which(command)\n\nExamples:\n\n```javascript\nvar nodeExec = 
which('node');\n```\n\nSearches for `command` in the system's PATH. On Windows 
looks for `.exe`, `.cmd`, and `.bat` extensions.\nReturns string containing the 
absolute path to the command.\n\n### echo(string [,string 
...])\n\nExamples:\n\n```javascript\necho('hello world');\nvar str = 
echo('hello world');\n```\n\nPrints string to stdout, and returns string with 
additional utility methods\nlike `.to()`.\n\n### dirs([options | '+N' | 
'-N'])\n\nAvailable options:\n\n+ `-c`: Clears the directory stack by deleting 
all of the elements.\n\nArguments:\n\n+ `+N`: Displays the Nth directory 
(counting from the left of the list printed by dirs when invoked without 
options), starting with zero.\n+ `-N`: Displays the Nth directory (counting 
from the right of the list printed by dirs when invoked without options), 
starting with zero.\n\nDisplay the list of currently remembered directories. 
Returns an ar
 ray of paths in the stack, or a single path if +N or -N was specified.\n\nSee 
also: pushd, popd\n\n### pushd([options,] [dir | '-N' | '+N'])\n\nAvailable 
options:\n\n+ `-n`: Suppresses the normal change of directory when adding 
directories to the stack, so that only the stack is 
manipulated.\n\nArguments:\n\n+ `dir`: Makes the current working directory be 
the top of the stack, and then executes the equivalent of `cd dir`.\n+ `+N`: 
Brings the Nth directory (counting from the left of the list printed by dirs, 
starting with zero) to the top of the list by rotating the stack.\n+ `-N`: 
Brings the Nth directory (counting from the right of the list printed by dirs, 
starting with zero) to the top of the list by rotating the 
stack.\n\nExamples:\n\n```javascript\n// process.cwd() === 
'/usr'\npushd('/etc'); // Returns /etc /usr\npushd('+1');   // Returns /usr 
/etc\n```\n\nSave the current directory on the top of the directory stack and 
then cd to `dir`. With no arguments, pushd exchanges the t
 op two directories. Returns an array of paths in the stack.\n\n### 
popd([options,] ['-N' | '+N'])\n\nAvailable options:\n\n+ `-n`: Suppresses the 
normal change of directory when removing directories from the stack, so that 
only the stack is manipulated.\n\nArguments:\n\n+ `+N`: Removes the Nth 
directory (counting from the left of the list printed by dirs), starting with 
zero.\n+ `-N`: Removes the Nth directory (counting from the right of the list 
printed by dirs), starting with 
zero.\n\nExamples:\n\n```javascript\necho(process.cwd()); // 
'/usr'\npushd('/etc');       // '/etc /usr'\necho(process.cwd()); // 
'/etc'\npopd();              // '/usr'\necho(process.cwd()); // 
'/usr'\n```\n\nWhen no arguments are given, popd removes the top directory from 
the stack and performs a cd to the new top directory. The elements are numbered 
from 0 starting at the first directory listed with dirs; i.e., popd is 
equivalent to popd +0. Returns an array of paths in the stack.\n\n### 
exit(code)\nExits t
 he current process with the given exit code.\n\n### env['VAR_NAME']\nObject 
containing environment variables (both getter and setter). Shortcut to 
process.env.\n\n### exec(command [, options] [, callback])\nAvailable options 
(all `false` by default):\n\n+ `async`: Asynchronous execution. Defaults to 
true if a callback is provided.\n+ `silent`: Do not echo program output to 
console.\n\nExamples:\n\n```javascript\nvar version = exec('node --version', 
{silent:true}).output;\n\nvar child = exec('some_long_running_process', 
{async:true});\nchild.stdout.on('data', function(data) {\n  /* ... do something 
with data ... */\n});\n\nexec('some_long_running_process', function(code, 
output) {\n  console.log('Exit code:', code);\n  console.log('Program output:', 
output);\n});\n```\n\nExecutes the given `command` _synchronously_, unless 
otherwise specified.\nWhen in synchronous mode returns the object `{ code:..., 
output:... }`, containing the program's\n`output` (stdout + stderr)  and its 
exit `c
 ode`. Otherwise returns the child process object, and\nthe `callback` gets the 
arguments `(code, output)`.\n\n**Note:** For long-lived processes, it's best to 
run `exec()` asynchronously as\nthe current synchronous implementation uses a 
lot of CPU. This should be getting\nfixed soon.\n\n### chmod(octal_mode || 
octal_string, file)\n### chmod(symbolic_mode, file)\n\nAvailable options:\n\n+ 
`-v`: output a diagnostic for every file processed\n+ `-c`: like verbose but 
report only when a change is made\n+ `-R`: change files and directories 
recursively\n\nExamples:\n\n```javascript\nchmod(755, 
'/Users/brandon');\nchmod('755', '/Users/brandon'); // same as above 
\nchmod('u+x', '/Users/brandon');\n```\n\nAlters the permissions of a file or 
directory by either specifying the\nabsolute permissions in octal form or 
expressing the changes in symbols.\nThis command tries to mimic the POSIX 
behavior as much as possible.\nNotable exceptions:\n\n+ In symbolic modes, 
'a-r' and '-r' are identical.  No
  consideration is\n  given to the umask.\n+ There is no \"quiet\" option since 
default behavior is to run silent.\n\n## Configuration\n\n\n### 
config.silent\nExample:\n\n```javascript\nvar silentState = config.silent; // 
save old silent state\nconfig.silent = true;\n/* ... */\nconfig.silent = 
silentState; // restore old silent state\n```\n\nSuppresses all command output 
if `true`, except for `echo()` calls.\nDefault is `false`.\n\n### 
config.fatal\nExample:\n\n```javascript\nconfig.fatal = 
true;\ncp('this_file_does_not_exist', '/dev/null'); // dies here\n/* more 
commands... */\n```\n\nIf `true` the script will die on errors. Default is 
`false`.\n\n## Non-Unix commands\n\n\n### tempdir()\nSearches and returns 
string containing a writeable, platform-dependent temporary directory.\nFollows 
Python's [tempfile 
algorithm](http://docs.python.org/library/tempfile.html#tempfile.tempdir).\n\n###
 error()\nTests if error occurred in the last command. Returns `null` if no 
error occurred,\notherw
 ise returns string explaining the error\n",
+  "readmeFilename": "README.md",
+  "bugs": {
+    "url": "https://github.com/arturadib/shelljs/issues";
+  },
+  "_id": "[email protected]",
+  "_shasum": "dfbbe78d56c3c0168d2fb79e10ecd1dbcb07ec0e",
+  "_from": "shelljs@^0.1.4",
+  "_resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz";
+}

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/scripts/docs.js
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/scripts/docs.js 
b/node_modules/shelljs/scripts/docs.js
new file mode 100755
index 0000000..68a2138
--- /dev/null
+++ b/node_modules/shelljs/scripts/docs.js
@@ -0,0 +1,15 @@
+#!/usr/bin/env node
+require('../global');
+
+echo('Appending docs to README.md');
+
+cd(__dirname + '/..');
+
+// Extract docs from shell.js
+var docs = grep('//@', 'shell.js');
+// Remove '//@'
+docs = docs.replace(/\/\/\@ ?/g, '');
+// Append docs to README
+sed('-i', /## Command reference(.|\n)*/, '## Command reference\n\n' + docs, 
'README.md');
+
+echo('All done.');

http://git-wip-us.apache.org/repos/asf/cordova-browser/blob/926681b8/node_modules/shelljs/scripts/run-tests.js
----------------------------------------------------------------------
diff --git a/node_modules/shelljs/scripts/run-tests.js 
b/node_modules/shelljs/scripts/run-tests.js
new file mode 100755
index 0000000..a9d32fc
--- /dev/null
+++ b/node_modules/shelljs/scripts/run-tests.js
@@ -0,0 +1,50 @@
+#!/usr/bin/env node
+require('../global');
+
+var path = require('path');
+
+var failed = false;
+
+//
+// Lint
+//
+JSHINT_BIN = './node_modules/jshint/bin/jshint';
+cd(__dirname + '/..');
+
+if (!test('-f', JSHINT_BIN)) {
+  echo('JSHint not found. Run `npm install` in the root dir first.');
+  exit(1);
+}
+
+if (exec(JSHINT_BIN + ' --config jshint.json *.js test/*.js').code !== 0) {
+  failed = true;
+  echo('*** JSHINT FAILED! (return code != 0)');
+  echo();
+} else {
+  echo('All JSHint tests passed');
+  echo();
+}
+
+//
+// Unit tests
+//
+cd(__dirname + '/../test');
+ls('*.js').forEach(function(file) {
+  echo('Running test:', file);
+  if (exec('node ' + file).code !== 123) { // 123 avoids false positives (e.g. 
premature exit)
+    failed = true;
+    echo('*** TEST FAILED! (missing exit code "123")');
+    echo();
+  }
+});
+
+if (failed) {
+  echo();
+  echo('*******************************************************');
+  echo('WARNING: Some tests did not pass!');
+  echo('*******************************************************');
+  exit(1);
+} else {
+  echo();
+  echo('All tests passed.');
+}

Reply via email to